Video & audio · Live on Apify

YouTube Subtitles and Transcript Scraper

Paste a YouTube link. You get the words of the video as text, from its public subtitles.

About $18.60 for 1,000 transcripts$0.008 per transcript + $0.053 per run. One run gives up to 5 transcripts. Apify bills you, not us.One transcript in a run of its own: about $0.06.Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Run it on Apify Opens apify.com, the website where our tools run. Sign up free with Google or email, no card needed.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure

What you get, for example

videoIdjNQXAC9IVRw
languageEnglish
textAll right, so here we are, in front of the elephants…

How to use it: 3 steps

  1. 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.
  2. Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example: jNQXAC9IVRw in YouTube video IDs or links. Each start is one run.
  3. 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 forPriceWhen
Complete transcript$0.008One complete public caption transcript saved to the default Dataset.
Start fee$0.053Charged 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
  1. Open the Actor's Input form in Apify Console.
  2. A fresh form offers the public demo video jNQXAC9IVRw in YouTube video IDs or links (videoUrls). You can replace it with a direct video ID or link.
  3. Keep the defaults: English (preferredLanguages: ["en"]), FIRST_AVAILABLE, and MANUAL_FIRST. You can change these settings.
  4. Click Start. Open Subtitle and transcript results when the run ends.
  5. Check status, complete, text, segments, and track. Open Run summary if any video has an error or did not finish.
Use cases
TaskMain inputResult to use
Search or index subtitle textvideoUrlstext, videoId, track.effectiveLanguageCode
Link text to moments in a videovideoUrlssegments[].startSeconds, segments[].durationSeconds, segments[].text
Choose manual or generated captionscaptionPreferencetrack.sourceIsGenerated, selection.reason
Try other public languagespreferredLanguages, languageFallbacktrack.effectiveLanguageCode, availableTracks
Request an offered YouTube translationtranslateTotrack.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

ProblemLikely reasonSafe action
Input validation failsMissing/empty videoUrls, unsupported URL or language/enum valueAdd 1–5 direct IDs or links; check exact field names.
CAPTIONS_NOT_AVAILABLEYouTube exposes no public track to this requestCheck the video's subtitles on YouTube. No audio transcription is available.
LANGUAGE_NOT_AVAILABLE or GENERATED_CAPTIONS_EXCLUDEDLanguage or caption kind does not matchCheck availableTracks; change language or fallback/type settings.
TRANSLATION_NOT_AVAILABLEThe selected track does not offer that targetPick an offered language; the Actor does not create translations.
REQUEST_BLOCKED, PROXY_ERROR, TIMEOUTSource or network restrictionCheck the run summary and retry later if appropriate. Never add credentials.
SOURCE_CHANGED or TRANSCRIPT_EMPTYUpstream content/format could not be readSave the run ID and safe error code for support.
TRANSCRIPT_OVERSIZEFull text or JSON exceeds a limitUse a shorter video. This video has no successful charge event.
Dataset has fewer rows than inputsDuplicates or stopped workCheck inputIndexes, RUN_SUMMARY.unprocessed and runStatus.
Recent updates
  1. 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.
  2. 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_SUMMARY when 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.
  3. 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.

one result · JSON
{
  "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.

Python · apify-client
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
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"]}'
LangChain · langchain-apify
# 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)
FieldType
schemaVersionstring
workKeystring
statusstring
completeboolean
inputIndexesarray
normalizedInputstring
videoIdstring
canonicalUrlstring
scrapedAtstring
sourceobject
catalogCompletenessstring
availableTracksarray
selectionobject
trackobject
segmentsarray
textstring
segmentCountinteger
textLengthinteger
serializedBytesinteger
errorobject
attemptsinteger
Input settings (5)

The main fields of the input form. With the API you send them as JSON.

SettingName in the APITypeExample value
YouTube video IDs or links requiredvideoUrlsarray["jNQXAC9IVRw"]
Languages to trypreferredLanguagesarray["en"]
If a language is missinglanguageFallbackstring"FIRST_AVAILABLE"
Caption typecaptionPreferencestring"MANUAL_FIRST"
Translate totranslateTostring

Use cases with this tool

Each guide shows all the steps and the other tools.

Start on Apify

Make a free Apify account: you get $5 of free usage every month. Missing a tool? Suggest it. We read every idea, but we do not promise to build it.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure