KolWrite API Documentation
Welcome to the KolWrite API documentation. Here you'll find everything you need to integrate our powerful transcription and speaker diarization services into your applications.
Authentication
All API requests must be authenticated using your unique API key. Include it in the request headers:
x-api-key: YOUR_API_KEY
You can generate and manage your API keys in the KolWrite Console after creating an account.
Quickstart
Get started quickly with these basic examples.
1. Start Transcription
Send a POST request to the `/transcribe` endpoint with the URL of the audio file you want to transcribe.
Request:
POST https://app.kolwrite.com/transcribe
Content-Type: application/json
x-api-key: YOUR_API_KEY
{
"audio_url": "https://salford.figshare.com/ndownloader/files/14630270"
}
Response:
The API returns a `jobId` which you'll use to retrieve the transcription results.
{
"jobId": "34c63d45-4cb5-473b-bc60-25c175e69c57"
}
2. Get Transcription Result
Send a GET request to the `/transcribe/{jobId}` endpoint using the `jobId` received from the previous step.
Request:
GET https://app.kolwrite.com/transcribe/34c63d45-4cb5-473b-bc60-25c175e69c57
x-api-key: YOUR_API_KEY
Response (Example):
Once the job status is COMPLETED, the response will include the transcription details.
{
"jobId": "34c63d45-4cb5-473b-bc60-25c175e69c57",
"status": "COMPLETED",
"result": {
"language": "en",
"segments": [
{
"start": 0.5,
"end": 3.2,
"text": "Hello everyone, welcome to today's meeting.",
"speaker": "Speaker 1",
"words": [
{
"start": 0.5,
"end": 0.8,
"word": "Hello"
},
{
"start": 0.9,
"end": 1.4,
"word": "everyone"
},
{
"start": 1.5,
"end": 1.9,
"word": "welcome"
}
]
}
]
}
}
Models & usage credits
Model usage is metered in usage credits per second with no minimum charge. Checkout, receipts, and tax documents show the real payment currency used for purchase.
1 credit is the API billing unit previously displayed as $1.00 in the API console.
Eligible Israeli billing accounts purchase usage credits in ILS at a net price of ILS 3.60 per credit before VAT. Checkout shows the usage credits, net amount, VAT, and final ILS total before payment. Other accounts purchase usage credits in USD at USD 1.20 per credit unless separate order terms apply.
| Model | API value | Credits / hour | Best for |
|---|---|---|---|
| Base | base | 0.40 | Low-cost transcription, word timestamps, and speaker separation |
| Oracle Mini | oracle_mini | 0.80 | Fast Oracle transcription with optional diarization and channel separation |
| Oracle | oracle | 1.20 | Production transcription and multilingual workflows |
| Oracle Pro | oracle_pro | 1.40 | Premium production quality |
| Oracle Max | oracle_max | 3.00 | Maximum quality for difficult or high-stakes audio |
| Core | core | 1.00 | Legacy general-purpose transcription |
| Edge | edge | 1.20 | Legacy higher-accuracy transcription |
Add-ons: Regular speaker diarization and standard channel separation are
included. Pro Speaker Diarization adds 0.20 credits per audio hour. overlap
channel separation is billed at the selected model rate for the greater of the recording duration or the
total detected speech time across its physical channels; neither channel mode adds a diarization surcharge. Oracle Mini automatically enables timestamp alignment
when speaker diarization or channel separation is selected.
API Endpoints
POST /upload
Upload local audio or video and use the returned fileUrl as audio_url in POST /transcribe. Choose the inline Base64 upload for small files, or direct storage upload for larger files.
Inline Base64 upload (up to 4 MiB)
For files up to 4 MiB (4,194,304 bytes), send the media bytes as Base64 in a single API request.
POST /upload
Content-Type: application/json
x-api-key: YOUR_API_KEY
{
"filename": "clip.mp3",
"contentType": "audio/mpeg",
"content": "<base64-encoded media bytes>"
}
contentType is optional and is inferred from the filename when omitted. Send raw Base64 media bytes in content, without a data:...;base64, prefix. The 4 MiB limit applies to the decoded media file.
The response includes fileUrl. Use it as audio_url when creating the transcription job.
Direct storage upload (up to 100 MiB)
For larger files, request a signed form for our S3-compatible storage, upload the file directly, then create the transcription job. Maximum upload size: 100 MiB (104,857,600 bytes). The signed form is valid for 60 minutes. The returned read URL is valid for 24 hours, which is enough for the transcription service to retrieve the media.
1. Request a signed upload form
POST /upload
Content-Type: application/json
x-api-key: YOUR_API_KEY
{
"filename": "meeting.mp3",
"contentType": "audio/mpeg"
}
contentType is optional and is inferred from the filename when omitted. The API returns uploadUrl, uploadFields, fileUrl, and uploadExpiresIn.
Use uploadUrl to upload the file to our S3-compatible storage. Then use fileUrl as audio_url when creating the transcription job.
2. Upload the file directly to storage
// upload is the JSON response from POST /upload
const form = new FormData();
for (const [name, value] of Object.entries(upload.uploadFields)) {
form.append(name, value);
}
form.append('file', file, file.name);
await fetch(upload.uploadUrl, { method: 'POST', body: form });
Submit the fields exactly as returned and do not add a custom authorization header to the storage POST.
3. Create the transcription job
POST /transcribe
Content-Type: application/json
x-api-key: YOUR_API_KEY
{
"audio_url": "<fileUrl returned by POST /upload>",
"model": "oracle"
}
POST /transcribe
Submits an audio file for asynchronous transcription with optional speaker diarization.
Request Body Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| audio_url | string | Required | The publicly accessible URL of the audio or video file to transcribe. |
| language | string | Optional | Language code hint (e.g., "he", "en", "es"). If not provided, the language will be
automatically
detected. Default: "auto" |
| translate_to | string | Optional | The language code to translate the transcription to (e.g., "en", "es", "fr"). If provided, the output text will be in the specified language. Note: This parameter only works with the Oracle model family. |
| word_timestamps | boolean | Optional | Whether to include word-level timestamps in JSON or SRT when the selected model supports
word alignment. Oracle Mini automatically enables alignment for speaker diarization and channel separation; plain Oracle Mini transcription returns segment-level timestamps. Has no effect on TXT
output. Default: true |
| model | string | Optional | Specifies which transcription model to use: • base: Low-cost transcription with word timestamps and optional diarization, 0.40 credits/hour• core: Faster legacy model, 1.00 credits/hour
• edge: More accurate legacy model, 1.20 credits/hour• oracle_mini: Fast Oracle tier with optional speaker processing, 0.80 credits/hour• oracle: Production Oracle tier, 1.20 credits/hour• oracle_pro: Premium Oracle tier, 1.40 credits/hour• oracle_max: Maximum-quality Oracle tier, 3.00 credits/hourDefault: "core" |
| output_format | string | Optional | The desired format for the transcription output: • json: Detailed output
with segments
and timestamps• txt: Plain text transcription• srt: SubRip
subtitle
formatDefault: "json" |
| include_diarization | boolean | Optional | Whether to enable speaker diarization (identifying different speakers in the audio). When
enabled,
segments will include speaker labels. Oracle Mini automatically enables timestamp alignment for this mode. Default: false |
| pro_diarization | boolean | Optional | Enables the premium speaker diarization model for higher accuracy, especially in challenging audio. Adds 0.20 credits per audio hour. Oracle Mini automatically enables timestamp alignment for this mode. Default: false |
| num_speakers | integer | Optional | The expected number of speakers in the audio. Only used when
include_diarization is true.
If not specified, the system will automatically detect the number of speakers.Default: auto |
| channel_speaker_separation | string | Optional | Separates a stereo or multichannel audio_url by physical audio track. Use standard for turn-taking speakers or overlap for overlapping speech. Cannot be combined with diarization. Oracle Mini automatically enables timestamp alignment for either channel mode.Default: "off" |
| channel_labels | object | Optional | Optional zero-based channel-index map, for example {"0":"Agent","1":"Customer"}. Labels are returned on each segment and word. |
| webhook_url | string | Optional | Public HTTPS URL that receives a POST when the transcription job completes or fails. Return any 2xx status to acknowledge delivery. |
| webhook_secret | string | Optional | Optional secret used to sign webhook payloads. The signature header is formatted as sha256=<hex digest>. |
Example Request (with diarization):
{
"audio_url": "https://salford.figshare.com/ndownloader/files/14630270",
"word_timestamps": true,
"model": "edge",
"output_format": "json",
"include_diarization": true,
"num_speakers": 2
}
Response:
Returns an object containing the `jobId` for the submitted transcription task.
{
"jobId": "34c63d45-4cb5-473b-bc60-25c175e69c57"
}
GET /transcribe/{jobId}
Retrieves the status and result of a specific transcription job.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| jobId | string | Required | The ID of the transcription job, obtained from the POST /transcribe response. |
Response Body
| Field | Type | Description |
|---|---|---|
| jobId | string | The requested transcription job ID. |
| status | string | Current job status: PENDING, IN_PROGRESS, COMPLETED, or FAILED |
| result | object | string | The transcription output (present only when status is COMPLETED). Structure depends on the requested output_format. |
| error | string | Error message (present only when status is FAILED). |
Example Response (JSON Output with Speaker Diarization):
{
"jobId": "34c63d45-4cb5-473b-bc60-25c175e69c57",
"status": "COMPLETED",
"result": {
"language": "en",
"segments": [
{
"start": 0.5,
"end": 3.2,
"text": "Hello everyone, welcome to today's meeting.",
"speaker": "Speaker 1",
"words": [
{
"start": 0.5,
"end": 0.8,
"word": "Hello"
},
{
"start": 0.9,
"end": 1.4,
"word": "everyone"
}
]
},
{
"start": 4.1,
"end": 6.8,
"text": "Thank you. Let's begin with the quarterly review.",
"speaker": "Speaker 2",
"words": [
{
"start": 4.1,
"end": 4.5,
"word": "Thank"
},
{
"start": 4.6,
"end": 4.9,
"word": "you"
}
]
}
]
}
}
Speaker Diarization
Speaker diarization is the process of identifying and separating different speakers in an audio recording. When enabled, KolWrite will analyze the audio to detect speaker changes and label each segment accordingly.
Speaker diarization and channel separation are available with every listed model. Oracle Mini automatically enables timestamp alignment whenever a speaker mode is selected.
How to Enable Diarization
To enable speaker diarization, set the include_diarization parameter to true in
your
transcription request:
{
"audio_url": "https://example.com/meeting-audio.mp3",
"include_diarization": true,
"num_speakers": 3
}
Speaker Count Optimization
For best results, specify the expected number of speakers using the num_speakers parameter.
If you
don't know the exact number, you can:
- Omit the parameter (system will auto-detect)
- Provide an estimated range by setting it to your best guess
Pro Diarization
For higher accuracy in speaker identification, especially in challenging acoustics, you can enable Pro Diarization. This feature costs an additional 0.20 credits per audio hour.
To use it, set the pro_diarization parameter to true. This parameter can be used in conjunction with include_diarization.
{
"audio_url": "https://example.com/panel-discussion.mp3",
"include_diarization": true,
"pro_diarization": true
}
Channel Speaker Separation
Channel separation transcribes each physical audio track independently and labels returned segments and words with their physical channel and speaker. It requires a two-to-eight-channel audio_url and cannot be combined with regular or Pro diarization. Oracle Mini automatically enables timestamp alignment for either channel mode.
Use standard when speakers take turns; it bills one selected-model audio rate. Use overlap when speakers can overlap; it bills the selected-model rate for the greater of the recording duration or the total detected speech time across its physical channels.
{
"audio_url": "https://example.com/stereo-call.wav",
"model": "oracle",
"channel_speaker_separation": "overlap",
"channel_labels": {"0": "Agent", "1": "Customer"}
}
Completion Webhooks
Set webhook_url to receive transcription.completed and transcription.failed events. Delivery failures are retried, but clients should continue to support GET /transcribe/{jobId} as the source of truth.
{
"audio_url": "https://example.com/meeting-audio.mp3",
"output_format": "json",
"webhook_url": "https://example.com/kolwrite-webhook",
"webhook_secret": "replace-with-your-secret"
}
Every delivery includes X-KolWrite-Event, X-KolWrite-Job-Id, X-KolWrite-Delivery-Id, and X-KolWrite-Timestamp. Delivery is at least once; retries reuse the same delivery ID, so deduplicate events using X-KolWrite-Delivery-Id. When a secret is configured, compute HMAC-SHA256 over timestamp + "." + raw_request_body and compare it with X-KolWrite-Signature.
{
"event": "transcription.completed",
"jobId": "34c63d45-4cb5-473b-bc60-25c175e69c57",
"status": "COMPLETED",
"createdAt": "2026-07-10T09:30:00+00:00",
"model": "base",
"output_format": "json",
"result_available": true,
"result_omitted": false,
"result_size_bytes": 12480,
"result": { "language": "en", "segments": [] }
}
For output_format: "json", the webhook result field is a JSON object. TXT and
SRT results are delivered as strings.
Large results may set result_omitted to true; fetch the complete result from GET /transcribe/{jobId}. Failed events include an error field.
Output Format with Diarization
When diarization is enabled, each segment in the JSON output will include a speaker field
identifying the speaker (e.g., "Speaker 1", "Speaker 2", etc.).
Output Formats
JSON Format
Detailed output with segments, timestamps, and optional word-level data.
TXT Format
Plain text transcription with speaker labels (when diarization is enabled).
SRT Format
SubRip subtitle format with timestamps, compatible with video players and subtitle editors.
Service Status
See the public KolWrite API status page for live availability, uptime history, and service-level incidents.
GET /health requires no API key and returns the current API, job-intake, and transcription-processing state. A 200 response means the service is operational or degraded; a 503 response means the current state is unknown or unavailable. Both responses include JSON status details.
GET /health/history?period=24h returns compact availability history. Supported periods are 24h, 7d, and 30d.
Status Codes
| Status | Description |
|---|---|
| PENDING | The job is waiting to be processed in the queue. |
| IN_PROGRESS | The job is actively being processed by our transcription service. |
| COMPLETED | The job finished successfully. Results are available in the response. |
| FAILED | The job failed to process. Check the error message for details. |