YouTube transcripts by API, ready for your LLM
Send a video, Shorts, playlist or channel URL. Get clean text, timestamped segments, SRT or VTT, plus title, channel and duration. Runs from any server, without the IP blocks that break DIY scrapers.
Get an API keyTry it live, free
- Videos without captions are free
- Manual captions preferred, auto as fallback
- Any caption language + auto-translate
One request per video, playlist or channel
Pass up to 10 URLs or video IDs. Playlists and channels expand to up to 25 videos each.
outputFormats:text,segments,srt,vttlanguagepreference list like"es,en", andtranslateTo- Metadata included free: title, channel, duration, views, keywords, thumbnail
curl https://siftwright.com/v1/youtube-transcript \
-H "Authorization: Bearer $SIFTWRIGHT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.youtube.com/watch?v=jNQXAC9IVRw", "outputFormats": ["text", "segments"]}'import os, requests
r = requests.post(
"https://siftwright.com/v1/youtube-transcript",
headers={"Authorization": f"Bearer {os.environ['SIFTWRIGHT_API_KEY']}"},
json={"url": "https://www.youtube.com/watch?v=jNQXAC9IVRw", "outputFormats": ["text"]},
timeout=300,
)
r.raise_for_status()
video = r.json()["results"][0]
print(video["title"], video["wordCount"], "words")
print(video["text"][:500])const res = await fetch("https://siftwright.com/v1/youtube-transcript", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SIFTWRIGHT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://youtu.be/jNQXAC9IVRw", outputFormats: ["srt"] }),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const { results } = await res.json();
console.log(results[0].srt);{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=siftwright/youtube-transcript-extractor,siftwright/pageframe-screenshots,siftwright/google-news-scraper",
"headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
}
}
}What you get back
Real output for the first ever YouTube video, trimmed to three segments.
| Field | What it is |
|---|---|
text | The full transcript as one string |
segments | Array of {start, duration, text} in seconds |
srt / vtt | Ready-to-save subtitle files, when requested |
language, isAutoGenerated | Which caption track was used |
availableLanguages | Every caption track on the video |
status | "ok" or an error reason; only ok is billed |
[
{
"videoId": "jNQXAC9IVRw",
"url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
"inputSource": "jNQXAC9IVRw",
"status": "ok",
"title": "Me at the zoo",
"channelName": "jawed",
"channelId": "UC4QobU6STFB0P71PMvOGN5A",
"durationSeconds": 19,
"viewCount": 438012882,
"publishDate": null,
"category": null,
"keywords": [
"me at the zoo",
"jawed karim",
"first youtube video"
],
"thumbnailUrl": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg",
"isLive": false,
"language": "en",
"sourceLanguage": "en",
"isAutoGenerated": false,
"isTranslated": "",
"availableLanguages": [
{
"code": "en",
"name": "English",
"autoGenerated": false
},
{
"code": "de",
"name": "German",
"autoGenerated": false
}
],
"wordCount": 39,
"text": "All right, so here we are, in front of the elephants the cool thing about these guys is that they have really... really really long trunks and that's cool (baaaaaaaaaaahhh!!) and that's pretty much all there is to say",
"segments": [
{
"start": 1.2,
"duration": 2.16,
"text": "All right, so here we are, in front of the elephants"
},
{
"start": 5.318,
"duration": 2.656,
"text": "the cool thing about these guys is that they have really..."
},
{
"start": 7.974,
"duration": 4.642,
"text": "really really long trunks"
}
]
}
]What people build with it
RAG and search over video
Chunk transcripts by segment timestamps so answers can link to the exact second in the video.
Summaries and show notes
Feed text to your LLM to produce summaries, chapters, quotes and newsletters.
Subtitles and localisation
Download SRT or VTT, or machine-translate captions into another language.
Research and monitoring
Pull every new upload from a set of channels and search what was said.
Content repurposing
Turn talks and tutorials into blog drafts, threads and docs.
Accessibility
Give readers a text version of the videos you embed.
Pricing
Each video whose transcript comes back counts as one result. Videos without captions, private or removed videos, and metadata-only lookups are free.
| Option | Price |
|---|---|
| Starter plan | $29/mo for 10,000 results ($2.90/1k) |
| Pro plan | $99/mo for 50,000 results ($1.98/1k) |
| Business plan | $299/mo for 250,000 results ($1.20/1k) |
| Enterprise plan | $999/mo for 1,500,000 results ($0.67/1k) |
| Pay-per-event on Apify | $3.00 per 1,000 transcripts, no subscription |
Frequently asked questions
Does it work for videos without captions?
No. It reads YouTube's caption tracks (creator-uploaded or auto-generated). If a video has no captions at all, the result has an error status and isn't billed. It doesn't do speech-to-text on the audio.
Why not use the open-source youtube-transcript-api library?
It's great on a laptop. From cloud servers YouTube often blocks the requests (the library's own docs discuss IP bans). Our tool connects directly and falls back to a proxy automatically, so it keeps working from any server.
Which languages are supported?
Any language YouTube has captions for. Pass a preference list like "de,en"; if none match, the first available track is used. translateTo uses YouTube's built-in translation.
Can I get transcripts for a whole channel or playlist?
Yes. Pass the playlist or channel URL and set maxVideosPerSource (1 to 25 per source through the API). Channels return the newest uploads first.
How long does a request take?
In our tests a short video took about 4 seconds end to end. Larger batches take longer; set a client timeout of a few minutes.
Get transcripts from any server today
Plans from $29/month with 10,000 successful results. Failed requests never count. Cancel anytime from the billing portal.