Transcriptions
Manage speech-to-text transcription jobs. Submit audio files for transcription, monitor job progress, retrieve results in multiple formats, configure webhooks for completion notifications, and manage the job lifecycle.
Base path: /api/v1/speech-services/transcriptions
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/v1/speech-services/transcriptions |
List Transcription Jobs |
POST |
/api/v1/speech-services/transcriptions/upload |
Upload and Transcribe |
POST |
/api/v1/speech-services/transcriptions |
Create Transcription Job |
GET |
/api/v1/speech-services/transcriptions/{id} |
Get Transcription Job |
GET |
/api/v1/speech-services/transcriptions/{id}/result |
Get Transcription Result |
PUT |
/api/v1/speech-services/transcriptions/{id}/webhook |
Update Webhook |
DELETE |
/api/v1/speech-services/transcriptions/{id}/webhook |
Delete Webhook |
POST |
/api/v1/speech-services/transcriptions/{id}/cancel |
Cancel Job |
DELETE |
/api/v1/speech-services/transcriptions/{id} |
Delete Job |
POST |
/api/v1/speech-services/transcriptions/{id}/purge |
Purge Job |
List Transcription Jobs
GET /api/v1/speech-services/transcriptions
Requires Authentication - Scopes: speech:transcriptions:read
Retrieve a paginated list of transcription jobs. By default returns only the current user's jobs. When fileId is specified, returns all transcriptions for that file (requires speech:files:read access to the file, enabling discovery of transcriptions on shared files).
Note
The result field is not included in list responses to reduce payload size. Use Get Transcription Job or Get Transcription Result to retrieve results.
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
page |
integer |
No | 0 |
Page number (zero-based). |
size |
integer |
No | 20 |
Page size (max 100). |
status |
string[] |
No | - | Filter by job status (comma-separated). Values: PENDING, IN_PROGRESS, COMPLETED, FAILED, CANCELLED. |
fileId |
string (UUID) |
No | - | Filter by source file ID. When specified for a shared file, returns all transcriptions for that file. |
isDeleted |
boolean |
No | false |
Filter by deleted state. |
createdAfter |
string (ISO 8601) |
No | - | Return jobs created on or after this timestamp. |
createdBefore |
string (ISO 8601) |
No | - | Return jobs created on or before this timestamp. |
completedAfter |
string (ISO 8601) |
No | - | Return jobs completed on or after this timestamp. |
completedBefore |
string (ISO 8601) |
No | - | Return jobs completed on or before this timestamp. |
itnRequested |
boolean |
No | - | Filter by whether ITN was requested. |
punctuationRequested |
boolean |
No | - | Filter by whether punctuation was requested. |
capitalizationRequested |
boolean |
No | - | Filter by whether capitalization was requested. |
diarizationRequested |
boolean |
No | - | Filter by whether diarization was requested. |
sort |
string |
No | creationDate,desc |
Sort field and direction. Allowed fields: creationDate, completionDate, status. Direction: asc or desc. |
SpeechServiceTranscriptionJobsListResponse
| Field | Type | Nullable | Description |
|---|---|---|---|
jobs |
SpeechServiceTranscriptionJobResponse[] |
No | Array of transcription job objects (without result). |
size |
integer |
No | Number of items returned in this page. |
total |
long |
No | Total number of matching items across all pages. |
filters |
object |
No | Echo of applied filters. |
sort |
object |
No | Applied sort order (field and direction). |
{
"jobs": [
{ "id": "d1e2f3a4-...", "status": "COMPLETED", ... }
],
"size": 1,
"total": 1
}
| Status | Description |
|---|---|
200 OK |
Transcription jobs retrieved successfully. |
400 Bad Request |
Invalid sort field or query parameters. |
401 Unauthorized |
Missing or invalid authentication. |
403 Forbidden |
Insufficient scope. |
Upload and Transcribe
POST /api/v1/speech-services/transcriptions/upload
Requires Authentication - Scopes: speech:files:write, speech:transcriptions:write; speech:translations:write when translations are requested
Rate Limited - Transcription admission and file upload limits, plus one Text Services execution and one Speech Services translation creation unit per target.
Upload a media file (or import from URI) and immediately start a transcription job in one step. Provide either file (multipart binary) or uri (string), but not both. Optional summary and translations schedule independent jobs after transcription completes.
Content Type
This endpoint requires multipart/form-data content type. The name and transcription parts are required. Provide exactly one of file or uri.
Multipart Form Parts
| Part | Type | Required | Description |
|---|---|---|---|
file |
binary |
Conditional | The media file to upload. Required if uri is not provided. |
uri |
string |
Conditional | URI of a remote file to import (HTTP, HTTPS, or S3). Required if file is not provided. |
uriHeaders |
string (JSON) |
No | Optional HTTP request headers for uri: at most 32 keys and 8,192 UTF-8 bytes per value. Keys must be allowed by server configuration. |
name |
string |
Yes | A display name for the uploaded file. |
description |
string |
No | A description of the file content. |
path |
string |
No | Virtual directory path. Must start and end with /. Default: /. |
metadata |
string (JSON) |
No | Additional key-value metadata as a JSON string. |
tags |
string (JSON) |
No | Array of tag display names as a JSON string. |
generateListeningAudio |
boolean |
No | Generate a compressed MP3 derivative. Default: true. |
transcription |
string (JSON) |
Yes | Transcription options as a JSON string. See SpeechServiceTranscriptionOptions. |
diarization |
string (JSON) |
No | Diarization options as a JSON string. See SpeechServiceDiarizationOptions. |
webhook |
string (JSON) |
No | Webhook configuration as a JSON string. See SpeechServiceWebhook. |
summary |
string (JSON) |
No | Requires scope: speech:summaries:writeSummary options as a JSON string. When provided, a summary job is scheduled to run after transcription completes. Requires promptTemplateId. |
translations |
string (JSON array) |
No | Requires scope: speech:translations:writeArray of SpeechServiceTranslationOptions. Each entry creates an independent job waiting for the transcript. Omitted or empty means no translations; default maximum 10. |
curl -X POST https://koldan.dixilang.com/api/v1/speech-services/transcriptions/upload \
-H "X-API-Key: $KOLDAN_API_KEY" \
-F "file=@meeting-2026-04-01.wav" \
-F "name=meeting-recording" \
-F 'transcription={"model":"hebrew-general","language":{"defaultLanguageCode":"he"}}' \
-F 'diarization={"enabled":true,"mode":"SPEAKER","maxSpeakers":4}'
import requests, json
with open("meeting-2026-04-01.wav", "rb") as f:
resp = requests.post(
"https://koldan.dixilang.com/api/v1/speech-services/transcriptions/upload",
headers={"Authorization": f"Bearer {JWT}"},
files={"file": ("meeting-2026-04-01.wav", f)},
data={
"name": "meeting-recording",
"transcription": json.dumps({"model": "hebrew-general", "language": {"defaultLanguageCode": "he"}}),
"diarization": json.dumps({"enabled": True, "mode": "SPEAKER", "maxSpeakers": 4})
}
)
print(resp.json())
SpeechServiceUploadAndTranscribeResponse
| Field | Type | Nullable | Description |
|---|---|---|---|
file |
SpeechServiceFileResponse |
No | The uploaded file object. |
job |
SpeechServiceTranscriptionJobResponse |
No | The created transcription job. |
summary |
object |
Yes | The scheduled summary job. Present only when summary options were provided. |
{
"file": { "id": "a1b2c3d4-...", "name": "meeting-recording", ... },
"job": { "id": "d1e2f3a4-...", "status": "PENDING", ... },
"summary": null
}
| Status | Description |
|---|---|
201 Created |
File uploaded and transcription job created successfully. |
400 Bad Request |
Invalid JSON parts, missing required parts, or both file and uri provided (or neither). |
401 Unauthorized |
Missing or invalid authentication. |
403 Forbidden |
Insufficient scope. |
429 Too Many Requests |
Rate limit exceeded, including per-target translation admission. |
Create Transcription Job
POST /api/v1/speech-services/transcriptions
Requires Authentication - Scopes: speech:transcriptions:write; speech:translations:write when translations are requested
Rate Limited - Transcription admission, plus one Text Services execution and one Speech Services translation creation unit per target.
Submit a new transcription job for an existing uploaded file. The file must belong to the current user, must not be deleted, and must have completed ingestion (for URI imports).
SpeechServiceTranscriptionJobRequest
| Field | Type | Required | Description |
|---|---|---|---|
fileId |
string (UUID) |
Yes | The ID of the uploaded file to process. |
transcription |
SpeechServiceTranscriptionOptions |
Yes | Transcription configuration options. |
diarization |
SpeechServiceDiarizationOptions |
No | Speaker diarization configuration. |
webhook |
SpeechServiceWebhook |
No | Webhook configuration for completion notifications. |
translations |
SpeechServiceTranslationOptions[] |
No | Requires scope: speech:translations:writeIndependent target-language jobs. Omitted or empty means no translations; default maximum 10. See Automatic translations. |
{
"fileId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"transcription": {
"model": "hebrew-general",
"punctuation": true
},
"diarization": { "enabled": true, "mode": "SPEAKER" }
}
curl -X POST https://koldan.dixilang.com/api/v1/speech-services/transcriptions \
-H "X-API-Key: $KOLDAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"fileId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"transcription": {
"model": "hebrew-general",
"punctuation": true
},
"diarization": { "enabled": true }
}'
import requests
resp = requests.post(
"https://koldan.dixilang.com/api/v1/speech-services/transcriptions",
headers={
"Authorization": f"Bearer {JWT}",
"Content-Type": "application/json"
},
json={
"fileId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"transcription": {
"model": "hebrew-general",
"punctuation": True
},
"diarization": {"enabled": True}
}
)
print(resp.json())
SpeechServiceTranscriptionJobResponse
Returns the created transcription job with status set to PENDING. See Data Types for the full response schema.
| Status | Description |
|---|---|
201 Created |
Transcription job created successfully. |
400 Bad Request |
Invalid request body or missing required fields. |
401 Unauthorized |
Missing or invalid authentication. |
403 Forbidden |
Insufficient scope. |
404 Not Found |
File not found or does not belong to the current user. |
422 Unprocessable Entity |
File is deleted or ingestion is not completed. |
Automatic translations
Both Create Transcription Job and Upload and Transcribe accept translations. Every SpeechServiceTranslationOptions entry creates an independent translation job with status PENDING and phase WAITING_FOR_TRANSCRIPTION. The response's translationIds identifies the retained automatic children in request order (under job.translationIds for upload). List all translations through the paginated Translations API using transcriptionId.
Targets must be supported by the chosen Text Services alias. Omitted model resolves the tenant default and pins its concrete model name at submission. Duplicate target/model combinations and null entries are rejected with 400; the default maximum is 10 entries, configurable by koldan.speech-services.translation.max-automatic-targets. Each target requires speech:translations:write and consumes both translation rate limits at submission. An omitted child webhook inherits the parent webhook.
No monthly translation requests or tokens are reserved while waiting. When the transcript is ready, each child validates its source language pairs, retains an aligned source snapshot, and reserves Text Services request and translation-token quota. Unsupported pairs or exhausted quota fail only the affected child. Success commits usage once; failure or cancellation releases its reservation. Source failure fails waiting translations; cancellation propagates to active translation children. Each child has its own status, webhook and retention; one failure does not fail siblings or the transcription. See translation lifecycle and retention.
{
"fileId": "dceecb24-6074-4c42-914e-c5974d8ad749",
"transcription": { "model": "hebrew-general", "language": { "defaultLanguageCode": "he-IL" } },
"translations": [
{ "targetLanguageCode": "en", "model": "translation-default" },
{ "targetLanguageCode": "ar", "model": "translation-default" }
]
}
curl -X POST https://koldan.dixilang.com/api/v1/speech-services/transcriptions/upload \
-H "X-API-Key: $KOLDAN_API_KEY" \
-F "file=@meeting.wav" \
-F "name=meeting" \
-F 'transcription={"model":"hebrew-general"}' \
-F 'translations=[{"targetLanguageCode":"en","model":"translation-default"}]'
Get Transcription Job
GET /api/v1/speech-services/transcriptions/{id}
Requires Authentication - Scopes: speech:transcriptions:read
Retrieve details of a specific transcription job including the full result when the job is completed and not purged.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id |
string (UUID) |
Yes | Unique identifier of the transcription job. |
SpeechServiceTranscriptionJobResponse
Returns the full job object including the result field when status is COMPLETED and isPurged is false. See Data Types for the full response schema.
{
"id": "d1e2f3a4-b5c6-7890-abcd-ef1234567890",
"status": "COMPLETED",
"creationDate": "2026-04-01T10:00:00Z",
"completionDate": "2026-04-01T10:05:32Z",
"result": { "text": "Hello everyone...", "confidence": 0.94, ... },
...
}
| Status | Description |
|---|---|
200 OK |
Transcription job retrieved successfully. |
401 Unauthorized |
Missing or invalid authentication. |
403 Forbidden |
Insufficient scope or not authorized to access this job. |
404 Not Found |
Job not found. |
Get Transcription Result
GET /api/v1/speech-services/transcriptions/{id}/result
Requires Authentication - Scopes: speech:transcriptions:read
Retrieve the transcription result for a completed job. The format parameter controls the export format.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id |
string (UUID) |
Yes | Unique identifier of the transcription job. |
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
format |
string |
No | json |
Export format. Currently supported: json. |
SpeechServiceTranscriptionJobResult
Returns the transcription result object. See Data Types for the full response schema.
{
"text": "Hello everyone, welcome to the meeting...",
"detectedLanguages": ["en"],
"confidence": 0.94,
"duration": 420.5,
"segments": [
{ "start": 0.0, "end": 3.2, "text": "Hello everyone,", "speaker": "SPEAKER_00", ... }
]
}
| Status | Description |
|---|---|
200 OK |
Transcription result returned successfully. |
400 Bad Request |
Unsupported export format. |
401 Unauthorized |
Missing or invalid authentication. |
403 Forbidden |
Insufficient scope or not authorized to access this job. |
404 Not Found |
Job not found or result not available (job not completed). |
410 Gone |
Job result has been purged and is no longer available. |
Update Webhook
PUT /api/v1/speech-services/transcriptions/{id}/webhook
Requires Authentication - Scopes: speech:transcriptions:write
Set or update the webhook configuration for an existing transcription job. The job must not be in a terminal state (COMPLETED, FAILED, or CANCELLED).
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id |
string (UUID) |
Yes | Unique identifier of the transcription job. |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
url |
string |
Yes | The URL to send the webhook notification to. Must be HTTPS. |
secret |
string |
No | A shared secret used to sign webhook payloads with HMAC-SHA256. Responses return only a masked value when a secret is configured. |
headers |
object |
No | Custom HTTP headers to include in the webhook request. |
includeSegments |
boolean |
No | When true, the transcription.completed webhook payload includes the full result with segments, words, and timing. Default: false. |
{
"url": "https://example.com/webhook/transcriptions",
"secret": "whsec_abc123",
"headers": { "X-Custom-Header": "my-value" },
"includeSegments": true
}
import requests
job_id = "d1e2f3a4-b5c6-7890-abcd-ef1234567890"
resp = requests.put(
f"https://koldan.dixilang.com/api/v1/speech-services/transcriptions/{job_id}/webhook",
headers={
"Authorization": f"Bearer {JWT}",
"Content-Type": "application/json"
},
json={
"url": "https://example.com/webhook/transcriptions",
"secret": "whsec_abc123"
}
)
print(resp.json())
SpeechServiceTranscriptionJobResponse
Returns the updated job object. See Data Types for the full response schema.
| Status | Description |
|---|---|
200 OK |
Webhook updated successfully. |
401 Unauthorized |
Missing or invalid authentication. |
403 Forbidden |
Insufficient scope or not authorized. |
404 Not Found |
Job not found. |
409 Conflict |
Job is in a terminal state and cannot be updated. |
Delete Webhook
DELETE /api/v1/speech-services/transcriptions/{id}/webhook
Requires Authentication - Scopes: speech:transcriptions:write
Remove the webhook configuration from an existing transcription job. The job must not be in a terminal state (COMPLETED, FAILED, or CANCELLED).
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id |
string (UUID) |
Yes | Unique identifier of the transcription job. |
Response
No response body.
| Status | Description |
|---|---|
204 No Content |
Webhook removed successfully. |
401 Unauthorized |
Missing or invalid authentication. |
403 Forbidden |
Insufficient scope or not authorized. |
404 Not Found |
Job not found. |
409 Conflict |
Job is in a terminal state and cannot be updated. |
Webhook Events and Delivery
Koldan sends a JSON POST request when a configured transcription reaches COMPLETED, FAILED, or CANCELLED. A successful receiver must return any 2xx status code.
| Event | Status | Event-specific data |
|---|---|---|
transcription.completed |
COMPLETED |
result contains the transcript text and detected languages. |
transcription.failed |
FAILED |
errors contains the processing errors. |
transcription.cancelled |
CANCELLED |
Cancellation was requested; active automatic translations are cancelled too. |
Webhook Payload
| Field | Type | Nullable | Description |
|---|---|---|---|
event |
string |
No | Event name shown in the table above. |
jobId |
string (UUID) |
No | Transcription job that reached a terminal state. |
status |
string |
No | COMPLETED or FAILED. |
timestamp |
string (ISO 8601) |
No | Time at which the payload was created. |
result |
object |
Yes | Present for transcription.completed. |
result.text |
string |
Yes | Completed transcript text. |
result.detectedLanguages |
string[] |
Yes | Languages detected during transcription. |
result.confidence |
double |
Yes | Overall confidence score (0.0–1.0). Present when includeSegments is true. |
result.duration |
double |
Yes | Audio duration in seconds. Present when includeSegments is true. |
result.segments |
SpeechServiceTranscriptionSegment[] |
Yes | Transcription segments with timestamps, words, and speaker labels. Present when includeSegments is true. |
errors |
object[] |
Yes | Present for transcription.failed. |
{
"event": "transcription.completed",
"jobId": "d1e2f3a4-b5c6-7890-abcd-ef1234567890",
"status": "COMPLETED",
"timestamp": "2026-04-01T12:05:42Z",
"result": {
"text": "The completed transcript text.",
"detectedLanguages": ["he"]
},
"errors": null
}
{
"event": "transcription.completed",
"jobId": "d1e2f3a4-b5c6-7890-abcd-ef1234567890",
"status": "COMPLETED",
"timestamp": "2026-04-01T12:05:42Z",
"result": {
"text": "The completed transcript text.",
"detectedLanguages": ["he"],
"confidence": 0.95,
"duration": 42.5,
"segments": [
{
"start": 0.0,
"end": 5.2,
"text": "The completed transcript text.",
"confidence": 0.95,
"language": "he",
"speaker": "SPEAKER_00",
"words": [
{ "word": "The", "start": 0.0, "end": 0.3, "confidence": 0.98 },
{ "word": "completed", "start": 0.4, "end": 0.9, "confidence": 0.96 },
{ "word": "transcript", "start": 1.0, "end": 1.5, "confidence": 0.94 },
{ "word": "text.", "start": 1.6, "end": 2.0, "confidence": 0.92 }
]
}
]
},
"errors": null
}
Include segments in the webhook payload
Set includeSegments: true in your SpeechServiceWebhook configuration to receive the full result with segments, words, and timing directly in the webhook payload. This saves a roundtrip to Get Transcription Result. When includeSegments is false (default), the result contains only text and detectedLanguages.
Delivery Headers
| Header | When present | Description |
|---|---|---|
Content-Type |
Always | application/json. |
X-Koldan-Schema-Version |
Always | Webhook schema version. The current version is 1. |
X-Webhook-Id |
Always | Stable identifier for the delivery and its retry attempts. Use it as an idempotency key. |
X-Webhook-Timestamp |
Always | Unix timestamp in seconds for the delivery attempt. |
X-Webhook-Signature |
When a secret is configured | sha256=<hex-digest>, computed with HMAC-SHA256 over the exact raw request body. |
Verify X-Webhook-Signature against the raw body before parsing JSON, using a constant-time comparison. Custom headers from SpeechServiceWebhook are also included in the request.
Koldan retries timeouts, network failures, and non-2xx responses with configurable backoff. URL security violations are not retried. Because a response can be lost after your server processes it, receivers must safely handle duplicate deliveries.
For a complete signed receiver and optional cleanup flow, see Python SDK: Webhooks and Automatic Cleanup.
Cancel Job
POST /api/v1/speech-services/transcriptions/{id}/cancel
Requires Authentication - Scopes: speech:transcriptions:write
Cancel a pending or in-progress transcription job. Repeating cancellation for a CANCELLED job also waits for its remaining workflow cleanup; completed and failed jobs return 409.
Cancellation stops the transcription and its active automatic translations before returning 204. State changes and quota release are performed by their workflows. If cancellation has not completed within the request timeout, the API returns 503; retry using the same job ID. Cancelling a translation directly leaves its source transcription and other targets running.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id |
string (UUID) |
Yes | Unique identifier of the transcription job. |
Response
No response body.
| Status | Description |
|---|---|
204 No Content |
Job cancelled successfully. |
401 Unauthorized |
Missing or invalid authentication. |
403 Forbidden |
Insufficient scope or not authorized. |
404 Not Found |
Job not found. |
409 Conflict |
Job is already in a terminal state (COMPLETED, FAILED, or CANCELLED). |
Delete Job
DELETE /api/v1/speech-services/transcriptions/{id}
Requires Authentication - Scopes: speech:transcriptions:delete
Delete a transcription job. Only jobs in a terminal state (COMPLETED, FAILED, or CANCELLED) can be deleted. Use ?purge=true for immediate permanent removal of result and error data.
Purge is Irreversible
When purge=true, the transcription result and error data are permanently deleted from storage and cannot be recovered.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id |
string (UUID) |
Yes | Unique identifier of the transcription job. |
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
purge |
boolean |
No | false |
Immediately purge result and error data from storage. |
Response
No response body.
| Status | Description |
|---|---|
204 No Content |
Job deleted (or purged) successfully. |
401 Unauthorized |
Missing or invalid authentication. |
403 Forbidden |
Insufficient scope or not authorized. |
404 Not Found |
Job not found. |
409 Conflict |
Job is not in a terminal state, or is already deleted (when purge=false). |
Purge Job
POST /api/v1/speech-services/transcriptions/{id}/purge
Requires Authentication - Scopes: speech:transcriptions:delete
Permanently purge result and error data of a deleted transcription job. The job must already be deleted and not yet purged. This operation is irreversible.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id |
string (UUID) |
Yes | Unique identifier of the transcription job. |
Response
No response body.
| Status | Description |
|---|---|
204 No Content |
Job data purged successfully. |
401 Unauthorized |
Missing or invalid authentication. |
403 Forbidden |
Insufficient scope or not authorized. |
404 Not Found |
Job not found. |
409 Conflict |
Job is not deleted, or is already purged. |
Data Types
SpeechServiceTranscriptionJobResponse
| Field | Type | Nullable | Description |
|---|---|---|---|
id |
string (UUID) |
No | Unique identifier of the transcription job. |
status |
string |
No | Current job status: PENDING, IN_PROGRESS, COMPLETED, FAILED, CANCELLED. |
isDeleted |
boolean |
No | Whether the job has been deleted. |
isPurged |
boolean |
No | Whether the job's result/error data has been permanently removed. |
creationDate |
string (ISO 8601) |
No | Timestamp when the job was created. |
completionDate |
string (ISO 8601) |
Yes | Timestamp when the job completed. null if not yet completed. |
deletedAt |
string (ISO 8601) |
Yes | Timestamp when the job was deleted. |
purgedAt |
string (ISO 8601) |
Yes | Timestamp when the job data was purged. |
purgeAt |
string (ISO 8601) |
Yes | Scheduled timestamp for automatic purge. |
file |
SpeechServiceFileResponse |
No | The media file associated with this job. |
transcription |
SpeechServiceTranscriptionOptions |
No | Transcription configuration used for this job. |
diarization |
SpeechServiceDiarizationOptions |
Yes | Diarization configuration used for this job. |
result |
SpeechServiceTranscriptionJobResult |
Yes | Transcription result. Present only when status is COMPLETED and isPurged is false. Not included in list responses. |
errorCode |
string |
Yes | Top-level error code when the job has failed. See TranscriptionErrorCode. |
errors |
SpeechServiceTranscriptionJobError[] |
Yes | Array of errors encountered during processing. Cleared when purged. |
webhook |
SpeechServiceWebhook |
Yes | Webhook configuration for job completion notifications. |
itnRequested |
boolean |
No | Whether inverse text normalization was requested. |
punctuationRequested |
boolean |
No | Whether punctuation was requested. |
capitalizationRequested |
boolean |
No | Whether capitalization was requested. |
diarizationRequested |
boolean |
No | Whether diarization was requested. |
translationIds |
string (UUID)[] |
No | Retained automatic translation job IDs in request order. Empty when none were requested; deleted or purged children are excluded. For all jobs use the paginated translations API. |
SpeechServiceTranscriptionJobResult
| Field | Type | Nullable | Description |
|---|---|---|---|
text |
string |
No | The full transcription text. |
detectedLanguages |
string[] |
Yes | Set of IETF BCP 47 codes of the detected languages. |
confidence |
double |
Yes | Overall confidence score of the transcription (0.0–1.0). |
duration |
double |
Yes | Total audio duration in seconds. |
segments |
SpeechServiceTranscriptionSegment[] |
Yes | Array of transcription segments with timestamps. |
SpeechServiceTranscriptionSegment
| Field | Type | Nullable | Description |
|---|---|---|---|
start |
double |
No | Start time of the segment in seconds. |
end |
double |
No | End time of the segment in seconds. |
text |
string |
No | The transcribed text for this segment. |
confidence |
double |
Yes | Confidence score for this segment (0.0–1.0). |
language |
string |
Yes | IETF BCP 47 language code detected for this segment. |
speaker |
string |
Yes | Speaker label (SPEAKER_00, SPEAKER_01, …) or custom channel label. |
channel |
integer |
Yes | Zero-based audio channel index. Present only when diarization mode is CHANNEL. |
words |
SpeechServiceWordTiming[] |
Yes | Word-level timing information. |
SpeechServiceWordTiming
| Field | Type | Nullable | Description |
|---|---|---|---|
word |
string |
No | The transcribed word. |
start |
double |
No | Start time of the word in seconds. |
end |
double |
No | End time of the word in seconds. |
confidence |
double |
Yes | Confidence score for this word (0.0–1.0). |
punctuation |
string |
Yes | Punctuation mark following the word (e.g., ., ,, ?). |
capitalization |
string |
Yes | Capitalized form of the word as determined by the capitalization service. |
SpeechServiceTranslationOptions
One entry in the transcription request's translations array or upload's JSON translations part. Every entry creates one independent translation job.
| Field | Type | Required | Description |
|---|---|---|---|
targetLanguageCode |
string |
Yes | BCP 47 target language, maximum 64 characters. A base-language pair such as he → en accepts he-IL → en-US. |
model |
string |
No | Text Services translation alias, maximum 128 characters. Omit for the tenant default. The concrete model name is resolved at submission. |
sourceLanguageCode |
string |
No | BCP 47 source override, maximum 64 characters. Otherwise uses each segment's detected language, with a single detected transcript language as fallback. Ambiguous source languages require an override. |
webhook |
CommonWebhook |
No | Child callback configuration: required url, optional secret and headers. Omit to inherit the transcription webhook. |
Regional language codes remain in API metadata; the inference service receives only language subtags. Segments already in the target base language pass through without consuming translation tokens. A child with no segments requiring translation fails with NO_TRANSLATION_REQUIRED.
SpeechServiceTranscriptionOptions
| Field | Type | Required | Description |
|---|---|---|---|
model |
string |
Yes | The transcription model identifier to use (e.g., hebrew-general). See Transcription Models for available transcription models. |
language |
SpeechServiceTranscriptionLanguageOptions |
No | Language configuration for transcription. When omitted, null, or blank, the model will attempt automatic language detection. |
punctuation |
boolean |
No | Enable automatic punctuation insertion in the transcribed text. |
capitalization |
boolean |
No | Enable automatic capitalization of the transcribed text. May be ignored depending on the language. |
inverseTextNormalization |
boolean |
No | Enable inverse text normalization - converting spoken-form numbers, dates, and other entities into their written form (e.g., "two thousand eighteen" → "2018"). Some models apply this automatically regardless of this setting. |
segmentation |
string |
No | Controls final transcript segment layout. readable (default) rebuilds segments from word timings using speaker/channel changes, pauses, and size limits. raw preserves engine/merge segment boundaries. |
SpeechServiceTranscriptionLanguageOptions
| Field | Type | Required | Description |
|---|---|---|---|
defaultLanguageCode |
string |
No | IETF BCP 47 language code (e.g., en, he, de). When omitted, null, or blank, a model supporting exactly one language uses that language and records it in the result. For multilingual models, specify the source language when it is known; automatic translation requires language metadata or a sourceLanguageCode override. |
SpeechServiceDiarizationOptions
| Field | Type | Required | Description |
|---|---|---|---|
enabled |
boolean |
Yes | Whether diarization should be performed. |
mode |
string |
No | Diarization mode: SPEAKER (default) or CHANNEL. See SpeechServiceDiarizationMode. |
maxSpeakers |
integer |
No | Maximum number of speakers expected. Used only when mode is SPEAKER. Set to -1 for automatic speaker count detection (the system will estimate the number of speakers). When omitted or null, defaults to automatic detection. |
channelMapping |
SpeechServiceChannelMapping[] |
No | Mapping of channel indices to custom speaker labels. Used only when mode is CHANNEL. |
SpeechServiceChannelMapping
| Field | Type | Required | Description |
|---|---|---|---|
channel |
integer |
Yes | Zero-based audio channel index. |
label |
string |
Yes | Custom speaker label for this channel (e.g., Agent, Customer). |
CommonWebhook
| Field | Type | Required | Description |
|---|---|---|---|
url |
string |
Yes | The URL to send the webhook notification to. Must be HTTPS. |
secret |
string |
No | A shared secret used to sign webhook payloads with HMAC-SHA256. Responses return only a masked value when a secret is configured. |
headers |
object |
No | Custom HTTP headers to include in the webhook request. |
SpeechServiceWebhook
Extends CommonWebhook with speech-service-specific options.
| Field | Type | Required | Description |
|---|---|---|---|
| (inherited) | All fields from CommonWebhook (url, secret, headers). |
||
includeSegments |
boolean |
No | When true, the transcription.completed webhook payload includes the full result with segments, words, and timing. Default: false. |
SpeechServiceTranscriptionJobError
| Field | Type | Nullable | Description |
|---|---|---|---|
code |
string |
No | Machine-readable error code. See TranscriptionErrorCode. |
message |
string |
No | Human-readable error message describing what went wrong. |
timestamp |
string (ISO 8601) |
No | Timestamp when the error occurred. |
Enumerations
TranscriptionJobStatus
| Value | Description |
|---|---|
PENDING |
Job has been accepted but processing has not started. |
IN_PROGRESS |
Audio is being transcribed. |
COMPLETED |
Transcription finished successfully. Result is available. |
FAILED |
Transcription failed. Check errorCode and errors for details. |
CANCELLED |
Job was cancelled before completion. |
SpeechServiceDiarizationMode
| Value | Description |
|---|---|
SPEAKER |
Automatic speaker separation (default). Speakers are identified by a diarization model. |
CHANNEL |
Channel-based speaker separation. Each audio channel maps to a distinct speaker. |
TranscriptionErrorCode
| Value | Description |
|---|---|
TRANSCRIPTION_FAILED |
The transcription engine encountered an error while processing the audio. |
DIARIZATION_FAILED |
Speaker diarization failed during processing. |
CHANNEL_DIARIZATION_FAILED |
Channel-based diarization failed (e.g., channel extraction error). |
UNSUPPORTED_FORMAT |
The file format or audio codec is not supported for transcription. |
FILE_CORRUPTED |
The file could not be decoded or is corrupted. |
FILE_NOT_FOUND |
The referenced file no longer exists or has been purged. |
EMPTY_AUDIO |
The file contains no audio stream or has zero duration. |
DURATION_EXCEEDED |
The file exceeds the maximum allowed duration for transcription. |
QUOTA_EXCEEDED |
The user's monthly transcription minutes quota has been exceeded. |
LANGUAGE_NOT_SUPPORTED |
The specified or detected language is not supported by the speech model. |
MODEL_UNAVAILABLE |
The requested speech model is offline or unreachable. |
PUNCTUATION_FAILED |
Punctuation and capitalization post-processing failed. |
INTERNAL_ERROR |
An unexpected internal error occurred during processing. |
Job Lifecycle
Transcription jobs follow a lifecycle: pending → in progress → completed/failed/cancelled → deleted → purged. Only terminal-state jobs (COMPLETED, FAILED, CANCELLED) can be deleted. Once purged (either automatically after a retention period or manually), jobs are permanently removed and invisible to the API (accessing by ID returns 404 Not Found).
Upload and Transcribe
For the simplest integration, use the Upload and Transcribe endpoint to upload a file and start transcription in a single request. This avoids the two-step process of uploading a file first and then creating a transcription job separately.