Overview
Turn audio and video files into transcripts, captions and subtitles with a simple REST API.
Send a media URL, follow the transcription job, and retrieve structured JSON or a ready-to-use subtitle file.
Your first transcription
Transcription happens in the background. Creating a job returns immediately; check its status until the result is ready.
Create a job
Send
POST /transcriptswith a direct, public media URL. Keep the returnedid.Check its progress
Poll
GET /transcripts/{id}every 15–30 seconds untilstatusiscompleteorerror.Use your transcript
Read JSON from
data, or downloadexport_urlwhen you request SRT or VTT.
Job status
initializingQueued and waiting to start. Keep polling.
transcribingYour media is being transcribed. Keep polling.
completeReady. Read the result or download the file.
errorThe job failed. Read message and stop polling.
Treat any other status as still in progress. New intermediate states may be added.
Authentication
Send your API key in the Authorization header of every request, exactly as shown when you created it.
Authorization: <your api key>Do not add a Bearer prefix.
New keys start with tp_live_. The full key is shown only once, when you create it. If you lose it, revoke it and create a new one; a revoked key stops working immediately.
An active subscription and the required API key scope are needed.
Keep your key on your server. It grants access to your account’s transcripts and usage. Never expose it in browser code or a public repository.
Create a transcript
/transcriptsStart a transcription job for a media file at a public URL. The response returns once the job is queued, with status: "initializing".
Taption downloads the file directly. Share-page links, such as a Google Drive or Dropbox preview page, will not work.
Request body
application/jsonmedia_urlstringrequiredDirect download link to your media file.
Maximum 2048 charactersextensionstringrequiredThe media file's format.
mp3wavm4aaacflacwmaopusmp4languagestringrequiredLanguage spoken in the media, as a language tag. See the Languages reference.
View language tagsnamestringDisplay name for the transcript. Defaults to the file name in `media_url`. Longer names are cut to 200 characters.
Maximum 200 charactersexport_typestringOutput format. Defaults to json, which returns parsed transcript content in data. srt and vtt return a file link in export_url.
Default: jsonjsonsrtvttmax_charintegerMaximum characters per caption segment. Defaults to `16` for Chinese, Japanese, Korean and Cantonese, and `65` for other languages. Values outside 1-200 are ignored and the default is used.
1–200
Responses
200The job was created and queued. Keep the `id` to check on it.
400The request body is invalid. Fix the request before retrying. Only the first problem found is reported.
401The API key is missing, invalid, or not set up for API access.
403An active subscription and the required API key scope are needed.
429Account limit reached; no job was created. Defaults: Premium 10 submissions/minute and 2 unfinished jobs; Corp 30/minute and 10 unfinished jobs, shared across all keys. Limits may change. Status polling is excluded.
500Unexpected server error. Retry with exponential backoff.
503Submission limits are temporarily unavailable (`api_limits_unavailable`; no transcript was created), or queue submission failed or could not be confirmed. Honor Retry-After when present. If an `id` is returned, check its status before retrying: it may be `error` or already processing. A retry creates a new transcript.
Retrieve a transcript
/transcripts/{id}Get the current status and result of a transcript. Poll every 15–30 seconds while the job is in progress.
For json or an omitted export type, the completed result appears in data. For srt or vtt, download the file from export_url.
Path parameter
idstringrequired- The transcript ID returned by
POST /transcripts.Maximum 256 characters
A failed transcription still returns HTTP 200 with status: "error". Check the job’s status as well as the HTTP code.
Responses
200The transcript's current status. This does not mean the job succeeded; read `status`.
401The API key is missing, invalid, or not set up for API access.
403An active subscription and the required API key scope are needed.
404No transcript with this ID exists in your account. A transcript that belongs to another account gives the same response.
500Unexpected server error. Retry with exponential backoff.
The transcript object
Creation and status requests return a JSON object. Its fields describe the job and, when ready, its output.
idstring- The transcript ID. Use it with `GET /transcripts/{id}`.
statusstring- Where the job is: `initializing`, `transcribing`, `complete` or `error`. Treat any other value as still in progress.
dataJSON- Parsed JSON export when ready for json or omitted export_type; otherwise an empty string.
export_urlstring- Download link for an srt or vtt export. Empty until ready. Omitted from status responses for json or omitted export_type.
messagestring- Extra detail about the current status. While `transcribing`, this may be a progress stage such as `ANALYZING` or `FINALIZING`. When `status` is `error`, it describes the failure. Written for people; do not parse it.
error_codestring- Optional machine-readable code for a submission limit error.
limitinteger- The applicable account limit, included with HTTP 429.
Errors & retries
Use the HTTP status code to decide what to do next. The message field is written for people; its wording may change.
API responses include an X-Request-Id header. Include it when you contact support about a request.
HTTP error codes9 codes
| HTTP | What happened | Next step |
|---|---|---|
400 | Invalid request body. | Fix the request first. |
401 | Missing, invalid, or revoked API key. | Check your API key. |
403 | An active subscription and the required API key scope are needed. | Check your subscription and API key scopes. |
404 | Transcript not found in your account. | Check the transcript ID. |
405 | Wrong HTTP method. | Use the documented method. |
429 | Submission rate or unfinished-job limit reached. | Honor Retry-After; wait for an available job slot. |
500 | Unexpected server error. | Exponential backoff. |
503 | Submission limits unavailable, or queue submission failed or could not be confirmed. | Check any returned job ID before retrying; honor Retry-After. |
504 | The request timed out. | Back off; avoid duplicate jobs. |
API limit errors return HTTP 429 with JSON and Retry-After in seconds. The hosting platform may also return non-JSON 429, 504, or 400 responses. Check the HTTP status before reading the body.
Creation requests are not idempotent. Retrying a timed-out POST /transcripts may create another transcript. If a 503 includes a job ID, check that job before submitting again: it may have failed or already be processing.
Languages
Set language to the language spoken in your media. Use the exact tag below, including any region or output-script suffix.
Supported languages74 languages
| Language | Tag |
|---|---|
| Afrikaans (South Africa) | af-ZA |
| Arabic (Egypt) | ar-EG |
| Armenian (Armenia) | hy-AM |
| Assamese (India) | as-IN |
| Azerbaijani (Azerbaijan) | az-AZ |
| Bengali (India) | bn-IN |
| Bosnian (Bosnia and Herzegovina) | bs-BA |
| Bulgarian (Bulgaria) | bg-BG |
| Burmese (Myanmar) | my-MM |
| Cantonese, Simplified Chinese output (Hong Kong) | yue-Hant-HK-zh |
| Cantonese, Traditional Chinese output (Hong Kong) | yue-Hant-HK-TW-zh |
| Cantonese, Simplified Cantonese output (Hong Kong) | yue-Hant-HK |
| Cantonese, Traditional Cantonese output (Hong Kong) | yue-Hant-HK-TW |
| Catalan (Spain) | ca-ES |
| Chinese (China) | zh |
| Chinese (Taiwan) | zh-TW |
| Chinese & English (Simplified) | zh-EN |
| Chinese & English (Traditional) | zh-EN-TW |
| Croatian (Croatia) | hr-HR |
| Czech (Czech Republic) | cs-CZ |
| Danish (Denmark) | da-DK |
| Dutch (Belgium) | nl-BE |
| English (Australia) | en-AU |
| English (United Kingdom) | en-GB |
| English (United States) | en-US |
| Estonian (Estonia) | et-EE |
| Filipino (Philippines) | tl-PH |
| Finnish (Finland) | fi-FI |
| French (France) | fr-FR |
| Galician (Spain) | gl-ES |
| German (Germany) | de-DE |
| Greek (Greece) | el-GR |
| Gujarati (India) | gu-IN |
| Hebrew (Israel) | iw-IL |
| Hindi (India) | hi-IN |
| Hungarian (Hungary) | hu-HU |
| Icelandic (Iceland) | is-IS |
| Indonesian (Indonesia) | id-ID |
| Italian (Italy) | it-IT |
| Japanese (Japan) | ja-JP |
| Kannada (India) | kn-IN |
| Kazakh (Kazakhstan) | kk-KZ |
| Khmer (Cambodia) | km-KH |
| Korean (South Korea) | ko-KR |
| Latvian (Latvia) | lv-LV |
| Lithuanian (Lithuania) | lt-LT |
| Macedonian (North Macedonia) | mk-MK |
| Malay (Malaysia) | ms-MY |
| Malayalam (India) | ml-IN |
| Marathi (India) | mr-IN |
| Nepali (Nepal) | ne-NP |
| Norwegian (Norway) | no-NO |
| Odia (India) | or-IN |
| Persian (Iran) | fa-IR |
| Polish (Poland) | pl-PL |
| Portuguese (Portugal, Brazil) | pt-PT_pt-BR |
| Punjabi, Gurmukhi (India) | pa-IN |
| Romanian (Romania) | ro-RO |
| Russian (Russia) | ru-RU |
| Serbian (Serbia) | sr-SR |
| Slovak (Slovakia) | sk-SK |
| Slovenian (Slovenia) | sl-SI |
| Spanish (Spain) | es-ES |
| Swahili (Kenya) | sw-KE |
| Swedish (Sweden) | sv-SE |
| Tamil (India) | ta-IN |
| Telugu (India) | te-IN |
| Thai (Thailand) | th-TH |
| Turkish (Turkey) | tr-TR |
| Ukrainian (Ukraine) | uk-UA |
| Urdu (Pakistan) | ur-PK |
| Uzbek (Uzbekistan) | uz-UZ |
| Vietnamese (Vietnam) | vi-VN |
| Zulu (South Africa) | zu-ZA |
This list follows Taption’s language settings and may change. Taption’s language selector is the source of truth.