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 continue to use the current USD checkout at USD 1.00 per credit unless separate order terms apply.

Model API value Credits / hour Best for
Basebase0.40Low-cost transcription, word timestamps, and speaker separation
Oracle Minioracle_mini0.80Fast, high-volume transcription without speaker processing
Oracleoracle1.20Production transcription and multilingual workflows
Oracle Prooracle_pro1.40Premium production quality
Oracle Maxoracle_max3.00Maximum quality for difficult or high-stakes audio
Corecore1.00Legacy general-purpose transcription
Edgeedge1.20Legacy 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 multiplied by the physical channel count; neither channel mode adds a diarization surcharge. Speaker diarization and channel separation are unavailable with Oracle Mini.

API Endpoints

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 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 transcription-only Oracle tier, 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/hour
Default: "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 format
Default: "json"
include_diarization boolean Optional Whether to enable speaker diarization (identifying different speakers in the audio). When enabled, segments will include speaker labels. Not supported by oracle_mini.
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. Not supported by oracle_mini.
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 and is not supported by oracle_mini.
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 except oracle_mini, which is transcription-only.

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:

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 returns channel and speaker on every segment and word. It requires a two-to-eight-channel audio_url, cannot be combined with regular or Pro diarization, and is unavailable with oracle_mini.

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 once per physical audio track.

{
  "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.

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.