Connecteur Zoom
Statut du connecteur: Prévu Pas encore construit. Tajo n'exécute pas ce connecteur aujourd'hui.
Illustration · données d’exemple
Exemple de synchronisation
Source
Zoom
Statut du connecteur: Prévu
Destination
Votre autre outil
Statut du connecteur: Outil personnalisé
Correspondance des champs
| Champ source | Champ de destination | Valeur d’exemple |
|---|---|---|
record.id | source_id | record_1042 |
record.updated_at | updated_at | 2026-10-18T08:00:00Z |
record.value | value | sample_value |
- Préparer
- Vérifier un enregistrement
- Approuver cette version
Les statuts concernent chaque connecteur et ne garantissent pas que cette synchronisation soit prête. Champs illustratifs. Vérifiez le schéma réel et les autorisations avant toute synchronisation.
Connectez Zoom à Brevo via Tajo pour synchroniser automatiquement les participants aux réunions et aux webinaires en tant que contacts, déclencher des séquences de suivi post-réunion, et suivre les métriques d’engagement pour vos automatisations marketing.
Vue d’ensemble
| Propriété | Valeur |
|---|---|
| Plateforme | Zoom |
| Catégorie | Visioconférence (Personnalisé) |
| Complexité de configuration | Moyenne |
| Intégration officielle | Non |
| Données synchronisées | Participants, Événements, Webinaires, Contacts |
| Méthode d’authentification | OAuth 2.0 / Server-to-Server OAuth |
Fonctionnalités
- Synchronisation des participants - Création automatique de contacts Brevo depuis les participants aux réunions
- Capture des participants aux webinaires - Synchronisation des inscrits et participants aux webinaires
- Déclencheurs d’événements de réunion - Lancement d’automatisations au début, à la fin et lors des événements d’enregistrement
- Suivi de l’engagement - Suivi de la durée de présence et des métriques de participation
- Suivi post-webinaire - Déclenchement de séquences email ciblées selon la présence aux webinaires
- Notifications d’enregistrement - Envoi des liens d’enregistrement via des campagnes email Brevo
Prérequis
Avant de commencer, assurez-vous d’avoir :
- Un compte Zoom (plan Pro ou supérieur)
- Une application Server-to-Server OAuth ou OAuth via le Zoom App Marketplace
- Un compte Brevo avec accès API
- Un compte Tajo avec permissions de connecteur
Authentification
Server-to-Server OAuth (Recommandé)
# Créez une application Server-to-Server OAuth sur marketplace.zoom.usexport ZOOM_ACCOUNT_ID=your_account_idexport ZOOM_CLIENT_ID=your_client_idexport ZOOM_CLIENT_SECRET=your_client_secret// Obtenir un jeton d'accès 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 (Niveau utilisateur)
// URL d'autorisation pour OAuth de niveau utilisateurconst 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' });
// Échanger le code contre des jetonsconst 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' })});Configuration
Configuration de base
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: 17Mappage de champs
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_SOURCEEndpoints API
| Endpoint | Méthode | Description |
|---|---|---|
https://api.zoom.us/v2/users | GET | Lister les utilisateurs |
https://api.zoom.us/v2/users/{userId}/meetings | GET | Lister les réunions |
https://api.zoom.us/v2/meetings/{meetingId} | GET | Obtenir les détails d’une réunion |
https://api.zoom.us/v2/past_meetings/{meetingId}/participants | GET | Lister les participants aux réunions passées |
https://api.zoom.us/v2/users/{userId}/webinars | GET | Lister les webinaires |
https://api.zoom.us/v2/webinars/{webinarId}/registrants | GET | Lister les inscrits aux webinaires |
https://api.zoom.us/v2/webinars/{webinarId}/participants | GET | Lister les participants aux webinaires |
https://api.zoom.us/v2/meetings/{meetingId}/recordings | GET | Obtenir les enregistrements de réunions |
https://api.zoom.us/v2/webhooks | POST | S’abonner aux webhooks |
Exemples de code
Initialiser le connecteur
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});Synchroniser les participants aux réunions
// Récupérer les participants aux réunions passéesconst 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] }); }}Synchroniser les participants aux webinaires
// Obtenir les participants aux webinaires et les synchroniser vers 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] });}Gérer les webhooks Zoom
app.post('/webhooks/zoom', async (req, res) => { // Gérer le challenge de validation d'URL Zoom 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 }); }
// Vérifier la signature du webhook 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');});Limites de taux
| Catégorie | Limite | Notes |
|---|---|---|
| Appels API légers | 30 req/sec | GET utilisateur, informations de réunion |
| Appels API moyens | 20 req/sec | Liste de participants, webinaires |
| Appels API lourds | 10 req/sec | Rapports, enregistrements |
| Limite quotidienne | 5 000+ | Dépend du niveau du plan |
En-têtes de limite de taux
Zoom retourne les en-têtes X-RateLimit-Limit, X-RateLimit-Remaining et Retry-After. Implémentez une logique de backoff basée sur ces en-têtes pour éviter les erreurs 429.
Dépannage
| Problème | Cause | Solution |
|---|---|---|
| 401 Unauthorized | Jeton expiré | Rafraîchissez le jeton Server-to-Server OAuth |
| Participants manquants | Réunion non terminée | Attendez la fin de la réunion pour les données complètes |
| Validation webhook échoue | Mauvais secret | Vérifiez le secret webhook dans Zoom Marketplace |
| Pas de données email | Participants invités | Activez l’inscription pour capturer les emails |
| Limite de taux 429 | Trop de requêtes | Implémentez un backoff exponentiel |
Mode debug
connectors: zoom: debug: true log_level: verbose log_webhooks: trueBonnes pratiques
- Utilisez Server-to-Server OAuth - Authentification plus simple sans interaction utilisateur
- Activez l’inscription aux webinaires - Nécessaire pour capturer les adresses email des participants
- Traitez après la fin de la réunion - Les données des participants ne sont complètes qu’après la fin des réunions
- Segmentez par type d’événement - Assignez différentes listes Brevo pour les réunions vs les webinaires
- Suivez les métriques d’engagement - Utilisez la durée et l’heure de connexion pour le scoring de leads
- Envoyez des suivis d’enregistrement - Automatisez l’envoi des liens d’enregistrement via Brevo
Sécurité
- OAuth 2.0 - Authentification Server-to-Server ou OAuth de niveau utilisateur
- Vérification des webhooks - Validation de signature HMAC-SHA256
- Validation d’URL - Vérification par challenge-réponse pour les endpoints webhook
- Permissions à périmètre réduit - Demandez les périmètres OAuth minimaux requis
- Rotation des jetons - Les jetons Server-to-Server expirent automatiquement (1 heure)
- Transport chiffré - TLS 1.2+ pour toutes les communications API