Konektor Zoom
Status konektor: Direncanakan Belum dibangun. Tajo belum menjalankan konektor ini.
Ilustrasi · data contoh
Contoh sinkronisasi
Sumber
Zoom
Status konektor: Direncanakan
Tujuan
Alat Anda yang lain
Status konektor: Alat khusus
Pemetaan field
| Field sumber | Field tujuan | Nilai contoh |
|---|---|---|
record.id | source_id | record_1042 |
record.updated_at | updated_at | 2026-10-18T08:00:00Z |
record.value | value | sample_value |
- Susun draf
- Tinjau satu data
- Setujui versi ini
Status berlaku untuk masing-masing konektor dan tidak menjamin sinkronisasi ini siap. Field ini hanya ilustrasi. Periksa skema dan izin sebenarnya sebelum sinkronisasi berjalan.
Hubungkan Zoom ke Brevo melalui Tajo untuk menyinkronkan peserta meeting dan peserta webinar sebagai kontak secara otomatis, memicu rangkaian tindak lanjut pasca-meeting, dan melacak metrik engagement untuk otomatisasi pemasaran Anda.
Ikhtisar
| Properti | Nilai |
|---|---|
| Platform | Zoom |
| Kategori | Konferensi Video (Custom) |
| Kompleksitas setup | Sedang |
| Integrasi resmi | Tidak |
| Data yang disinkronkan | Peserta, event, webinar, kontak |
| Metode autentikasi | OAuth 2.0 / Server-to-Server OAuth |
Fitur
- Sinkronisasi peserta - Buat kontak Brevo secara otomatis dari peserta meeting
- Penangkapan peserta webinar - Sinkronkan pendaftar dan peserta webinar
- Pemicu event meeting - Jalankan otomatisasi pada event mulai, selesai, dan perekaman meeting
- Pelacakan engagement - Lacak durasi kehadiran dan metrik partisipasi
- Tindak lanjut webinar - Picu rangkaian email tertarget berdasarkan kehadiran webinar
- Notifikasi rekaman - Kirim tautan rekaman melalui kampanye email Brevo
Prasyarat
Sebelum memulai, pastikan Anda memiliki:
- Akun Zoom (paket Pro atau lebih tinggi)
- Aplikasi Server-to-Server OAuth atau aplikasi OAuth Zoom via Zoom App Marketplace
- Akun Brevo dengan akses API
- Akun Tajo dengan izin konektor
Autentikasi
Server-to-Server OAuth (direkomendasikan)
# 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 (level pengguna)
// 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' })});Konfigurasi
Setup dasar
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: 17Pemetaan field
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_SOURCEEndpoint API
| Endpoint | Metode | Deskripsi |
|---|---|---|
https://api.zoom.us/v2/users | GET | Menampilkan pengguna |
https://api.zoom.us/v2/users/{userId}/meetings | GET | Menampilkan meeting |
https://api.zoom.us/v2/meetings/{meetingId} | GET | Mengambil detail meeting |
https://api.zoom.us/v2/past_meetings/{meetingId}/participants | GET | Menampilkan peserta meeting yang lalu |
https://api.zoom.us/v2/users/{userId}/webinars | GET | Menampilkan webinar |
https://api.zoom.us/v2/webinars/{webinarId}/registrants | GET | Menampilkan pendaftar webinar |
https://api.zoom.us/v2/webinars/{webinarId}/participants | GET | Menampilkan peserta webinar |
https://api.zoom.us/v2/meetings/{meetingId}/recordings | GET | Mengambil rekaman meeting |
https://api.zoom.us/v2/webhooks | POST | Berlangganan webhook |
Contoh kode
Inisialisasi konektor
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});Menyinkronkan peserta meeting
// 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] }); }}Menyinkronkan peserta webinar
// 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] });}Menangani webhook Zoom
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');});Batas rate
| Kategori | Batas | Catatan |
|---|---|---|
| Panggilan API ringan | 30 permintaan/detik | GET user, info meeting |
| Panggilan API sedang | 20 permintaan/detik | Menampilkan peserta, webinar |
| Panggilan API berat | 10 permintaan/detik | Laporan, rekaman |
| Batas harian | 5.000+ | Bergantung pada level paket |
Header batas rate
Zoom mengembalikan header X-RateLimit-Limit, X-RateLimit-Remaining, dan Retry-After. Terapkan logika backoff berdasarkan header tersebut untuk menghindari error 429.
Pemecahan masalah
| Masalah | Penyebab | Solusi |
|---|---|---|
| 401 Unauthorized | Token kedaluwarsa | Segarkan token Server-to-Server OAuth |
| Peserta hilang | Meeting belum berakhir | Tunggu hingga meeting berakhir agar data lengkap |
| Validasi webhook gagal | Secret salah | Periksa secret webhook di Zoom Marketplace |
| Tidak ada data email | Peserta tamu | Aktifkan registrasi untuk menangkap alamat email |
| Batas rate 429 | Terlalu banyak permintaan | Terapkan exponential backoff |
Mode debug
connectors: zoom: debug: true log_level: verbose log_webhooks: truePraktik terbaik
- Gunakan Server-to-Server OAuth - Autentikasi lebih sederhana tanpa interaksi pengguna
- Aktifkan registrasi webinar - Diperlukan untuk menangkap alamat email peserta
- Proses setelah meeting berakhir - Data peserta baru lengkap setelah meeting selesai
- Segmentasikan berdasarkan tipe event - Tetapkan list Brevo berbeda untuk meeting dan webinar
- Lacak metrik engagement - Gunakan durasi dan waktu bergabung untuk lead scoring
- Kirim tindak lanjut rekaman - Otomatiskan pengiriman tautan rekaman melalui Brevo
Keamanan
- OAuth 2.0 - Autentikasi OAuth Server-to-Server atau level pengguna
- Verifikasi webhook - Validasi tanda tangan HMAC-SHA256
- Validasi URL - Verifikasi challenge-response untuk endpoint webhook
- Izin tersegmentasi - Minta scope OAuth seminimal yang diperlukan
- Rotasi token - Token Server-to-Server kedaluwarsa otomatis (1 jam)
- Transport terenkripsi - TLS 1.2+ untuk seluruh komunikasi API