Skip to main content

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_events requires 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​

  1. Sign in to the Zoom App Marketplace and select Develop > Build App. Follow Zoom's instructions for creating a General app.
  2. Create a General app and choose Admin-managed. A user-managed app cannot list account users.
  3. 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​

  1. In the Zoom App Marketplace, select Develop > Build App, then create a Server-to-Server OAuth app using Zoom's instructions.
  2. On the App credentials page, copy the Account ID, Client ID, and Client Secret.
  3. On the Scopes page, add the required scopes.
  4. 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.

StreamsGranular 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
meetingsmeeting:read:meeting:admin
meeting_registrantsmeeting:read:list_registrants:admin
meeting_pollsmeeting:read:list_polls:admin
meeting_poll_resultsmeeting:read:list_poll_results:admin
meeting_registration_questionsmeeting: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_resultswebinar:read:list_webinars:admin, webinar:read:webinar:admin
webinar_panelistswebinar:read:list_panelists:admin
webinar_registrantswebinar:read:list_registrants:admin
webinar_absenteeswebinar:read:list_absentees:admin
webinar_pollswebinar:read:list_polls:admin
webinar_poll_resultswebinar:read:list_past_polls:admin
webinar_registration_questionswebinar:read:list_registration_questions:admin
webinar_tracking_sourceswebinar:read:list_tracking_sources:admin
webinar_qna_resultswebinar:read:past_qa:admin
report_meetings, report_meeting_participantsreport:read:meeting:admin
report_meeting_participantsreport:read:list_meeting_participants:admin
report_webinars, report_webinar_participantsreport:read:webinar:admin
report_webinar_participantsreport:read:list_webinar_participants:admin
report_meetings, report_meeting_participants, report_user_meetingsreport:read:user:admin
report_dailyreport:read:daily_usage:admin
chat_channelsteam_chat:read:list_user_channels:admin
zoom_eventszoom_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:

  1. 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:

  1. Enter the Account ID from the app's App credentials page.
  2. Enter the Client ID from the app's App credentials page.
  3. 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:

  1. Enter the app's Client ID.
  2. Enter the app's Client Secret.
  3. 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:

  1. Enter the Account ID from the app's App credentials page.
  2. Enter the Client ID from the app's App credentials page.
  3. 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_type to oauth2.0 and provide client_id, client_secret, and refresh_token.
  • For Server-to-Server OAuth, set auth_type to server_to_server and provide account_id, client_id, and client_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 modeSupported?
Full RefreshYes
IncrementalYes (meetings, webinars, report_meetings, report_meeting_participants, report_user_meetings)
NamespacesNo

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.

StreamEndpointPrimary key
usersGET /usersid
meetingsGET /meetings/{meetingId}id
meeting_registrantsGET /meetings/{meetingId}/registrantsid
meeting_pollsGET /meetings/{meetingId}/pollsmeeting_id, id
meeting_poll_resultsGET /past_meetings/{meetingId}/polls—
meeting_registration_questionsGET /meetings/{meetingId}/registrants/questionsmeeting_id
webinarsGET /webinars/{webinarId}id
webinar_panelistsGET /webinars/{webinarId}/panelistswebinar_id, id
webinar_registrantsGET /webinars/{webinarId}/registrantswebinar_id, id
webinar_absenteesGET /past_webinars/{webinarId}/absenteesid
webinar_pollsGET /webinars/{webinarId}/pollswebinar_id, id
webinar_poll_resultsGET /past_webinars/{webinarId}/polls—
webinar_registration_questionsGET /webinars/{webinarId}/registrants/questionswebinar_id
webinar_tracking_sourcesGET /webinars/{webinarId}/tracking_sourcesid
webinar_qna_resultsGET /past_webinars/{webinarId}/qa—
report_meetingsGET /report/meetings/{meetingId}uuid
report_meeting_participantsGET /report/meetings/{meetingId}/participantsmeeting_uuid, user_id
report_webinarsGET /report/webinars/{webinarId}uuid
report_webinar_participantsGET /report/webinars/{webinarId}/participantswebinar_uuid, user_id
report_user_meetingsGET /report/users/{userId}/meetingsuuid
report_dailyGET /report/dailydate
chat_channelsGET /chat/users/{userId}/channelsid, user_id
zoom_eventsGET /zoom_events/eventsevent_id

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_grant means the refresh token expired or was revoked; re-authenticate the source. invalid_client indicates an incorrect client ID or secret, or a deactivated app. For Server-to-Server OAuth, invalid_request means the Account ID is incorrect, and unsupported_grant_type means 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 HTTP 400 responses 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_events requests hosted events using role_type=host and includes upcoming, past, draft, and cancelled events. It doesn't request attendee-ticketed events, which use role_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_meetings and report_meeting_participants read past meeting sessions from report_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 400 or 404 responses, 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

Field
Type
Property name
object
credentials
integer
num_workers
string
start_date

Changelog​

Expand to review
VersionDatePull RequestSubject
2.2.32026-11-1090955Use 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.22026-11-1091781Update dependencies
2.2.12026-11-0691199Promote to certified support level
2.2.02026-11-0691200Raise page size to 300, add missing schema fields, bump base image to 7.46.0, add OpenAPI spec link
2.1.02026-11-0691195Add configurable concurrency and Pro-tier API rate-limit budget
2.0.02026-11-0389722Add session-based meeting reports, composite keys and date-time typing; retain Full Refresh for webinar reports; honor Retry-After on 429
1.5.12026-11-0390076Update dependencies
1.5.02026-10-2689564Add report_user_meetings, report_daily, chat_channels and zoom_events streams; the new streams need additional Zoom app scopes
1.4.12026-10-2389087Add registry metadata, spec titles and clearer Server-to-Server field descriptions
1.4.02026-10-2188359Add OAuth2.0 authentication as the default, with automatic migration of existing Server-to-Server configurations
1.3.22026-10-2089459Update dependencies
1.3.12026-10-1388881Update dependencies
1.3.02026-10-0887561Use the declarative OAuth authenticator, refresh tokens that expire mid-sync and report invalid credentials as configuration errors
1.2.672026-10-0887005Fix sync failures on users without meeting hosting rights, deleted meetings and webinars, and webinar UUIDs containing slashes
1.2.662026-10-0688100Update dependencies
1.2.652026-09-2987422Update dependencies
1.2.642026-09-2286858Update dependencies
1.2.632026-09-1586307Update dependencies
1.2.622026-09-0885742Update dependencies
1.2.612026-08-1884815Update dependencies
1.2.602026-08-1184173Update dependencies
1.2.592026-07-2883194Update to CDK 7.23.8 and remove the Cloud version override
1.2.582026-07-281082Roll Cloud back to 1.2.56
1.2.572026-07-2883156Update dependencies
1.2.562026-07-2182672Update dependencies
1.2.552026-07-1482073Update dependencies
1.2.542026-06-3081304Update dependencies
1.2.532026-06-2380722Update dependencies
1.2.522026-06-1680114Update dependencies
1.2.512026-06-0979582Update dependencies
1.2.502026-06-0279076Update dependencies
1.2.492026-04-2877500Update dependencies
1.2.482026-04-2176821Update dependencies
1.2.472026-03-3175837Update dependencies
1.2.462026-03-2475052Update dependencies
1.2.452026-03-1074448Update dependencies
1.2.442026-02-2473991Update dependencies
1.2.432026-02-1773592Update dependencies
1.2.422026-02-1073211Update dependencies
1.2.412026-02-0672082Update dependencies
1.2.402026-01-1471380Update dependencies
1.2.392025-12-1870796Update dependencies
1.2.382025-11-2570145Update dependencies
1.2.372025-11-1869428Update dependencies
1.2.362025-10-2968840Update dependencies
1.2.352025-10-2168502Update dependencies
1.2.342025-10-1467984Update dependencies
1.2.332025-10-0767477Update dependencies
1.2.322025-09-3066942Update dependencies
1.2.312025-09-2466312Update dependencies
1.2.302025-09-0965697Update dependencies
1.2.292025-08-2465399Update dependencies
1.2.282025-08-1064833Update dependencies
1.2.272025-08-0264316Update dependencies
1.2.262025-07-2764092Update dependencies
1.2.252025-07-2063671Update dependencies
1.2.242025-07-1263182Update dependencies
1.2.232025-07-0562729Update dependencies
1.2.222025-06-2862221Update dependencies
1.2.212025-06-2161777Update dependencies
1.2.202025-06-1661205Update dependencies
1.2.192025-05-2460763Update dependencies
1.2.182025-05-1059936Update dependencies
1.2.172025-05-0459545Update dependencies
1.2.162025-04-2758534Update dependencies
1.2.152025-04-1358032Update dependencies
1.2.142025-04-0657394Update dependencies
1.2.132025-03-3056840Update dependencies
1.2.122025-03-2356339Update dependencies
1.2.112025-03-0955666Update dependencies
1.2.102025-03-0254642Update dependencies
1.2.92025-02-1854113Update dependencies
1.2.82025-02-0953595Update dependencies
1.2.72025-02-0253122Update dependencies
1.2.62025-01-2652548Update dependencies
1.2.52025-01-1951931Update dependencies
1.2.42025-01-1251467Update dependencies
1.2.32024-12-2950835Update dependencies
1.2.22024-12-2250394Update dependencies
1.2.12024-12-1549445Update dependencies
1.2.02024-10-2947299Migrate to manifest only format
1.1.222024-10-2947755Update dependencies
1.1.212024-10-2847094Update dependencies
1.1.202024-10-1346824Update dependencies
1.1.192024-10-0646412Update dependencies
1.1.182024-09-2946196Update dependencies
1.1.172024-09-2245737Update dependencies
1.1.162024-09-1545523Update dependencies
1.1.152024-09-0845220Update dependencies
1.1.142024-09-0145037Update dependencies
1.1.132024-08-2544676Update dependencies
1.1.122024-08-1844249Update dependencies
1.1.112024-08-1143578Update dependencies
1.1.102024-08-0443149Update dependencies
1.1.92024-07-2842652Update dependencies
1.1.82024-07-2142212Update dependencies
1.1.72024-07-1441813Update dependencies
1.1.62024-07-1141486Update dependencies
1.1.52024-07-1041316Update dependencies
1.1.42024-07-0740986Update dependencies
1.1.32024-06-2740509Update dependencies
1.1.22024-06-2340141Update dependencies
1.1.12024-06-1139279[autopull] Upgrade base image to v1.2.2
1.1.02024-03-1235369Publish S2S Oauth connector with fixed authenticator
1.0.02023-7-2825308Replace JWT Auth methods with server-to-server Oauth
0.1.12022-11-3019939Upgrade CDK version to fix bugs with SubStreamSlicer
0.1.02022-10-2518179Initial Release