API Documentation

Full reference for every endpoint — authentication, request/response formats, file uploads, AI summaries, translation and error codes.

The Turnscribe API lets you transcribe audio/video from a URL or an uploaded file, and check the status of a transcription job. All endpoints are versioned under /api/v1/ and require an API key. You can generate a key from your dashboard once you sign up or log in.

Base URL
https://turnscribe.com/api/v1/
Authentication

Every request must include your API key in the Authorization header, using the Api-Key scheme:

Authorization: Api-Key <your_api_key>

Requests with a missing or invalid key return 400 Bad Request:

{
  "error": "Invalid API key. See https://turnscribe.com/api for more information. Contact us at [email protected] if you have any questions or need an increase in your limit."
}
Limits
  • Audio duration (URL requests): Each API key has a maximum duration per request, which depends on your plan. Requests for longer media are rejected before processing. See Pricing for the exact limit on your plan.
  • File uploads: Maximum upload size depends on your plan — 3MB (Starter, no login), 10MB (Free), 100MB (Basic), 1GB (Pro). See Pricing for details.
  • Allowed file extensions — audio: .mp3, .wav, .ogg, .flac, .aac, .m4a, .wma, .opus
  • Allowed file extensions — video: .mp4, .mkv, .webm, .avi, .mov, .flv, .wmv, .mpeg, .mpg, .3gp, .ts, .m2ts, .mts, .vob, .ogv, .rm, .rmvb

Need a higher duration limit? Contact [email protected].


1. Transcribe from a URL

POST /api/v1/transcribe/

Submits a YouTube, TikTok, Facebook or other media URL for transcription. If the same URL was already transcribed, the cached result is returned immediately.

Body (JSON)

{
  "url": "https://www.youtube.com/watch?v=..."
}

Response — 202 Accepted (new job queued)

{
  "status": "PENDING",
  "transcript_id": "...",
  "task_id": "..."
}

Response — 200 OK (already cached)

{
  "status": "COMPLETED",
  "transcript_id": "...",
  "content": "...",
  "title": "..."
}

Response — 400 Bad Request (duration exceeds your key's limit)

{
  "error": "Audio duration (32.4 min) exceeds the allowed limit of 15 minutes for your API key.",
  "media_duration_minutes": 32.4,
  "api_key_max_minutes": 15,
  "url": "https://www.youtube.com/watch?v=...",
  "message": "Your API key has a limit of 15 minutes of URLs per request. To transcribe longer audio, please for now contact us to request an increase in your limit at [email protected]."
}

Example — curl

curl -X POST https://turnscribe.com/api/v1/transcribe/ \
  -H "Authorization: Api-Key <your_api_key>" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.youtube.com/watch?v=..."}'

2. Transcribe from an uploaded file

POST /api/v1/transcribe/file/

Uploads an audio or video file directly (multipart/form-data) instead of a URL.

Form field

  • file — the audio/video file to transcribe (see allowed extensions and size limit above)

Response — 202 Accepted

{
  "status": "PENDING",
  "transcript_id": "...",
  "task_id": "..."
}

Possible errors

  • 400 — {"error": "File is required"}
  • 400 — {"error": "Invalid file extension"}
  • 400 — {"error": "Invalid file size. Max <plan_limit>MB"} (the limit depends on your plan — see Pricing)
  • 400 — {"error": "Error processing file"}

Example — curl

curl -X POST https://turnscribe.com/api/v1/transcribe/file/ \
  -H "Authorization: Api-Key <your_api_key>" \
  -F "file=@/path/to/audio.mp3"

3. Bulk transcribe from URLs Pro

POST /api/v1/transcribe/bulk/

Submits up to several URLs in a single request. Requires an API key linked to an account on a plan that includes bulk URL import (Pro); the exact limit is returned in the error message if you go over it.

Body (JSON)

{
  "urls": [
    "https://www.youtube.com/watch?v=...",
    "https://www.tiktok.com/@user/video/..."
  ]
}

Response — 202 Accepted

{
  "results": [
    { "url": "...", "status": "PENDING", "transcript_id": "...", "task_id": "..." },
    { "url": "...", "status": "COMPLETED", "transcript_id": "...", "content": "...", "title": "..." },
    { "url": "...", "error": "..." }
  ]
}

Each item in results mirrors the response of the single-URL endpoint above: PENDING for a newly queued job, COMPLETED if you already have your own transcript of that URL, or error if that particular URL was rejected. Poll each transcript_id/task_id with the status endpoint below.

Possible errors

  • 400 — {"error": "urls (a list of URLs) is required"}
  • 400 — {"error": "You can only submit up to 10 URLs at once."}
  • 403 — {"error": "Your plan does not include bulk URL import. Please upgrade your plan."}
  • 403 — {"error": "Bulk URL import requires an API key linked to a Pro account."}

Example — curl

curl -X POST https://turnscribe.com/api/v1/transcribe/bulk/ \
  -H "Authorization: Api-Key <your_api_key>" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://www.youtube.com/watch?v=...", "https://www.tiktok.com/@user/video/..."]}'

4. Check transcription status

GET /api/v1/transcribe/status/

Polls the status of a job created by either endpoint above.

Query parameters

  • transcript_id — required, returned when the job was created
  • task_id — returned when the job was created (echoed back while pending)

Response — pending

{
  "status": "PENDING",
  "transcript_id": "...",
  "task_id": "..."
}

Response — completed

{
  "status": "COMPLETED",
  "transcript_id": "...",
  "content": "...",
  "title": "..."
}

Response — error

{
  "status": "ERROR",
  "transcript_id": "...",
  "content": "..."
}

Other errors

  • 400 — {"error": "transcript_id is required"}
  • 404 — {"error": "Transcript not found"}

Example — curl

curl -X GET "https://turnscribe.com/api/v1/transcribe/status/?transcript_id=...&task_id=..." \
  -H "Authorization: Api-Key <your_api_key>"

5. Generate an AI summary Basic

POST /api/v1/transcribe/summary/

Generates (or checks) an AI summary of a completed transcript. Requires an API key linked to an account on a plan that includes AI summaries, and a transcript with enough content to be worth summarizing. Idempotent -- call again with the same transcript_id to poll progress.

Body (JSON)

{
  "transcript_id": "..."
}

Response — 202 Accepted (generating)

{ "status": "PENDING" }

Response — 200 OK (ready)

{
  "status": "COMPLETED",
  "summary": "..."
}

Possible errors

  • 400 — {"error": "transcript_id is required"}
  • 403 — {"error": "Your plan does not include API access. Please upgrade your plan."}
  • 403 — {"error": "AI summaries are not available for this transcription or plan."}
  • 404 — {"error": "Transcript not found"}

Example — curl

curl -X POST https://turnscribe.com/api/v1/transcribe/summary/ \
  -H "Authorization: Api-Key <your_api_key>" \
  -H "Content-Type: application/json" \
  -d '{"transcript_id": "..."}'

6. Translate a transcript Pro

POST /api/v1/transcribe/translate/

Translates a completed transcript into another language. Requires an API key linked to an account on a plan that includes translation. Rate-limited to once per day per transcript, regardless of target language, to control model cost. Idempotent -- call again with the same transcript_id/target_lang to poll progress.

Body (JSON)

{
  "transcript_id": "...",
  "target_lang": "es"
}

Response — 202 Accepted (translating)

{ "status": "PENDING" }

Response — 200 OK (ready)

{
  "status": "COMPLETED",
  "translation": "...",
  "target_lang": "es"
}

Possible errors

  • 400 — {"error": "transcript_id is required"}
  • 400 — {"error": "Please choose a valid target language.", "supported_languages": {...}}
  • 403 — {"error": "Your plan does not include API access. Please upgrade your plan."}
  • 403 — {"error": "Translation is not available for this plan."}
  • 404 — {"error": "Transcript not found"}
  • 429 — {"error": "You can only translate this transcription once per day. Please try again tomorrow."}

Example — curl

curl -X POST https://turnscribe.com/api/v1/transcribe/translate/ \
  -H "Authorization: Api-Key <your_api_key>" \
  -H "Content-Type: application/json" \
  -d '{"transcript_id": "...", "target_lang": "es"}'

7. Using n8n, Zapier or Make

All of these just call the REST endpoints above with your API key — no special integration needed, just an HTTP/Webhook step in each tool.

n8n

Download the ready-to-import workflow (transcribe, poll status, generate a summary and translate) from the API overview page, or build it yourself with an HTTP Request node: POST /api/v1/transcribe/, then a Wait node + another HTTP Request node polling GET /api/v1/transcribe/status/ in a loop until status is COMPLETED.

Zapier

Zaps aren't exportable as a reusable file, so build it directly in Zapier:

  • Trigger: whatever starts your automation (e.g. a new row in a sheet, a form submission).
  • Action: Webhooks by Zapier → POST → URL https://turnscribe.com/api/v1/transcribe/, Data {"url": "..."}, Headers Authorization: Api-Key <your_api_key>.
  • Action: Delay by Zapier (e.g. 30 seconds) to give the transcription time to process.
  • Action: Webhooks by Zapier → GET → URL https://turnscribe.com/api/v1/transcribe/status/?transcript_id=...&task_id=... (map the values from the first step's response), same Authorization header.
  • If the response is still PENDING, add another Delay + status check step, or use Zapier's built-in Paths/looping apps to retry automatically.

Make

Same pattern, using Make's native HTTP module:

  • Module: HTTP → Make a request → Method POST, URL https://turnscribe.com/api/v1/transcribe/, Body type JSON {"url": "..."}", Header Authorization: Api-Key <your_api_key>.
  • Module: Sleep (a few seconds).
  • Module: HTTP → Make a request → Method GET → https://turnscribe.com/api/v1/transcribe/status/ with transcript_id/task_id as query parameters.
  • Wrap the Sleep + status check in a Repeater module (or Make's built-in retry/error handler) so it keeps polling until status is COMPLETED.

Questions or need a higher limit? Reach out at [email protected].