Transkribe API
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
- 120 requests a minute per account, and 30 new uploads an hour. Over that you get
429; wait and retry. - Uploads count against your plan's monthly minutes, like recordings in the app. Out of minutes:
402. - Errors are JSON with a
message. A bad parameter is422with the details inerrors. Someone else's recording, or one that doesn't exist, is404.
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.