Transkribe API

Version 1 · Base address https://api.transkribe.com/api/v1/public

Read your meetings, upload recordings to transcribe and tick off action items from your own scripts, or from tools like Zapier, Make and n8n. The API sees only your own recordings, never ones other people shared with you.

Sign in with a key

In the app, open Settings → API keys and create a key. It's shown once, so copy it then. Send it as a bearer token on every request:

curl https://api.transkribe.com/api/v1/public/recordings \
  -H "Authorization: Bearer YOUR_KEY"

API keys work only with this API, and the app's own sign-in doesn't work here. You can have up to 10 keys and revoke any of them in Settings; a revoked key stops working at once. Treat a key like a password: anyone with it can read your meetings.

Limits and errors

Meetings

GET/recordings

Your recordings, newest first. Query: limit (1–100, default 20), status (ready, processing or failed), since (a date, 2026-10-01), cursor. Pass nextCursor back as cursor for the next page; it's null on the last page.

{
  "data": [{
    "id": "01k7…", "title": "Roadmap sync", "createdAt": "2026-10-12T15:04:05+00:00",
    "durationMs": 1830000, "language": "en", "status": "ready", "failureReason": null,
    "folder": "Product", "speakers": ["Dana", "Priya"], "overview": "Launch confirmed for the 14th…"
  }],
  "nextCursor": "eyJjcmVhdGVkX2F0Ijo…"
}

GET/recordings/{id}

One meeting with its notes. Add ?transcript=1 for every transcript line. The shape is the same one webhooks deliver, plus status and failureReason (no_speech or error when it failed). notes is null until the meeting is ready.

{
  "status": "ready", "failureReason": null,
  "id": "01k7…", "title": "Roadmap sync", "createdAt": "…", "durationMs": 1830000,
  "language": "en", "meetingType": "Team meeting", "folder": "Product", "speakers": ["Dana", "Priya"],
  "notes": {
    "language": "en", "overview": "…", "keyPoints": ["…"], "decisions": ["…"],
    "actionItems": [{ "id": "412", "text": "Run the billing migration test", "owner": "Priya", "done": false }],
    "sections": [], "outline": []
  },
  "highlights": [{ "startMs": 192000, "speaker": "Dana", "text": "…", "note": "The promise" }],
  "transcript": [{ "startMs": 4000, "speaker": "Dana", "text": "Let's lock the launch date." }]
}

GET/search?q=budget

Search titles, notes and every transcript line. Query: q (2–100 characters), speaker (only lines said by that name), since (a date). Returns { "results": [...] }: matching meetings, newest first, each with up to 3 matching lines.

Action items

GET/action-items

Open action items from all your meetings, newest meeting first (up to 50): { "data": [{ "id", "text", "owner", "done", "recordingId", "recordingTitle", "createdAt" }] }.

PATCH/recordings/{id}/action-items/{itemId}

Body { "done": true } (or false). Returns the item.

Upload a recording

Three steps. The file goes straight to storage, never through our servers.

POST/recordings

Body: title (required), contentType (required: the file's type, an audio/… or video/… type such as audio/mpeg, audio/mp4 or video/mp4), language (a language code such as en, or multi to detect it; default multi), template (the meeting type, optional). Returns the new recording and where to put the file:

{
  "recording": { "id": "01k7…", "status": "processing", … },
  "upload": { "method": "PUT", "url": "https://…", "headers": { "x-ms-blob-type": "BlockBlob", "Content-Type": "audio/mpeg" } }
}

Put the file

Send the file with PUT to upload.url, with every header in upload.headers. Don't add your API key to this request. The link works for 6 hours.

curl -X PUT "$UPLOAD_URL" -H "x-ms-blob-type: BlockBlob" -H "Content-Type: audio/mpeg" \
  --data-binary @meeting.mp3

POST/recordings/{id}/uploaded

Tell us the file is there, and transcription starts. Calling it again is safe: a recording is only ever transcribed once. Files over your plan's size limit are rejected with 413. Notes are usually ready a minute or two later: poll GET /recordings/{id}, or better, add a webhook.

Webhooks

Instead of polling, have each finished meeting sent to an address of yours: in the app, Settings → Webhook. It POSTs the same meeting JSON as GET /recordings/{id} (optionally with the transcript), signed so you can check it came from us.

Your account

GET/me

{ "id", "name", "email", "plan", "minutesUsed", "minutesLimit", "bonusMinutes", "resetsAt" }. minutesLimit is null when there's no monthly limit.

AI assistants

To let Claude, ChatGPT, Cursor or another assistant read your meetings, you don't need this API: connect it to our MCP server in Settings → Connect an AI assistant.

Questions, or something you need that isn't here? Write to hi@transkribe.com. Using the API is covered by our terms of use and privacy policy.

← Back to Transkribe