Batch mode
Batch mode provides asynchronous transcription for large or complex jobs that require processing multiple files or lengthy recordings.
Capabilities
- Parallel file processing
- Asynchronous operation
- Large-scale recording support
- Multi-speaker and multi-channel audio support
Each audio file generates its own transcript that saves to a corresponding output location.
How it works
Batch mode processing runs asynchronously and enables you to transcribe multiple files in a single API call.
This mode is ideal for workflows that involve multi-channel audio or large file collections.
Input
The API supports three input modes.
| Mode | Description |
|---|---|
SINGLE | A single audio file. Inferred when the URI points to a single file. |
PREFIX | All files under a shared S3 prefix/container. Supports glob filters to include or exclude files. |
MANIFEST | An explicit list of file URIs. Maximum 1,000 files per manifest. |
Output
The API supports three output layouts.
| Layout | Description |
|---|---|
SINGLE | Use the output URI as a single transcript file path (single-file mode). |
ADJACENT | Place output transcript next to the input file (same directory). |
PREFIX | Use the output URI as the base directory for all transcripts. |
Audio formats
WAV, MP3, M4A, and MP4
Transcription options
These options control transcription language, segmentation mode, and channel separation.
| Parameter | Type | Default | Description |
|---|---|---|---|
language | string | — | Language code (e.g., en-US). See language abbreviations. |
segmentation_mode | string | "auto" | Voice Activity Detection (VAD) mode. Set "none" to disable. |
word_time_offsets | boolean | false | Include word-level timestamps. |
channel_separation | boolean | false | Transcribe stereo channels separately. |
Batch jobs
Create a batch job
To create a new batch transcription job, use this endpoint:
POST /aiservices/scribe/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 transcription job from S3 and defines the output location and settings. The response returns a job ID and status so you can track processing.
curl -X POST https://api.zoom.us/v2/aiservices/scribe/jobs \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"input": {
"mode": "PREFIX",
"source": "S3",
"uri": "s3://acme-bucket/audio/2025/11/",
"filters": {
"include_globs": ["**/*.wav", "**/*.mp3"],
"exclude_globs": ["**/tmp/**"]
},
"auth": {
"aws": {
"access_key_id": "AKIA...",
"secret_access_key": "wJalrX...",
"session_token": "FwoGZXIvYXdzE..."
}
}
},
"output": {
"destination": "S3",
"uri": "s3://acme-bucket/transcripts/2025/11/",
"layout": "PREFIX",
"auth": {
"aws": {
"access_key_id": "AKIA...",
"secret_access_key": "wJalrX...",
"session_token": "FwoGZXIvYXdzE..."
}
}
},
"config": {
"language": "en-US",
"word_time_offsets": true,
"channel_separation": true
},
"notifications": {
"webhook_url": "https://example.com/hooks/scribe",
"secret": "hmac-secret"
},
"reference_id": "import-2025-11"
}'
Response (201)
{
"job_id": "job_abc123",
"state": "QUEUED",
"submitted_at": "2026-01-05T18:34:12Z"
}
Batch job endpoints
Three 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/scribe/jobs/{jobId} |
| List batch jobs | View all batch jobs, optionally filtered by state. | GET /aiservices/scribe/jobs?state=QUEUED&page_size=50&next_page_token=... |
| Cancel batch job | Cancel a job that is in QUEUED or PROCESSING state. | DELETE /aiservices/scribe/jobs/{jobId} |
Webhook verification
When you provide a secret in the notifications object, the API signs each webhook request so you can verify that Zoom AI Services sent it.
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 of when the request was sent |
To verify the signature:
- Compute the
HMAC-SHA256of the stringv0:{timestamp}:{raw_body}using your secret key - Compare it with the value in
x-zm-signatureusing a timing-safe comparison to prevent timing attacks. - Reject the request if the signatures do not match or if 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),
);
Per-file processing status
Use the following endpoint to retrieve per-file processing status for a batch job.
| Action | Description | Endpoint |
|---|---|---|
| List batch job files | Retrieve per-file status with pagination. | GET /aiservices/scribe/jobs/{jobId}/files?page_size=200&next_page_token=... |