(or receive them on a webhook).
How it works
/start.
Interactive API reference
Each endpoint has a Try it playground. Paste yourX-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
- An API key from the Gnani APIs dashboard
- Audio with real speech in a supported format
- A supported language code
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.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:- 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_codein 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
Passcallback_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 codes401 / 400 / 404 / 409.