# 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](/docs/ai-services/summarizer/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](/docs/ai-services/summarizer/#supported-languages). | ## 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. ```shell 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) ```json { "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: 1. Compute `HMAC-SHA256` of `v0:{timestamp}:{raw_body}` using your secret. 2. Compare the result to the `x-zm-signature` header using a timing-safe comparison. 3. Reject the request if the signatures don't match or the timestamp is stale. ```javascript 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), ); ```