Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/zoom-phone-recordings-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no email required.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Phone Recordings API
description: "You can access information from Zoom with Zoom Phone APIs to build private services or public applications on the [Zoom App Marketplace](https://marketplace.zoom.us/).\n\n To learn how to get your credentials and create private or public applications, see Zoom APIs use [OAuth 2.0 authorization](https://developers.zoom.us/docs/integrations/oauth/). \n\n All endpoints are available through `https` at `api.zoom.us/v2/`. For instance, `https://api.zoom.us/v2/users/` returns all users on an account. You'll receive a `403` error message if you have not set up Zoom Phone."
termsOfService: https://zoom.us/docs/en-us/zoom_api_license_and_tou.html
contact:
name: Zoom Developers
url: https://developer.zoom.us/
version: '2'
servers:
- url: https://api.zoom.us/v2
tags:
- name: Recordings
paths:
/phone/call_element/{callElementId}/recording:
get:
tags:
- Recordings
summary: Get a recording by call element ID
description: "Returns an account's [call recording](https://support.zoom.us/hc/en-us/articles/360038521091-Accessing-and-sharing-call-recordings) by the call element's `callElementId`.\n**Prerequisites** \n* A Pro or higher account with Zoom Phone license \n* Account owner or admin privileges\n\n**[Scopes](https://developers.zoom.us/docs/integrations/oauth-scopes-overview/):** `phone:read:admin`,`phone_recording:read`,`phone_recording:read:admin`,`phone:read`\n\n**[Granular Scopes](https://developers.zoom.us/docs/integrations/oauth-scopes-overview/):** `phone:read:call_recording`,`phone:read:call_recording:admin`\n\n**[Rate Limit Label](https://marketplace.zoom.us/docs/api-reference/rate-limits#rate-limits):** `LIGHT`"
operationId: getPhoneRecordingByCallElementId
parameters:
- name: callElementId
in: path
description: The ID of the call element.
required: true
schema:
type: string
example: 20210609-a297ae04-a875-4cfd-85ab-4adcead91edb
responses:
'200':
description: "**HTTP Status Code:** `200` \n \nOK."
content:
application/json:
schema:
type: object
properties:
call_id:
type: string
description: The phone call's unique ID.
example: '7069775907364530379'
call_element_id:
type: string
description: The phone call element's unique ID.
example: 20210609-a297ae04-a875-4cfd-85ab-4adcead91edb
callee_name:
type: string
description: The callee's contact name.
example: User A
callee_number:
type: string
description: The callee's phone number.
example: '1000001004'
callee_number_type:
type: integer
description: "The callee's number type: \n* `1` — Internal number. \n* `2` — External number. \n* `3` — Customized emergency number."
example: 1
enum:
- 1
- 2
- 3
caller_name:
type: string
description: The caller's contact name.
example: User B
caller_number:
type: string
description: The caller's phone number.
example: '1000123476'
caller_number_type:
type: integer
description: "The caller's number type: \n* `1` — Internal number. \n* `2` — External number."
example: 1
enum:
- 1
- 2
outgoing_by:
type: object
properties:
name:
type: string
description: The user's name.
example: User B
extension_number:
type: string
description: The user's extension number.
example: '123476'
description: The user who initiates the call. The current recording must belong to the initiator and the call queue for it to be available.
accepted_by:
type: object
properties:
name:
type: string
description: The user's name.
example: User A
extension_number:
type: string
description: The user's extension number.
example: '132001'
description: The call-receiving user. The current recording must belong to the receiver and call queue for it to be available.
date_time:
type: string
description: The date and time when the recording was received.
format: date-time
example: '2022-03-08T05:37:23Z'
direction:
type: string
description: 'The call''s direction:
* `inbound`
* `outbound`'
example: inbound
enum:
- inbound
- outbound
download_url:
type: string
description: "The URL from which to download the recording. \n\nFor security purposes, you **must** provide an OAuth access token in the Authorization header to download the recording file using this URL."
example: https://domain/recording/download/EvVNLihbQ1WpeG_ALwnNzg
duration:
type: integer
description: The call recording's duration, in seconds.
example: 115
end_time:
type: string
description: The recording's end time.
format: date-time
example: '2022-03-08T05:39:19Z'
id:
type: string
description: The recording's ID.
example: 1dfe35c05f0f4bf1b2e4a8869a731178
meeting_uuid:
type: string
description: The meeting ID associated with the recording, if any.
example: egLSRuj2SlWet+wLi87LNA==
owner:
type: object
properties:
extension_number:
type: integer
description: The extension number associated with the call number.
format: int64
example: 1000123476
id:
type: string
description: The owner's ID.
example: NL3cEpSdRc-c2t8aLoZqiw
name:
type: string
description: The name of the owner.
example: user@test.com
type:
type: string
description: The owner's type, can be `user`, `callQueue`, or `sharedOffice`(deprecated and to be replaced by `commonArea` after the transition period.)
example: user
enum:
- user
- callQueue
- commonArea
extension_status:
type: string
description: "This field indicates the status of extension. \n* `inactive` \n* `deleted`"
example: deleted
enum:
- inactive
- deleted
extension_deleted_time:
type: string
description: The date time the extension was deleted. It exists only when extension_status is `deleted`.
example: '2022-10-14T22:10:54Z'
description: The owner of the recording.
soft_deleted:
type: boolean
description: Whether this recording soft deletes and moves to trash.
example: true
soft_deleted_type:
type: string
description: This field indicates how the recording was deleted. It exists only when the recording is from trash.
example: Manual
enum:
- Manual
- Data Retention
deleted_time:
type: string
description: The time and date the recording was deleted. It exists only when recording is from trash.
format: date-time
example: '2023-04-18T22:10:49.907Z'
days_left_auto_permanently_delete:
type: integer
description: The number of days left until recording is permanently deleted. If the recording never auto deletes, the value is '-1'. It exists only when recording is from trash.
example: 30
recording_type:
type: string
description: The recording type. The allowed value is `OnDemand` or `Automatic`.
example: OnDemand
enum:
- OnDemand
- Automatic
file_url:
type: string
description: The download URL for the recording. For security purposes, you must provide an OAuth access token in the auth header to download the recording file using this url.
example: https://domain/recording/download/8f7345c50a654182ab1672fdb3be61ff
disclaimer_status:
type: integer
description: "The status of disclaimer for recording: \n* `0` - passive/implicit \n* `1` - agree (active/explicit and press 1) \n* `2` - passive agree (active/explicit and no press)"
example: 0
enum:
- 0
- 1
- 2
caller_account_code:
type: string
description: 'The caller''s account code. To dial between accounts, use the format: [Account code] - [extension number].'
example: '111'
callee_account_code:
type: string
description: 'The callee''s account code. To dial between accounts, use the format: [Account code] - [extension number].'
example: '222'
description: The information about the user's phone recording.
'400':
description: "**HTTP Status Code:** `400` <br>\n Bad Request \n\n "
'404':
description: "**HTTP Status Code:** `404` <br>\n Not Found \n\n **Error Code:** `404` <br>\n Recording does not exist for {callElementId}. <br>\n"
'429':
description: "**HTTP Status Code:** `429` <br>\n Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rest/rate-limits/). \n\n "
security:
- openapi_oauth:
- phone:read:admin
- phone_recording:read
- phone_recording:read:admin
- phone:read
- phone:read:call_recording
- phone:read:call_recording:admin
openapi_authorization: []
x-extensions:
x-permissions: []
x-macro-scopes:
- phone:read:admin
- phone_recording:read
- phone_recording:read:admin
- phone:read
x-granular-scopes:
- phone:read:call_recording
- phone:read:call_recording:admin
/phone/call_logs/{id}/recordings:
get:
tags:
- Recordings
summary: Get recording by call ID
description: "Returns an account's [call recording](https://support.zoom.us/hc/en-us/articles/360038521091-Accessing-and-sharing-call-recordings) by the recording's `callId` or `callLogId`. \n\n**Note**: Returns the `file_url` in the JSON query results.\n\n**Prerequisites** \n* A Pro or higher account with Zoom Phone license \n* Account owner or admin privileges\n\n**[Scopes](https://developers.zoom.us/docs/integrations/oauth-scopes-overview/):** `phone:read:admin`,`phone_recording:read`,`phone_recording:read:admin`\n\n**[Granular Scopes](https://developers.zoom.us/docs/integrations/oauth-scopes-overview/):** `phone:read:call_recording`,`phone:read:call_recording:admin`\n\n**[Rate Limit Label](https://marketplace.zoom.us/docs/api-reference/rate-limits#rate-limits):** `LIGHT`"
operationId: getPhoneRecordingsByCallIdOrCallLogId
parameters:
- name: id
in: path
description: This field gets the unique ID of the call log. You can use `callLogId` and `callId` as path parameters. You can find the value for this field with the **[Get account's call logs](https://marketplace.zoom.us/docs/api-reference/phone/methods#operation/accountCallLogs)** API or the **[Get user's call logs](https://marketplace.zoom.us/docs/api-reference/phone/methods#operation/phoneUserCallLogs)** API.
required: true
schema:
type: string
example: '7069775907364530379'
responses:
'200':
description: "**HTTP Status Code:** `200` \n \nOK."
content:
application/json:
schema:
type: object
properties:
call_id:
type: string
description: The phone call's unique ID.
example: '7069775907364530379'
call_log_id:
type: string
description: The phone call log's unique ID.
example: 1dfe35c0-5f0f-4bf1-b2e4-a8869a731178
deprecated: true
call_history_id:
type: string
description: The phone call history's unique ID.
example: 20220308-1dfe35c0-5f0f-4bf1-b2e4-a8869a731178
deprecated: true
call_element_id:
type: string
description: The phone call element's unique ID.
example: 20210609-a297ae04-a875-4cfd-85ab-4adcead91edb
callee_name:
type: string
description: The callee's contact name.
example: User A
callee_number:
type: string
description: The callee's phone number.
example: '1000001004'
callee_number_type:
type: integer
description: "The callee's number type: \n* `1` — Internal number. \n* `2` — External number. \n* `3` — Customized emergency number."
example: 1
enum:
- 1
- 2
- 3
caller_name:
type: string
description: The caller's contact name.
example: User B
caller_number:
type: string
description: The caller's phone number.
example: '1000123476'
caller_number_type:
type: integer
description: "The caller's number type: \n* `1` — Internal number. \n* `2` — External number."
example: 1
enum:
- 1
- 2
outgoing_by:
type: object
properties:
name:
type: string
description: The user's name.
example: User B
extension_number:
type: string
description: The user's extension number.
example: '123476'
description: The user who initiates the call. The current recording must belong to the initiator and the call queue for it to be available.
accepted_by:
type: object
properties:
name:
type: string
description: The user's name.
example: User A
extension_number:
type: string
description: The user's extension number.
example: '132001'
description: The call-receiving user. The current recording must belong to the receiver and call queue for it to be available.
date_time:
type: string
description: The date and time when the recording was received.
format: date-time
example: '2022-03-08T05:37:23Z'
direction:
type: string
description: 'The call''s direction:
* `inbound`
* `outbound`'
example: inbound
download_url:
type: string
description: "The URL from which to download the recording. \n\nFor security purposes, you **must** provide an OAuth access token in the Authorization header to download the recording file using this URL. \n\nFor example: \n\n```curl --request GET \\\n --url {download_url} \\\n --header 'authorization: Bearer {access_token} \\\n --header 'content-type: application/json'\n```"
example: https://domain/recording/download/EvVNLihbQ1WpeG_ALwnNzg
duration:
type: integer
description: The call recording's duration, in seconds.
example: 115
end_time:
type: string
description: The recording's end time.
format: date-time
example: '2022-03-08T05:39:19Z'
id:
type: string
description: The recording's ID.
example: 1dfe35c05f0f4bf1b2e4a8869a731178
meeting_uuid:
type: string
description: The meeting ID associated with the recording, if any.
example: egLSRuj2SlWet+wLi87LNA==
owner:
type: object
properties:
extension_number:
type: integer
description: The extension number associated with the call number.
format: int64
example: 1000123476
id:
type: string
description: The owner's ID.
example: NL3cEpSdRc-c2t8aLoZqiw
name:
type: string
description: The name of the owner.
example: user@test.com
type:
type: string
description: The owner's type, can be `user`, `callQueue`, or `sharedOffice`(deprecated and to be replaced by `commonArea` after the transition period.)
example: user
enum:
- user
- callQueue
- commonArea
extension_status:
type: string
description: "This field indicates the status of extension. \n* `inactive` \n* `deleted`"
example: deleted
enum:
- inactive
- deleted
extension_deleted_time:
type: string
description: The date time the extension was deleted. It exists only when extension_status is `deleted`.
example: '2022-10-14T22:10:54Z'
description: The owner of the recording.
deleted_time:
type: string
description: The time and date the recording was deleted. It exists only when recording is from trash.
format: date-time
example: '2023-04-18T22:10:49.907Z'
days_left_auto_permantely_delete:
type: integer
description: The number of days left until recording is permanently deleted. If the recording never auto deletes, the value is '-1'. It exists only when recording is from trash.
example: 30
soft_deleted_type:
type: string
description: This field indicates how the recording was deleted. It exists only when the recording is from trash.
example: Manual
enum:
- Manual
- Data Retention
recording_type:
type: string
description: The recording type. The allowed value is `OnDemand` or `Automatic`.
example: OnDemand
enum:
- OnDemand
- Automatic
file_url:
type: string
description: "The download URL for the recording. For security purposes, you must provide an OAuth access token in the auth header to download the recording file using this url.\nExample request:\n```\ncurl --request GET \\\n --url {download_url} \\\n --header 'authorization: Bearer {access_token}' \\\n --header 'content-type: application/json'\n```"
example: https://domain/recording/download/8f7345c50a654182ab1672fdb3be61ff
disclaimer_status:
type: integer
description: "The status of disclaimer for recording: \n* `0` - passive/implicit \n* `1` - agree (active/explicit and press 1) \n* `2` - passive agree (active/explicit and no press)"
example: 0
enum:
- 0
- 1
- 2
caller_account_code:
type: string
description: 'The caller''s account code. To dial between accounts, use the format: [Account code] - [extension number].'
example: '111'
callee_account_code:
type: string
description: 'The callee''s account code. To dial between accounts, use the format: [Account code] - [extension number].'
example: '222'
description: The information about the user's phone recording.
'400':
description: "**HTTP Status Code:** `400` <br>\n Bad Request \n\n "
'401':
description: "**HTTP Status Code:** `401` <br>\n Unauthorized \n\n **Error Code:** `124` <br>\n Account does not exist: \"{accountId}\". <br>\n"
'404':
description: "**HTTP Status Code:** `404` <br>\n Not Found \n\n **Error Code:** `1001` <br>\n Recording does not exist: \"{callId or callLogId}\". <br>\n"
'429':
description: "**HTTP Status Code:** `429` <br>\n Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rest/rate-limits/). \n\n "
deprecated: true
security:
- openapi_oauth:
- phone:read:admin
- phone_recording:read
- phone_recording:read:admin
- phone:read:call_recording
- phone:read:call_recording:admin
openapi_authorization: []
x-extensions:
x-permissions: []
x-macro-scopes:
- phone:read:admin
- phone_recording:read
- phone_recording:read:admin
x-granular-scopes:
- phone:read:call_recording
- phone:read:call_recording:admin
/phone/recording/download/{fileId}:
get:
tags:
- Recordings
summary: Download a phone recording
description: "Downloads the phone recording. \n\n**Prerequisites:**\n\n* A Business or Enterprise account\n* A Zoom Phone license\n\n\n\n**[Scopes](https://developers.zoom.us/docs/integrations/oauth-scopes-overview/):** `phone:read`,`phone:read:admin`,`phone_recording:read`,`phone_recording:read:admin`\n\n**[Granular Scopes](https://developers.zoom.us/docs/integrations/oauth-scopes-overview/):** `phone:read:call_recording`,`phone:read:call_recording:admin`\n\n**[Rate Limit Label](https://marketplace.zoom.us/docs/api-reference/rate-limits#rate-limits):** `MEDIUM`"
operationId: phoneDownloadRecordingFile
parameters:
- name: fileId
in: path
description: The file ID of the phone recording.
required: true
schema:
type: string
example: SJD6tIJpQHeTU4RDde-NVA
responses:
'200':
description: "**HTTP Status Code:** `200` **OK** \n \n"
'400':
description: "**HTTP Status Code:** `400` <br>\n Bad Request \n\n **Error Code:** `404` <br>\n File does not exist. <br>\n"
'429':
description: "**HTTP Status Code:** `429` <br>\n Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rest/rate-limits/). \n\n "
security:
- openapi_oauth:
- phone:read
- phone:read:admin
- phone_recording:read
- phone_recording:read:admin
- phone:read:call_recording
- phone:read:call_recording:admin
openapi_authorization: []
x-extensions:
x-permissions: []
x-macro-scopes:
- phone:read
- phone:read:admin
- phone_recording:read
- phone_recording:read:admin
x-granular-scopes:
- phone:read:call_recording
- phone:read:call_recording:admin
/phone/recording_transcript/download/{recordingId}:
get:
tags:
- Recordings
summary: Download a phone recording transcript
description: "Downloads the phone recording transcript. \n\n**Prerequisites**\n\n* A Business or Enterprise account\n* A Zoom Phone license\n\n\n\n**[Scopes](https://developers.zoom.us/docs/integrations/oauth-scopes-overview/):** `phone:read`,`phone:read:admin`,`phone_recording:read`,`phone_recording:read:admin`\n\n**[Granular Scopes](https://developers.zoom.us/docs/integrations/oauth-scopes-overview/):** `phone:read:recording_transcript`,`phone:read:recording_transcript:admin`\n\n**[Rate Limit Label](https://marketplace.zoom.us/docs/api-reference/rate-limits#rate-limits):** `LIGHT`"
operationId: phoneDownloadRecordingTranscript
parameters:
- name: recordingId
in: path
description: The phone recording ID.
required: true
schema:
type: string
example: 8f7345c50a654182ab1672fdb3be61ff
responses:
'302':
description: "**HTTP Status Code:** `302` **OK** \nYou will be redirected to a download URL where you can access the transcript file in JSON format. The file will have a structure similar to the following\n```json\n{\n \"type\": \"zoom_transcript\",\n \"ver\": 1,\n \"recording_id\": \"RECORDING_ID\",\n \"meeting_id\": \"MEETING_ID\",\n \"account_id\": \"ACCOUNT_ID\",\n \"host_id\": \"HOST_ID\",\n \"recording_start\": \"YYYY-MM-DDThh:mm:ssZ\",\n \"recording_end\": \"YYYY-MM-DDThh:mm:ssZ\",\n \"timeline\": [\n {\n \"text\": \"TRANSCRIPTED TEXT APPEARS HERE\",\n \"raw_text\": \"TRANSCRIPTED RAW TEXT APPEARS HERE\",\n \"ts\": \"00:00:00.000\",\n \"end_ts\": \"00:00:00.600\",\n \"users\": [],\n \"userId\": \"USER PHONE EXTENSION NUMBER APPEARS HERE\",\n \"userIds\": [],\n \"channelMark\": \"L\"\n }\n ]\n}\n```"
'400':
description: "**HTTP Status Code:** `400` <br>\n Bad Request \n\n **Error Code:** `404` <br>\n File does not exist.<br> <br>\n**Error Code:** `12000` <br>\n Unable to transcribe this recording.<br> <br>\n**Error Code:** `12001` <br>\n Admin has disabled this transcription.<br> <br>\n**Error Code:** `12002` <br>\n This recording is still in the process of being transcribed. Reopen this recording in a few minutes.<br> <br>\n**Error Code:** `12003` <br>\n Transcripts failed to download. <br>\n"
'429':
description: "**HTTP Status Code:** `429` <br>\n Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rest/rate-limits/). \n\n "
security:
- openapi_oauth:
- phone:read
- phone:read:admin
- phone_recording:read
- phone_recording:read:admin
- phone:read:recording_transcript
- phone:read:recording_transcript:admin
openapi_authorization: []
x-extensions:
x-permissions: []
x-macro-scopes:
- phone:read
- phone:read:admin
- phone_recording:read
- phone_recording:read:admin
x-granular-scopes:
- phone:read:recording_transcript
- phone:read:recording_transcript:admin
/phone/recordings:
get:
tags:
- Recordings
summary: Get call recordings
description: "Returns an account's [call recordings](https://support.zoom.us/hc/en-us/articles/360038521091-Accessing-and-sharing-call-recordings). \n\n**Prerequisites:** \n* A Pro or higher account plan \n * A Zoom Phone license \n * Account owner or admin privileges\n\n**[Scopes](https://developers.zoom.us/docs/integrations/oauth-scopes-overview/):** `phone:read:admin`,`phone_recording:read:admin`\n\n**[Granular Scopes](https://developers.zoom.us/docs/integrations/oauth-scopes-overview/):** `phone:read:list_call_recordings:admin`\n\n**[Rate Limit Label](https://marketplace.zoom.us/docs/api-reference/rate-limits#rate-limits):** `MEDIUM`"
operationId: getPhoneRecordings
parameters:
- name: page_size
in: query
description: "The number of records returned within a single API call. \n\nThe default is **30** and the maximum is **300**."
required: false
schema:
type: integer
example: 30
- name: next_page_token
in: query
description: The current page number of the returned records.
required: false
schema:
type: string
example: cWiI3vTqdcENiV9RJz3Rh8iP1ksNPheW8c1
- name: from
in: query
description: "The start time and date in **yyyy-mm-dd** or **yyyy-MM-dd T HH:mm:ssZ** format. \n\nThe date range defined in the `from` and `to` parameters should be a month as the response only includes one month's worth of data at once. \n\nIf unspecified, it returns data from the past 30 days."
required: false
schema:
type: string
format: date
example: '2021-12-01'
- name: to
in: query
description: "This field is **required** only when the `from` parameter is specified. \n\nThe end time and date display in **yyyy-mm-dd** or **yyyy-MM-dd T HH:mm:ssZ** format, which is the same format as the `from` parameter."
required: false
schema:
type: string
format: date
example: '2021-12-31'
- name: owner_type
in: query
description: "The owner type. \n\nThe allowed values are `null`, `user`, `callQueue`, or `sharedOffice`(deprecated and to be replaced by `commonArea` after the transition period). \n\nThe default value is `null`. If the value is `null`, it returns all owner types."
required: false
schema:
type: string
exa
# --- truncated at 32 KB (98 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/zoom-phone/refs/heads/main/openapi/zoom-phone-recordings-api-openapi.yml