# Zoom

Zoom is a video communications platform for meetings, webinars, and team chat. The Sling Zoom connector extracts data from the Zoom REST API v2 using Server-to-Server OAuth, supporting users, meetings, webinars, reports, and channels.

{% hint style="success" %}
**CLI Pro Required**: APIs require a [CLI Pro token](https://docs.slingdata.io/sling-cli/cli-pro) or [Platform Plan](https://docs.slingdata.io/sling-platform/platform).
{% endhint %}

## Setup

The following credentials are accepted:

**Secrets:**

* `account_id` **(required)** -> Your Zoom Account ID
* `client_id` **(required)** -> Your Server-to-Server OAuth App Client ID
* `client_secret` **(required)** -> Your Server-to-Server OAuth App Client Secret

**Inputs:**

* `anchor_date` *(optional)* -> Starting date for the first sync of incremental endpoints (ISO 8601 format, e.g., `2024-01-01T00:00:00Z`). Defaults to 1 year ago.

### Creating a Server-to-Server OAuth App

1. Go to the [Zoom App Marketplace](https://marketplace.zoom.us/)
2. Click **Develop** → **Build App**
3. Select **Server-to-Server OAuth** and click **Create**
4. Name your app (e.g., "Sling Data Extractor")
5. Note the **Account ID**, **Client ID**, and **Client Secret** from the **App Credentials** tab
6. Fill in the required **Information** fields (Company Name, Developer Contact)
7. Under **Scopes**, add the following:
   * `user:read:list_users:admin` — View all users
   * `meeting:read:list_meetings:admin` — View all meetings
   * `meeting:read:list_registrants:admin` — View meeting registrants
   * `meeting:read:list_polls:admin` — View meeting polls
   * `webinar:read:list_webinars:admin` — View all webinars
   * `webinar:read:list_registrants:admin` — View webinar registrants
   * `webinar:read:list_panelists:admin` — View webinar panelists
   * `webinar:read:list_polls:admin` — View webinar polls
   * `webinar:read:list_absentees:admin` — View webinar absentees
   * `report:read:list_meeting_participants:admin` — View meeting participant reports
   * `team_chat:read:list_channels:admin` — View Team Chat channels
8. Click **Activate** to activate the app

{% hint style="warning" %}
**Plan Limitations:** Some endpoints require specific Zoom plans. Meeting registrants and polls require a Pro plan or higher. Webinar endpoints require the Webinar add-on. Report endpoints require a Pro, Business, or Education plan.
{% endhint %}

### Using `sling conns`

Here are examples of setting a connection named `ZOOM`. We must provide the `type=api` property:

{% code overflow="wrap" %}

```bash
sling conns set ZOOM type=api spec=zoom secrets='{ account_id: your-account-id, client_id: your-client-id, client_secret: your-client-secret }'
```

{% endcode %}

### Environment Variable

See [here](https://docs.slingdata.io/sling-cli/environment#dot-env-file-.env.sling) to learn more about the `.env.sling` file.

{% code overflow="wrap" %}

```bash
export ZOOM='{ type: api, spec: zoom, secrets: { account_id: "your-account-id", client_id: "your-client-id", client_secret: "your-client-secret" } }'
```

{% endcode %}

### Sling Env File YAML

See [here](https://docs.slingdata.io/sling-cli/environment#sling-env-file-env.yaml) to learn more about the sling `env.yaml` file.

```yaml
connections:
  ZOOM:
    type: api
    spec: zoom
    secrets:
      account_id: "your-account-id"
      client_id: "your-client-id"
      client_secret: "your-client-secret"
```

## Replication

Here's an example replication configuration to sync Zoom data to a PostgreSQL database:

```yaml
source: ZOOM
target: MY_POSTGRES

defaults:
  mode: full-refresh
  object: zoom.{stream_name}

streams:
  # sync all endpoints
  '*':
```

**Incremental sync for meeting reports:**

```yaml
source: ZOOM
target: MY_POSTGRES

defaults:
  mode: full-refresh
  object: zoom.{stream_name}

streams:
  users:
  meetings:
  meeting_registrants:
  meeting_polls:
  webinars:
  webinar_registrants:
  webinar_panelists:
  webinar_polls:
  webinar_absentees:
  webinar_tracking_sources:
  report_meetings:
    mode: incremental
  report_meeting_participants:
  channels:
```

## Endpoints

| Endpoint                      | Description                            | Incremental | Depends On |
| ----------------------------- | -------------------------------------- | ----------- | ---------- |
| `users`                       | All active users in the account        | No          | —          |
| `meetings`                    | Scheduled meetings for each user       | No          | `users`    |
| `meeting_registrants`         | Registrants for each meeting           | No          | `meetings` |
| `meeting_polls`               | Polls for each meeting                 | No          | `meetings` |
| `webinars`                    | Webinars for each user                 | No          | `users`    |
| `webinar_registrants`         | Registrants for each webinar           | No          | `webinars` |
| `webinar_panelists`           | Panelists for each webinar             | No          | `webinars` |
| `webinar_polls`               | Polls for each webinar                 | No          | `webinars` |
| `webinar_absentees`           | Absentees for past webinars            | No          | `webinars` |
| `webinar_tracking_sources`    | Tracking sources for each webinar      | No          | `webinars` |
| `report_meetings`             | Meeting reports for completed meetings | Yes         | `users`    |
| `report_meeting_participants` | Participants for completed meetings    | No          | `meetings` |
| `channels`                    | Team Chat channels                     | No          | —          |

The connector uses a **queue-based architecture** to handle parent-child relationships. The `users` endpoint populates user IDs used by `meetings`, `webinars`, and `report_meetings`. The `meetings` endpoint populates meeting IDs used by `meeting_registrants`, `meeting_polls`, and `report_meeting_participants`. The `webinars` endpoint populates webinar IDs used by `webinar_registrants`, `webinar_panelists`, `webinar_polls`, `webinar_absentees`, and `webinar_tracking_sources`.

To discover available endpoints:

```bash
sling conns discover ZOOM
```

### Endpoint Details

**`users`** — Returns all active users in the Zoom account, including profile information, email, timezone, and login details. User IDs are queued for child endpoints.

**`meetings`** — Returns scheduled meetings for each user. Meeting IDs are queued for registrant, poll, and report endpoints. Each meeting includes topic, start time, duration, and join URL.

**`meeting_registrants`** — Returns registrants for each meeting. Requires meeting registration to be enabled (Pro plan or higher).

**`meeting_polls`** — Returns polls configured for each meeting. Requires the Polls feature (Pro plan or higher).

**`webinars`** — Returns webinars for each user. Requires the Webinar add-on. Webinar IDs are queued for child endpoints.

**`webinar_registrants`** — Returns registrants for each webinar. Includes registration details like name, email, and custom questions.

**`webinar_panelists`** — Returns panelists assigned to each webinar.

**`webinar_polls`** — Returns polls configured for each webinar.

**`webinar_absentees`** — Returns registered attendees who did not attend past webinars.

**`webinar_tracking_sources`** — Returns tracking sources configured for each webinar, useful for marketing attribution.

**`report_meetings`** — Returns meeting reports for completed meetings. Supports incremental sync using the meeting end time. Note: the Zoom Reports API limits date ranges to a maximum of 1 month per request. Requires a Pro, Business, or Education plan.

**`report_meeting_participants`** — Returns participant details for completed meetings, including join/leave times and duration.

**`channels`** — Returns Team Chat channels accessible to the authenticated user.

## Incremental Sync

The `report_meetings` endpoint supports incremental sync using the `end_time` field:

* **First run:** Fetches reports from the last 30 days (Zoom Reports API limits date ranges to 1 month)
* **Subsequent runs:** Only fetches reports since the last sync timestamp

You can customize the starting date with the `anchor_date` input:

```yaml
connections:
  ZOOM:
    type: api
    spec: zoom
    secrets:
      account_id: "your-account-id"
      client_id: "your-client-id"
      client_secret: "your-client-secret"
    inputs:
      anchor_date: "2024-01-01T00:00:00Z"
```

All other endpoints run in full-refresh mode since they represent current state.

## Rate Limiting

The Zoom API enforces rate limits:

* **General:** 10 requests per second per account
* **Reports:** Lower rate limits apply

The connector automatically:

* Limits to 3 requests per second with concurrency of 3
* Retries with exponential backoff on 429 (rate limit) responses
* Allows up to 5 retry attempts
* Gracefully skips endpoints that return 400/404 errors (e.g., features not available on your plan)

If you are facing issues connecting, please reach out to us at <support@slingdata.io>, on [discord](https://discord.gg/q5xtaSNDvp) or open a Github Issue [here](https://github.com/slingdata-io/sling-cli/issues).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.slingdata.io/connections/api-connections/zoom.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
