AI Services API
- OpenAPI Version:
3.1.1 - API Version:
2
Servers
- URL:
https://api.zoom.us/v2
Operations
List Vocabularies
- Method:
GET - Path:
/aiservices/assets/vocabularies - Tags: Asset
List the custom vocabularies created for the account.
Rate Limit Label: LIGHT
Parameters
page_size
- In:
query
The maximum number of items returned per page.
integer
next_page_token
- In:
query
The pagination token from the previous response's next_page_token field.
string
Responses
Status: 200 Successfully listed vocabularies, including all ZAS-provided and customer-managed vocabulary assets.
Content-Type: application/json
next_page_tokenstringvocabulariesarray— A list of vocabularies. The maximum number of items per page is 100.Items: languagestring— The language of the custom vocabulary.namestring | null— The name of the vocabulary.vocabulary_idstring— The unique identifier of the custom vocabulary.
Example:
{
"vocabularies": [
{
"vocabulary_id": "acct_vocab_abc123",
"language": "en-US",
"name": "vocabulary name"
}
],
"next_page_token": "eyJqb2JfaWQiOiJqb2JfZGVmNDU2In0"
}Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Create Custom Vocabulary
- Method:
POST - Path:
/aiservices/assets/vocabularies - Tags: Asset
Create a custom vocabulary.
Rate Limit Label: LIGHT
Request Body
Content-Type: application/json
languagestring— The language code. For details, refer to [Abbreviations](https://developers.zoom.us/docs/api/references/abbreviations/).namestring | null— The name of the vocabulary.phrasesarray— A list of phrases used to improve recognition of domain-specific terms, names, and other uncommon vocabulary. This array supports a maximum of 100 items.Items: string
Example:
{
"language": "en-US",
"phrases": [
""
],
"name": "vocabulary name"
}Responses
Status: 201 Custom vocabulary created successfully.
Content-Type: application/json
languagestring— The language of the custom vocabulary.namestring | null— The name of the vocabulary.phrasesarray— The list of phrases in the custom vocabulary. This array supports a maximum of 100 items.Items: stringvocabulary_idstring— The unique identifier of the custom vocabulary.
Example:
{
"vocabulary_id": "acct_vocab_abc123",
"language": "en-US",
"phrases": [
"Acme"
],
"name": "vocabulary name"
}Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 413 **HTTP Status Code:** `413` <br> Payload Too Large
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Get Vocabulary
- Method:
GET - Path:
/aiservices/assets/vocabularies/{vocabularyId} - Tags: Asset
Retrieves a specific custom vocabulary by ID for the account, including its language and complete list of phrases. This API cannot be used to retrieve ZAS-provided vocabulary.
Rate Limit Label: LIGHT
Parameters
vocabularyId required
- In:
path
The unique identifier of the custom vocabulary.
string
Responses
Status: 200 Custom vocabulary retrieved successfully.
Content-Type: application/json
languagestring— The language of the custom vocabulary.namestring | null— The name of the vocabulary.phrasesarray— The list of phrases in the custom vocabulary. The maximum number of items for the array is 100.Items: stringvocabulary_idstring— The unique identifier of the custom vocabulary.
Example:
{
"vocabulary_id": "acct_vocab_abc123",
"language": "en-US",
"phrases": [
"Acme"
],
"name": "vocabulary name"
}Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Delete Vocabulary
- Method:
DELETE - Path:
/aiservices/assets/vocabularies/{vocabularyId} - Tags: Asset
Delete a specified custom vocabulary.
Rate Limit Label: LIGHT
Parameters
vocabularyId required
- In:
path
The unique identifier of the custom vocabulary.
string
Responses
Status: 204 Vocabulary deleted successfully.
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized.
Status: 403 **HTTP Status Code:** `403` <br> Forbidden.
Status: 404 **HTTP Status Code:** `404` <br> Not Found.
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error.
Evaluate decision questions
- Method:
POST - Path:
/aiservices/decisions/decide - Tags: Decisions
Evaluates typed questions independently against the same input and returns one ordered answer per question.
Dependent questions require separate requests.
Authenticate with a Decisions-enabled API key in the x-api-key request header. A Zoom AI Services or Universal SDK entitlement is required.
ZOAP authenticates requests, and backend services enforce authorization. Requests exceeding supported limits are rejected before inference. Account-level rate limits and workload quotas apply.
Invalid model output is not returned as a valid decision result.
Granular Scopes: aiservices:write:decide:admin
Rate Limit Label: LIGHT
Not supported in Gov cluster
Request Body
Content-Type: application/json
input(required)object— Shared input evaluated against every question: text or one or more user messages.questions(required)array— One to ten independent typed questions. Names must be unique within this request.Items: One of: instructions(required)string— Instructions describing the decision to make. Input must not override service-level instructions or guardrails.name(required)string— Caller-defined question name. Names must be unique within this request; the corresponding answer echoes the name.type(required)string, possible values:"predicate"— The decision question type.
choices(required)array— Between 2 and 255 allowed choices. Choice values, including booleans, must be unique within this question.Items: value(required)object— A string or boolean choice value. Values must be unique within a question.descriptionstring— Optional guidance describing when this choice applies.
instructions(required)string— Instructions describing the decision to make. Input must not override service-level instructions or guardrails.name(required)string— Caller-defined question name. Names must be unique within this request; the corresponding answer echoes the name.type(required)string, possible values:"choice"— The decision question type.
instructions(required)string— Instructions describing the decision to make. Input must not override service-level instructions or guardrails.levels(required)array— Between 2 and 10 ordered scoring levels, indexed from zero.Items: label(required)string— Human-readable level name.descriptionstring— Optional guidance describing the level.
name(required)string— Caller-defined question name. Names must be unique within this request; the corresponding answer echoes the name.type(required)string, possible values:"score"— The decision question type.
enable_image_inputboolean, default:false— Optional. Defaults to `false`. Set to `true` to opt in to image input when the input contains an `input_image`.modelstring, possible values:"zoom-decisions", "zoom-decisions-pro", default:"zoom-decisions"— Optional decision model ID. Currently supported IDs are `zoom-decisions` and `zoom-decisions-pro`. When omitted, the service uses `zoom-decisions`. Image input is opt-in: set `enable_image_input` to `true`. Selecting `zoom-decisions-pro` does not require additional entitlement.reference_idstring— Optional caller-provided correlation and tracing identifier.
Example:
{
"input": "The package arrived with a torn box.",
"questions": [
{
"type": "predicate",
"name": "damaged",
"instructions": "Is the package visibly damaged?"
}
]
}Responses
Status: 200 Structured answers and metered usage.
Content-Type: application/json
answers(required)array— Answers in the same order as the submitted questions.Items: One of: name(required)string— Caller-defined question name echoed from the request.probability(required)number— Estimated probability that the condition is true.type(required)string, possible values:"predicate"— The decision answer type.
choice(required)object— The selected string or boolean choice value.name(required)string— Caller-defined question name echoed from the request.probabilities(required)array— Probability distribution over all submitted choices. Values correspond to the request. Probabilities sum to one, subject to numeric precision.Items: probability(required)number— The probability of this choice, from zero to one.value(required)object— The string or boolean choice value from the request.
type(required)string, possible values:"choice"— The decision answer type.
name(required)string— Caller-defined question name echoed from the request.probabilities(required)array— Probability distribution over all submitted levels. Values correspond to the request. Probabilities sum to one, subject to numeric precision.Items: probability(required)number— The probability of this level, from zero to one.value(required)integer— Zero-based index of the level in the submitted levels array.
score(required)number— Probability-weighted average of the zero-based level indices. The value may be fractional and is bounded above by the number of submitted levels minus one.type(required)string, possible values:"score"— The decision answer type.
name(required)string— Caller-defined question name echoed from the request.type(required)string, possible values:"refusal"— The decision answer type.
model(required)string, possible values:"zoom-decisions", "zoom-decisions-pro"— Model ID used to process the request. The underlying model implementation may change while preserving the public API contract.request_id(required)string— Unique request identifier for tracing and support.usage(required)object— Usage information for the request. Input usage is measured in tokens; output_units is the number of submitted questions. Optional details may include cached input tokens.input_units(required)integer— Model input usage processed for the request.output_units(required)integer— Number of questions submitted in the request.unit_type(required)string— Unit used for input_units. output_units reports the number of questions in the request.detailsobject— Optional usage breakdown, which may include cached input token usage.cached_input_tokensinteger— Cached input token usage, when reported.
Example:
{
"answers": [
{
"type": "predicate",
"name": "damaged",
"probability": 0.9964802288772219
}
],
"model": "zoom-decisions",
"request_id": "req_test_case_predicate",
"usage": {
"input_units": 96,
"output_units": 1,
"unit_type": "tokens",
"details": {}
}
}Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized Unauthorized. The observed test response indicates that the supplied access token was invalid. **Error Code:** `124` <br> Invalid Access token <br>
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 409 **HTTP Status Code:** `409` <br> Conflict
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. A `Retry-After` header is returned when applicable. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
List Batch Jobs
- Method:
GET - Path:
/aiservices/scribe/jobs - Tags: Scribe
Retrieves a paginated list of batch transcription jobs for the authenticated tenant.
Granular Scopes: aiservices:read:list_scribe_batch_jobs:admin
Rate Limit Label: LIGHT
Parameters
state
- In:
query
This field filters jobs by processing state. Omit to return jobs in all states.
string, possible values: "QUEUED", "PROCESSING", "SUCCEEDED", "PARTIAL", "FAILED", "CANCELED"
page_size
- In:
query
The maximum number of jobs to return per page.
integer, format: int32, default: 50
next_page_token
- In:
query
The pagination token from the previous response's next_page_tokenfield.
string
Responses
Status: 200 Jobs listed successfully
Content-Type: application/json
jobs(required)array— The list of batch jobs.Items: job_id(required)string— The job identifier.state(required)string, possible values:"QUEUED", "PROCESSING", "SUCCEEDED", "PARTIAL", "FAILED", "CANCELED"— The overall job processing state.submitted_at(required)string, format:date-time— The job submission timestamp.configobject— The ASR configuration.channel_separationboolean, default:false— Whether to transcribe stereo channels separately.diarizationboolean— Whether to enable stretch or premium feature for speaker diarization.languagestring— The language code. See following page for details: https://developers.zoom.us/docs/api/references/abbreviations/output_formatstring— The output format (default json). Reserved for future (srt/vtt).profanity_filterboolean— Whether to enable profanity filtering.timestampsboolean, default:true— The include segment-level timestamps.word_time_offsetsboolean, default:false— The include word-level timestamps.
errorobject | null— Job-level error (only when state=FAILED).codestring— The error code indicating the failure reason.detailsobject— Additional error context and details.messagestring— The human-readable error message.
inputobject— The input configuration.modestring, possible values:"SINGLE", "INPUT_PREFIX", "MANIFEST"— The input mode specifying how files are provided.sourcestring, possible values:"S3"— The storage provider where input files are located.uristring— The URI path to input files or manifest.
outputobject— The output configuration.destinationstring, possible values:"S3"— The storage provider for output transcripts.layoutstring, possible values:"ADJACENT", "PREFIX"— The output file organization pattern.uristring— The URI path where transcripts will be written.
summaryobject— The job progress summary.canceledinteger— The number of files canceled by user request.failedinteger— The number of files that failed processing.processinginteger— The number of files currently being processed.queuedinteger— The number of files waiting in the queue.skippedinteger— The number of files skipped due to filters or errors.succeededinteger— The number of successfully processed files.total_filesinteger— The total number of files in the job.
next_page_tokenstring— The pagination token for fetching next page of results. Empty if no more results.
Example:
{
"jobs": [
{
"job_id": "job_abc123",
"state": "PROCESSING",
"submitted_at": "2026-01-05T18:34:12Z",
"input": {
"mode": "INPUT_PREFIX",
"source": "S3",
"uri": "s3://acme-bucket/audio/"
},
"output": {
"destination": "S3",
"uri": "s3://acme-bucket/transcripts/",
"layout": "PREFIX"
},
"config": {
"language": "en-US",
"timestamps": true,
"word_time_offsets": false,
"channel_separation": false,
"diarization": false,
"profanity_filter": false,
"output_format": "json"
},
"summary": {
"total_files": 2487,
"queued": 0,
"processing": 23,
"succeeded": 2450,
"failed": 14,
"skipped": 0,
"canceled": 0
},
"error": {
"code": "INVALID_CREDENTIALS",
"message": "AWS credentials expired",
"details": {
"additionalProperty": ""
}
}
}
],
"next_page_token": "eyJqb2JfaWQiOiJqb2JfZGVmNDU2In0"
}Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Submit Batch Scribe Job
- Method:
POST - Path:
/aiservices/scribe/jobs - Tags: Scribe
Submits a batch transcription job for asynchronous processing.
Supports three input modes: single file (mode inferred when uri points to single file), prefix/container enumeration (with optional filters), or explicit manifest (list of URIs).
Maximum of 1000 files per manifest.
Granular Scopes: aiservices:write:scribe_batch_job:admin
Rate Limit Label: LIGHT
Request Body
Content-Type: application/json
config(required)object— The ASR transcription configuration.channel_separationboolean, default:false— Whether to transcribe stereo channels separately.diarizationboolean— The stretch or premium feature for speaker diarization.languagestring— The language code. See following page for details: https://developers.zoom.us/docs/api/references/abbreviations/language_detectionobject— Zoom Scribe supports optional automatic language detection through `config.language_detection`.candidate_languagesarray | null, default:["en-US"]— An optional set of languages to consider during language detection.modestring, possible values:"once", "continuous", default:"continuous"— The language detection mode. Supported values are `once` and `continuous`.
modelstring | null— The optional model selection.output_formatstring— The output format. The default is JSON. Reserved for future (srt/vtt).profanity_filterboolean— Whether to enable profanity filtering.segmentation_modestring, possible values:"auto", "none"— The VAD option. The default value is 'auto'. auto: use default VAD behavior, none: disable VAD segmentation.vocabularyobject— The vocabulary used to customize speech recognition for the current request. This field takes higher precedence over `vocabulary_id` if both are present.phrasesarray— A list of phrases used for ephemeral vocabulary.Items: string— A phrase used for ephemeral vocabulary.
vocabulary_idstring— A reference to an immutable vocabulary asset used to customize speech recognition.word_time_offsetsboolean, default:false— The include word-level timestamps.
input(required)object— The input source configuration. Either 'uri' (for single/prefix modes) or 'manifest' (for manifest mode) must be provided.source(required)string, possible values:"S3"— The storage provider.authobject— The authentication credentials for the input source.awsobject— The AWS credentials for S3 access. Required when source is 's3' and URIs are not pre-signed. Use session tokens for enhanced security.access_key_id(required)string— The AWS access key ID.secret_access_key(required)string— The AWS secret access key.session_token(required)string— The AWS session token for temporary credentials (recommended for security).
filtersobject— The file filtering options for prefix mode. Use glob patterns to include/exclude files from processing.exclude_globsarray— The exclude files that match the glob patterns. Applied after include_globs.Items: stringinclude_globsarray— The include only files that match the glob patterns. Supports wildcards: * (any chars), ** (recursive), ? (single char). Applied first.Items: string
manifestarray— The explicit list of file URIs for manifest mode. Each URI can include SAS tokens or signed URLs. Required when mode is 'manifest'. Maximum 1000 files per batch job.Items: string, format:urimodestring, possible values:"SINGLE", "PREFIX", "MANIFEST"— The input processing mode. Optional - can be inferred: 'SINGLE' if uri points to single file, 'PREFIX' if uri is directory/prefix, 'MANIFEST' if manifest array provided.uristring, format:uri— The S3 URI Blob URL for single file or prefix/container. Required for single and prefix modes.
output(required)object— The output destination configuration.destination(required)string, possible values:"S3"— The output storage provider.uri(required)string, format:uri— The output base URI for a single transcript file or a path for multiple transcript files.authobject— The authentication credentials for the output destination.awsobject— The AWS credentials for S3 access. Required when source is 's3' and URIs are not pre-signed. Use session tokens for enhanced security.access_key_id(required)string— The AWS access key ID.secret_access_key(required)string— The AWS secret access key.session_token(required)string— The AWS session token for temporary credentials (recommended for security).
layoutstring, possible values:"SINGLE", "PREFIX", "ADJACENT"— The output file layout strategy. 'SINGLE': use 'uri' for output file (single file mode). 'PREFIX': use output uri as base directory. 'ADJACENT': place output next to input file (same directory).
notificationsobject— The webhook notification settings for job status updates.webhook_url(required)string, format:uri— The HTTPS webhook URL for job status notifications. It will receive POST requests on job state changes.secretstring— The HMAC secret for webhook signature verification. Used to sign notification payloads.
outputsobject— The optional output configuration for the transcription. This plural `outputs` object is separate from the singular `output` storage destination.text_polishingobject— The text polishing configuration.enabledboolean, default:false— Whether to return polished text under `outputs.text_polishing.text`. Text polishing must support the requested locale.
reference_idstring— The customer-provided reference ID for tracking and correlation.
Example:
{
"input": {
"mode": "PREFIX",
"source": "S3",
"uri": "s3://acme-bucket/audio/2025/11/",
"manifest": [
"https://acct.blob.core.windows.net/audio/a1.mp3?sv=...sig=...",
"https://acct.blob.core.windows.net/audio/a2.wav?sv=...sig=..."
],
"filters": {
"include_globs": [
"**/*.wav",
"**/*.mp3"
],
"exclude_globs": [
"**/tmp/**",
"*_draft.*"
]
},
"auth": {
"aws": {
"access_key_id": "AKIAIOSFODNN7EXAMPLE",
"secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"session_token": "FwoGZXIvYXdzE..."
}
}
},
"output": {
"destination": "S3",
"uri": "s3://acme-bucket/transcripts/2025/11/",
"layout": "PREFIX",
"auth": {
"aws": {
"access_key_id": "AKIAIOSFODNN7EXAMPLE",
"secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"session_token": "FwoGZXIvYXdzE..."
}
}
},
"config": {
"language": "en-US",
"word_time_offsets": false,
"channel_separation": false,
"diarization": false,
"profanity_filter": false,
"language_detection": {
"mode": "continuous",
"candidate_languages": [
"en-US"
]
},
"output_format": "json",
"segmentation_mode": "auto",
"model": "zoom-scribe-en",
"vocabulary": {
"phrases": [
"ace"
]
},
"vocabulary_id": "acct_vocab_abc123"
},
"outputs": {
"text_polishing": {
"enabled": false
}
},
"reference_id": "import-2025-11",
"notifications": {
"webhook_url": "https://example.com/hooks/scribe",
"secret": "hmac-secret"
}
}Responses
Status: 201 Job submitted successfully and queued for processing.
Content-Type: application/json
job_id(required)string— The unique job identifier for tracking and status queries.state(required)string, possible values:"QUEUED", "PROCESSING", "SUCCEEDED", "PARTIAL", "FAILED", "CANCELED"— The initial job state (typically 'QUEUED').submitted_at(required)string, format:date-time— The job submission timestamp in ISO 8601 format.
Example:
{
"job_id": "job_abc123",
"state": "QUEUED",
"submitted_at": "2026-01-05T18:34:12Z"
}Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 415 **HTTP Status Code:** `415` <br> Unsupported Media Type
Status: 422 **HTTP Status Code:** `422` <br> Unprocessable Entity
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Get Batch Job Status
- Method:
GET - Path:
/aiservices/scribe/jobs/{jobId} - Tags: Scribe
Retrieves job-level summary for a batch transcription job.
Returns overall job state and progress statistics. Use GET /ai/scribe/jobs/{jobId}/files to retrieve per-file status with pagination.
Granular Scopes: aiservices:read:scribe_batch_job:admin
Rate Limit Label: LIGHT
Parameters
jobId required
- In:
path
The unique identifier for the batch transcription job.
string
Responses
Status: 200 Job status retrieved successfully
Content-Type: application/json
job_id(required)string— The job identifier.state(required)string, possible values:"QUEUED", "PROCESSING", "SUCCEEDED", "PARTIAL", "FAILED", "CANCELED"— The overall job processing state. PARTIAL indicates some files succeeded while others failed.submitted_at(required)string, format:date-time— The job submission timestamp in ISO 8601 format.summary(required)object— The aggregated job progress statistics.failed(required)integer— The files that failed processing.processing(required)integer— The files currently being processed.queued(required)integer— The files waiting in the queue.skipped(required)integer— The files that are skipped due to filters or errors.succeeded(required)integer— The successfully processed files.total_files(required)integer— The total number of files in job.
Example:
{
"job_id": "job_abc123",
"state": "PARTIAL",
"submitted_at": "2026-01-05T18:34:12Z",
"summary": {
"total_files": 2487,
"queued": 0,
"processing": 23,
"succeeded": 2450,
"failed": 14,
"skipped": 0
}
}Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Cancel Batch Job
- Method:
DELETE - Path:
/aiservices/scribe/jobs/{jobId} - Tags: Scribe
Cancels a batch transcription job.
Only jobs in QUEUED or PROCESSING state can be canceled.
Successfully canceled jobs transition to CANCELED state. Jobs that are already COMPLETED, FAILED, or CANCELED cannot be canceled.
Granular Scopes: aiservices:delete:scribe_batch_job:admin
Rate Limit Label: LIGHT
Parameters
jobId required
- In:
path
The unique identifier for the batch transcription job.
string
Responses
Status: 204 Job canceled successfully. No content returned. For details of job use get job status API.
Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
List Batch Job Files
- Method:
GET - Path:
/aiservices/scribe/jobs/{jobId}/files - Tags: Scribe
Retrieves per-file processing status for a batch transcription job.
Use page_size and next_page_token for pagination.
Granular Scopes: aiservices:read:list_scribe_batch_job_files:admin
Rate Limit Label: LIGHT
Parameters
jobId required
- In:
path
The unique identifier for the batch transcription job.
string
page_size
- In:
query
The maximum number of files to return per page.
integer, format: int32, default: 200
next_page_token
- In:
query
The pagination token from the previous response's next_page_token field.
string
Responses
Status: 200 Job files listed successfully.
Content-Type: application/json
files(required)array— The per-file processing status results for the job.Items: file_id(required)string— The unique file identifier within the job.input_uri(required)string— The source audio file URI.output_uri(required)string— The transcript output URI. Null if file failed or not yet processed.state(required)string, possible values:"FILE_QUEUED", "FILE_PROCESSING", "FILE_SUCCEEDED", "FILE_FAILED", "FILE_CANCELED", "FILE_SKIPPED"— The current processing state of this file.duration_secnumber— The audio duration in seconds (if successfully analyzed).errorobject | null— The error details (only present when state=FAILED).code(required)string— The error code indicating the failure reason.message(required)string— The human-readable error description.
next_page_tokenstring— The pagination token for fetching the next page of results. Empty if no more results.
Example:
{
"files": [
{
"file_id": "f_001",
"input_uri": "s3://acme-bucket/audio/2025/11/call_0001.wav",
"state": "FILE_SUCCEEDED",
"output_uri": "s3://acme-bucket/transcripts/2025/11/call_0001.json",
"duration_sec": 3520.2,
"error": {
"code": "UNSUPPORTED_MEDIA",
"message": "OGG not enabled for MVP"
}
}
],
"next_page_token": "eyJ0YXNrX2lkIjoidGFza18wMDIifQ"
}Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Get Batch Scribe Job File
- Method:
GET - Path:
/aiservices/scribe/jobs/{jobId}/files/{fileId} - Tags: Scribe
Retrieves the processing result for a specific file within a batch Scribe transcription job.
Granular Scopes: aiservices:read:scribe_batch_job_file:admin
Rate Limit Label: LIGHT
Parameters
jobId required
- In:
path
The unique identifier of the batch Scribe job.
string
fileId required
- In:
path
The unique identifier of the file within the job.
string
Responses
Status: 200 File result retrieved successfully.
Content-Type: application/json
file_id(required)string— The unique file identifier within the job.input_uri(required)string— The source audio file URI.state(required)string, possible values:"FILE_QUEUED", "FILE_PROCESSING", "FILE_SUCCEEDED", "FILE_FAILED", "FILE_CANCELED", "FILE_SKIPPED"— The current processing state of this file.duration_secnumber | null, format:double— The duration of the audio file in seconds. Present only when state is `FILE_SUCCEEDED`.errorobject | null— The error details. Only present when state is `FILE_FAILED`.codestring— The error code indicating the failure reason.detailsobject— Additional error context.messagestring— A human-readable error description.
output_uristring | null— The URI of the transcription result file. Null if not yet processed or failed.
Example:
{
"file_id": "f_001",
"input_uri": "s3://acme-bucket/audio/2025/11/meeting_001.mp3",
"state": "FILE_SUCCEEDED",
"output_uri": "s3://acme-bucket/transcripts/2025/11/meeting_001.json",
"duration_sec": 183.5,
"error": {
"code": "UNSUPPORTED_CONTENT_TYPE",
"message": "Content type application/pdf is not supported for transcription",
"details": {
"additionalProperty": ""
}
}
}Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Live Scribe WebSocket
- Method:
GET - Path:
/aiservices/scribe/live - Tags: Scribe
The Live API converts speech to text in real time over a WebSocket connection. Your application streams audio to the service and receives transcription events as people speak, so you can show captions or transcripts without waiting for the recording to finish.
Key features
- Real-time results: Partial results appear while a speaker is still talking, and final results follow when each utterance ends.
- Timing and turn tracking: Every event includes start and end times and an identifier for its utterance, so you can align partial and final results.
- Session configuration: Set the language, voice activity detection, transcription options, and custom vocabulary when you start a session.
- Custom vocabulary: Provide names, product terms, or other domain words to improve recognition accuracy. You can pass them inline for one session or reference a saved vocabulary by its ID. Use one or the other, not both.
- Optional text polishing: Remove filler words, false starts, and mid-sentence cuts from the transcript. The original transcript is still available if you need it.
Granular Scopes: aiservices:write:live_transcribe:admin
Rate Limit Label: LIGHT
Parameters
Sec-WebSocket-Protocol required
- In:
header
WebSocket subprotocol requested by the client.
string, possible values: "live-asr"
Responses
Status: 101 WebSocket upgrade accepted. The connection switches to the WebSocket protocol and uses the frame contract described in `x-websocket`.
Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 426 **HTTP Status Code:** `426` <br> Upgrade Required
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Status: 503 **HTTP Status Code:** `503` <br> Service Unavailable
Scribe (Synchronous)
- Method:
POST - Path:
/aiservices/scribe/transcribe - Tags: Scribe
Uploads a single audio file and receive transcript inline. Synchronous operation response returns immediately after the transcription completes.
Maximum file size: 100MB. Maximum duration: 2 hours.
Granular Scopes: aiservices:write:transcribe:admin
Rate Limit Label: LIGHT
Request Body
Content-Type: application/json
config(required)object— The ASR configuration options.channel_separationboolean, default:false— Whether to transcribe stereo channels separately.diarizationboolean— A stretch/premium feature for speaker diarization.languagestring— The language code. For details, see the [Abbreviations page](https://developers.zoom.us/docs/api/references/abbreviations/).language_detectionobject— The optional automatic language detection configuration.candidate_languagesarray | null, default:["en-US"]— An optional set of languages to consider during language detection.modestring, possible values:"once", "continuous", default:"continuous"— The language detection mode. Supported values are `once` and `continuous`.
modelstring | null— The optional model selection.output_formatstring— The output format. The default value is `json`. Reserved for future use (`srt`/`vtt`).profanity_filterboolean— Whether to enable profanity filtering.timestampsboolean, default:true— Whether to include segment-level timestamps.vocabularyobject— The vocabulary used to customize speech recognition for the current request. This field takes higher precedence over the vocabulary ID if both are present.phrasesarray— A list of phrases used for ephemeral vocabulary.Items: string— A phrase used for ephemeral vocabulary.
vocabulary_idstring— A reference to an immutable vocabulary asset used to customize speech recognition.word_time_offsetsboolean, default:false— Whether to include word-level timestamps.
file(required)string— The audio file to transcribe. Supported formats: wav, mp3, m4a, flac, ogg, webm, mp4, mov. Max size: 100MB. Max duration: 2 hours.outputsobject— The optional output configuration for the transcription.text_polishingobject— The text polishing configuration.enabledboolean, default:false— Whether to return polished text under `outputs.text_polishing.text`. Text polishing must support the requested locale.
Example:
{
"file": "Vm0wd2QyUXlVWGxWV0d4WFlURndVRlpzWkZOWFZsbDNXa2M1V0Zac2JETlhhMUpUVmpGS2MySkVUbGhoTWsweFZtcEtTMUl5U2tWVWJHaG9UVlZ3VlZadGNFdFRNVTVJVm10a1dHSkdjRTlaVjNSR1pVWmFkR05GWkZwV01VcEpWbTEwVjFWdFNsWlhiR2hYWWxob2VsUlVSbUZrUjA1R1drWlNUbUpGY0VwV2JURXdWakZXZEZOclpGaGlSMmhoV1ZSR1lVMHhXbk5YYlhSWFRWaENTbGt3WkRSVk1rcElaSHBHVjJFeVVYZFpla3BIVmpGT2RWVnNXbWxTTW1oWFZtMTBWMlF5VW5OWGEyUllZbFZhY1ZSV1duZE5SbFowWlVkMFZXSkdjREZWVjNodlZqRktjMk5HYUZkaGEzQklWVEJhWVdSV1NuTlRiR1JUVFRBd01RPT0=",
"config": {
"language": "en-US",
"timestamps": true,
"word_time_offsets": false,
"channel_separation": false,
"diarization": false,
"profanity_filter": false,
"language_detection": {
"mode": "continuous",
"candidate_languages": [
"en-US"
]
},
"output_format": "json",
"model": "zoom-scribe-en",
"vocabulary": {
"phrases": [
"ace"
]
},
"vocabulary_id": "acct_vocab_abc123"
},
"outputs": {
"text_polishing": {
"enabled": false
}
}
}Responses
Status: 200 Transcription completed successfully
Content-Type: application/json
duration_sec(required)number— The audio duration in seconds.request_id(required)string— The unique request identifier.result(required)object— Transcription result object containing text and optional timing or speaker data.text_display(required)string— The formatted display text with punctuation and capitalization.segmentsarray— The transcript segments with timing information. Only present when timestamps=true in config.Items: text(required)string— The segment text.channelinteger, format:int32— The audio channel identifier for this segment.endnumber— The segment end time in seconds.speakerstring— The speaker tag (e.g., 'speaker_1', 'speaker_2'). Only present when diarization=true in config.startnumber— The segment start time in seconds.wordsarray— The word-level data with timing. Only present when `word_time_offsets=true` in config.Items: word(required)string— The word text.endnumber— The word end time in seconds.startnumber— The word start time in seconds.
modelstring— The ASR model identifier for transcription.outputsobject— Optional generated outputs.text_polishingobject— Present when `outputs.text_polishing.enabled` is set to `true`.text(required)string— The polished text of the full transcription. Optionally includes a speaker tag `[Speaker 1]` or channel tag `[channel0]` when `diarization` or `channel_separation` is set to `true`.
Example:
{
"request_id": "req_123",
"duration_sec": 27.4,
"result": {
"text_display": "Hello and welcome to the meeting...",
"segments": [
{
"start": 0,
"end": 3.24,
"text": "Hello and welcome...",
"channel": 0,
"speaker": "speaker_1",
"words": [
{
"word": "Hello",
"start": 0,
"end": 0.2
}
]
}
]
},
"model": "zoom-asr-en-v1",
"outputs": {
"text_polishing": {
"text": "Hello, and welcome to the meeting. "
}
}
}Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 413 **HTTP Status Code:** `413` <br> Payload Too Large
Status: 415 **HTTP Status Code:** `415` <br> Unsupported Media Type
Status: 422 **HTTP Status Code:** `422` <br> Unprocessable Entity
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Summarize (Synchronous)
- Method:
POST - Path:
/aiservices/speech-summarization/summarize - Tags: Speech Summarization
Provides speech-to-text transcription and AI-powered summarization in a single streaming request using Server-Sent Events (SSE).
Flow:
- transcribe_started - Transcription begins.
- transcribe_complete - Full transcript available.
- summary_delta - Streaming summary output (multiple events).
- done - Processing complete.
- error - If any failure occurs.
Supported Formats: WAV, MP3, M4A, FLAC, OGG, WebM, MP4, MOV Max File Size: 50 MB Max Duration: 2 hours
Response Events:
transcribe_started:
event: transcribe_started
data: {"status":"transcribing"}
transcribe_complete:
event: transcribe_complete
data: {
"transcript": {...},
"latency_ms": 5234,
"body_bytes": 12456,
"status_code": 200
}
summary_delta (multiple):
event: summary_delta
data: {
"summary": "## Meeting Summary
Content...",
"metadata": {}
}
Note: Each event contains the complete accumulated text.
done:
event: done
data: {
"status": "complete",
"total_latency_ms": 8500,
"transcribe_ms": 5234,
"summary_ms": 3266
}
error:
event: error
data: {
"error": "error message",
"stage": "transcribe|summary|summary_preparation"
}
Granular Scopes: aiservices:write:transcribe-summarize:admin
Rate Limit Label: LIGHT
Request Body
Content-Type: multipart/form-data
file(required)string— The audio or video file to process. **Supported formats:** - Audio: WAV, MP3, M4A, FLAC, OGG, WebM - Video: MP4, MOV **Requirements:** - Maximum file size: 50 MB - Maximum duration: 2 hours - Sample rate: ≥8 kHz (16 kHz or higher recommended) - Channels: Mono or stereoconfigobject— Configuration for the transcription and summarization parameters.summaryobject— Summary generation configuration options.citationsboolean, default:true— Whether to include citations linking summary content back to the transcript.custom_templatestring, default:""— Custom template for the summary in Markdown format.enable_dynamic_templateboolean, default:true— Whether to allow dynamic template selection instead of a fixed `template_id`.languagestring, default:"en-US"— The language code for the generated summary.pii_redactionboolean, default:false— Whether to redact personally identifiable information (PII) from the summary.should_remove_sentimentboolean, default:false— Whether to remove sentiment-related language from the summary.summary_lengthstring, possible values:"short", "long", default:"short"— The desired length of the generated summary.template_idstring, possible values:"one_on_one", "stand_up", "brainstorm", "project_update", "discussion", "q_a", "customer_success", "user_feedback", "lecture_summary", "next_steps"— The summary template to use.
transcribeobject— Transcription (ASR) configuration options.channel_separationboolean, default:false— Whether to transcribe stereo channels separately.diarizationboolean, default:false— Whether to enable speaker diarization.languagestring, default:"en-US"— The language code. See the [Zoom abbreviations](https://developers.zoom.us/docs/api/references/abbreviations/) page for details.modelstring, possible values:"zoom-scribe-en", default:"zoom-scribe-en"— The ASR model identifier to use for transcription.output_formatstring, possible values:"json", default:"json"— The transcript output format.profanity_filterboolean, default:false— Whether to enable profanity filtering.word_time_offsetsboolean, default:false— Whether to include word-level timestamps in the transcript.
Example:
{
"config": {
"transcribe": {
"language": "en-US",
"model": "zoom-scribe-en",
"word_time_offsets": false,
"channel_separation": false,
"diarization": false,
"profanity_filter": false,
"output_format": "json"
},
"summary": {
"language": "en-US",
"template_id": "one_on_one",
"summary_length": "short",
"citations": true,
"should_remove_sentiment": false,
"pii_redaction": false,
"enable_dynamic_template": true,
"custom_template": "## Overview\nMaya and Jordan reviewed progress on the onboarding project, discussed workload, and agreed on a focused development goal for the next month.\n\n## Highlights\n- The onboarding checklist is ready for a pilot with two customer teams.\n- Jordan enjoys customer interviews but needs more uninterrupted time to act on feedback.\n- Maya will help prioritize requests so the team can focus on the pilot.\n\n## Feedback and growth\nJordan's customer research has made the setup flow clearer. The next growth goal is to lead a project review and practice presenting recommendations to stakeholders.\n\n## Next steps\n- **Jordan:** Share the pilot plan by Thursday.\n- **Maya:** Confirm priorities with the product team by Friday.\n- **Together:** Review pilot feedback at the next one-on-one.\n\n## Follow-up topics\nCheck whether the new focus blocks reduce interruptions and discuss opportunities to lead the next review."
}
},
"file": "[Audio data]"
}Responses
Status: 200 Streaming SSE response with multiple event types. See the endpoint description for event details.
Content-Type: application/json
Example:
{}Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 405 **HTTP Status Code:** `405` <br> Method Not Allowed The request method is not allowed. Use POST.
Status: 413 **HTTP Status Code:** `413` <br> Payload Too Large The file exceeds the 50 MB size limit.
Status: 415 **HTTP Status Code:** `415` <br> Unsupported Media Type
Status: 422 **HTTP Status Code:** `422` <br> Unprocessable Entity
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Status: 502 **HTTP Status Code:** `502` <br> Bad Gateway A transcription or summary service error occurred.
Status: 503 **HTTP Status Code:** `503` <br> Service Unavailable The summary API is not configured.
List Batch Summarizer Jobs
- Method:
GET - Path:
/aiservices/summarizer/jobs - Tags: Summarizer
Retrieves a paginated list of batch summarization jobs for the authenticated tenant.
Granular Scopes: aiservices:read:list_summarizer_batch_jobs:admin
Rate Limit Label: LIGHT
Parameters
state
- In:
query
Filter jobs by processing state. Omit to return jobs in all states.
string, possible values: "QUEUED", "PROCESSING", "SUCCEEDED", "PARTIAL", "FAILED", "CANCELED"
page_size
- In:
query
The maximum number of jobs to return per page.
integer, format: int32, default: 50
next_page_token
- In:
query
The pagination token from the previous response's next_page_token field.
string
Responses
Status: 200 Jobs listed successfully.
Content-Type: application/json
jobs(required)array— List of batch summarization jobs.Items: job_id(required)string— The job identifier.state(required)string, possible values:"QUEUED", "PROCESSING", "SUCCEEDED", "PARTIAL", "FAILED", "CANCELED"— The overall job processing state.submitted_at(required)string, format:date-time— The job submission timestamp in ISO 8601 format.configobject— The summarization configuration.languagestring— The output language ISO locale code. Supported values: `en-US`, `zh-CN`, `zh-Hans`, `ja-JP`, `es-ES`, `fr-FR`, `de-DE`, `pt-PT`, `pt-BR`, `it-IT`, `ar-SA`, `ar-AE`.output_formatstring, possible values:"text"— The output format. Defaults to `text`. Currently only `text` is supported.summary_typestring, possible values:"CONVERSATION", default:"CONVERSATION"— The type of content being summarized. Defaults to `CONVERSATION`.taskstring, possible values:"full_summary", "recap", "action_items", "summary"— The summarization task type. Defaults to `full_summary` if not specified. Accepted values are `full_summary`, `recap`, `action_items`, and `summary`.
errorobject | null— The job-level error. Only present when state is `FAILED`.codestring— The error code indicating the failure reason.messagestring— A human-readable error message.
inputobject— The input configuration.modestring, possible values:"SINGLE", "PREFIX", "MANIFEST"— The input mode.sourcestring, possible values:"S3"— The storage provider.uristring— The URI path to input files.
outputobject— The output configuration.destinationstring, possible values:"S3"— The output storage provider.layoutstring, possible values:"ADJACENT", "PREFIX"— The output file layout strategy.uristring— The URI path where summaries are written.
summaryobject— The job progress summary.canceledinteger— The number of files canceled by user request.failedinteger— The number of files that failed processing.processinginteger— The number of files currently being processed.queuedinteger— The number of files waiting in the queue.skippedinteger— The number of files skipped due to filters or limits.succeededinteger— The number of successfully processed files.total_filesinteger— The total number of files in the job.
usageobject | null— The aggregate character usage for this job. Null until at least one file has been processed.input_unitsnumber— The total input characters processed across all succeeded files.output_unitsnumber— The total output characters generated across all succeeded files.unit_typestring— The unit of measurement for billing.
next_page_tokenstring— The pagination token for fetching the next page. Empty if no more results.
Example:
{
"jobs": [
{
"job_id": "job_abc123",
"state": "PROCESSING",
"submitted_at": "2026-01-05T18:34:12Z",
"input": {
"mode": "PREFIX",
"source": "S3",
"uri": "s3://acme-bucket/transcripts/"
},
"output": {
"destination": "S3",
"uri": "s3://acme-bucket/summaries/",
"layout": "PREFIX"
},
"config": {
"summary_type": "CONVERSATION",
"task": "full_summary",
"language": "en-US",
"output_format": "text"
},
"summary": {
"total_files": 2487,
"queued": 0,
"processing": 23,
"succeeded": 2450,
"failed": 14,
"skipped": 0,
"canceled": 0
},
"error": {
"code": "INVALID_CREDENTIALS",
"message": "AWS credentials expired"
},
"usage": {
"input_units": 985430,
"output_units": 62140,
"unit_type": "characters"
}
}
],
"next_page_token": "eyJqb2JfaWQiOiJqb2JfZGVmNDU2In0"
}Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Submit Batch Summarizer Job
- Method:
POST - Path:
/aiservices/summarizer/jobs - Tags: Summarizer
Submits a batch summarization job for asynchronous processing.
Supports three input modes: single file (mode inferred when the URI points to a single file), prefix or container enumeration (with optional filters), or explicit manifest (list of URIs).
Maximum of 1,000 files per manifest.
Granular Scopes: aiservices:write:summarizer_batch_job:admin
Rate Limit Label: LIGHT
Request Body
Content-Type: application/json
input(required)object— The input source configuration. Provide `uri` (for SINGLE/PREFIX modes) or `manifest` (for MANIFEST mode).source(required)string, possible values:"S3"— The storage provider.authobject— The storage authentication credentials.awsobject— The AWS credentials for S3 access. Required when the source is S3 and URIs are not pre-signed.access_key_id(required)string— The AWS access key ID.secret_access_key(required)string— The AWS secret access key.session_token(required)string— The AWS session token for temporary credentials (recommended).
filtersobject— The file filtering options for PREFIX mode. Use glob patterns to include or exclude files.exclude_globsarray— The exclude files matching these glob patterns. Applied after `include_globs`.Items: stringinclude_globsarray— The include only files matching these glob patterns. Supports wildcards: `*` (any characters), `**` (recursive), `?` (single character). Applied before `exclude_globs`.Items: string
manifestarray— The explicit list of file URIs for MANIFEST mode. Required when mode is `MANIFEST`. Maximum of 1,000 files per batch job.Items: string, format:urimodestring, possible values:"SINGLE", "PREFIX", "MANIFEST"— The input processing mode. Optional — can be inferred: `MANIFEST` if a manifest array is provided, `SINGLE` if the URI points to a single file, or `PREFIX` if the URI is a directory/prefix.uristring, format:uri— The S3 URI for a single file or prefix/container. Required for SINGLE and PREFIX modes.
output(required)object— The output destination configuration.destination(required)string, possible values:"S3"— The output storage provider.uri(required)string, format:uri— The base output URI where summarization results will be written.authobject— The storage authentication credentials.awsobject— The AWS credentials for S3 write access.access_key_id(required)string— The AWS access key ID.secret_access_key(required)string— The AWS secret access key.session_token(required)string— The AWS session token for temporary credentials (recommended).
layoutstring, possible values:"ADJACENT", "PREFIX"— The output file layout strategy. `ADJACENT`: places output next to the input file. `PREFIX`: uses the output URI as the base directory.overwriteboolean, default:false— Whether to overwrite existing output files.
configobject— The summarization configuration.languagestring— The output language as an ISO locale code. Supported: `en-US`, `zh-CN`, `zh-Hans`, `ja-JP`, `es-ES`, `fr-FR`, `de-DE`, `pt-PT`, `pt-BR`, `it-IT`, `ar-SA`, `ar-AE`. Defaults to `en-US`.output_formatstring, possible values:"text", default:"text"— The output format. Defaults to `text`. Currently only `text` is supported.summary_typestring, possible values:"CONVERSATION", default:"CONVERSATION"— The type of content being summarized. Defaults to `CONVERSATION`.taskstring, possible values:"full_summary", "recap", "action_items", "summary", default:"full_summary"— The summarization task type. Defaults to `full_summary` if not specified. Accepted values are `full_summary`, `recap`, `action_items`, and `summary`.
limitsobject— The job processing limits.max_filesinteger— The maximum number of files to process. Excess files are skipped.
notificationsobject— The webhook notification settings for job status updates.audiencestring— The JWT audience (`aud` claim) for the signed webhook token. Required when `security_type` is `WEBHOOK_SECURITY_JWT`.secretstring— The shared secret used to sign webhook payloads. Used as the HMAC key when `security_type` is `WEBHOOK_SECURITY_HMAC`, or as the JWT signing key when `security_type` is `WEBHOOK_SECURITY_JWT`.security_typestring, possible values:"WEBHOOK_SECURITY_HMAC", "WEBHOOK_SECURITY_JWT", default:"WEBHOOK_SECURITY_HMAC"— The webhook payload signature scheme. Defaults to `WEBHOOK_SECURITY_HMAC`.webhook_urlstring, format:uri— The HTTPS webhook URL to receive POST notifications on job state changes.
reference_idstring— The customer-provided reference ID for deduplication and correlation. Submitting the same `reference_id` twice returns the existing job instead of creating a duplicate.
Example:
{
"input": {
"mode": "PREFIX",
"source": "S3",
"uri": "s3://acme-bucket/transcripts/2025/11/",
"manifest": [
"s3://acme-bucket/transcripts/meeting_001.vtt",
"s3://acme-bucket/transcripts/meeting_002.vtt"
],
"filters": {
"include_globs": [
"**/*.vtt",
"**/*.txt"
],
"exclude_globs": [
"**/tmp/**",
"*_draft.*"
]
},
"auth": {
"aws": {
"access_key_id": "YOUR_AWS_ACCESS_KEY_ID",
"secret_access_key": "YOUR_AWS_SECRET_ACCESS_KEY",
"session_token": "FwoGZXIvYXdzE..."
}
}
},
"output": {
"destination": "S3",
"uri": "s3://acme-bucket/summaries/2025/11/",
"layout": "PREFIX",
"overwrite": false,
"auth": {
"aws": {
"access_key_id": "YOUR_AWS_ACCESS_KEY_ID",
"secret_access_key": "YOUR_AWS_SECRET_ACCESS_KEY",
"session_token": "FwoGZXIvYXdzE..."
}
}
},
"config": {
"summary_type": "CONVERSATION",
"task": "full_summary",
"language": "en-US",
"output_format": "text"
},
"reference_id": "summarize-2025-11",
"notifications": {
"webhook_url": "https://example.com/hooks/summarizer",
"secret": "hmac-secret",
"security_type": "WEBHOOK_SECURITY_HMAC",
"audience": "https://example.com/hooks/summarizer"
},
"limits": {
"max_files": 500
}
}Responses
Status: 201 Job submitted successfully and queued for processing.
Content-Type: application/json
job_id(required)string— The unique job identifier for tracking and status queries.state(required)string, possible values:"QUEUED", "PROCESSING", "SUCCEEDED", "PARTIAL", "FAILED", "CANCELED"— The initial job state (typically `QUEUED`).submitted_at(required)string, format:date-time— The job submission timestamp in ISO 8601 format.
Example:
{
"job_id": "job_abc123",
"state": "QUEUED",
"submitted_at": "2026-01-05T18:34:12Z"
}Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 409 **HTTP Status Code:** `409` <br> Conflict A job with the same `reference_id` already exists.
Status: 422 **HTTP Status Code:** `422` <br> Unprocessable Entity The request body contains invalid or missing fields.
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Get Batch Summarizer Job
- Method:
GET - Path:
/aiservices/summarizer/jobs/{jobId} - Tags: Summarizer
Retrieves job-level status, configuration, and progress summary for a batch summarization job.
To list individual file results, use the List Batch Job Files endpoint.
Granular Scopes: aiservices:read:summarizer_batch_job:admin
Rate Limit Label: LIGHT
Parameters
jobId required
- In:
path
The unique identifier of the batch summarization job.
string
Responses
Status: 200 Job status retrieved successfully.
Content-Type: application/json
job_id(required)string— The job identifier.state(required)string, possible values:"QUEUED", "PROCESSING", "SUCCEEDED", "PARTIAL", "FAILED", "CANCELED"— Overall job processing state. `PARTIAL` indicates some files succeeded while others failed.submitted_at(required)string, format:date-time— The job submission timestamp in ISO 8601 format.configobject— The summarization configuration used for this job.languagestring— The output language ISO locale code. Supported values: `en-US`, `zh-CN`, `zh-Hans`, `ja-JP`, `es-ES`, `fr-FR`, `de-DE`, `pt-PT`, `pt-BR`, `it-IT`, `ar-SA`, `ar-AE`.output_formatstring, possible values:"text"— The output format. Defaults to `text`. Currently only `text` is supported.summary_typestring, possible values:"CONVERSATION", default:"CONVERSATION"— The type of content being summarized. Defaults to `CONVERSATION`.taskstring, possible values:"full_summary", "recap", "action_items", "summary"— The summarization task type. Defaults to `full_summary` if not specified. Accepted values are `full_summary`, `recap`, `action_items`, and `summary`.
errorobject | null— The job-level error. Only present when state is `FAILED`.codestring— The error code indicating the failure reason.detailsobject— Additional error context.messagestring— A human-readable error message.
inputobject— The input configuration used when the job was submitted.modestring, possible values:"SINGLE", "PREFIX", "MANIFEST"— The input mode.sourcestring, possible values:"S3"— The storage provider.uristring— The URI path to input files.
outputobject— The output configuration used when the job was submitted.destinationstring, possible values:"S3"— The output storage provider.layoutstring, possible values:"ADJACENT", "PREFIX"— The output file layout strategy.uristring— The URI path where summaries are written.
summaryobject— Aggregated job progress statistics.canceledinteger— The number of files canceled by user request.failedinteger— The number of files that failed processing.processinginteger— The number of files currently being processed.queuedinteger— The number of files waiting in the queue.skippedinteger— The number of files skipped due to filters or limits.succeededinteger— The number of successfully processed files.total_filesinteger— The total number of files in the job.
usageobject | null— The aggregate character usage for the entire batch job. Null until at least one file has been processed.input_unitsnumber— The total input characters processed across all succeeded files.output_unitsnumber— The total output characters generated across all succeeded files.unit_typestring— The unit of measurement for billing.
Example:
{
"job_id": "job_abc123",
"state": "PROCESSING",
"submitted_at": "2026-01-05T18:34:12Z",
"input": {
"mode": "PREFIX",
"source": "S3",
"uri": "s3://acme-bucket/transcripts/2025/11/"
},
"output": {
"destination": "S3",
"uri": "s3://acme-bucket/summaries/2025/11/",
"layout": "PREFIX"
},
"config": {
"summary_type": "CONVERSATION",
"task": "full_summary",
"language": "en-US",
"output_format": "text"
},
"summary": {
"total_files": 2487,
"queued": 0,
"processing": 23,
"succeeded": 2450,
"failed": 14,
"skipped": 0,
"canceled": 0
},
"error": {
"code": "INVALID_CREDENTIALS",
"message": "AWS credentials expired",
"details": {
"additionalProperty": ""
}
},
"usage": {
"input_units": 985430,
"output_units": 62140,
"unit_type": "characters"
}
}Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Cancel Batch Summarizer Job
- Method:
DELETE - Path:
/aiservices/summarizer/jobs/{jobId} - Tags: Summarizer
Cancels a batch summarization job.
Only jobs in a QUEUED or PROCESSING state can be canceled.
Successfully canceled jobs transition to the CANCELED state. Jobs that are already in a SUCCEEDED, FAILED, or CANCELED state cannot be canceled.
Granular Scopes: aiservices:delete:summarizer_batch_job:admin
Rate Limit Label: LIGHT
Parameters
jobId required
- In:
path
The unique identifier of the batch summarization job to cancel.
string
Responses
Status: 204 Job canceled successfully. No content returned.
Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 409 **HTTP Status Code:** `409` <br> Conflict The job is already in a terminal state (`SUCCEEDED`, `FAILED`, or `CANCELED`).
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
List Batch Summarizer Job Files
- Method:
GET - Path:
/aiservices/summarizer/jobs/{jobId}/files - Tags: Summarizer
Retrieves a paginated list of individual file results for a batch summarization job.
Granular Scopes: aiservices:read:list_summarizer_batch_job_files:admin
Rate Limit Label: LIGHT
Parameters
jobId required
- In:
path
The unique identifier of the batch summarization job.
string
state
- In:
query
This field enables you to filter files by processing state. If you omit this parameter, the API returns files in all states.
string, possible values: "FILE_QUEUED", "FILE_PROCESSING", "FILE_SUCCEEDED", "FILE_FAILED", "FILE_CANCELED", "FILE_SKIPPED"
page_size
- In:
query
The maximum number of files to return per page.
integer, format: int32, default: 100
next_page_token
- In:
query
The pagination token from the previous response's next_page_token field.
string
Responses
Status: 200 Files listed successfully.
Content-Type: application/json
files(required)array— The list of file results for this page.Items: file_id(required)string— The unique file identifier within the job.input_uri(required)string— The source transcript file URI.state(required)string, possible values:"FILE_QUEUED", "FILE_PROCESSING", "FILE_SUCCEEDED", "FILE_FAILED", "FILE_CANCELED", "FILE_SKIPPED"— The current processing state of this file.errorobject | null— Error details. Only present when state is `FILE_FAILED`.codestring— Error code indicating the failure reason.messagestring— Human-readable error description.
output_uristring | null— The URI of the summarization result JSON file. Null if not yet processed or failed.usageobject | null— Character usage for billing. Null until processing completes.detailsobject— Service-specific billing details.summarizerobject— Summarizer-specific usage details.summary_typestring— The type of content summarized.taskstring— The task type.
input_unitsnumber— The number of input characters processed.output_unitsnumber— The number of output characters generated.unit_typestring— The unit of measurement for billing.
next_page_tokenstring— Pagination token for fetching the next page. Empty if no more results.
Example:
{
"files": [
{
"file_id": "f_001",
"input_uri": "s3://acme-bucket/transcripts/2025/11/meeting_001.vtt",
"state": "FILE_SUCCEEDED",
"output_uri": "s3://acme-bucket/summaries/2025/11/meeting_001.json",
"usage": {
"input_units": 4820,
"output_units": 312,
"unit_type": "characters",
"details": {
"summarizer": {
"task": "full_summary",
"summary_type": "CONVERSATION"
}
}
},
"error": {
"code": "UNSUPPORTED_CONTENT_TYPE",
"message": "Content type audio/wav is not supported for summarization"
}
}
],
"next_page_token": "eyJmaWxlX2lkIjoiZl8xMDEifQ"
}Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Get Batch Summarizer Job File
- Method:
GET - Path:
/aiservices/summarizer/jobs/{jobId}/files/{fileId} - Tags: Summarizer
Retrieves the processing result for a specific file within a batch summarization job.
Granular Scopes: aiservices:read:summarizer_batch_job_file:admin
Rate Limit Label: LIGHT
Parameters
jobId required
- In:
path
The unique identifier of the batch summarization job.
string
fileId required
- In:
path
The unique identifier of the file within the job.
string
Responses
Status: 200 File result retrieved successfully.
Content-Type: application/json
file_id(required)string— The unique identifier of the file within the job.input_uri(required)string— The source transcript file URI.state(required)string, possible values:"FILE_QUEUED", "FILE_PROCESSING", "FILE_SUCCEEDED", "FILE_FAILED", "FILE_CANCELED", "FILE_SKIPPED"— The current processing state of this file.errorobject | null— Error details. Only present when the state is `FILE_FAILED`.codestring— The error code indicating the failure reason.detailsobject— Additional error context.messagestring— A human-readable error description.
output_uristring | null— The URI of the summarization result JSON file. This value is `null` if the file has not yet been processed or processing failed.usageobject | null— The character usage for billing. This value is `null` until processing completes.detailsobject— Service-specific billing details.summarizerobject— Summarizer-specific usage details.summary_typestring— The type of content summarized.taskstring— The task type.
input_unitsnumber— The number of input characters processed.output_unitsnumber— The number of output characters generated.unit_typestring— The unit of measurement for billing.
Example:
{
"file_id": "f_001",
"input_uri": "s3://acme-bucket/transcripts/2025/11/meeting_001.vtt",
"state": "FILE_SUCCEEDED",
"output_uri": "s3://acme-bucket/summaries/2025/11/meeting_001.json",
"usage": {
"input_units": 4820,
"output_units": 312,
"unit_type": "characters",
"details": {
"summarizer": {
"task": "full_summary",
"summary_type": "CONVERSATION"
}
}
},
"error": {
"code": "UNSUPPORTED_CONTENT_TYPE",
"message": "Content type audio/wav is not supported for summarization",
"details": {
"additionalProperty": ""
}
}
}Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Summarize (Synchronous)
- Method:
POST - Path:
/aiservices/summarizer/summarize - Tags: Summarizer
Submit transcript text and receive a summary inline. This is a synchronous operation — the response is returned immediately after summarization completes.
Supported task types: full summary (recap + section summary + action items, also returned combined as markdown), recap only, action items only, or section summary only.
Granular Scopes: aiservices:write:summarize:admin
Rate Limit Label: LIGHT
Request Body
Content-Type: application/json
input(required)object— The input content to summarize.text(required)string— The transcript text to summarize.
configobject— Summarization configuration options.languagestring— The output language as an ISO locale code. Supported values: `en-US`, `zh-CN`, `zh-Hans`, `ja-JP`, `es-ES`, `fr-FR`, `de-DE`, `pt-PT`, `pt-BR`, `it-IT`, `ar-SA`, `ar-AE`. Defaults to `en-US`.output_formatstring, possible values:"text", default:"text"— The output format. Defaults to `text`. Currently, only `text` is supported.summary_typestring, possible values:"CONVERSATION", default:"CONVERSATION"— The type of content being summarized. Defaults to `CONVERSATION`.taskstring, possible values:"full_summary", "recap", "action_items", "summary", default:"full_summary"— The summarization task type. Defaults to `full_summary` if not specified. Accepted values: `full_summary`, `recap`, `action_items`, and `summary`.
Example:
{
"input": {
"text": "Alice: Good morning everyone, let's get started.\nBob: I finished the auth module last week.\nAlice: Great. Bob, can you document the API by Friday?\nBob: Sure, I'll have that done."
},
"config": {
"summary_type": "CONVERSATION",
"task": "full_summary",
"language": "en-US",
"output_format": "text"
}
}Responses
Status: 200 Summarization completed successfully.
Content-Type: application/json
model(required)string— The model identifier used for summarization.request_id(required)string— The unique request identifier.result(required)object— The summarization result. The fields populated depend on the `task` value.action_itemsstring— The extracted action items. Present when the task is `full_summary` or `action_items`.full_summarystring— A combined markdown summary with recap, section summary, and action items formatted as sections. Present when the task is `full_summary`.recapstring— A high-level meeting recap. Present when the task is `full_summary` or `recap`.summary_textstring— A section-by-section summary. Present when the task is `full_summary` or `summary`.
task(required)string, possible values:"full_summary", "recap", "action_items", "summary"— The task that was executed.usage(required)object— The token and character usage for billing.detailsobject— The service-specific billing details.summarizerobject— The summarizer-specific usage details.summary_typestring— The type of content summarized.taskstring— The task type used.
input_unitsinteger— The number of input characters processed.output_unitsinteger— The number of output characters generated.unit_typestring— The unit of measurement for billing.
Example:
{
"request_id": "req_abc123",
"task": "full_summary",
"result": {
"recap": "The team aligned on deliverables: Bob will document the auth API by Friday.",
"summary_text": "**Authentication Module**\nBob completed the auth module. Documentation is due Friday.",
"action_items": "- **Bob**: Document the auth API by Friday",
"full_summary": "## Recap\nThe team aligned on deliverables: Bob will document the auth API by Friday.\n\n## Summary\n**Authentication Module**\nBob completed the auth module. Documentation is due Friday.\n\n## Action Items\n- **Bob**: Document the auth API by Friday"
},
"model": "zoom-summarizer-v1",
"usage": {
"input_units": 4820,
"output_units": 312,
"unit_type": "characters",
"details": {
"summarizer": {
"task": "full_summary",
"summary_type": "CONVERSATION"
}
}
}
}Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 422 **HTTP Status Code:** `422` <br> Unprocessable Entity
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
List Batch Translator Jobs
- Method:
GET - Path:
/aiservices/translator/jobs - Tags: Translator
Retrieves a paginated list of batch translation jobs for the authenticated tenant.
Granular Scopes: aiservices:read:list_translator_batch_jobs:admin
Rate Limit Label: LIGHT
Parameters
state
- In:
query
Filter jobs by processing state. Omit to return jobs in all states.
string, possible values: "QUEUED", "PROCESSING", "SUCCEEDED", "PARTIAL", "FAILED", "CANCELED"
page_size
- In:
query
The maximum number of jobs to return per page.
integer, format: int32, default: 50
next_page_token
- In:
query
The pagination token from the previous response's next_page_token field.
string
Responses
Status: 200 Jobs listed successfully.
Content-Type: application/json
jobs(required)array— List of batch translation jobs.Items: job_id(required)string— The job identifier.state(required)string, possible values:"QUEUED", "PROCESSING", "SUCCEEDED", "PARTIAL", "FAILED", "CANCELED"— The overall job processing state.submitted_at(required)string, format:date-time— The job submission timestamp in ISO 8601 format.configobject— The translation configuration.source_languagestring— The source language ISO locale code. Empty if auto-detected. Supported: `en-US`, `zh-CN`, `zh-Hans`, `zh-TW`, `zh-Hant`, `ja-JP`, `ko-KR`, `es-ES`, `fr-FR`, `de-DE`, `pt-PT`, `pt-BR`, `it-IT`target_languagesarray— The target language ISO locale codes. Supported: `en-US`, `zh-CN`, `zh-Hans`, `zh-TW`, `zh-Hant`, `ja-JP`, `ko-KR`, `es-ES`, `fr-FR`, `de-DE`, `pt-PT`, `pt-BR`, `it-IT`Items: string
errorobject | null— The job-level error. Only present when the state is `FAILED`.codestring— The error code indicating the failure reason.messagestring— A human-readable error message.
inputobject— The input configuration.modestring, possible values:"SINGLE", "PREFIX", "MANIFEST"— The input mode.sourcestring, possible values:"S3"— The storage provider.uristring— The URI path to the input files.
outputobject— The output configuration.destinationstring, possible values:"S3"— The output storage provider.layoutstring, possible values:"ADJACENT", "PREFIX"— The output file layout strategy.uristring— The URI path where translations are written.
summaryobject— The job progress summary.canceledinteger— The number of files canceled by user request.failedinteger— The number of files that failed processing.processinginteger— The number of files currently being processed.queuedinteger— The number of files waiting in the queue.skippedinteger— The number of files skipped due to filters or limits.succeededinteger— The number of successfully processed files.total_filesinteger— The total number of files in the job.
next_page_tokenstring— The pagination token for fetching the next page. Empty if no more results.
Example:
{
"jobs": [
{
"job_id": "job_abc123",
"state": "PROCESSING",
"submitted_at": "2026-01-05T18:34:12Z",
"input": {
"mode": "PREFIX",
"source": "S3",
"uri": "s3://acme-bucket/text/"
},
"output": {
"destination": "S3",
"uri": "s3://acme-bucket/translations/",
"layout": "PREFIX"
},
"config": {
"source_language": "en-US",
"target_languages": [
"es-ES"
]
},
"summary": {
"total_files": 2487,
"queued": 0,
"processing": 23,
"succeeded": 2450,
"failed": 14,
"skipped": 0,
"canceled": 0
},
"error": {
"code": "INVALID_CREDENTIALS",
"message": "AWS credentials expired"
}
}
],
"next_page_token": "eyJqb2JfaWQiOiJqb2JfZGVmNDU2In0"
}Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Submit Batch Translator Job
- Method:
POST - Path:
/aiservices/translator/jobs - Tags: Translator
Submits a batch translation job for asynchronous processing.
Supports three input modes: single file (mode inferred when the URI points to a single file), prefix/container enumeration (with optional filters), or explicit manifest (list of URIs).
Maximum of 1,000 files per manifest.
Granular Scopes: aiservices:write:translator_batch_job:admin
Rate Limit Label: LIGHT
Request Body
Content-Type: application/json
input(required)object— The input source configuration. Provide `uri` (for SINGLE/PREFIX modes) or `manifest` (for MANIFEST mode).source(required)string, possible values:"S3"— The storage provider.authobject— The storage authentication credentials.awsobject— The AWS credentials for S3 access. Required when the source is S3 and URIs are not pre-signed.access_key_id(required)string— The AWS access key ID.secret_access_key(required)string— The AWS secret access key.session_token(required)string— The AWS session token for temporary credentials (recommended).
filtersobject— The file filtering options for PREFIX mode. Use glob patterns to include or exclude files.exclude_globsarray— The exclude files matching these glob patterns. Applied after `include_globs`.Items: stringinclude_globsarray— This field includes only files matching these glob patterns. Supports wildcards: `*` (any characters), `**` (recursive), `?` (single character). Applied before `exclude_globs`.Items: string
manifestarray— The explicit list of file URIs for MANIFEST mode. Required when mode is `MANIFEST`. Maximum of 1,000 files per batch job.Items: string, format:urimodestring, possible values:"SINGLE", "PREFIX", "MANIFEST"— The input processing mode. Optional — can be inferred: `MANIFEST` if a manifest array is provided, `SINGLE` if the URI points to a single file, `PREFIX` if the URI is a directory/prefix.uristring, format:uri— The S3 URI for a single file or prefix/container. Required for SINGLE and PREFIX modes.
output(required)object— The output destination configuration.destination(required)string, possible values:"S3"— The output storage provider.uri(required)string, format:uri— The base output URI where translation results will be written.authobject— The storage authentication credentials.awsobject— The AWS credentials for S3 write access.access_key_id(required)string— The AWS access key ID.secret_access_key(required)string— The AWS secret access key.session_token(required)string— The AWS session token for temporary credentials (recommended).
layoutstring, possible values:"ADJACENT", "PREFIX"— The output file layout strategy. `ADJACENT`: places output next to the input file. `PREFIX`: uses the output URI as the base directory.overwriteboolean, default:false— Whether to overwrite existing output files.
configobject— The translation configuration.source_languagestring— The source language as an ISO locale code. Leave empty for automatic language detection. Supported: `en-US`, `zh-CN`, `zh-Hans`, `zh-TW`, `zh-Hant`, `ja-JP`, `ko-KR`, `es-ES`, `fr-FR`, `de-DE`, `pt-PT`, `pt-BR`, `it-IT`.target_languagesarray— The list of target language ISO locale codes to translate. Maximum of 1 target per request. One side of each pair must be English (`en-US`). Supported: `en-US`, `zh-CN`, `zh-Hans`, `zh-TW`, `zh-Hant`, `ja-JP`, `ko-KR`, `es-ES`, `fr-FR`, `de-DE`, `pt-PT`, `pt-BR`, `it-IT`.Items: string
limitsobject— The job processing limits.max_filesinteger— The maximum number of files to process. Excess files are skipped.
notificationsobject— The webhook notification settings for job status updates.audiencestring— The JWT audience (`aud` claim) for the signed webhook token. Required when `security_type` is `WEBHOOK_SECURITY_JWT`.secretstring— The shared secret used to sign webhook payloads. Used as the HMAC key when `security_type` is `WEBHOOK_SECURITY_HMAC`, or as the JWT signing key when `security_type` is `WEBHOOK_SECURITY_JWT`.security_typestring, possible values:"WEBHOOK_SECURITY_HMAC", "WEBHOOK_SECURITY_JWT", default:"WEBHOOK_SECURITY_HMAC"— The webhook payload signature scheme. Defaults to `WEBHOOK_SECURITY_HMAC`.webhook_urlstring, format:uri— The HTTPS webhook URL to receive POST notifications on job state changes.
reference_idstring— The customer-provided reference ID for deduplication and correlation. Submitting the same `reference_id` twice returns the existing job instead of creating a duplicate.
Example:
{
"input": {
"mode": "PREFIX",
"source": "S3",
"uri": "s3://acme-bucket/text/2025/11/",
"manifest": [
"s3://acme-bucket/text/document_001.txt",
"s3://acme-bucket/text/document_002.txt"
],
"filters": {
"include_globs": [
"**/*.txt",
"**/*.vtt"
],
"exclude_globs": [
"**/tmp/**",
"*_draft.*"
]
},
"auth": {
"aws": {
"access_key_id": "YOUR_AWS_ACCESS_KEY_ID",
"secret_access_key": "YOUR_AWS_SECRET_ACCESS_KEY",
"session_token": "FwoGZXIvYXdzE..."
}
}
},
"output": {
"destination": "S3",
"uri": "s3://acme-bucket/translations/2025/11/",
"layout": "PREFIX",
"overwrite": false,
"auth": {
"aws": {
"access_key_id": "YOUR_AWS_ACCESS_KEY_ID",
"secret_access_key": "YOUR_AWS_SECRET_ACCESS_KEY",
"session_token": "FwoGZXIvYXdzE..."
}
}
},
"config": {
"source_language": "en-US",
"target_languages": [
"es-ES"
]
},
"reference_id": "translate-2025-11",
"notifications": {
"webhook_url": "https://example.com/hooks/translator",
"secret": "hmac-secret",
"security_type": "WEBHOOK_SECURITY_HMAC",
"audience": "https://example.com/hooks/translator"
},
"limits": {
"max_files": 500
}
}Responses
Status: 201 Job submitted successfully and queued for processing.
Content-Type: application/json
job_id(required)string— The unique job identifier for tracking and status queries.state(required)string, possible values:"QUEUED", "PROCESSING", "SUCCEEDED", "PARTIAL", "FAILED", "CANCELED"— The initial job state (typically `QUEUED`).submitted_at(required)string, format:date-time— The job submission timestamp in ISO 8601 format.
Example:
{
"job_id": "job_abc123",
"state": "QUEUED",
"submitted_at": "2026-01-05T18:34:12Z"
}Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 409 **HTTP Status Code:** `409` <br> Conflict -- a job with the same `reference_id` already exists.
Status: 422 **HTTP Status Code:** `422` <br> Unprocessable Entity
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Get Batch Translator Job
- Method:
GET - Path:
/aiservices/translator/jobs/{jobId} - Tags: Translator
Retrieves job-level status, configuration, and progress summary for a batch translation job.
To list individual file results, use the List Batch Job Files endpoint.
Granular Scopes: aiservices:read:translator_batch_job:admin
Rate Limit Label: LIGHT
Parameters
jobId required
- In:
path
The unique identifier of the batch translation job.
string
Responses
Status: 200 Job status retrieved successfully.
Content-Type: application/json
job_id(required)string— The job identifier.state(required)string, possible values:"QUEUED", "PROCESSING", "SUCCEEDED", "PARTIAL", "FAILED", "CANCELED"— Overall job processing state. `PARTIAL` indicates some files succeeded while others failed.submitted_at(required)string, format:date-time— Job submission timestamp in ISO 8601 format.configobject— Translation configuration used for this job.source_languagestring— Source language ISO locale code. Empty if auto-detected. Supported: `en-US`, `zh-CN`, `zh-Hans`, `zh-TW`, `zh-Hant`, `ja-JP`, `ko-KR`, `es-ES`, `fr-FR`, `de-DE`, `pt-PT`, `pt-BR`, `it-IT`.target_languagesarray— Target language ISO locale codes. Supported: `en-US`, `zh-CN`, `zh-Hans`, `zh-TW`, `zh-Hant`, `ja-JP`, `ko-KR`, `es-ES`, `fr-FR`, `de-DE`, `pt-PT`, `pt-BR`, `it-IT`.Items: string
errorobject | null— Job-level error. Only present when state is `FAILED`.codestring— The error code indicating the failure reason.detailsobject— Additional error context.messagestring— A human-readable error message.
inputobject— Input configuration used when the job was submitted.modestring, possible values:"SINGLE", "PREFIX", "MANIFEST"— The input mode.sourcestring, possible values:"S3"— The storage provider.uristring— The URI path to input files.
outputobject— Output configuration used when the job was submitted.destinationstring, possible values:"S3"— The output storage provider.layoutstring, possible values:"ADJACENT", "PREFIX"— The output file layout strategy.uristring— The URI path where translations are written.
summaryobject— Aggregated job progress statistics.canceledinteger— The number of files canceled by user request.failedinteger— The number of files that failed processing.processinginteger— The number of files currently being processed.queuedinteger— The number of files waiting in the queue.skippedinteger— The number of files skipped due to filters or limits.succeededinteger— The number of successfully processed files.total_filesinteger— The total number of files in the job.
Example:
{
"job_id": "job_abc123",
"state": "PROCESSING",
"submitted_at": "2026-01-05T18:34:12Z",
"input": {
"mode": "PREFIX",
"source": "S3",
"uri": "s3://acme-bucket/text/2025/11/"
},
"output": {
"destination": "S3",
"uri": "s3://acme-bucket/translations/2025/11/",
"layout": "PREFIX"
},
"config": {
"source_language": "en-US",
"target_languages": [
"es-ES"
]
},
"summary": {
"total_files": 2487,
"queued": 0,
"processing": 23,
"succeeded": 2450,
"failed": 14,
"skipped": 0,
"canceled": 0
},
"error": {
"code": "INVALID_CREDENTIALS",
"message": "AWS credentials expired",
"details": {
"additionalProperty": ""
}
}
}Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Cancel Batch Translator Job
- Method:
DELETE - Path:
/aiservices/translator/jobs/{jobId} - Tags: Translator
Cancels a batch translation job.
Only jobs in QUEUED or PROCESSING state can be canceled.
Successfully canceled jobs transition to the CANCELED state. Jobs that are already in the SUCCEEDED, FAILED, or CANCELED state cannot be canceled.
Granular Scopes: aiservices:delete:translator_batch_job:admin
Rate Limit Label: LIGHT
Parameters
jobId required
- In:
path
The unique identifier of the batch translation job to cancel.
string
Responses
Status: 204 Job canceled successfully. No content returned.
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 409 **HTTP Status Code:** `409` <br> Conflict The job is already in a terminal state (`SUCCEEDED`, `FAILED`, or `CANCELED`).
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
List Batch Translator Job Files
- Method:
GET - Path:
/aiservices/translator/jobs/{jobId}/files - Tags: Translator
Retrieves a paginated list of individual file results for a batch translation job.
Granular Scopes: aiservices:read:list_translator_batch_job_files:admin
Rate Limit Label: LIGHT
Parameters
jobId required
- In:
path
Unique identifier of the batch translation job.
string
state
- In:
query
Filter files by processing state. Omit to return files in all states.
string, possible values: "FILE_QUEUED", "FILE_PROCESSING", "FILE_SUCCEEDED", "FILE_FAILED", "FILE_CANCELED", "FILE_SKIPPED"
page_size
- In:
query
Maximum number of files to return per page.
integer, format: int32, default: 100
next_page_token
- In:
query
Pagination token from the previous response's next_page_token field.
string
Responses
Status: 200 Files listed successfully.
Content-Type: application/json
files(required)array— List of file results for this page.Items: file_id(required)string— Unique file identifier within the job.input_uri(required)string— Source text file URI.state(required)string, possible values:"FILE_QUEUED", "FILE_PROCESSING", "FILE_SUCCEEDED", "FILE_FAILED", "FILE_CANCELED", "FILE_SKIPPED"— Current processing state of this file.errorobject | null— Error details. Only present when state is `FILE_FAILED`.codestring— Error code indicating the failure reason.messagestring— Human-readable error description.
output_uristring | null— URI of the translation result file. Null if not yet processed or failed.
next_page_tokenstring— Pagination token for fetching the next page. Empty if no more results.
Example:
{
"files": [
{
"file_id": "f_001",
"input_uri": "s3://acme-bucket/text/2025/11/document_001.txt",
"state": "FILE_SUCCEEDED",
"output_uri": "s3://acme-bucket/translations/2025/11/document_001.json",
"error": {
"code": "UNSUPPORTED_LANGUAGE_PAIR",
"message": "Translation between zh-CN and ja-JP is not supported"
}
}
],
"next_page_token": "eyJmaWxlX2lkIjoiZl8xMDEifQ"
}Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Get Batch Translator Job File
- Method:
GET - Path:
/aiservices/translator/jobs/{jobId}/files/{fileId} - Tags: Translator
Retrieves the processing result for a specific file within a batch translation job.
Granular Scopes: aiservices:read:translator_batch_job_file:admin
Rate Limit Label: LIGHT
Parameters
jobId required
- In:
path
Unique identifier of the batch translation job.
string
fileId required
- In:
path
Unique identifier of the file within the job.
string
Responses
Status: 200 File result retrieved successfully.
Content-Type: application/json
file_id(required)string— Unique identifier of the file within the job.input_uri(required)string— The URI of the source text file.state(required)string, possible values:"FILE_QUEUED", "FILE_PROCESSING", "FILE_SUCCEEDED", "FILE_FAILED", "FILE_CANCELED", "FILE_SKIPPED"— The current processing state of this file.errorobject | null— The error details. Only present when the state is `FILE_FAILED`.codestring— The error code indicating the failure reason.detailsobject— Additional error context.messagestring— A human-readable error description.
output_uristring | null— The URI of the translation result file. This value is `null` if the file has not yet been processed or processing failed.
Example:
{
"file_id": "f_001",
"input_uri": "s3://acme-bucket/text/2025/11/document_001.txt",
"state": "FILE_SUCCEEDED",
"output_uri": "s3://acme-bucket/translations/2025/11/document_001.json",
"error": {
"code": "UNSUPPORTED_LANGUAGE_PAIR",
"message": "Translation between zh-CN and ja-JP is not supported",
"details": {
"additionalProperty": ""
}
}
}Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 404 **HTTP Status Code:** `404` <br> Not Found
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Translate (Synchronous)
- Method:
POST - Path:
/aiservices/translator/translate - Tags: Translator
Submit text and receive translations inline. This is a synchronous operation — the response is returned immediately after translation completes.
Supports auto-detection of the source language and translation into a target language.
Granular Scopes: aiservices:write:translate:admin
Rate Limit Label: LIGHT
Request Body
Content-Type: application/json
text(required)string— The text to translate.configobject— Translation configuration options.source_languagestring— Source language as an ISO locale code. Leave empty for automatic language detection. Supported: `en-US`, `zh-CN`, `zh-Hans`, `zh-TW`, `zh-Hant`, `ja-JP`, `ko-KR`, `es-ES`, `fr-FR`, `de-DE`, `pt-PT`, `pt-BR`, `it-IT`.target_languagesarray— List of target language ISO locale codes to translate into. Maximum of 1 target per request. One side of each pair must be English (`en-US`). Supported: `en-US`, `zh-CN`, `zh-Hans`, `zh-TW`, `zh-Hant`, `ja-JP`, `ko-KR`, `es-ES`, `fr-FR`, `de-DE`, `pt-PT`, `pt-BR`, `it-IT`.Items: string
Example:
{
"text": "Good morning everyone, let's get started with today's meeting.",
"config": {
"source_language": "en-US",
"target_languages": [
"es-ES"
]
}
}Responses
Status: 200 Translation completed successfully.
Content-Type: application/json
model(required)string— Model identifier used for translation.request_id(required)string— Unique request identifier.result(required)object— Translation results keyed by target language code.translationsobject— Map of target language codes to translated text.
usage(required)object— Character usage for billing.detailsobject— Service-specific billing details.translatorobject— Translator-specific usage details.source_languagestring— Detected or specified source language.target_languagestring— Target language for translation.
input_unitsinteger— Number of input characters processed.output_unitsinteger— Number of output characters generated.unit_typestring— Unit of measurement for billing.
Example:
{
"request_id": "req_abc123",
"result": {
"translations": {
"es-ES": "Buenos días a todos, comencemos la reunión de hoy."
}
},
"model": "zoom-translator-v1",
"usage": {
"input_units": 62,
"output_units": 56,
"unit_type": "characters",
"details": {
"translator": {
"source_language": "en-US",
"target_language": "es-ES"
}
}
}
}Status: 400 **HTTP Status Code:** `400` <br> Bad Request
Status: 401 **HTTP Status Code:** `401` <br> Unauthorized
Status: 403 **HTTP Status Code:** `403` <br> Forbidden
Status: 422 **HTTP Status Code:** `422` <br> Unprocessable Entity
Status: 429 **HTTP Status Code:** `429` <br> Too Many Requests. For more information, see [rate limits](https://developers.zoom.us/docs/api/rate-limits/).
Status: 500 **HTTP Status Code:** `500` <br> Internal Server Error
Live Voice Agent WebSocket
- Method:
GET - Path:
/aiservices/voice-agent/live - Tags: VoiceAgent
The Voice Agent Live API enables real-time spoken conversations with an AI assistant over a WebSocket connection. Your application streams audio to the service and receives assistant speech, transcripts, and function-call events on the same connection.
Key features
- Real-time responses: Assistant speech streams as it is generated, so playback can begin before the complete response is ready.
- Conversation transcripts: Receive final user transcripts and streamed assistant transcripts to display the conversation alongside audio.
- Natural conversation flow: Automatic turn detection identifies when the user has finished speaking, and users can interrupt an assistant response by speaking.
- Session configuration: Set the assistant's instructions and choose a supported voice when you start a session.
- Function calling: Define functions that run in your application and return their results to the session so the assistant can use them in the conversation.
- Bring your own key: Use your own API key to connect to supported OpenAI- or Anthropic-hosted models as the LLM provider.
Granular Scopes: aiservices:read:voice-agent:admin
Rate Limit Label: MEDIUM
Parameters
Sec-WebSocket-Protocol required
- In:
header
The WebSocket subprotocol requested by the client.
string, possible values: "voice-agent.zoom.v2"