Skip to content
[00Reference]

One endpoint.
Everything you need.

A small, honest API. Send a video ID, get a transcript. Burn one credit per fetch — cached responses are free forever.

stable since 2024 < 200ms cached 99.97% uptime
cURL
curl https://gettranscript.io/api/get-transcript?videoId=dQw4w9WgXcQ \
  -H "Authorization: Bearer YOUR_API_KEY"
[01Introduction]

The whole API in one breath.

The gettranscript.io API exposes one resource: GET /api/get-transcript. You pass a YouTube video ID, you get back a clean transcript in any of six formats. That's the whole product.

Authentication is a single Bearer token. Errors come back in one shape. There are no webhooks, no async jobs, no SDKs to install — just fetch from anything that speaks HTTP.

Prefer a task-oriented walkthrough? The how-to guides cover specific jobs — downloading subtitles, picking between formats, wiring transcripts into your workflow.

Base URL
https://gettranscript.io
Auth
Bearer token
Format
JSON in, JSON out
[02Authentication]

A single Bearer token.

Every request needs an Authorization header. Find your key in the Dashboard → API access tab.

HTTP
Authorization: Bearer YOUR_API_KEY
callout

Treat your key like a password. If exposed, regenerate from the dashboard — your old key is invalidated immediately.

[03Endpoint]

GET /api/get-transcript

Returns the transcript for a single video. Idempotent. Cached responses don't refetch from YouTube.

GET/api/get-transcript→ 200 application/json

Query parameters

videoId
Type
string
Required
yes
Description
YouTube video ID (e.g. dQw4w9WgXcQ) or any full youtube.com / youtu.be URL — we'll parse out the ID.
format
Type
string
Required
no
Description
One of txt, txt_timestamped, srt, vtt, json, md. Omit to receive the full JSON object.
[04Response]

Two shapes: success and error.

Every response is JSON. Successes carry the transcript and your remaining credit balance; errors share one consistent envelope.

200 — success
JSON
{
  "success": true,
  "cached": false,
  "video_id": "dQw4w9WgXcQ",
  "text": "Welcome back — today we're walking through…",
  "language": "English",
  "language_code": "en",
  "is_generated": false,
  "remaining_credits": 311,
  "segments": [
    { "text": "Welcome back…", "start": 0.0, "duration": 4.2 },
    { "text": "The headline change is the API.", "start": 4.2, "duration": 5.1 }
  ]
}
4xx · 5xx — error
JSON
{
  "error": {
    "code": "INSUFFICIENT_CREDITS",
    "message": "You have no credits remaining."
  }
}

Success fields

success
Type
boolean
Required
yes
Description
Always true for 200 responses.
cached
Type
boolean
Required
yes
Description
Whether this transcript was served from cache. Cached responses still cost 1 credit.
video_id
Type
string
Required
yes
Description
The canonical YouTube video ID.
text
Type
string
Required
yes
Description
The full transcript as one continuous string.
segments
Type
array
Required
yes
Description
Time-aligned segments with start, duration, and text.
language
Type
string
Required
no
Description
Display name of the transcript track, e.g. "Finnish (auto-generated)". English is preferred; otherwise the video's own language is used.
language_code
Type
string
Required
no
Description
ISO language code of the transcript track, e.g. "en" or "fi".
is_generated
Type
boolean
Required
no
Description
True if the track is auto-generated rather than uploader-provided.
remaining_credits
Type
number
Required
yes
Description
Your credit balance after this request was billed.
[05Error codes]

Six errors to know.

Each error returns the corresponding HTTP status and a stable string code. Build against the code, not the message.

401
Code
UNAUTHORIZED
Meaning
Missing, malformed, or invalid API key.
402
Code
INSUFFICIENT_CREDITS
Meaning
Your credit balance is 0. Top up to continue.
404
Code
TRANSCRIPT_NOT_FOUND
Meaning
No transcript available — disabled by uploader or video unavailable.
422
Code
INVALID_VIDEO_ID
Meaning
The videoId query parameter is missing or malformed.
429
Code
RATE_LIMITED
Meaning
Too many requests — check the Retry-After header.
500
Code
INTERNAL_ERROR
Meaning
Unexpected server error. Try again or write to us.
[06Examples]

Drop-in snippets.

Copy any of these into your codebase. Replace YOUR_API_KEY with the value from your dashboard.

cURL
curl https://gettranscript.io/api/get-transcript?videoId=dQw4w9WgXcQ \
  -H "Authorization: Bearer YOUR_API_KEY"
[07Credits & caching]

One credit per fetch. Cached forever.

Every successful request — whether served fresh from YouTube or instantly from cache — costs one credit. Errors are free.

Once we've fetched a video, we cache the segments permanently. The same video ID called again uses the cache (still 1 credit, but ~80ms instead of 1–3 seconds). If you'd rather not be billed for cached fetches, dedupe video IDs on your side before calling — your call.

~1.5s
cold fetch · p50
~80ms
cache hit · p50
[08Rate limits]

Generous, but not infinite.

The default account ceiling is 60 requests / minute per API key. If you hit a limit, we return 429 with a Retry-After header (seconds). Need more? Email us — we'll lift it.

HTTP
HTTP/1.1 429 Too Many Requests
Retry-After: 14
Content-Type: application/json

{
  "error": {
    "code": "RATE_LIMITED",
    "message": "Slow down — try again in 14s."
  }
}
[09Changelog]

What's changed lately.

Backwards-incompatible changes ship with at least 30 days of notice. Anything else, we just ship.

Non-English transcripts: when a video has no English track, the transcript is returned in the video's own language. New language, language_code, and is_generated response fields.
Jul 02, 2026·· added
Six output formats (SRT, VTT, JSON, Plain, Timestamped, Markdown).
Apr 28, 2026·· added
Cached responses now return a richer segments[] array.
Apr 12, 2026·· changed
Full youtu.be short-link support.
Mar 30, 2026·· added
Edge case where 404 was returned for valid age-restricted videos.
Mar 02, 2026·· fixed
[ ready ]

50 free credits.
No card to start.