Zoom Connector
Connectorstatus: Planlagt Ikke bygget endnu. Tajo kører ikke denne connector i dag.
Illustration · eksempeldata
Eksempel på synkronisering
Kilde
Zoom
Connectorstatus: Planlagt
Destination
Dit andet værktøj
Connectorstatus: Eget værktøj
Feltmapping
| Kildefelt | Destinationsfelt | Eksempelværdi |
|---|---|---|
record.id | source_id | record_1042 |
record.updated_at | updated_at | 2026-10-18T08:00:00Z |
record.value | value | sample_value |
- Udkast
- Gennemse én post
- Godkend denne version
Status gælder den enkelte connector og garanterer ikke, at denne synkronisering er klar. Felterne er illustrative. Tjek det faktiske skema og tilladelser før en synkronisering.
Forbind Zoom til Brevo via Tajo for automatisk at synkronisere mødedeltagere og webinardeltagere som kontakter, udløse opfølgningssekvenser efter møder og spore engagementmetrikker til dine marketingautomatiseringer.
Oversigt
| Egenskab | Værdi |
|---|---|
| Platform | Zoom |
| Kategori | Videokonferencer (brugerdefineret) |
| Opsætningskompleksitet | Mellem |
| Officiel integration | Nej |
| Synkroniserede data | Deltagere, hændelser, webinarer, kontakter |
| Autentifikationsmetode | OAuth 2.0 / Server-to-Server OAuth |
Funktioner
- Deltagersynkronisering - Opret automatisk Brevo-kontakter fra mødedeltagere
- Opfangning af webinardeltagere - Synkronisér webinar-registranter og deltagere
- Triggere på mødehændelser - Aktivér automatiseringer ved mødestart, -slut og optagelseshændelser
- Engagementtracking - Spor deltagelsesvarighed og deltagelsesmetrikker
- Webinaropfølgning - Udløs målrettede e-mailsekvenser baseret på webinardeltagelse
- Optagelsesnotifikationer - Send optagelseslinks via Brevo-e-mailkampagner
Forudsætninger
Før du begynder, skal du sikre dig, at du har:
- En Zoom-konto (Pro-plan eller højere)
- En Zoom Server-to-Server OAuth-app eller OAuth-app via Zoom App Marketplace
- En Brevo-konto med API-adgang
- En Tajo-konto med konnektorrettigheder
Autentifikation
Server-to-Server OAuth (anbefalet)
# 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 (brugerniveau)
// 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' })});Konfiguration
Grundlæggende opsætning
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: 17Feltmapping
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 | Metode | Beskrivelse |
|---|---|---|
https://api.zoom.us/v2/users | GET | Vis brugere |
https://api.zoom.us/v2/users/{userId}/meetings | GET | Vis møder |
https://api.zoom.us/v2/meetings/{meetingId} | GET | Hent mødedetaljer |
https://api.zoom.us/v2/past_meetings/{meetingId}/participants | GET | Vis tidligere mødedeltagere |
https://api.zoom.us/v2/users/{userId}/webinars | GET | Vis webinarer |
https://api.zoom.us/v2/webinars/{webinarId}/registrants | GET | Vis webinar-registranter |
https://api.zoom.us/v2/webinars/{webinarId}/participants | GET | Vis webinardeltagere |
https://api.zoom.us/v2/meetings/{meetingId}/recordings | GET | Hent mødeoptagelser |
https://api.zoom.us/v2/webhooks | POST | Abonnér på webhooks |
Kodeeksempler
Initialisér konnektor
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});Synkronisér mødedeltagere
// 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] }); }}Synkronisér webinardeltagere
// 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] });}Håndtér Zoom-webhooks
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');});Ratebegrænsninger
| Kategori | Grænse | Noter |
|---|---|---|
| Lette API-kald | 30 req/sek | GET bruger, mødeinfo |
| Mellemtunge API-kald | 20 req/sek | Vis deltagere, webinarer |
| Tunge API-kald | 10 req/sek | Rapporter, optagelser |
| Daglig grænse | 5.000+ | Afhænger af plan |
Rate limit-headere
Zoom returnerer headerne X-RateLimit-Limit, X-RateLimit-Remaining og Retry-After. Implementér backoff-logik baseret på disse headere for at undgå 429-fejl.
Fejlfinding
| Problem | Årsag | Løsning |
|---|---|---|
| 401 Unauthorized | Token udløbet | Opdatér Server-to-Server OAuth-token |
| Manglende deltagere | Møde ikke afsluttet | Vent, til mødet slutter, for fulde data |
| Webhook-validering fejler | Forkert secret | Verificér webhook-secret i Zoom Marketplace |
| Ingen e-maildata | Gæstedeltagere | Aktivér registrering for at opfange e-mails |
| Ratebegrænsning 429 | For mange forespørgsler | Implementér eksponentiel backoff |
Fejlfindingstilstand
connectors: zoom: debug: true log_level: verbose log_webhooks: trueBest practices
- Brug Server-to-Server OAuth - Enklere autentifikation uden brugerinteraktion
- Aktivér webinar-registrering - Påkrævet for at opfange deltageres e-mailadresser
- Behandl efter mødeslut - Deltagerdata er først komplette, når møder slutter
- Segmentér efter hændelsestype - Tildel forskellige Brevo-lister til møder vs. webinarer
- Spor engagementmetrikker - Brug varighed og deltagelsestid til leadscoring
- Send opfølgning på optagelser - Automatisér levering af optagelseslinks via Brevo
Sikkerhed
- OAuth 2.0 - Server-to-Server eller OAuth-autentifikation på brugerniveau
- Webhook-verifikation - HMAC-SHA256-signaturvalidering
- URL-validering - Challenge-response-verifikation for webhook-endpoints
- Scoped rettigheder - Anmod om minimumskrævede OAuth-scopes
- Tokenrotation - Server-to-Server-tokens udløber automatisk (1 time)
- Krypteret transport - TLS 1.2+ til al API-kommunikation