Zoom-connector
Connectorstatus: Gepland Nog niet gebouwd. Tajo draait deze connector vandaag niet.
Illustratie · voorbeelddata
Voorbeeld van synchronisatie
Bron
Zoom
Connectorstatus: Gepland
Bestemming
Je andere tool
Connectorstatus: Eigen tool
Veldtoewijzing
| Bronveld | Doelveld | Voorbeeldwaarde |
|---|---|---|
record.id | source_id | record_1042 |
record.updated_at | updated_at | 2026-10-18T08:00:00Z |
record.value | value | sample_value |
- Opstellen
- Eén record controleren
- Deze versie goedkeuren
Statussen gelden per connector en garanderen niet dat deze synchronisatie klaar is. De velden zijn illustratief. Controleer het echte schema en de rechten voordat een synchronisatie draait.
Verbind Zoom met Brevo via Tajo om automatisch vergaderingsdeelnemers en webinardeelnemers als contacten te synchroniseren, follow-up-sequenties na vergaderingen te triggeren en engagementmetrics te volgen voor je marketingautomatiseringen.
Overzicht
| Eigenschap | Waarde |
|---|---|
| Platform | Zoom |
| Categorie | Video Conferencing (Custom) |
| Setupcomplexiteit | Gemiddeld |
| Officiële integratie | Nee |
| Gesynchroniseerde data | Deelnemers, Events, Webinars, Contacten |
| Auth-methode | OAuth 2.0 / Server-to-Server OAuth |
Functies
- Deelnemerssynchronisatie - Maak automatisch Brevo-contacten aan vanuit vergaderingsdeelnemers
- Webinar-attendee-capture - Synchroniseer webinarregistranten en -deelnemers
- Vergader-event-triggers - Activeer automatiseringen bij start, einde en opname van vergaderingen
- Engagement-tracking - Volg aanwezigheidsduur en participatiemetrics
- Webinar-follow-up - Trigger gerichte e-mailsequenties op basis van webinar-aanwezigheid
- Opname-notificaties - Verstuur opnamelinks via Brevo-e-mailcampagnes
Vereisten
Voordat je begint, zorg dat je beschikt over:
- Een Zoom-account (Pro-plan of hoger)
- Een Zoom Server-to-Server OAuth-app of OAuth-app via Zoom App Marketplace
- Een Brevo-account met API-toegang
- Een Tajo-account met connector-rechten
Authenticatie
Server-to-Server OAuth (aanbevolen)
# Create a Server-to-Server OAuth app at marketplace.zoom.usexport ZOOM_ACCOUNT_ID=your_account_idexport ZOOM_CLIENT_ID=your_client_idexport ZOOM_CLIENT_SECRET=your_client_secret// Get access token via Server-to-Server OAuthconst tokenResponse = await fetch('https://zoom.us/oauth/token', { method: 'POST', headers: { 'Authorization': `Basic ${Buffer.from( `${process.env.ZOOM_CLIENT_ID}:${process.env.ZOOM_CLIENT_SECRET}` ).toString('base64')}`, 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ grant_type: 'account_credentials', account_id: process.env.ZOOM_ACCOUNT_ID })});
const { access_token } = await tokenResponse.json();OAuth 2.0 (op gebruikersniveau)
// Authorization URL for user-level OAuthconst authUrl = 'https://zoom.us/oauth/authorize?' + new URLSearchParams({ client_id: process.env.ZOOM_CLIENT_ID, redirect_uri: 'https://your-app.com/callback', response_type: 'code' });
// Exchange code for tokensconst tokenResponse = await fetch('https://zoom.us/oauth/token', { method: 'POST', headers: { 'Authorization': `Basic ${Buffer.from( `${process.env.ZOOM_CLIENT_ID}:${process.env.ZOOM_CLIENT_SECRET}` ).toString('base64')}`, 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ grant_type: 'authorization_code', code: authorizationCode, redirect_uri: 'https://your-app.com/callback' })});Configuratie
Basisinstelling
connectors: zoom: enabled: true account_id: "${ZOOM_ACCOUNT_ID}" client_id: "${ZOOM_CLIENT_ID}" client_secret: "${ZOOM_CLIENT_SECRET}"
sync: participants: true webinars: true recordings: true
webhook: secret_token: "${ZOOM_WEBHOOK_SECRET}" verification_token: "${ZOOM_VERIFICATION_TOKEN}"
lists: meeting_participants: 15 webinar_attendees: 16 webinar_registrants: 17Veldmapping
field_mapping: email: email name: FIRSTNAME join_time: MEETING_JOIN_DATE duration: MEETING_DURATION webinar_title: WEBINAR_NAME attendance_status: ATTENDANCE_STATUS registration_source: UTM_SOURCEAPI-endpoints
| Endpoint | Method | Beschrijving |
|---|---|---|
https://api.zoom.us/v2/users | GET | Gebruikers opvragen |
https://api.zoom.us/v2/users/{userId}/meetings | GET | Vergaderingen opvragen |
https://api.zoom.us/v2/meetings/{meetingId} | GET | Vergaderingsdetails ophalen |
https://api.zoom.us/v2/past_meetings/{meetingId}/participants | GET | Deelnemers van afgelopen vergadering opvragen |
https://api.zoom.us/v2/users/{userId}/webinars | GET | Webinars opvragen |
https://api.zoom.us/v2/webinars/{webinarId}/registrants | GET | Webinarregistranten opvragen |
https://api.zoom.us/v2/webinars/{webinarId}/participants | GET | Webinardeelnemers opvragen |
https://api.zoom.us/v2/meetings/{meetingId}/recordings | GET | Vergaderingsopnames ophalen |
https://api.zoom.us/v2/webhooks | POST | Abonneren op webhooks |
Codevoorbeelden
Connector initialiseren
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
await tajo.connectors.connect('zoom', { accountId: process.env.ZOOM_ACCOUNT_ID, clientId: process.env.ZOOM_CLIENT_ID, clientSecret: process.env.ZOOM_CLIENT_SECRET});Vergaderingsdeelnemers synchroniseren
// Retrieve past meeting participantsconst response = await fetch( `https://api.zoom.us/v2/past_meetings/${meetingId}/participants`, { headers: { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': 'application/json' } });
const { participants } = await response.json();
for (const participant of participants) { if (participant.user_email) { await tajo.contacts.sync({ email: participant.user_email, attributes: { FIRSTNAME: participant.name, MEETING_DURATION: participant.duration, MEETING_JOIN_DATE: participant.join_time, ATTENDANCE_STATUS: 'attended' }, listIds: [15] }); }}Webinardeelnemers synchroniseren
// Get webinar attendees and sync to Brevoconst attendeesResponse = await fetch( `https://api.zoom.us/v2/past_webinars/${webinarId}/participants`, { headers: { 'Authorization': `Bearer ${accessToken}` } });
const { participants: attendees } = await attendeesResponse.json();
for (const attendee of attendees) { await tajo.contacts.sync({ email: attendee.user_email, attributes: { FIRSTNAME: attendee.name, WEBINAR_NAME: webinarTitle, ATTENDANCE_STATUS: 'attended', MEETING_DURATION: attendee.duration }, listIds: [16] });}Zoom-webhooks afhandelen
app.post('/webhooks/zoom', async (req, res) => { // Handle Zoom URL validation challenge if (req.body.event === 'endpoint.url_validation') { const hashForValidation = crypto .createHmac('sha256', process.env.ZOOM_WEBHOOK_SECRET) .update(req.body.payload.plainToken) .digest('hex');
return res.json({ plainToken: req.body.payload.plainToken, encryptedToken: hashForValidation }); }
// Verify webhook signature const message = `v0:${req.headers['x-zm-request-timestamp']}:${JSON.stringify(req.body)}`; const hash = crypto .createHmac('sha256', process.env.ZOOM_WEBHOOK_SECRET) .update(message) .digest('hex'); const signature = `v0=${hash}`;
if (req.headers['x-zm-signature'] !== signature) { return res.status(401).send('Unauthorized'); }
const { event, payload } = req.body;
await tajo.connectors.handleWebhook('zoom', { topic: event, payload: payload });
res.status(200).send('OK');});Rate limits
| Categorie | Limiet | Opmerkingen |
|---|---|---|
| Lichte API-calls | 30 req/sec | GET user, meeting info |
| Gemiddelde API-calls | 20 req/sec | Lijsten met deelnemers, webinars |
| Zware API-calls | 10 req/sec | Rapporten, opnames |
| Daglimiet | 5.000+ | Afhankelijk van planniveau |
Rate limit-headers
Zoom retourneert X-RateLimit-Limit-, X-RateLimit-Remaining- en Retry-After-headers. Implementeer backoff-logica op basis van deze headers om 429-fouten te voorkomen.
Probleemoplossing
| Probleem | Oorzaak | Oplossing |
|---|---|---|
| 401 Unauthorized | Token verlopen | Vernieuw Server-to-Server OAuth-token |
| Ontbrekende deelnemers | Vergadering niet beëindigd | Wacht tot de vergadering eindigt voor volledige data |
| Webhook-validatie mislukt | Verkeerd secret | Verifieer webhook secret in Zoom Marketplace |
| Geen e-maildata | Gast-deelnemers | Schakel registratie in om e-mails te capturen |
| Rate limit 429 | Te veel requests | Implementeer exponentiële backoff |
Debugmodus
connectors: zoom: debug: true log_level: verbose log_webhooks: trueBest practices
- Gebruik Server-to-Server OAuth - Eenvoudigere authenticatie zonder gebruikersinteractie
- Schakel webinarregistratie in - Vereist om e-mailadressen van deelnemers te capturen
- Verwerk na het einde van de vergadering - Deelnemersdata is pas compleet nadat vergaderingen eindigen
- Segmenteer per eventtype - Wijs verschillende Brevo-lijsten toe voor vergaderingen vs. webinars
- Volg engagementmetrics - Gebruik duur en jointijd voor lead scoring
- Verstuur opname-follow-ups - Automatiseer opnamelinkbezorging via Brevo
Beveiliging
- OAuth 2.0 - Server-to-Server- of user-level-OAuth-authenticatie
- Webhook-verificatie - HMAC-SHA256-signatureverificatie
- URL-validatie - Challenge-response-verificatie voor webhook-endpoints
- Gescoopte rechten - Vraag minimaal vereiste OAuth-scopes aan
- Tokenrotatie - Server-to-Server-tokens vervallen automatisch (1 uur)
- Versleuteld transport - TLS 1.2+ voor alle API-communicatie