раздел 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 забрать сам файл на сервер.