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": "gnani-prisma-v2.5",
"language_code": "en-IN",
"mode": "transcribe",
"with_diarization": false,
"is_multi_channel": 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": "gnani-prisma-v2.5",
"language_code": "en-IN",
"mode": "transcribe",
"with_diarization": False,
"is_multi_channel": 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: 'gnani-prisma-v2.5',
language_code: 'en-IN',
mode: 'transcribe',
with_diarization: false,
is_multi_channel: 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
}Speech-to-Text (Batch)
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": "gnani-prisma-v2.5",
"language_code": "en-IN",
"mode": "transcribe",
"with_diarization": false,
"is_multi_channel": 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": "gnani-prisma-v2.5",
"language_code": "en-IN",
"mode": "transcribe",
"with_diarization": False,
"is_multi_channel": 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: 'gnani-prisma-v2.5',
language_code: 'en-IN',
mode: 'transcribe',
with_diarization: false,
is_multi_channel: 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. The job is created inCREATED status with your audio accepted — it does not start transcription yet.
Call Start Job next.
| 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 |
application/json) body below. For file upload, use the multipart cURL examples.
Authentication
| Header | Required | Description |
|---|---|---|
X-API-Key-ID | Yes | Your Gnani Prisma v2.5 API key |
Request Body
Public URL (application/json) — Try it
| Field | Type | Required | Description |
|---|---|---|---|
config.model | string | Yes | "gnani-prisma-v2.5" |
config.language_code | string | Yes | One code, e.g. en-IN. Or up to 3 comma-separated codes ("hi-IN,en-IN") to have the language identified per file — see Language identification |
config.mode | string | No | "transcribe" |
config.with_diarization | boolean | No | Default false |
config.num_speakers | integer | No | Required when diarization is on (max 2) |
config.is_multi_channel | boolean | No | Default false |
source.type | string | Yes | "cloud_storage" |
source.auth.mode | string | Yes | "public" |
source.paths | string[] | Yes | Public HTTPS URLs (presigned URLs work). A path ending in / expands to every audio file under that prefix. No 10 MB cap here — cloud files are bounded by the 4-hour duration limit, not by size. See Limits |
callback_url | string | No | Webhook URL — leave empty in Try it if unused |
Multipart upload (multipart/form-data)
Use cURL / your client — not the Try it panel.
| Field | Type | Required | Description |
|---|---|---|---|
config | string (JSON) | Yes | STT config. Required: model, language_code (one code, or up to 3 comma-separated — see Language identification). Optional: mode (default transcribe), with_diarization, num_speakers (required when diarization is on, max 2), is_multi_channel |
files | file | Yes | Audio or ZIP. Max 100 files/job, 10 MB per file, ZIP up to 50 MB compressed / 200 MB decompressed. These caps apply to uploads only — see Limits |
callback_url | string | No | HTTPS webhook. See Webhook sample payloads |
config as a form field with Content-Type: application/json (see cURL -F '...;type=application/json').
Example cURL
Direct upload (live-verified)
curl --request POST \
--url https://api.vachana.ai/stt/v3/batch/jobs \
--header 'X-API-Key-ID: <YOUR_API_KEY>' \
-F 'config={"model":"gnani-prisma-v2.5","language_code":"en-IN","mode":"transcribe","with_diarization":false,"is_multi_channel":false};type=application/json' \
-F "files=@./customer_call.wav"
Public URL
curl --request POST \
--url https://api.vachana.ai/stt/v3/batch/jobs \
--header 'Content-Type: application/json' \
--header 'X-API-Key-ID: <YOUR_API_KEY>' \
--data '{
"config": {
"model": "gnani-prisma-v2.5",
"language_code": "en-IN",
"mode": "transcribe"
},
"source": {
"type": "cloud_storage",
"auth": { "mode": "public" },
"paths": ["https://cdn.example.com/audio/call-001.mp3"]
}
}'
Diarization (2 speakers)
curl --request POST \
--url https://api.vachana.ai/stt/v3/batch/jobs \
--header 'X-API-Key-ID: <YOUR_API_KEY>' \
-F 'config={"model":"gnani-prisma-v2.5","language_code":"en-IN","mode":"transcribe","with_diarization":true,"num_speakers":2};type=application/json' \
-F "files=@./stereo_call.wav"
Response
Success — multipart upload (201)
{
"job_id": "019fa79e-81f9-7a8a-a446-6eff16ddec30",
"status": "CREATED",
"total_files_accepted": 1,
"created_at": "2026-07-28T07:26:50.926489Z",
"message": "1 file(s) uploaded. Call POST /v1/jobs/{job_id}/start to begin processing."
}
job_id. Always start with:
POST /stt/v3/batch/jobs/{job_id}/start
/v1/jobs/...)
Success — public URL create (201)
{
"job_id": "019fa79c-ec88-770c-b498-371fc21fb40e",
"status": "CREATED",
"created_at": "2026-07-28T07:25:07.137907Z",
"message": "Job created. Call POST /stt/v3/batch/jobs/{job_id}/start to begin processing.",
"total_files_accepted": null
}
Error responses
401 Missing API key{
"detail": {
"error_code": "MISSING_API_KEY",
"message": "Missing API key",
"status_code": 401
}
}
{
"error": "UNSUPPORTED_LANGUAGE",
"message": "Value error, This service does not support language_code 'xx-XX'. Supported languages: bn-IN, en-IN, hi-IN, kn-IN, ml-IN, mr-IN, ta-IN, te-IN"
}
{
"error": "UNSUPPORTED_LANGUAGE",
"message": "Value error, language_code accepts at most 3 comma-separated languages for identification, got 4: hi-IN, en-IN, kn-IN, ta-IN."
}
string
Unique job identifier. Required for Start / Status / Files / Cancel.
string
Always
CREATED on success.integer
Number of files accepted for multipart/ZIP uploads. May be
null for public-URL creates.Webhook samples
If you passcallback_url, Gnani sends a POST to your URL when the job finishes.
Full payload examples (including transcripts[] / full_transcript):
→ Webhook samples on Batch STT Introduction
Events: job.completed · job.partial_failure · job.failed · job.cancelled
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 Prisma v2.5 API key
Body
application/json
Was this page helpful?