Create Job
curl --request POST \
--url https://api.vachana.ai/stt/v3/batch/jobs \
--header 'Content-Type: application/json' \
--header 'X-API-Key-ID: <api-key>' \
--data '
{
"config": {
"model": "prisma-v2.5",
"language_code": "en-IN",
"mode": "transcribe",
"with_diarization": false,
"is_multi_channel": false,
"with_denoise": false
},
"source": {
"type": "cloud_storage",
"auth": {
"mode": "public"
},
"paths": [
"https://cdn.example.com/audio/call-001.mp3"
]
}
}
'import requests
url = "https://api.vachana.ai/stt/v3/batch/jobs"
payload = {
"config": {
"model": "prisma-v2.5",
"language_code": "en-IN",
"mode": "transcribe",
"with_diarization": False,
"is_multi_channel": False,
"with_denoise": False
},
"source": {
"type": "cloud_storage",
"auth": { "mode": "public" },
"paths": ["https://cdn.example.com/audio/call-001.mp3"]
}
}
headers = {
"X-API-Key-ID": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key-ID': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
config: {
model: 'prisma-v2.5',
language_code: 'en-IN',
mode: 'transcribe',
with_diarization: false,
is_multi_channel: false,
with_denoise: false
},
source: {
type: 'cloud_storage',
auth: {mode: 'public'},
paths: ['https://cdn.example.com/audio/call-001.mp3']
}
})
};
fetch('https://api.vachana.ai/stt/v3/batch/jobs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"job_id": "019fa854-1db0-7e45-a026-7a6b09ff6d7c",
"status": "CREATED",
"created_at": "2026-07-28T10:45:12.769450Z",
"message": "Job created. Call POST /stt/v3/batch/jobs/{job_id}/start to begin processing.",
"total_files_accepted": null
}Create Job
Create a new batch transcription job with uploaded files, a ZIP, or public URLs.
POST
/
stt
/
v3
/
batch
/
jobs
Create Job
curl --request POST \
--url https://api.vachana.ai/stt/v3/batch/jobs \
--header 'Content-Type: application/json' \
--header 'X-API-Key-ID: <api-key>' \
--data '
{
"config": {
"model": "prisma-v2.5",
"language_code": "en-IN",
"mode": "transcribe",
"with_diarization": false,
"is_multi_channel": false,
"with_denoise": false
},
"source": {
"type": "cloud_storage",
"auth": {
"mode": "public"
},
"paths": [
"https://cdn.example.com/audio/call-001.mp3"
]
}
}
'import requests
url = "https://api.vachana.ai/stt/v3/batch/jobs"
payload = {
"config": {
"model": "prisma-v2.5",
"language_code": "en-IN",
"mode": "transcribe",
"with_diarization": False,
"is_multi_channel": False,
"with_denoise": False
},
"source": {
"type": "cloud_storage",
"auth": { "mode": "public" },
"paths": ["https://cdn.example.com/audio/call-001.mp3"]
}
}
headers = {
"X-API-Key-ID": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key-ID': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
config: {
model: 'prisma-v2.5',
language_code: 'en-IN',
mode: 'transcribe',
with_diarization: false,
is_multi_channel: false,
with_denoise: false
},
source: {
type: 'cloud_storage',
auth: {mode: 'public'},
paths: ['https://cdn.example.com/audio/call-001.mp3']
}
})
};
fetch('https://api.vachana.ai/stt/v3/batch/jobs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"job_id": "019fa854-1db0-7e45-a026-7a6b09ff6d7c",
"status": "CREATED",
"created_at": "2026-07-28T10:45:12.769450Z",
"message": "Job created. Call POST /stt/v3/batch/jobs/{job_id}/start to begin processing.",
"total_files_accepted": null
}Overview
Create a new batch transcription job within your organization. The job is created inCREATED status with your audio accepted — it does not start transcription yet.
You can then start processing via the Start Job endpoint.
| Method | Best for | Content-Type |
|---|---|---|
| Direct upload / ZIP | Files on your machine or CI | multipart/form-data |
| Public URL | HTTPS links, including S3 presigned URLs | application/json |
Authentication
| Header | Required | Description |
|---|---|---|
X-API-Key-ID | Yes | Your Gnani Prisma v2.5 API key |
Request Body
Multipart upload
string
required
JSON string with STT configuration. Required fields:
model, language_code. Optional: mode, with_diarization, num_speakers, is_multi_channel, bias_list, bias_score (see Word boosting).file
required
Audio file or ZIP archive. Repeat this field for multiple files. Max 100 files per job, 10 MB per file. ZIP up to 50 MB compressed.
string
Optional HTTPS webhook URL. When set, Gnani POSTs terminal job results (including
full_transcript) to this URL.Public URL (JSON)
| Field | Type | Required | Description |
|---|---|---|---|
config | object | Yes | STT config object. Optional bias_list and bias_score — see Word boosting |
source.type | string | Yes | "cloud_storage" |
source.auth.mode | string | Yes | "public" |
source.paths | string[] | Yes | Public HTTPS URLs |
callback_url | string | No | Webhook URL |
Word boosting (bias_list)
Optionally bias 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 multipart config string and the JSON body alike.
| Field | Type | Required | Description |
|---|---|---|---|
config.bias_list | string[] | No | Up to 100 words. One word per entry — letters only (Latin or Indic script), no spaces, digits or punctuation. A comma-separated string ("HDFC,Prisma") is also accepted. Case does not matter. |
config.bias_score | number | No | One of 0.0, 0.5, 1.0, 1.5, 2.0. 0.0 turns boosting off. Defaults to 1.0 when bias_list is sent without it. Ignored when there is no bias_list. |
"config": {
"model": "prisma-v2.5",
"language_code": "hi-IN",
"bias_list": ["HDFC", "Prisma", "EMI"],
"bias_score": 1.5
}
- The same list and score apply to every segment of every file in the job.
- Boosting takes effect only for languages served by the v2 model (
hi-IN,en-IN,ta-IN,bn-IN,kn-IN,te-IN,ml-IN,mr-IN). For anything else it is ignored, not rejected. - An invalid list or score is rejected when the job is created (see the
400 INVALID_CONFIGerror below), unlike the synchronousPOST /stt/v3, which skips boosting silently. - Boosted words are not echoed in the transcript;
Get Job Statusshows them inconfig.
Example cURL
curl -X POST "https://api.vachana.ai/stt/v3/batch/jobs" \
-H "X-API-Key-ID: <YOUR_API_KEY>" \
-F 'config={"model":"prisma-v2.5","language_code":"en-IN","mode":"transcribe","with_diarization":false,"is_multi_channel":false};type=application/json' \
-F "files=@./customer_call.wav"
Example cURL with word boosting
curl -X POST "https://api.vachana.ai/stt/v3/batch/jobs" \
-H "X-API-Key-ID: <YOUR_API_KEY>" \
-F 'config={"model":"prisma-v2.5","language_code":"hi-IN","mode":"transcribe","bias_list":["HDFC","Prisma","EMI"],"bias_score":1.5};type=application/json' \
-F "files=@./customer_call.wav"
Response
Success (201)
{
"job_id": "019fa259-b084-71eb-94d7-ba4cdf2e64c6",
"status": "CREATED",
"total_files_accepted": 1,
"created_at": "2026-07-27T06:53:34.750193Z",
"message": "1 file(s) uploaded. Call POST /v1/jobs/{job_id}/start to begin processing."
}
job_id. Always start with /stt/v3/batch/jobs/{job_id}/start (even if the message mentions /v1/jobs/...).
Error responses
400 Unsupported language{
"error": "UNSUPPORTED_LANGUAGE",
"message": "Value error, This service does not support language_code 'xx-XX'. Supported languages: bn-IN, en-IN, gu-IN, hi-IN, kn-IN, ml-IN, mr-IN, pa-IN, ta-IN, te-IN"
}
bias_list / bias_score
{
"error": "INVALID_CONFIG",
"message": "Invalid config: 1 validation error for STTConfig\nbias_list\n Value error, bias_list entries must be single words, not phrases ..."
}
bias_list entries must be letters only (no digits, punctuation, or symbols), bias_list holds N words; the maximum is 100, bias_score must be one of [0.0, 0.5, 1.0, 1.5, 2.0].
401 Missing API key
{
"detail": {
"error_code": "MISSING_API_KEY",
"message": "Missing API key",
"status_code": 401
}
}
Use Cases
- Uploading one or many call recordings for offline transcription
- Sending a ZIP of customer audio for batch processing
- Pointing to public HTTPS / S3 presigned URLs without re-uploading files
Authorizations
Your Gnani API key
Body
application/json
Was this page helpful?