раздел 02

Авторизация и список записей

Чтобы дёргать API, нужен access_token. Самый удобный способ для серверной задачи - приложение Server-to-Server OAuth: у вас есть три значения (account_id, client_id, client_secret), вы меняете их на токен. Как завести такое приложение и какие выдать права - подробно в курсе Zoom API.

Токену нужны права на чтение записей - то есть scope на cloud recording (например recording:read:admin). Без нужного scope список вернётся пустым или с ошибкой доступа.

Шаг 1. Получить access_token

Server-to-Server OAuth выдаёт токен по grant_type=account_credentials. В примере ниже ACCOUNT_ID, CLIENT_ID, CLIENT_SECRET - плейсхолдеры, подставьте свои.

curl -X POST "https://zoom.us/oauth/token?grant_type=account_credentials&account_id=ACCOUNT_ID" \
  -u "CLIENT_ID:CLIENT_SECRET"

В ответе придёт JSON с полем access_token. Дальше используем его в заголовке Authorization.

{
  "access_token": "ACCESS_TOKEN",
  "token_type": "bearer",
  "expires_in": 3600,
  "scope": "recording:read:admin"
}

Токен живёт около часа. Для долгих задач запрашивайте новый по мере истечения.

Шаг 2. Запросить список записей за период

Записи пользователя берём через эндпоинт списка. Вместо userId можно подставить me (текущий пользователь токена) или email/идентификатор конкретного пользователя.

GET https://api.zoom.us/v2/users/{userId}/recordings

Главные параметры:

  • from и to - период в формате YYYY-MM-DD. Окно запроса ограничено, поэтому большие диапазоны проходите помесячно.
  • page_size - сколько записей на страницу.
  • next_page_token - токен следующей страницы (см. пагинацию ниже).

Пример на curl за месяц:

curl -X GET "https://api.zoom.us/v2/users/me/recordings?from=2026-05-01&to=2026-05-31&page_size=100" \
  -H "Authorization: Bearer ACCESS_TOKEN"

В ответе - массив meetings, а внутри каждой встречи recording_files с нужными download_url:

{
  "from": "2026-05-01",
  "to": "2026-05-31",
  "page_size": 100,
  "next_page_token": "",
  "meetings": [
    {
      "uuid": "MEETING_UUID",
      "topic": "Еженедельный созвон",
      "start_time": "2026-05-14T09:00:00Z",
      "recording_files": [
        {
          "id": "FILE_ID",
          "file_type": "MP4",
          "recording_type": "shared_screen_with_speaker_view",
          "file_size": 184320000,
          "download_url": "https://api.zoom.us/v2/recording/download/FILE_PATH",
          "play_url": "https://api.zoom.us/recording/play/SHARE_PATH"
        }
      ]
    }
  ]
}

Шаг 3. Пагинация

Если записей больше, чем page_size, в ответе будет непустой next_page_token. Повторяйте запрос с тем же периодом, добавляя next_page_token, пока он не вернётся пустым.

curl -X GET "https://api.zoom.us/v2/users/me/recordings?from=2026-05-01&to=2026-05-31&page_size=100&next_page_token=NEXT_PAGE_TOKEN" \
  -H "Authorization: Bearer ACCESS_TOKEN"

Список как код на Python

Тот же поток на Python: получить токен, пройти все страницы, собрать download_url всех нужных файлов.

import requests

ACCOUNT_ID = "ACCOUNT_ID"
CLIENT_ID = "CLIENT_ID"
CLIENT_SECRET = "CLIENT_SECRET"


def get_access_token() -> str:
    resp = requests.post(
        "https://zoom.us/oauth/token",
        params={"grant_type": "account_credentials", "account_id": ACCOUNT_ID},
        auth=(CLIENT_ID, CLIENT_SECRET),
    )
    resp.raise_for_status()
    return resp.json()["access_token"]


def list_recordings(token: str, user_id: str, date_from: str, date_to: str):
    headers = {"Authorization": f"Bearer {token}"}
    url = f"https://api.zoom.us/v2/users/{user_id}/recordings"
    params = {"from": date_from, "to": date_to, "page_size": 100}
    while True:
        resp = requests.get(url, headers=headers, params=params)
        resp.raise_for_status()
        data = resp.json()
        for meeting in data.get("meetings", []):
            for file in meeting.get("recording_files", []):
                yield meeting, file
        token_next = data.get("next_page_token")
        if not token_next:
            break
        params["next_page_token"] = token_next


token = get_access_token()
for meeting, file in list_recordings(token, "me", "2026-05-01", "2026-05-31"):
    print(meeting["topic"], file["file_type"], file["download_url"])

Записи одной конкретной встречи можно взять адресно через GET https://api.zoom.us/v2/meetings/{meetingId}/recordings - структура ответа та же.

Дальше - как по download_url забрать сам файл на сервер.