Skip to main content
Use STT Batch to transcribe long recordings or many files asynchronously. Flow: create a job → start it → poll until it finishes → download transcripts
(or receive them on a webhook).

How it works

Important: creating a job does not start transcription. You must call /start.

Interactive API reference

Each endpoint has a Try it playground. Paste your X-API-Key-ID and run live requests from the docs. Webhook payload examples: Webhooks — samples for job.completed, job.failed, and job.cancelled.

Before you begin

  1. An API key from the Gnani APIs dashboard
  2. Audio with real speech in a supported format
  3. A supported language code
Base URL
Auth — send on every Batch API request:
Tone-only / silent audio is accepted into a job but fails later with Empty transcript after 3 retries.

How do I get the transcript text?

GET /jobs/{job_id} and GET /jobs/{job_id}/files do not return full_transcript.

Quickstart (live-verified)

1. Create

2. Start

3. Poll until COMPLETED

4. Get transcript_url, then download text


Configuration

Inverse Text Normalization (ITN) is not supported for STT Batch.

Limits

Limits depend on how you send the audio. The size and file-count limits below apply to direct upload only — they do not apply to files fetched from cloud storage.

Every file, whichever way it arrives

A file longer than 4 hours is rejected with AUDIO_TOO_LONG. Split it first.

Direct upload (multipart/form-data)

The 100-file limit counts everything in the job, including files expanded out of a ZIP.

Cloud storage (source.type: "cloud_storage")

The 10 MB limit is for uploads only. Sending a 200 MB recording as a cloud_storage path is fine — what matters is that it is under 4 hours and downloadable within 30 minutes. Uploading that same file through multipart/form-data would be rejected.
A path ending in / is treated as a folder and expands to every supported audio file under that prefix. Because cloud storage jobs are not file-count capped, a broad prefix can enqueue far more audio than you intended — and every file is billed. Point at explicit file paths, or a narrow prefix you have checked.

Results and polling

The poll interval is guidance, not an enforced limit — but the API is rate limited, so polling more tightly than this risks 429 responses on your other calls.

Supported languages

Batch vs REST/Realtime: Gujarati (gu-IN) and Punjabi (pa-IN) are supported on STT REST and STT Realtime but not on Batch STT. Use REST or Realtime for those languages.

Language identification

If you know the language, pass a single code and it is used for the whole file. If you do not, pass up to three codes as a comma-separated list. Each file is then identified as one of exactly those languages and transcribed in it:
Rules:
  • Maximum three codes. More returns 400 UNSUPPORTED_LANGUAGE.
  • Every code must be from the table above; one unsupported code rejects the request.
  • Order matters. The first code is the fallback used when identification is not confident enough to choose.
  • The decision is made per file, not per segment — a file is transcribed entirely in one language. The resolved language is returned as language_code in the transcript JSON, so it always tells you what the text is actually in.
  • A single code behaves exactly as before, with no identification step.

Supported audio formats

.wav · .mp3 · .mp4 · .flac · .ogg · .opus · .m4a · .aac · .webm · .amr

Job statuses


Webhooks

Pass callback_url at create time to receive a POST when the job reaches a terminal state. The transcripts array includes full per-file transcript JSON (with full_transcript), so webhook users usually do not need /files + transcript_url. Treat webhooks as best-effort. Polling remains the source of truth.

Sample webhook payload — job.completed

Sample webhook payload — job.failed

Sample webhook payload — job.cancelled


Common mistakes


Support

Docs feedback: Batch STT docs feedback Last verified: 5 August 2026 Live-checked: Create → Start → Poll → Files → Transcript download, List, Cancel, and error codes 401 / 400 / 404 / 409.