Transcription is live again: 60 free minutes a month, Pro is $19/mo. Other tools are coming back. Students: lecture notes still live at VocalScribe.

Transcription API

The Kai The Scribe API lets an agent or script transcribe audio and video on your account. Create a key on the transcribe page, send it as a Bearer token to POST /api/v1/transcribe/ with a file or a public URL, and get back plain text plus a speaker-labelled version.

The API uses the same Deepgram pipeline, the same minutes, and the same plan as the transcribe page. Nothing about your account changes when a key is used, except that the minutes it transcribes count against your month.

Get a key

  1. Sign in with Google on the transcribe page.
  2. Scroll to the API keys card, give the key a name, and click Create key.
  3. Copy the key immediately. It starts with kts_live_ and is shown once. Only a SHA-256 hash is stored, so a lost key cannot be recovered: revoke it and make another.

Each account can hold up to 5 active keys. Revoke a key from the same card; requests with a revoked key get 401 from then on. Keys are for people who own the account and the agents they run. Do not paste a key into a public repository or a shared prompt.

Authentication

Every request to /api/v1/ carries the key in the Authorization header:

Authorization: Bearer kts_live_...

A missing, malformed, unknown, or revoked key returns 401 with a JSON error string.

POST /api/v1/transcribe/

Transcribes one recording. Send either a multipart file or a JSON body with a URL.

Request

FieldWhereMeaning
filemultipart/form-dataAn audio or video file (MP3, WAV, M4A, MP4, MOV, WEBM). Direct uploads are capped at 4.5 MB by the host; larger files must use url.
urlapplication/jsonA direct, public http(s) link to the media file. Page links from YouTube, Zoom, or Google Drive do not work. No size cap beyond the 60 second processing limit.
languageeitherBCP-47 code such as en or es. Omit or send auto to detect.
diarizeeithertrue to label speakers. Off by default.

Examples

By URL, with speaker labels:

curl -s -X POST https://www.kaithescribe.com/api/v1/transcribe/ \
  -H "Authorization: Bearer $KTS_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/episode.mp3", "diarize": true}'

By file upload, under 4.5 MB:

curl -s -X POST https://www.kaithescribe.com/api/v1/transcribe/ \
  -H "Authorization: Bearer $KTS_KEY" \
  -F "file=@interview.m4a" -F "diarize=true" -F "language=en"

Response

{
  "transcript": "Hi, Sam. Hi, Alex. Ready? Yes.",
  "formattedTranscript": "Speaker 1: Hi, Sam.\n\nSpeaker 2: Hi, Alex.\n\nSpeaker 1: Ready?\n\nSpeaker 2: Yes.",
  "words": [{ "word": "Hi,", "start": 0.08, "end": 0.32, "confidence": 0.99, "speaker": 0 }],
  "durationSeconds": 3.4,
  "language": "en",
  "persisted": true
}
  • transcript: punctuated plain text, one block.
  • formattedTranscript: the same text as Speaker 1: ... paragraphs when diarize was on and speakers were found. Identical to transcript otherwise. Use this one for people.
  • words: per-word timing and confidence, with a 0-based speaker index when diarized.
  • durationSeconds: length of the recording. Minutes are counted from this, rounded up.
  • language: detected or requested language code.
  • persisted: true when the transcript was saved to the account.

Errors

StatusMeaning
400No file, bad URL, or invalid JSON. The error string says which.
401Missing, malformed, unknown, or revoked key.
402The free 60 minutes for this month are used. The body carries upgradeUrl, minutesUsedThisMonth, and minutesAllowance. The key owner starts Pro at that URL.
413The upload is over the 4.5 MB direct-upload cap. Host the file and send {"url": ...} instead.
415The body is neither multipart/form-data nor application/json.
429More than 30 requests in the current hour for this key. resetAt and a Retry-After header say when to try again.
502The speech engine rejected the file (unreadable media, unreachable URL). The error string carries its message.
503Transcription or API keys are not configured on this deployment.

GET /api/v1/me/

Returns the key owner's plan and minutes so an agent can decide before it uploads.

curl -s https://www.kaithescribe.com/api/v1/me/ \
  -H "Authorization: Bearer $KTS_KEY"
{
  "email": "you@example.com",
  "plan": "free",
  "status": "none",
  "minutesUsedThisMonth": 12,
  "minutesAllowance": 60,
  "minutesRemaining": 48,
  "rateLimitPerHour": 30,
  "keyPrefix": "kts_live_Ab3dEf9h"
}

minutesAllowance and minutesRemaining are null on Pro, which means unlimited. minutesUsedThisMonth is null when usage cannot be read.

Limits

  • 30 requests per hour per key. Both endpoints count. The limit resets on the hour, UTC.
  • 5 active keys per account.
  • 4.5 MB per direct upload. Anything larger goes in by URL.
  • 60 seconds of processing per request. Recordings under an hour finish inside that window. Split longer files.
  • Minutes are the recording length, rounded up to the next whole minute per request.

Pricing

The API has no separate price. Free accounts get 60 minutes a month across the page and the API. Pro is $19 a month for unlimited minutes, billed by Stripe and cancelled any time from the billing portal. The key owner upgrades on the pricing section; an agent cannot buy Pro with a key.

For agents

A ready-made skill file describes this API in the shape most agent harnesses read: kaithescribe-transcribe.skill (a zip with SKILL.md inside) or the plain SKILL.md. The site's agent card and llms.txt point here too.