model=prisma-v3.0: one model for all ten languages, which identifies the spoken language itself. A prisma-v3.0 job also accepts four extra config options: format, keyterms, topic and speaker_names (see Prisma v3.0 options).
Everything else about a job is the same on both models: the endpoints, start, cancel, status and file-results calls, speaker diarization, denoising, limits and webhooks.
Flow: create a job → start it → poll until it finishes → download transcripts(or receive them on a webhook).
How it works
/start.
Interactive API reference
These are the same six endpoints as on docs.gnani.ai. Open an endpoint page and use Try it to send a live request with yourX-API-Key-ID.
For files over 10 MB, create the job with a presigned upload (
POST /stt/v3/batch/v2/jobs). It is described on Create job and has no Try it playground.
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
1. Create
The Prisma v2.5 request below was live-verified.model to prisma-v3.0 in config. With prisma-v3.0, language_code can be indic-auto, or 1–4 comma-separated codes (see Language identification):
2. Start
3. Poll until COMPLETED
4. Get transcript_url, then download text
prisma-v3.0 job returns the same document with model set to prisma-v3.0 and language_detected filled on every segment that has text. See Get job files.
5. List jobs
6. Cancel a job
Quickstart — Python SDK
The Python SDK wraps the same four steps — create, start, poll, fetch:job.id to resume later with client.get_job(job_id). For asyncio use AsyncGnaniSTTBatchClient. To do all four steps in one call, use client.transcribe(...) — see the SDK guide.
Configuration
Inverse Text Normalization (ITN) is not supported for STT Batch.
Prisma v3.0 options
format, keyterms, topic and speaker_names exist only for prisma-v3.0. Sending any of them with another model returns 400 INVALID_CONFIG: they are refused, not ignored. They go inside config, for every way of creating a job.
Output style
When you leave
format out, the model picks a style for each segment: transcribe when the only language is hi-IN or en-IN (or a list of languages that are all hi-IN or en-IN), and verbatim otherwise, including indic-auto. English speech is written in Latin in every style. Inverse text normalization is not supported on Batch, so format is what controls how numbers are written. For more on the three styles, see Prisma v3.0.
Context
Context is sent with every segment of every file in the job.
None of them may contain
<| or |>. keyterms and speaker_names can also be sent as a comma-separated string, or as a string that holds a JSON array. Use the JSON array form when an item contains a comma.
Send one of the combinations below. Anything else returns 400 INVALID_CONFIG when the job is created.
bias_list with prisma-v3.0: if keyterms is not sent, bias_list is used as keyterms, and counts as keyterms in the table above. If both are sent, keyterms wins and bias_list is dropped. bias_score is ignored. Get job status shows the result: keyterms filled, bias_list and bias_score null.
Not available on Batch
These REST options are not supported on Batch:Word boosting
This section describes Prisma v2.5. With
prisma-v3.0, bias_list is the older name of keyterms and bias_score is ignored. See Prisma v3.0 options.bias_list nudges recognition towards words the model tends to get wrong — brand
names, product names, Roman-script tokens. Both fields are optional and go inside
config, for the public-URL body and for the multipart config field alike:
Start at
1.0 and raise it only if a word is still missed. A stronger score can make the model favour a listed word where it was not spoken.
The same list and score are applied to every segment of every file in the job. An
invalid list or score is rejected when the job is created (400 INVALID_CONFIG) — unlike the
synchronous POST /stt/v3, which would silently skip boosting.
Boosting only takes effect for languages served by the v2 model (hi-IN, en-IN,
ta-IN, bn-IN, kn-IN, te-IN, ml-IN, mr-IN, gu-IN, pa-IN); it is ignored, not rejected,
for anything else. Boosted words are not echoed in the transcript, only in the job’s
config.
Speech enhancement (denoising)
Setwith_denoise: true to have each file cleaned up before it is segmented and
transcribed:
Notes:
- The whole pipeline sees the cleaned audio — speech detection, transcription and diarization all run on it, so timestamps and speaker labels come from the enhanced signal.
- It adds processing work per file — on the order of a quarter of the audio’s
duration again — so a job with
with_denoisetakes longer to reachCOMPLETED. - It is not conditional on how noisy the file is — every file in the job is enhanced. Set it per job, on the jobs that need it.
- Nothing else changes: the transcript JSON, webhook payloads and billing are the same (billing is per audio duration either way).
- The setting is echoed back as
config.with_denoiseon Get job status.
Enhancement is applied where the platform has it enabled. If it is switched off for
maintenance, a job that asked for it still runs to
COMPLETED — transcribed from the
original audio rather than failing.Limits
Limits depend on how you send the audio. The 10 MB, ZIP 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.
Presigned upload (source.type: "direct_upload_url")
For files too large for direct upload. See Create job.
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
Language identification
How the language is chosen depends on the model. If you know the language, pass a single code on either model.Prisma v3.0
prisma-v3.0 identifies the spoken language itself, so you can send indic-auto, or one to four language codes.
- The language is decided per segment: each stretch of speech between pauses, split again at speaker changes. A call where speakers switch language gets each part in its own language.
- Your languages are a hint, not a limit. If a segment is clearly in a language outside your list, it is transcribed and reported in that language.
- Order does not matter. Prisma v3.0 has no fallback language.
- At most 4 languages.
"auto"is accepted as another spelling of"indic-auto". Either is stored as"auto".- The transcript reports the language of each segment in
language_detected, and the language that covers the most speech inlanguage_code. See Get job files.
Prisma v2.5
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.
Webhooks work the same way for prisma-v3.0: same events, same payload. The entries in transcripts use the same transcript document as Get job files, where the prisma-v3.0 differences are described.
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 (Prisma v2.5): 5 August 2026 Live-checked: Create → Start → Poll → Files → Transcript download, List, Cancel, and error codes401 / 400 / 404 / 409.