> ## Documentation Index
> Fetch the complete documentation index at: https://support.configview.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Zoom setup

ConfigView pulls Zoom account data through a **Server-to-Server OAuth app** that you create in the Zoom App Marketplace. That app type authenticates as the account itself rather than as a signed-in user, so nothing breaks when the person who set it up leaves.

You will end up with **3 secrets** in ConfigView (`ZOOM_ACCOUNT_ID`, `ZOOM_CLIENT_ID`, `ZOOM_CLIENT_SECRET`) when setup is complete.

> **Scope of this integration today.** ConfigView currently ingests the Zoom **user directory** only — who has an account, what licence type, when they last signed in. Meetings, webinars, recordings and phone are not collected. If you need those, mention it to your ConfigView contact.

***

## Step 1: Create the Server-to-Server OAuth app

1. Sign in to the [Zoom App Marketplace](https://marketplace.zoom.us/) as an account **Owner** or **Admin** with permission to create apps
2. Go to **Develop** → **Build App**
3. Choose **Server-to-Server OAuth**
4. **Name:** `ConfigView`
5. On the **App Credentials** screen, copy all three values — you need every one of them:
   * **Account ID**
   * **Client ID**
   * **Client Secret**
6. Fill in the required **Information** fields (company name, developer contact) — Zoom will not let you activate the app without them
7. On the **Scopes** screen, add the read scope ConfigView needs:
   * **`user:read:admin`** — View all user information
8. Click **Continue**, then **Activate your app**

> **The activation step is the one people miss.** An app that is created but not activated returns a token error rather than a permission error, so it reads like a bad secret. The ConfigView health check distinguishes the two for you.

***

## Step 2: Add the secrets to ConfigView

1. Go to your ConfigView dashboard: `https://{companyname}.configview.com/admin/integrations/zoom`
2. Under **Credentials**, enter each value and click the save icon on its row:

| Secret name          | Value                     |
| -------------------- | ------------------------- |
| `ZOOM_ACCOUNT_ID`    | Account ID from Step 1    |
| `ZOOM_CLIENT_ID`     | Client ID from Step 1     |
| `ZOOM_CLIENT_SECRET` | Client Secret from Step 1 |

***

## Step 3: Enable the Zoom script in ConfigView

1. Go to: `https://{companyname}.configview.com/admin/integrations/zoom`
2. Click **Connect**. ConfigView creates its tables and schedules every collector at your default run time.
3. The collectors it will start running — stop any you do not want under **Collectors**:
4. Click **Verify now** to confirm the credentials work.

| Script    | Notes                                                                                          |
| --------- | ---------------------------------------------------------------------------------------------- |
| **Users** | Every user in the account — licence type, department, last login, last client version, status. |

***

## Step 4: Verify

1. Go to: `https://{companyname}.configview.com/admin/integrations/zoom`
2. Click **Verify now** to confirm the credentials work.

If a check fails:

* **Token request fails** — Check all three secrets, and check the app is **activated** in the Marketplace. A created-but-not-activated app fails here, not at the scope check.
* **`user:read:admin` probe returns 401/403** — The scope is missing. Add it in the app's **Scopes** tab, then **re-activate** the app; scope changes do not take effect until you do.
* **Health check passes but the table is empty** — The account genuinely has no users visible to the scope, which is rare. Re-run the Users script and check the run log.

***

## Data Tables

Once the script runs, the table is created in your database. It includes a `run_at` column for historical tracking.

| Table        | Source                             | Key Columns                                                                                                                                                                                                                            |
| ------------ | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `zoom_users` | `GET https://api.zoom.us/v2/users` | zoom\_user\_id, email, first\_name, last\_name, display\_name, type, status, dept, role\_id, created\_at, last\_login\_time, last\_client\_version, timezone, verified, pmi, language, employee\_unique\_id, phone\_number, group\_ids |

***

## Things worth knowing

**`type` is the licence, and it is a number.** Zoom encodes the licence type as an integer rather than a name (Basic / Licensed / On-prem). If you are reporting on paid seats, that column is the one to filter on — check a couple of known users to confirm the mapping for your account before relying on it.

**No `status` filter is sent.** ConfigView calls `/users` without a `status` parameter, so you get whatever Zoom's default set is for that endpoint. If your row count does not match the user count in the Zoom admin console, that is the first thing to check — deactivated and pending users are the usual difference.

**`last_login_time` is not a liveness signal on its own.** It records the last sign-in Zoom saw, which for a user on a permanently signed-in desktop client can be a long time ago while they are using Zoom daily. Pair it with `last_client_version` before concluding a seat is idle.
