How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
jNQXAC9IVRwin YouTube video IDs or links. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Get public YouTube subtitles and full transcripts as text and timed segments. Add a video ID or link, choose a language, and export one selected caption track as JSON.
Who uses it
AI builders
Feed video text into search, summaries or chat tools.
Students and researchers
Read and quote lectures without watching the full video.
Content teams
Turn video captions into notes or blog drafts.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Complete transcript | $0.008 | One complete public caption transcript saved to the default Dataset. |
| Start fee | $0.053 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
Examples
- One transcript: about $0.06.
- 1,000 transcripts: about $18.60 (200 runs of up to 5).
- Every day 100 transcripts, for 30 days: about $55.80 a month (20 runs a day).
- 5 transcripts once a week (4 runs a month): about $0.37 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 260 transcripts.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Does it make text from the audio?
No. It copies the subtitles that the video already has on YouTube. If a video has no subtitles, use our Audio & Podcast Transcriber. It turns speech into text.
Do I need a YouTube account?
No. The tool reads only public videos and their public subtitles.
Can I get several languages for one video?
No. You get one subtitle language per video. You can list a few languages, and the tool takes the first one the video has.
Do I pay for videos without subtitles?
There is no transcript fee for them: you pay the transcript fee only when the tool saves a full transcript. The small start fee of the run is paid once per run, whatever the videos have.
Can I paste a channel or a playlist?
No. Paste links to single videos, up to 5 in one run.
Is the text complete?
You get all the subtitles that YouTube has for the language you chose, with the time of each part. If the subtitles on YouTube miss some words, the text misses them too.
Details
Step by step on Apify
- Open the Actor's Input form in Apify Console.
- A fresh form offers the public demo video
jNQXAC9IVRwin YouTube video IDs or links (videoUrls). You can replace it with a direct video ID or link. - Keep the defaults: English (
preferredLanguages: ["en"]),FIRST_AVAILABLE, andMANUAL_FIRST. You can change these settings. - Click Start. Open Subtitle and transcript results when the run ends.
- Check
status,complete,text,segments, andtrack. Open Run summary if any video has an error or did not finish.
Use cases
| Task | Main input | Result to use |
|---|---|---|
| Search or index subtitle text | videoUrls | text, videoId, track.effectiveLanguageCode |
| Link text to moments in a video | videoUrls | segments[].startSeconds, segments[].durationSeconds, segments[].text |
| Choose manual or generated captions | captionPreference | track.sourceIsGenerated, selection.reason |
| Try other public languages | preferredLanguages, languageFallback | track.effectiveLanguageCode, availableTracks |
| Request an offered YouTube translation | translateTo | track.isTranslated, track.translationTarget |
Tips for better results
- List several languages in order; the first available one is used.
- Set the caption type to skip auto-generated captions.
- Use the start time of each part to link to a moment.
Limits and good to know
Troubleshooting
| Problem | Likely reason | Safe action |
|---|---|---|
| Input validation fails | Missing/empty videoUrls, unsupported URL or language/enum value | Add 1–5 direct IDs or links; check exact field names. |
CAPTIONS_NOT_AVAILABLE | YouTube exposes no public track to this request | Check the video's subtitles on YouTube. No audio transcription is available. |
LANGUAGE_NOT_AVAILABLE or GENERATED_CAPTIONS_EXCLUDED | Language or caption kind does not match | Check availableTracks; change language or fallback/type settings. |
TRANSLATION_NOT_AVAILABLE | The selected track does not offer that target | Pick an offered language; the Actor does not create translations. |
REQUEST_BLOCKED, PROXY_ERROR, TIMEOUT | Source or network restriction | Check the run summary and retry later if appropriate. Never add credentials. |
SOURCE_CHANGED or TRANSCRIPT_EMPTY | Upstream content/format could not be read | Save the run ID and safe error code for support. |
TRANSCRIPT_OVERSIZE | Full text or JSON exceeds a limit | Use a shorter video. This video has no successful charge event. |
| Dataset has fewer rows than inputs | Duplicates or stopped work | Check inputIndexes, RUN_SUMMARY.unprocessed and runStatus. |
Recent updates
Update · 10 October 2026
- Suppress raw storage-provider exception chains in runtime tracebacks.
- Update existing urllib3 and multidict dependencies to patched exact versions.
- Use a labeled real Cloud output excerpt and validate the refreshed publication package.
Update · 10 October 2026
- Keep the internal source deadline within the Apify run timeout, leaving time to save a partial result and report unprocessed videos. The normal 600-second source cap remains in place for longer platform timeouts.
- Report unavailable Dataset or Key-value store resources as a resource failure in
RUN_SUMMARYwhen the summary store can be opened. - Refresh the Store README with a product example, a timestamped output guide, input/default/prefill distinctions, limits, and honest error and price notes.
Version 0.1.0 · 3 September 2026
- Added support for up to 5 direct YouTube video IDs or links in one run.
- Added full subtitle text and every timestamped segment in one transcript result.
- Added clear results for missing subtitles, unavailable videos, connection problems, and changed YouTube responses.
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
The words of the video are at the end of the box, in segments → text. Scroll down inside the box to see them.
{
"schemaVersion": "1.0",
"workKey": "video:jNQXAC9IVRw",
"status": "SUCCEEDED",
"complete": true,
"inputIndexes": [
0
],
"normalizedInput": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
"videoId": "jNQXAC9IVRw",
"canonicalUrl": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
"scrapedAt": "2026-10-10T00:52:57.102Z",
"source": {
"library": "youtube-transcript-api",
"libraryVersion": "1.2.4",
"transport": "UNOFFICIAL_PUBLIC_WEB",
"proxyMode": "APIFY_RESIDENTIAL"
},
"catalogCompleteness": "NORMALIZED_UNIQUE_LANGUAGE_KIND",
"availableTracks": [
{
"trackKey": "manual:de",
"languageCode": "de",
"languageName": "German",
"kind": "MANUAL",
"isTranslatable": false
},
{
"trackKey": "manual:en",
"languageCode": "en",
"languageName": "English",
"kind": "MANUAL",
"isTranslatable": false
}
],
"selection": {
"preferredLanguages": [
"en"
],
"languageFallback": "FIRST_AVAILABLE",
"captionPreference": "MANUAL_FIRST",
"matchedPreference": "en",
"matchType": "EXACT",
"fallbackUsed": false,
"reason": "EXACT_LANGUAGE_MANUAL_PREFERRED"
},
"track": {
"trackKey": "manual:en",
"sourceLanguageCode": "en",
"sourceLanguageName": "English",
"effectiveLanguageCode": "en",
"sourceIsGenerated": false,
"isTranslated": false,
"translationTarget": null,
"isTranslatable": false,
"availableTranslationLanguages": []
},
"segments": [
{
"sequence": 0
}
]
}Use it from code
Actor ID: cliqtomedia/youtube-transcript-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/youtube-transcript-scraper").call(run_input={
"videoUrls": [
"jNQXAC9IVRw"
],
"preferredLanguages": [
"en"
]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~youtube-transcript-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"videoUrls": ["jNQXAC9IVRw"], "preferredLanguages": ["en"]}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/youtube-transcript-scraper")
result = tool.invoke({"run_input": {"videoUrls": ["jNQXAC9IVRw"], "preferredLanguages": ["en"]}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (21)
| Field | Type |
|---|---|
schemaVersion | string |
workKey | string |
status | string |
complete | boolean |
inputIndexes | array |
normalizedInput | string |
videoId | string |
canonicalUrl | string |
scrapedAt | string |
source | object |
catalogCompleteness | string |
availableTracks | array |
selection | object |
track | object |
segments | array |
text | string |
segmentCount | integer |
textLength | integer |
serializedBytes | integer |
error | object |
attempts | integer |
Input settings (5)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| YouTube video IDs or links required | videoUrls | array | ["jNQXAC9IVRw"] |
| Languages to try | preferredLanguages | array | ["en"] |
| If a language is missing | languageFallback | string | "FIRST_AVAILABLE" |
| Caption type | captionPreference | string | "MANUAL_FIRST" |
| Translate to | translateTo | string |
Use cases with this tool
Each guide shows all the steps and the other tools.