Wicked YouTube Transcript Scraper API
Pricing
$0.70 / 1,000 transcripts
Wicked YouTube Transcript Scraper API
YouTube transcripts from the videos’ own captions. One video or 250 per run, nothing truncated. Plain text, timestamped segments, video facts and caption languages in every result; SRT/WebVTT on request. $0.70 per 1,000, no start fee, failed videos free.
Pricing
$0.70 / 1,000 transcripts
Rating
0.0
(0)
Developer
Myworkingmemory LLC
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
18 hours ago
Last modified
Categories
Share
Timestamped transcripts of public YouTube videos, straight from their own caption tracks. One video or 250 in a run. Plain text, timestamped segments, video facts and the caption-language list in every result. $0.70 per 1,000 transcripts, one flat price per delivered transcript. Nothing else on the bill.
What you get, every result
- Plain-text transcript (
text), ready for an LLM. - Timestamped segments (
data):start,dur,text, seconds to three decimals. - Video facts: title, channel, duration, view count, description, keywords, thumbnail.
- Every caption language the video has, manual and auto-generated, so you know what else you can ask for.
- SRT and WebVTT subtitle text when you ask for them.
What you will not pay for here
- No start fee. No per-run fee. The bill is one flat price per delivered transcript: $0.0007, which is $0.70 per 1,000.
- No cap of 100. Up to 250 videos per run, and every one is processed. A longer list is refused up front, never cut off quietly.
- No charge for a video without captions. It is reported, not billed.
- No charge to list languages. Ask for the caption languages only and the run is free.
- No charge for video facts, SRT or WebVTT. They ride along with the transcript.
- No translation sold that does not work. A language the video lacks fails at once, free, with the languages it does have listed.
How it picks the captions
Give one language, or a priority list such as ["es", "en"]; the first language the video has captions in wins. Manual captions come before auto-generated ones unless you choose manual only or auto only. The video must carry captions in that language: there is no audio transcription and no translation.
Input
| Field | Type | Description |
|---|---|---|
videoUrl | string | One YouTube video URL (watch, youtu.be, Shorts, embed, live) or 11-character ID. |
videoUrls | array of strings | Up to 250 URLs or IDs in one run. Duplicates merged. Above 250: refused before any work, nothing charged. |
targetLanguage | string, default en | ISO 639-1 code of the captions you want. |
languages | array of strings | Priority list, e.g. ["es", "en"]. Replaces targetLanguage when set. |
captionType | any / manual / auto, default any | any = manual first, then auto-generated. |
outputFormats | array: srt, vtt | Adds subtitle text to each result. Free. |
listOnly | boolean, default false | Only list each video's caption languages and facts. Free. Answer is in the OUTPUT record. |
includeMetadata | boolean, default true | Video facts on every result. Free. |
One video:
{ "videoUrl": "https://www.youtube.com/watch?v=jNQXAC9IVRw", "targetLanguage": "en" }
A batch with a fallback language and subtitle files:
{"videoUrls": ["https://www.youtube.com/watch?v=jNQXAC9IVRw", "https://youtu.be/IELMSD2kdmk"],"languages": ["es", "en"],"outputFormats": ["srt", "vtt"]}
Languages only, free:
{ "videoUrls": ["jNQXAC9IVRw", "IELMSD2kdmk"], "listOnly": true }
Output
One dataset item per delivered transcript, written the moment it is ready:
{"videoId": "jNQXAC9IVRw","url": "https://www.youtube.com/watch?v=jNQXAC9IVRw","title": "Me at the zoo","channel": "jawed","channelId": "UC4QobU6STFB0P71PMvOGN5A","durationSeconds": 19,"viewCount": 353000000,"description": "…","keywords": ["…"],"thumbnailUrl": "https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg","language": "en","languageName": "English","captionType": "manual","availableLanguages": [{ "code": "en", "name": "English", "type": "manual" },{ "code": "en", "name": "English (auto-generated)", "type": "auto" }],"text": "All right, so here we are, in front of the elephants\nthe cool thing about these guys is that they have really, really, really long trunks","data": [{ "start": "1.200", "dur": "4.000", "text": "All right, so here we are, in front of the elephants" },{ "start": "5.200", "dur": "5.600", "text": "the cool thing about these guys is that they have really, really, really long trunks" }],"srt": "1\n00:00:01,200 --> 00:00:05,200\nAll right, so here we are, in front of the elephants\n…","vtt": "WEBVTT\n\n00:00:01.200 --> 00:00:05.200\nAll right, so here we are, in front of the elephants\n…"}
srt and vtt appear only when requested. With includeMetadata: false the facts are left out.
The run's key-value store holds an OUTPUT record: for one video, the same item; for a batch, { "requested", "delivered", "deliveredVideoIds", "failed": [ { "videoId", "error", "message", "availableLanguages" } ] }; for listOnly, each video's facts and caption languages. A failed video is never written to the dataset, so it is never charged. Error codes: INVALID_URL, VIDEO_UNAVAILABLE, PRIVATE_OR_RESTRICTED, AGE_RESTRICTED, NO_CAPTIONS, NO_CAPTIONS_IN_LANGUAGE, EMPTY_TRACK, BLOCKED, TIMEOUT.
Use it from code
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });const run = await client.actor('myworkingmemory/wicked-youtube-transcript-scraper-api').call({videoUrls: ['https://www.youtube.com/watch?v=VIDEO_ID'],languages: ['en'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0].title, items[0].text);
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("myworkingmemory/wicked-youtube-transcript-scraper-api").call(run_input={"videoUrls": ["https://www.youtube.com/watch?v=VIDEO_ID"],"languages": ["en"],})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["videoId"], item["title"], item["text"][:80])
One HTTP call, transcript in the response body:
POST https://api.apify.com/v2/acts/myworkingmemory~wicked-youtube-transcript-scraper-api/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>{ "videoUrl": "https://www.youtube.com/watch?v=VIDEO_ID", "targetLanguage": "en" }
Postman: the collection and spec are published at https://documenter.getpostman.com/view/59146422/2sBYHVvJvA (public workspace "Myworkingmemory LLC APIs"); OpenAPI spec: https://www.myworkingmemory.ai/apis/wicked-youtube-transcript-scraper-api.openapi.json.
AI agents and MCP: add this Actor as a tool through the Apify MCP server (https://mcp.apify.com); any MCP client can then fetch a transcript on demand.
In the Console
- Paste one URL, or up to 250 in the batch list. Pick a language, or a priority list.
- Start.
- Read the Transcripts view (plain text) or the Segments view, download, or fetch through the API.
Limits
- Public videos with captions only. Private, removed and age-restricted videos cannot be read.
- No audio transcription. No translation.
- 250 videos per run. Playlists and channels are not expanded; pass video URLs.
Pricing
$0.0007 per delivered transcript, $0.70 per 1,000. No start fee, no per-run fee, nothing for a video without captions, nothing for a language listing, nothing for facts, SRT or WebVTT. A batch of 250 costs $0.175. The pricing card at the top of this page is the binding rate.
Privacy
The Actor reads the public caption tracks and video facts you ask for. Results live in your own run's dataset and key-value store. Nothing is kept elsewhere and no user text is collected.
FAQ
Does it work on every YouTube video? Only public videos that have captions.
Can I get a language the video has no captions in? No. The run fails for that video, free, and lists the languages it does have.
How many videos per run? Up to 250, all processed. A longer list is refused before any work.
Is there a start fee or a per-run fee? No. $0.0007 per delivered transcript, nothing else.
Does listing languages cost anything? No. listOnly runs are free.
Can I use it with LangChain, an agent or a RAG pipeline? Yes. Plain JSON, callable through the Apify API, the SDKs, or as an MCP tool.