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.

ModeDescription
SINGLEA single audio file. Inferred when the URI points to a single file.
PREFIXAll files under a shared S3 prefix/container. Supports glob filters to include or exclude files.
MANIFESTAn explicit list of file URIs. Maximum 1,000 files per manifest.

Output

The API supports three output layouts.

LayoutDescription
SINGLEUse the output URI as a single transcript file path (single-file mode).
ADJACENTPlace output transcript next to the input file (same directory).
PREFIXUse 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.

ParameterTypeDefaultDescription
languagestringLanguage code (e.g., en-US). See language abbreviations.
segmentation_modestring"auto"Voice Activity Detection (VAD) mode. Set "none" to disable.
word_time_offsetsbooleanfalseInclude word-level timestamps.
channel_separationbooleanfalseTranscribe 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.

ActionDescriptionEndpoint
Get batch job statusCheck the current status and progress summary of a specific job.GET /aiservices/scribe/jobs/{jobId}
List batch jobsView all batch jobs, optionally filtered by state.GET /aiservices/scribe/jobs?state=QUEUED&page_size=50&next_page_token=...
Cancel batch jobCancel 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.

HeaderDescription
x-zm-signatureHMAC-SHA256 signature of the request, prefixed with sha256=
x-zm-request-timestampUnix timestamp of when the request was sent

To verify the signature:

  1. Compute the HMAC-SHA256 of the string v0:{timestamp}:{raw_body} using your secret key
  2. Compare it with the value in x-zm-signatureusing a timing-safe comparison to prevent timing attacks.
  3. 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.

ActionDescriptionEndpoint
List batch job filesRetrieve per-file status with pagination.GET /aiservices/scribe/jobs/{jobId}/files?page_size=200&next_page_token=...