Skip to main content
Use STT Batch to transcribe long recordings or many files asynchronously. On Batch, Prisma v3.0 is the same model as REST with 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

Important: creating a job does not start transcription. You must call /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 your X-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

  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

1. Create

The Prisma v2.5 request below was live-verified.
To use Prisma v3.0, set 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):
Try it on Create job Example response:

2. Start

Try it on Start job

3. Poll until COMPLETED

Try it on Get job status

4. Get transcript_url, then download text

Try it on Get job files
A 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

Try it on List jobs

6. Cancel a job

Try it on Cancel job

Quickstart — Python SDK

The Python SDK wraps the same four steps — create, start, poll, fetch:
Keep 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.
Context can make a model less accurate on some audio. Compare a job with and without it on your own recordings before relying on it.
For tips on writing keyterms, see Prisma v3.0.

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)

Set with_denoise: true to have each file cleaned up before it is segmented and transcribed:
It is off by default, and worth turning on only when your audio needs it: 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_denoise takes longer to reach COMPLETED.
  • 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_denoise on 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.
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

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 in language_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:
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. 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 codes 401 / 400 / 404 / 409.