Batch mode
Batch mode provides asynchronous summarization for large or complex jobs that process transcript files stored in cloud storage.
Capabilities
- Asynchronous job processing
- Large-scale file and batch support
- Transcript-focused input optimization
Each input file generates its own summary result in the configured output location.
How it works
Batch mode processing runs asynchronously and lets you summarize transcript files at scale. This mode is ideal for storage-based pipelines and large transcript archives.
Limits
Here are the size and file limits for prefix and manifest jobs.
| Limit | Value |
|---|---|
| Maximum files per prefix job | 10,000 |
| Maximum files per manifest job | 1,000 |
| Maximum file size | 96 KB |
| Maximum characters per job | 100,000,000 |
Input
The API supports three input modes.
| Mode | Description |
|---|---|
SINGLE | A single transcript file. |
PREFIX | All supported files under a shared storage prefix or container. |
MANIFEST | An explicit list of transcript file URIs. Maximum 1,000 files per manifest. |
These are the supported transcript file formats for the current release:
.vtt.srt.txt
For .vtt and .srt inputs, the service removes timestamps and subtitle formatting before sending normalized transcript text to the summarization model.
Output
Each input file produces one summary result in the configured destination. The result format follows the same task-dependent output model as fast mode.
Summarization options
These options control the summarization task and output language.
| Parameter | Type | Default | Description |
|---|---|---|---|
summary_type | string | "conversation" | The type of content being summarized. Currently we only support "conversation". |
task | string | "full_summary" | The summarization task. Accepted values are "recap", "action_items", "summary", and "full_summary". |
language | string | "en-US" | Output language as a BCP-47 locale code. Must be one of the supported locales. |
Batch jobs
Create a batch job
To create a new batch summarization job, use this endpoint:
POST /aiservices/summarizer/jobs
You can optionally include a reference_id for tracking. To receive webhook notifications when a job finishes, include a notifications object with a webhook_url and a secret for payload verification.
Example request (cURL)
This cURL example submits a batch summarization job from S3 and defines the output location and summarization settings.
curl -X POST https://api.zoom.us/v2/aiservices/summarizer/jobs \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"input": {
"mode": "PREFIX",
"source": "S3",
"uri": "s3://bucket/transcripts/",
"filters": {
"include_globs": ["*.vtt", "*.srt", "*.txt"]
},
"auth": {
"aws": {
"access_key_id": "AKIA...",
"secret_access_key": "wJalrX...",
"session_token": "FwoGZXIvYXdzE..."
}
}
},
"output": {
"destination": "S3",
"uri": "s3://bucket/summaries/",
"layout": "PREFIX",
"auth": {
"aws": {
"access_key_id": "AKIA...",
"secret_access_key": "wJalrX...",
"session_token": "FwoGZXIvYXdzE..."
}
}
},
"config": {
"summary_type": "conversation",
"task": "summary",
"language": "en-US"
},
"notifications": {
"webhook_url": "https://example.com/hooks/summarizer",
"secret": "hmac-secret"
},
"reference_id": "batch-summarization-2026-05"
}'
Response (201)
{
"job_id": "job_abc123",
"state": "QUEUED",
"submitted_at": "2026-05-10T18:34:12Z"
}
Batch job endpoints
These additional endpoints are available to manage batch jobs.
| Action | Description | Endpoint |
|---|---|---|
| Get batch job status | Check the current status and progress summary of a specific job. | GET /aiservices/summarizer/jobs/{jobId} |
| List batch jobs | View all batch jobs, optionally filtered by state. The response includes a next_cursor field. Pass its value as next_page_token to retrieve the next page. | GET /aiservices/summarizer/jobs?state=QUEUED&page_size=50&next_page_token=... |
| Cancel batch job | Cancel a job that is in QUEUED or PROCESSING state. | DELETE /aiservices/summarizer/jobs/{jobId} |
| List batch job files | Retrieve per-file status with pagination. | GET /aiservices/summarizer/jobs/{jobId}/files?page_size=200&next_page_token=... |
Webhook verification
When you provide a secret in the notifications object, the API signs each webhook request so you can verify it came from Zoom AI Services.
Each webhook request includes two headers.
| Header | Description |
|---|---|
x-zm-signature | HMAC-SHA256 signature of the request, prefixed with sha256= |
x-zm-request-timestamp | Unix timestamp that indicates when the request originated. |
To verify the signature:
- Compute
HMAC-SHA256ofv0:{timestamp}:{raw_body}using your secret. - Compare the result to the
x-zm-signatureheader using a timing-safe comparison. - Reject the request if the signatures don't match or the timestamp is stale.
const message = `v0:${timestamp}:${rawBody}`;
const expected = `sha256=${crypto.createHmac("sha256", secret).update(message).digest("hex")}`;
const isValid = crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected),
);