Zoom
This page explains how to set up the Zoom source connector and which Zoom data it syncs.
Prerequisites
- A Zoom account on a Pro plan or higher. Webinar and report-webinar streams also require the Zoom Webinars add-on;
zoom_eventsrequires a Webinars Plus or Zoom Events license. - An account owner or admin who can create an account-level app and grant the required admin scopes.
- An account-level General app set to Admin-managed for OAuth2.0, or a Server-to-Server OAuth app.
- For OAuth2.0, have the app's Client ID, Client Secret, and Refresh Token ready. Airbyte Cloud obtains these when you authenticate.
- For Server-to-Server OAuth, have the Account ID, Client ID, and Client Secret ready.
Both authentication methods use an account-level app. For the scopes to grant, see Required scopes.
Setup guide
Step 1: Create a Zoom app
OAuth2.0 General app
- Sign in to the Zoom App Marketplace and select Develop > Build App. Follow Zoom's instructions for creating a General app.
- Create a General app and choose Admin-managed. A user-managed app cannot list account users.
- If Airbyte asks for a redirect URL, add the URL it provides to the app's OAuth redirect URL and OAuth allow list.
Server-to-Server OAuth app
- In the Zoom App Marketplace, select Develop > Build App, then create a Server-to-Server OAuth app using Zoom's instructions.
- On the App credentials page, copy the Account ID, Client ID, and Client Secret.
- On the Scopes page, add the required scopes.
- Activate the app. Zoom does not issue access tokens for apps that are not activated.
Required scopes
Add these granular scopes to your Zoom app. If your app uses Zoom's classic scopes, add user:read:admin, meeting:read:admin, webinar:read:admin, report:read:admin, chat_channel:read:admin, and zoom_events_basic:read:admin instead.
| Streams | Granular scopes |
|---|---|
| All streams (lists account users) | user:read:list_users:admin |
meetings, meeting_registrants, meeting_polls, meeting_poll_results, meeting_registration_questions (lists each user's meetings) | meeting:read:list_meetings:admin |
meetings | meeting:read:meeting:admin |
meeting_registrants | meeting:read:list_registrants:admin |
meeting_polls | meeting:read:list_polls:admin |
meeting_poll_results | meeting:read:list_poll_results:admin |
meeting_registration_questions | meeting:read:list_registration_questions:admin |
webinars, webinar_panelists, webinar_registrants, webinar_absentees, webinar_polls, webinar_poll_results, webinar_registration_questions, webinar_tracking_sources, webinar_qna_results | webinar:read:list_webinars:admin, webinar:read:webinar:admin |
webinar_panelists | webinar:read:list_panelists:admin |
webinar_registrants | webinar:read:list_registrants:admin |
webinar_absentees | webinar:read:list_absentees:admin |
webinar_polls | webinar:read:list_polls:admin |
webinar_poll_results | webinar:read:list_past_polls:admin |
webinar_registration_questions | webinar:read:list_registration_questions:admin |
webinar_tracking_sources | webinar:read:list_tracking_sources:admin |
webinar_qna_results | webinar:read:past_qa:admin |
report_meetings, report_meeting_participants | report:read:meeting:admin |
report_meeting_participants | report:read:list_meeting_participants:admin |
report_webinars, report_webinar_participants | report:read:webinar:admin |
report_webinar_participants | report:read:list_webinar_participants:admin |
report_meetings, report_meeting_participants, report_user_meetings | report:read:user:admin |
report_daily | report:read:daily_usage:admin |
chat_channels | team_chat:read:list_user_channels:admin |
zoom_events | zoom_events:read:list_events:admin |
If you set up your Zoom app before version 1.5.0, add the scopes for any of the four new streams you want to sync. OAuth2.0 users must then re-authenticate so the new token includes the scopes. Server-to-Server OAuth requests a new token on every sync, so it needs no reconnection.
Before upgrading to source-zoom 2.0.0, add report:read:user:admin or the classic report:read:admin scope to the Zoom app for connections that sync report_meetings or report_meeting_participants. OAuth2.0 users must re-authenticate after adding the scope. See the Zoom 2.0.0 migration guide.
Step 2: Set up the Zoom connector in Airbyte
In Airbyte, create a Zoom source and select the authentication method that matches your app.
For Airbyte Cloud:
For OAuth2.0, select OAuth2.0 and authorize your Zoom account:
- Click Authenticate your Zoom account and sign in as a Zoom account owner or admin.
For Server-to-Server OAuth, select that authentication method and enter the app credentials:
- Enter the Account ID from the app's App credentials page.
- Enter the Client ID from the app's App credentials page.
- Enter the Client Secret from the app's App credentials page.
For Airbyte Open Source:
For OAuth2.0, select OAuth2.0 and enter the values for your admin-managed General app:
- Enter the app's Client ID.
- Enter the app's Client Secret.
- Enter the Refresh Token issued after an account owner or admin authorizes your app.
For Server-to-Server OAuth, select that authentication method and enter the app credentials:
- Enter the Account ID from the app's App credentials page.
- Enter the Client ID from the app's App credentials page.
- Enter the Client Secret from the app's App credentials page.
Zoom refresh tokens expire after 90 days. Re-authenticate if the source does not sync for that long. Zoom issues a new refresh token whenever the connector refreshes its access token, and the connector saves the new token to the source configuration. Authorizing the same Zoom app again, for example for a second source, revokes previously issued tokens. Server-to-Server OAuth apps do not use refresh tokens; the connector requests a new access token with the app credentials.
Start Date
Start Date (optional, start_date): UTC date-time filter for meetings and webinars. These streams include only records created on or after this date, including in Full Refresh; leave it empty to sync everything Zoom still serves. report_user_meetings, report_daily, report_meetings, and report_meeting_participants start from this date and are limited to Zoom's roughly six months of report retention; report_daily starts at the beginning of that month. report_webinars and report_webinar_participants are not filtered by start_date.
Number of Concurrent Threads
Number of Concurrent Threads (optional, num_workers): number of threads used during a sync. The default is 3; configure a value from 2 to 10. Higher values can speed up syncs but use more of the Zoom account's rate limit, which is shared with other apps on that account. See Rate limits.
Configure the source with the Airbyte API or Terraform
Before version 1.4.0, Server-to-Server OAuth settings were top-level fields. Airbyte migrates existing configurations automatically. If you manage the source through the Airbyte API or Terraform, put the settings inside the credentials object:
- For OAuth2.0, set
auth_typetooauth2.0and provideclient_id,client_secret, andrefresh_token. - For Server-to-Server OAuth, set
auth_typetoserver_to_serverand provideaccount_id,client_id, andclient_secret.
Use the Required scopes table above to configure the app scopes.
A configuration with only the old top-level account_id, client_id, client_secret, and authorization_endpoint fields is rejected. Once credentials.auth_type is set, the connector removes those top-level fields.
Supported sync modes
| Sync mode | Supported? |
|---|---|
| Full Refresh | Yes |
| Incremental | Yes (meetings, webinars, report_meetings, report_meeting_participants, report_user_meetings) |
| Namespaces | No |
meetings and webinars use created_at as the Incremental cursor with a 30-day lookback. Incremental syncs don't re-read edits to meetings or webinars created before that window, including reschedules, settings, and occurrences. Run a Full Refresh to pick them up; until then, Incremental | Append + Deduped keeps those rows as last synced. report_meetings uses end_time, report_meeting_participants uses meeting_end_time, and report_user_meetings uses end_time as their Incremental cursors. These three streams re-read the last day on each sync. report_webinars, report_webinar_participants, and report_daily support Full Refresh only; report_daily re-reads approximately the last six months.
Use Incremental for report_meetings and report_meeting_participants. A Full Refresh requests a report for every past meeting session in the roughly six-month report window. These requests use Zoom's Heavy rate limit, and participant reports can require additional requests for pagination.
Supported streams
The connector reads account users, then each user's meetings and webinars, and then details for those meetings and webinars. It also syncs meeting and webinar reports, daily account reports, chat channels, and Zoom Events.
Limitations and troubleshooting
Webinar streams require the Zoom Webinars add-on, and zoom_events requires a Webinars Plus or Zoom Events license. Zoom may return no records for streams that your account or host does not have access to. Report data is available for roughly six months. Past-meeting reports omit sessions with fewer than two participants and return a separate row for each eligible session of a recurring meeting.
- If Zoom rejects the OAuth token request, the connection test or sync fails with a configuration error. For OAuth2.0,
invalid_grantmeans the refresh token expired or was revoked; re-authenticate the source.invalid_clientindicates an incorrect client ID or secret, or a deactivated app. For Server-to-Server OAuth,invalid_requestmeans the Account ID is incorrect, andunsupported_grant_typemeans the selected authentication method does not match the app type. An S2S error message may say the refresh token was rejected even though S2S apps do not use refresh tokens. - If Zoom returns code
4711, the access token lacks a required scope. Add the missing scope from Required scopes to the Zoom app and re-authenticate if you use OAuth2.0. Streams that ignore HTTP400responses return no records instead of reporting missing scopes. - If Zoom rejects an expired access token with code
124, the connector refreshes the token and retries the request. - Zoom returns active users for the account. Meetings and webinars for inactive or pending users are not synced.
zoom_eventsrequests hosted events usingrole_type=hostand includes upcoming, past, draft, and cancelled events. It doesn't request attendee-ticketed events, which userole_type=attendee.- Zoom's meeting and webinar list endpoints return scheduled, unexpired meetings and webinars. Instant or expired meetings and webinars, and their registrants, polls, and webinar reports, are not returned.
report_meetingsandreport_meeting_participantsread past meeting sessions fromreport_user_meetings, so they include instant and ended meetings. - If a user cannot host or schedule meetings, Zoom can return code
3161; the connector skips that user's meeting partition instead of failing the sync. - If a meeting or webinar was deleted or no longer has report data, Zoom can return code
3001; the connector skips that resource. - Some stream requesters ignore HTTP
400or404responses, so those streams can return no records instead of failing. If an expected stream is empty, check your Zoom plan, the host's license, and the scopes on your app.
Rate limits
Zoom applies rate limits per account, shared across all apps on that account; limits depend on your Zoom plan. The connector throttles its requests to Zoom's Pro per-second limits, because Pro is the minimum supported plan: 10 requests/second for Heavy APIs (the report endpoints and GET /past_webinars/{webinarId}/absentees), 20 requests/second for Medium APIs, and 30 requests/second for Light APIs.
Each Airbyte Zoom source throttles only its own requests. Other Zoom sources and other apps on the same Zoom account use the same limits, so if syncs hit HTTP 429 responses, lower Number of Concurrent Threads on those sources.
Heavy and Resource-intensive requests also share a daily cap across all apps on the account: 30,000 requests on Pro and 60,000 on Business and higher plans. The cap resets at 00:00 UTC. The connector doesn't track the daily cap. In Full Refresh, report_meetings and report_meeting_participants each make at least one Heavy request per past meeting session in the roughly six-month retention window. Participant report pagination adds requests, so use Incremental for these streams.
When Zoom returns HTTP 429, the connector honors Zoom's Retry-After header. A wait of 600 seconds or longer fails the stream instead of waiting; if the header is missing, the connector uses exponential backoff.
IP allow list
If you use Airbyte Cloud and your organization restricts access to specific IPs, add the Airbyte Cloud IP addresses to your allow list.
Reference
Config fields reference
Changelog
Expand to review
| Version | Date | Pull Request | Subject |
|---|---|---|---|
| 2.2.3 | 2026-11-10 | 90955 | Use one error handler per request; a Zoom error code returned with an unexpected HTTP 2xx or 5xx status now gets that code's handling instead of being accepted or retried |
| 2.2.2 | 2026-11-10 | 91781 | Update dependencies |
| 2.2.1 | 2026-11-06 | 91199 | Promote to certified support level |
| 2.2.0 | 2026-11-06 | 91200 | Raise page size to 300, add missing schema fields, bump base image to 7.46.0, add OpenAPI spec link |
| 2.1.0 | 2026-11-06 | 91195 | Add configurable concurrency and Pro-tier API rate-limit budget |
| 2.0.0 | 2026-11-03 | 89722 | Add session-based meeting reports, composite keys and date-time typing; retain Full Refresh for webinar reports; honor Retry-After on 429 |
| 1.5.1 | 2026-11-03 | 90076 | Update dependencies |
| 1.5.0 | 2026-10-26 | 89564 | Add report_user_meetings, report_daily, chat_channels and zoom_events streams; the new streams need additional Zoom app scopes |
| 1.4.1 | 2026-10-23 | 89087 | Add registry metadata, spec titles and clearer Server-to-Server field descriptions |
| 1.4.0 | 2026-10-21 | 88359 | Add OAuth2.0 authentication as the default, with automatic migration of existing Server-to-Server configurations |
| 1.3.2 | 2026-10-20 | 89459 | Update dependencies |
| 1.3.1 | 2026-10-13 | 88881 | Update dependencies |
| 1.3.0 | 2026-10-08 | 87561 | Use the declarative OAuth authenticator, refresh tokens that expire mid-sync and report invalid credentials as configuration errors |
| 1.2.67 | 2026-10-08 | 87005 | Fix sync failures on users without meeting hosting rights, deleted meetings and webinars, and webinar UUIDs containing slashes |
| 1.2.66 | 2026-10-06 | 88100 | Update dependencies |
| 1.2.65 | 2026-09-29 | 87422 | Update dependencies |
| 1.2.64 | 2026-09-22 | 86858 | Update dependencies |
| 1.2.63 | 2026-09-15 | 86307 | Update dependencies |
| 1.2.62 | 2026-09-08 | 85742 | Update dependencies |
| 1.2.61 | 2026-08-18 | 84815 | Update dependencies |
| 1.2.60 | 2026-08-11 | 84173 | Update dependencies |
| 1.2.59 | 2026-07-28 | 83194 | Update to CDK 7.23.8 and remove the Cloud version override |
| 1.2.58 | 2026-07-28 | 1082 | Roll Cloud back to 1.2.56 |
| 1.2.57 | 2026-07-28 | 83156 | Update dependencies |
| 1.2.56 | 2026-07-21 | 82672 | Update dependencies |
| 1.2.55 | 2026-07-14 | 82073 | Update dependencies |
| 1.2.54 | 2026-06-30 | 81304 | Update dependencies |
| 1.2.53 | 2026-06-23 | 80722 | Update dependencies |
| 1.2.52 | 2026-06-16 | 80114 | Update dependencies |
| 1.2.51 | 2026-06-09 | 79582 | Update dependencies |
| 1.2.50 | 2026-06-02 | 79076 | Update dependencies |
| 1.2.49 | 2026-04-28 | 77500 | Update dependencies |
| 1.2.48 | 2026-04-21 | 76821 | Update dependencies |
| 1.2.47 | 2026-03-31 | 75837 | Update dependencies |
| 1.2.46 | 2026-03-24 | 75052 | Update dependencies |
| 1.2.45 | 2026-03-10 | 74448 | Update dependencies |
| 1.2.44 | 2026-02-24 | 73991 | Update dependencies |
| 1.2.43 | 2026-02-17 | 73592 | Update dependencies |
| 1.2.42 | 2026-02-10 | 73211 | Update dependencies |
| 1.2.41 | 2026-02-06 | 72082 | Update dependencies |
| 1.2.40 | 2026-01-14 | 71380 | Update dependencies |
| 1.2.39 | 2025-12-18 | 70796 | Update dependencies |
| 1.2.38 | 2025-11-25 | 70145 | Update dependencies |
| 1.2.37 | 2025-11-18 | 69428 | Update dependencies |
| 1.2.36 | 2025-10-29 | 68840 | Update dependencies |
| 1.2.35 | 2025-10-21 | 68502 | Update dependencies |
| 1.2.34 | 2025-10-14 | 67984 | Update dependencies |
| 1.2.33 | 2025-10-07 | 67477 | Update dependencies |
| 1.2.32 | 2025-09-30 | 66942 | Update dependencies |
| 1.2.31 | 2025-09-24 | 66312 | Update dependencies |
| 1.2.30 | 2025-09-09 | 65697 | Update dependencies |
| 1.2.29 | 2025-08-24 | 65399 | Update dependencies |
| 1.2.28 | 2025-08-10 | 64833 | Update dependencies |
| 1.2.27 | 2025-08-02 | 64316 | Update dependencies |
| 1.2.26 | 2025-07-27 | 64092 | Update dependencies |
| 1.2.25 | 2025-07-20 | 63671 | Update dependencies |
| 1.2.24 | 2025-07-12 | 63182 | Update dependencies |
| 1.2.23 | 2025-07-05 | 62729 | Update dependencies |
| 1.2.22 | 2025-06-28 | 62221 | Update dependencies |
| 1.2.21 | 2025-06-21 | 61777 | Update dependencies |
| 1.2.20 | 2025-06-16 | 61205 | Update dependencies |
| 1.2.19 | 2025-05-24 | 60763 | Update dependencies |
| 1.2.18 | 2025-05-10 | 59936 | Update dependencies |
| 1.2.17 | 2025-05-04 | 59545 | Update dependencies |
| 1.2.16 | 2025-04-27 | 58534 | Update dependencies |
| 1.2.15 | 2025-04-13 | 58032 | Update dependencies |
| 1.2.14 | 2025-04-06 | 57394 | Update dependencies |
| 1.2.13 | 2025-03-30 | 56840 | Update dependencies |
| 1.2.12 | 2025-03-23 | 56339 | Update dependencies |
| 1.2.11 | 2025-03-09 | 55666 | Update dependencies |
| 1.2.10 | 2025-03-02 | 54642 | Update dependencies |
| 1.2.9 | 2025-02-18 | 54113 | Update dependencies |
| 1.2.8 | 2025-02-09 | 53595 | Update dependencies |
| 1.2.7 | 2025-02-02 | 53122 | Update dependencies |
| 1.2.6 | 2025-01-26 | 52548 | Update dependencies |
| 1.2.5 | 2025-01-19 | 51931 | Update dependencies |
| 1.2.4 | 2025-01-12 | 51467 | Update dependencies |
| 1.2.3 | 2024-12-29 | 50835 | Update dependencies |
| 1.2.2 | 2024-12-22 | 50394 | Update dependencies |
| 1.2.1 | 2024-12-15 | 49445 | Update dependencies |
| 1.2.0 | 2024-10-29 | 47299 | Migrate to manifest only format |
| 1.1.22 | 2024-10-29 | 47755 | Update dependencies |
| 1.1.21 | 2024-10-28 | 47094 | Update dependencies |
| 1.1.20 | 2024-10-13 | 46824 | Update dependencies |
| 1.1.19 | 2024-10-06 | 46412 | Update dependencies |
| 1.1.18 | 2024-09-29 | 46196 | Update dependencies |
| 1.1.17 | 2024-09-22 | 45737 | Update dependencies |
| 1.1.16 | 2024-09-15 | 45523 | Update dependencies |
| 1.1.15 | 2024-09-08 | 45220 | Update dependencies |
| 1.1.14 | 2024-09-01 | 45037 | Update dependencies |
| 1.1.13 | 2024-08-25 | 44676 | Update dependencies |
| 1.1.12 | 2024-08-18 | 44249 | Update dependencies |
| 1.1.11 | 2024-08-11 | 43578 | Update dependencies |
| 1.1.10 | 2024-08-04 | 43149 | Update dependencies |
| 1.1.9 | 2024-07-28 | 42652 | Update dependencies |
| 1.1.8 | 2024-07-21 | 42212 | Update dependencies |
| 1.1.7 | 2024-07-14 | 41813 | Update dependencies |
| 1.1.6 | 2024-07-11 | 41486 | Update dependencies |
| 1.1.5 | 2024-07-10 | 41316 | Update dependencies |
| 1.1.4 | 2024-07-07 | 40986 | Update dependencies |
| 1.1.3 | 2024-06-27 | 40509 | Update dependencies |
| 1.1.2 | 2024-06-23 | 40141 | Update dependencies |
| 1.1.1 | 2024-06-11 | 39279 | [autopull] Upgrade base image to v1.2.2 |
| 1.1.0 | 2024-03-12 | 35369 | Publish S2S Oauth connector with fixed authenticator |
| 1.0.0 | 2023-7-28 | 25308 | Replace JWT Auth methods with server-to-server Oauth |
| 0.1.1 | 2022-11-30 | 19939 | Upgrade CDK version to fix bugs with SubStreamSlicer |
| 0.1.0 | 2022-10-25 | 18179 | Initial Release |