Speech to text API for Hindi and 22 Indian languages
Send an audio file, get text back. One endpoint covers 22 Indian languages plus English, and one form field decides whether Hinglish comes back in Devanagari, in Latin script, mixed, or translated to English.
- saaras:v3, per audio minute
- $0.005208
- STT models, 4 on the free tier
- 45
मेरा order कब deliver होगा?
Code-mixed output: Indic words in native script, English words in English.
Simulated example — output for one Hinglish sentence. Your transcript depends on your audio.
Write a request the model will accept
The mode field exists on saaras models only; the diarize/redact/keyterm fields only on a deepgram- id. Pick a model and the form shrinks to what that model accepts, then writes the multipart curl for you.
curl -X POST https://api.callmissed.com/v1/audio/transcriptions \
-H "Authorization: Bearer cm_your_key" \
-F file=@call.wav \
-F model=saaras:v3 \
-F response_format=verbose_jsonOne multipart POST, with or without an SDK
The endpoint follows the OpenAI audio transcription shape, so the OpenAI SDK works once you point base_url at https://api.callmissed.com/v1. These examples use plain HTTP so you can see every field.
curl -X POST https://api.callmissed.com/v1/audio/transcriptions \
-H "Authorization: Bearer cm_your_key" \
-F file=@call.wav \
-F model=saaras:v3 \
-F language=hi-IN \
-F mode=codemix \
-F response_format=verbose_json// Node 18+ — no SDK, just fetch + FormData
import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("file", new Blob([await readFile("call.wav")]), "call.wav");
form.append("model", "saaras:v3");
form.append("language", "hi-IN"); // omit to auto-detect
form.append("mode", "codemix");
form.append("response_format", "verbose_json");
const res = await fetch("https://api.callmissed.com/v1/audio/transcriptions", {
method: "POST",
headers: { Authorization: "Bearer " + process.env.CALLMISSED_API_KEY },
body: form,
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? res.statusText);
console.log((await res.json()).text);# Python — requests only, no SDK
import os, requests
with open("call.wav", "rb") as f:
res = requests.post(
"https://api.callmissed.com/v1/audio/transcriptions",
headers={"Authorization": f"Bearer {os.environ['CALLMISSED_API_KEY']}"},
files={"file": f},
data={"model": "saaras:v3", "language": "hi-IN",
"mode": "codemix", "response_format": "verbose_json"},
)
res.raise_for_status()
print(res.json()["text"]){
"task": "transcribe",
"language": "hi-IN",
"duration": 4.12,
"text": "मेरा order कब deliver होगा?",
"segments": [],
"words": []
}response_format=json returns only {"text": "..."}. The segments and words arrays are returned empty today; do not depend on word timestamps from this endpoint.
- file
- The audio file. Required.
- model
- Any file-transcription STT id. Defaults to saaras:v3.
- language
- A code from the table below. Omit to auto-detect.
- mode
- transcribe, translate, verbatim, translit or codemix. saaras models only.
- response_format
- json, text or verbose_json.
- prompt, temperature
- Optional. temperature is bounded 0 to 2.
Every language code saaras:v3 accepts
Pass the code as the language field. A code that is not on this list falls back to auto-detect, so copy from here rather than guessing. Leave the field out and the model detects the language itself.
Click a card to copy its code.
Need more? saaras:v4 covers 24 languages and ink-whisper covers 100. See Indian language coverage across speech, voice and LLMs
Pick a model per request
The model field takes any of 45 file-transcription ids. These six cover most jobs. Prices are read from the same table billing uses.
| Model id | Use it for | Per hour | Free tier |
|---|---|---|---|
| saaras:v3 | Indian languages or code-mixed HinglishThe default when model is omitted. 22 Indian languages plus English, five output modes. | $0.3125 | Yes |
| saaras:v4 | The same, with one more language24 languages, all five output modes on one model. | $0.3125 | Yes |
| ink-whisper | The widest language coverage100 languages including Hindi, Urdu and Tamil. | $0.1875 | No |
| nova-3 | English call-centre audio on the free tierSame underlying model as deepgram-nova-3; only this id is free-tier. | $0.5208 | Yes |
| deepgram-nova-3 | English with diarize, redact or keytermAccepts the Deepgram feature fields listed below. | $0.3021 | No |
| whisper-large-v3-turbo | Low-cost general transcriptionGeneral multilingual transcription on the free tier. | $0.0625 | Yes |
saaras:v3 works out to $0.3125 per hour, billed on the true audio duration. Browse all models · See pricing
What this endpoint does not do
It is not a live socket.
This endpoint transcribes files. Live transcripts arrive inside the voice agent pipeline, where audio streams over a WebSocket and transcript messages come back as the caller speaks.
Streaming-only models are refused, not swapped.
ink-2 and the Deepgram Flux models detect turns on a live stream. Send one here and you get HTTP 400 naming the file-transcription alternative, rather than a different model billed under the same name.
Word timestamps are not returned yet.
verbose_json gives you text, language and duration. Plan captions and alignment around that.
Building a phone or browser voice bot instead? See the AI voice agent
Extra form fields on deepgram-* models
Speaker labels, redaction and term boosting are available when the model id starts with deepgram-. Other models ignore these fields, and a feature the chosen model does not support is dropped.
- diarize
- utterances
- utt_split
- paragraphs
- numerals
- measurements
- dictation
- profanity_filter
- filler_words
- multichannel
- detect_entities
- detect_language
- redact
- keyterm
- keywords
- search
- replace
Speech to text API questions
Which Indian languages does the speech to text API support?
The default model, saaras:v3, accepts 23 language codes: 22 Indian languages (Hindi, Bengali, Tamil, Telugu, Marathi, Gujarati, Kannada, Malayalam, Punjabi, Odia, Assamese, Urdu, Nepali, Konkani, Kashmiri, Sindhi, Sanskrit, Santali, Manipuri, Bodo, Maithili and Dogri) plus Indian English. Leave language unset and it auto-detects. saaras:v4 covers 24 languages, and ink-whisper covers 100.
How much does speech to text cost?
saaras:v3 is billed at $0.3125 per hour of audio, which is $0.005208 per minute, against the true duration of the file. 4 of the 45 STT models are on the free tier, and a new account starts with 1,000 credits. Every model's price is listed on the pricing and models pages.
Does it handle Hinglish and code-switching?
Yes. Set mode=codemix on saaras:v3 or saaras:v4 and Indic words come back in native script with English words left in English. mode=translit returns the same speech in Latin script, and mode=translate returns English.
Is there a real-time streaming speech to text endpoint?
Not as a standalone endpoint. POST /v1/audio/transcriptions takes a file. Live transcripts are delivered inside the voice agent pipeline, where audio streams over a WebSocket and transcript messages arrive as the caller speaks. Streaming-only models such as ink-2 return HTTP 400 on the file endpoint rather than silently substituting another model.
Can I use the OpenAI SDK?
Yes. The endpoint follows the OpenAI audio transcription shape, so client.audio.transcriptions.create() works once you set base_url to https://api.callmissed.com/v1 and use a cm_ API key. No CallMissed-specific SDK is required; plain HTTP works too, as the examples on this page show.
What does the response contain?
response_format=json returns {"text": "..."}. text returns plain text. verbose_json adds task, language and the audio duration in seconds. The segments and words arrays are present for OpenAI-client compatibility and are currently returned empty, so do not build on word-level timestamps from this endpoint.
Do I get speaker labels, redaction or keyword boosting?
On Deepgram models only. When model is a deepgram-* id the endpoint also accepts diarize, redact (pci, pii, phi, numbers), keyterm, keywords, utterances, paragraphs and the other fields listed on this page. Other models ignore them.




