Transcription API and MCP
The API is the same engine as the site: one POST with the file, and you get back a transcript with the text, the segments and the times. The base URL is https://api.transcrib.si, the version prefix is /v1, and the same host serves an MCP server with four tools for Claude, ChatGPT and anything else that speaks MCP.
Try it live. The API playground takes your key, sends the request and shows the real answer — the status, the timings, the headers and the body — with the curl, Python and JavaScript snippets built from what you fill in. The machine-readable reference is api.md.
The endpoints
| Method | Path | What it does |
|---|---|---|
| POST | /v1/auth/register | create an account, returns a session token |
| POST | /v1/auth/login | sign in, returns a session token |
| GET | /v1/me | the current user, the plan and the usage |
| POST | /v1/api-keys | create an API key; the value is shown once |
| GET | /v1/api-keys | the list of keys, without their values |
| DELETE | /v1/api-keys/{id} | revoke a key |
| POST | /v1/transcripts | upload a file (multipart), returns a queued transcript |
| GET | /v1/transcripts | the list of transcripts, ?limit=50&offset=0 |
| GET | /v1/transcripts/{id} | the transcript: the text, the segments, the times, the speakers |
| PATCH | /v1/transcripts/{id} | save the edited text |
| DELETE | /v1/transcripts/{id} | delete the transcript and the file |
| GET | /v1/transcripts/{id}/export | export, ?format=txt|md|srt|vtt|csv|docx |
| POST | /v1/uploads/init | open a chunked upload, returns an upload id |
| PUT | /v1/uploads/{id}/chunk?index=N | send one piece of the file |
| POST | /v1/uploads/{id}/complete | assemble the pieces and queue the transcription |
| DELETE | /v1/uploads/{id} | drop an unfinished upload |
| GET | /v1/usage | the plan, the period, the minutes and the files used |
| POST | /v1/billing/checkout | start a Stripe checkout for pro_monthly or pro_yearly |
| POST | /v1/billing/portal | open the Stripe billing portal |
A request in five lines
The whole API is one multipart POST for the file. Everything else reads the result back.
curl -X POST "https://api.transcrib.si/v1/transcripts" \
-H "X-API-Key: $TRANSCRIB_API_KEY" \
-F "file=@meeting.mp3" \
-F "language=auto" \
-F "diarize=true" And the same call from Python:
import httpx
with open("meeting.mp3", "rb") as audio:
response = httpx.post(
"https://api.transcrib.si/v1/transcripts",
headers={"X-API-Key": API_KEY},
files={"file": ("meeting.mp3", audio, "audio/mpeg")},
data={"language": "auto", "diarize": "true"},
timeout=120.0,
)
transcript_id = response.json()["id"] # status: queued The answer comes back as {"id": …, "status": "queued"}. The transcript is not ready yet: read it with GET /v1/transcripts/{id} until the status is done. The segments come in the same answer, each with start_s, end_s, the text and the speaker.
The errors
Every endpoint answers with the same shape, so one handler covers the whole API: {"error": {"code": "…", "message": "…"}}.
| Code | HTTP status | When it happens | What to do |
|---|---|---|---|
| unauthorized | 401 | no key, or a token that is not valid any more | send X-API-Key, or a Bearer token |
| forbidden | 403 | the token belongs to another account | check which account the key belongs to |
| not_found | 404 | no such transcript, upload or key | check the id |
| limit_exceeded | 402, 413 | the daily file limit, the monthly allowance, a file over 64 MB or over 120 minutes | split the file, or change the plan |
| invalid_request | 400, 422 | a field is wrong: a bad format, a bad id, a missing file | the message says which field |
| provider_error | 502 | the transcription engine is unavailable or refused the file | retry later; the file itself may be the problem |
| payment_required | 402 | this call needs the Pro plan | create an API key on Pro or Team |
| billing_disabled | 503 | the server has no payment key configured | not a client problem |
| not_ready | 503 | the database or the storage is not available yet | retry in a moment |
The limits
| Limit | Value | What happens when you cross it |
|---|---|---|
| Size of one file | 64 MB | the upload is rejected with a clear error |
| Length of one file | 120 minutes (two hours) | the upload is rejected with a clear error |
| Free plan | 3 files a day, up to 30 minutes each | the next upload is refused until the next day |
| Pro fair use | 1,500 minutes of audio per calendar month | a clear limit error, the account stays open |
| Team | committed volume, written down | agreed case by case |
| API | metered by volume, no subscription | billed on the audio you send |
What the API costs
API usage is metered and billed by volume, separately from any subscription: there is no API plan with a monthly fee attached to it. We do not publish a per-hour rate — write to us with your monthly volume and we will send the rate for it.
The MCP server and the plugins
The same host serves an MCP server at /mcp with four tools — transcribe_audio, summarize_transcript, extract_actions and list_transcripts — and the plugins for Claude and ChatGPT use it. The details, the OAuth flow and the tool schemas are on the page for developers and agents. The page Transcrib in ChatGPT and Claude tells you what works with the two assistants today, what is still missing and how to connect the server yourself.
The keys
An API key is created in the app and its value is shown exactly once; we store only its hash. Send it in the X-API-Key header, or send a session token as Authorization: Bearer …. A key can be revoked from the app at any moment, and a revoked key stops working immediately.
The browser extension uses the same two ways to authenticate: paste the API key or the access token into its settings, and it is sent in the same headers.
Put a file on the page and read the first lines.
The widget below is the same one as on the home page: file → transcript with timecodes and speakers → export. The transcript is saved to your account.
Drop an audio or video file
or — mp3, wav, m4a, mp4, up to 64 MB and two hours
Transcription runs under your account: sign in or create a free account.
No account yet? The free plan needs no card. Create a free account or sign in.
Questions this page answers.
Where do I get an API key?
In the app, on the Pro or Team plan. The value is shown once at creation and we store only its hash, so it cannot be shown again.
Which authentication should I use?
X-API-Key for a server-to-server call, Authorization: Bearer for a session. Both work on the same endpoints.
Do you have an SDK?
No SDK: it is a plain REST API with one file-upload endpoint, multipart. requests or httpx is enough, as the example above shows.
Can I upload a file bigger than 64 MB?
Not in one request, but in parts: POST /v1/uploads/init, then PUT /v1/uploads/{id}/chunk?index=N for each piece, then POST /v1/uploads/{id}/complete. The limits on the finished file are the same 64 MB and 120 minutes.
Is there a live stream or a websocket?
No. The service takes files: you send the file and read the transcript when it is done.
Can an agent call the API?
Yes. The MCP server exposes the same engine as four tools, and there are plugins for Claude and ChatGPT.
Related pages.
The MCP server, the four tools, OAuth and the plugins.
То же самое на русском.
The general guide, with the upload widget.
Every plan, every limit, in one table.
Where the keys are created.
Records a tab or a microphone and sends it to the same API.
Mark Vesyoly, Founder.
Every number on this page comes from the service contract, the pricing page or our own measurements. The author of the page and the publisher of the site are the same person. Questions and corrections: support@transcrib.si.