YouTube Transcript Scraper ๐Ÿ“ Subtitles, Timestamps & SRT avatar

YouTube Transcript Scraper ๐Ÿ“ Subtitles, Timestamps & SRT

Pricing

from $1.50 / 1,000 transcripts

Go to Apify Store
YouTube Transcript Scraper ๐Ÿ“ Subtitles, Timestamps & SRT

YouTube Transcript Scraper ๐Ÿ“ Subtitles, Timestamps & SRT

Quickly get the full transcript of any YouTube video as clean text, timestamped cues or an SRT file. Works on manual and auto-generated captions in any language. No cookies, no login, no API key. Accurate and reliable whilst maintaining maximum speed.

Pricing

from $1.50 / 1,000 transcripts

Rating

5.0

(1)

Developer

GatherWorks

GatherWorks

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Get the full transcript of any YouTube video โ€” as clean text, timestamped cues, or a ready-to-use SRT subtitle file. Manual and auto-generated captions, any language.

No account, no API key, no setup. Paste links and run.


๐Ÿ” What is the YouTube Transcript Scraper?

Give it YouTube links โ€” watch URLs, youtu.be links, Shorts, or bare video IDs. For each one it returns the transcript in whichever shape you need it:

  • ๐Ÿ“ the whole thing as one clean block of text
  • โฑ๏ธ every line with its start time and duration, to the millisecond
  • ๐ŸŽฌ a complete SRT file as a string, ready to save or upload
  • ๐Ÿท๏ธ the video's own context โ€” title, channel, views, duration โ€” on the same row

โšก What can it do?

  • ๐ŸŒ Pick the language you asked for. preferredLanguages is tried in order, and the language actually used is reported back on the row.
  • ๐Ÿค– Include or exclude machine captions. Set allowAutoGenerated: false to accept only human-written subtitles.
  • ๐ŸŽฌ Emit SRT directly. No post-processing, no timestamp maths โ€” the file comes out ready to use.
  • ๐Ÿ“ฆ Take a list of videos and return one dataset covering all of them.
  • โœ… Say which track you got on every row, so a transcript is never anonymous.
  • ๐Ÿ”Ž Filter before you pay. Keep only the rows you want โ€” a minimum word count, a language, human-written only โ€” and rows that do not match are never returned and never charged for.
  • ๐Ÿ”€ Sort the results by any field, e.g. longest transcript first.
  • โ™ป๏ธ Reuse what you already fetched. A video you have pulled before is served from your own recent copy โ€” same result, a fraction of the time. The add-ons work off it too, so switching on cues or SRT later needs no refetch.
  • ๐Ÿ“„ Export anywhere. JSON, CSV, Excel โ€” the dataset is yours.

๐ŸŽฏ "No captions" is an answer, not a failure

A video with no caption track comes back with status: "no_captions" and a plain-English message, and it is never charged for a transcript โ€” only for the lookup. The same applies when the only tracks are auto-generated and you have switched those off.

That distinction matters downstream: an empty string cannot tell you whether the captions do not exist or simply were not read, and you find out which at the wrong moment. Here status and message say which, on every row.

โšก Speed and accuracy

Speed. Measured on real runs: 10 videos in 21.5 seconds, and the same 10 in 2.5 seconds when already fetched โ€” with timestamped cues and SRT switched on the second time, rebuilt without going back out.

Accuracy. Transcripts are the caption tracks YouTube publishes for the video, so the wording is not a machine transcription of our own. Cue timings are preserved to the millisecond and carried into the SRT output unchanged. Every row reports the language used and whether that track was human-written or auto-generated. A video whose captions cannot be read is reported as such rather than returned empty.

๐Ÿ“Š What data does it return?

One row per video:

FieldNotes
๐Ÿ“ textThe whole transcript as one clean block
โฑ๏ธ cues(timestamps add-on) Every line with start and duration in seconds
๐ŸŽฌ srt(SRT add-on) A complete SRT subtitle file as a string
๐ŸŒ languageThe caption track actually used
๐Ÿค– isAutoGeneratedWhether YouTube generated that track rather than a human writing it
๐Ÿ—‚๏ธ availableLanguagesEvery caption language the video offers, de-duplicated
๐Ÿ”ข wordCount, cueCountSize of the transcript at a glance
๐Ÿท๏ธ videoTitle, channelName, channelIdVideo context
๐Ÿ“Š viewCount, durationSeconds, publishedAtVideo stats
โœ… statusok, no_captions, transcript_unavailable or error
โš ๏ธ messageWhy, in plain English, whenever status is not ok
๐Ÿ•ฐ๏ธ scrapedAtWhen the row was captured

๐Ÿšซ What it does not return

  • A transcript for a video that has no captions. It says so instead.
  • Speech recognition of our own. If YouTube has no caption track, there is nothing to return โ€” a machine transcription would be a different product with different accuracy, and passing one off as the video's captions would be a lie.
  • Captions from private, members-only or age-gated videos. They are not served publicly.
  • Translated captions. You get the tracks the video actually publishes.

๐Ÿ’ฐ How much does it cost?

You pay per event, for what the run actually produces โ€” never for runtime, and never on a subscription. Every video costs a base lookup fee; a transcript is charged only when one is actually returned.

Standard rate, at $0.0025 per transcript โ€” one charge, and only when a transcript is actually returned:

RunCost
๐ŸŸฉ 100 transcripts, plain text๐Ÿ’ต $0.25
๐ŸŸจ 100 transcripts + timestamped cues๐Ÿ’ต $0.34
๐ŸŸง 100 transcripts + cues + SRT๐Ÿ’ต $0.43

A video with no captions is free. So is a video that fails to load. You are charged per transcript you receive, and for nothing else. A month you do not run it costs nothing at all โ€” there is no plan to keep alive.

What you get for that

Included here
๐ŸŒ The language actually used, reported per rowโœ…
๐Ÿค– Human-written vs auto-generated, markedโœ…
๐Ÿ—‚๏ธ Every caption language the video offersโœ… free
๐Ÿท๏ธ Video title, channel, views and durationโœ… free
๐Ÿ’ณ Minimum spendnone
๐Ÿ“… Monthly commitmentnone

The usual alternative is a monthly credit plan, where the cheap per-transcript rate only arrives once you have prepaid for tens of thousands of them and used the lot. Here the rate is the rate, the add-ons are genuinely optional, and nothing expires at the end of the month.

๐Ÿš€ How do I use it?

  1. Paste your video URLs into videoUrls.
  2. Put your preferred caption languages in order in preferredLanguages.
  3. Switch on includeTimestamps or includeSrt only if you need them.
  4. Run it. Rows land in the dataset as they arrive.

โš™๏ธ Input

InputTypeDefaultWhat it does
๐Ÿ” videoUrlsarrayโ€”Required. Watch URLs, youtu.be links, Shorts URLs or bare 11-character IDs
๐ŸŒ preferredLanguagesarray["en"]Language codes in order of preference. First available wins
๐Ÿค– allowAutoGeneratedbooleantrueTurn off to accept only human-written subtitles
๐Ÿ”Ž filterobjectโ€”Keep only matching rows. Unmatched rows are not returned and not charged
๐Ÿ”€ sortResultsBystringโ€”e.g. wordCount:desc. Leave empty to keep input order
โ™ป๏ธ useCachebooleantrueServe videos you have already fetched from your own recent copy
โณ cacheHoursinteger168How long a stored result stays usable. Default one week
โฑ๏ธ includeTimestampsbooleanfalseAdds the cues array. Add-on
๐ŸŽฌ includeSrtbooleanfalseAdds the srt string. Add-on
๐Ÿ”ข concurrencyinteger5Videos fetched at once
โš™๏ธ proxyConfigurationobjectโ€”Optional proxy settings
{
"videoUrls": [
"https://www.youtube.com/watch?v=jNQXAC9IVRw",
"https://youtu.be/dQw4w9WgXcQ"
],
"preferredLanguages": ["en"],
"includeTimestamps": true,
"includeSrt": true,
"filter": { "wordCount": { "gte": 200 }, "isAutoGenerated": false },
"sortResultsBy": "wordCount:desc"
}

๐Ÿ“„ Output example

A real row from a real run, trimmed for length:

{
"videoId": "jNQXAC9IVRw",
"videoUrl": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
"videoTitle": "Me at the zoo",
"channelName": "jawed",
"viewCount": 407909330,
"durationSeconds": 19,
"availableLanguages": ["en", "de"],
"status": "ok",
"language": "en",
"isAutoGenerated": false,
"cueCount": 6,
"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...",
"cues": [
{ "start": 1.2, "duration": 2.16, "text": "All right, so here we are, in front of the elephants" }
],
"srt": "1\n00:00:01,200 --> 00:00:03,360\nAll right, so here we are, in front of the elephants\n",
"scrapedAt": "2026-08-29T07:12:44.108Z"
}

Videos without captions return status: "no_captions" and are never charged for a transcript.

โ“ Frequently asked questions

Do I need a Google account or API key? No. There is nothing to sign up for and no key to manage.

What happens if a video has captions in several languages? preferredLanguages is tried in order. If none of them match, the first available track is used โ€” and language on the row tells you which one you got.

Can I get a transcript for a video that has none? No. This Actor returns the captions the video publishes; it does not transcribe audio. Those videos come back as no_captions.

What can I filter on? Any field in the table above. Conditions take an operator โ€” gte, lte, eq, ne, contains, notContains, startsWith, endsWith, matches, in, notIn, exists, before, after โ€” or a bare value for an exact match. Give several and all must hold; use {"any": [...]} for or.

Am I charged for rows the filter removes? No. The filter runs before the row is returned, so you are only charged for transcripts you actually receive.

How fresh is a reused result? scrapedAt on every row is the moment the captions were actually captured, not the moment they were handed to you โ€” so you can always see the real age. Set useCache: false to force a fresh fetch, or lower cacheHours.

What about live streams? Live streams and videos with captions disabled are reported, not charged for.

๐Ÿท๏ธ Pricing

Pay per event โ€” you are charged for output, not for platform time.

EventPriceCovers
๐Ÿ“ transcript โ€” primary๐Ÿ’ต $0.0025One transcript returned. The only charge a default run makes
โฑ๏ธ timestamped-transcript โ€” add-on๐Ÿ’ต $0.0009The cues array. Only when includeTimestamps is on
๐ŸŽฌ srt-export โ€” add-on๐Ÿ’ต $0.0009The srt string. Only when includeSrt is on
โ–ถ๏ธ apify-actor-start๐Ÿ’ต $0.00005Starting one run, charged once per GB of memory
๐Ÿ“น Videos with no captionsโœ… freeReported, never charged
๐Ÿท๏ธ Title, channel, views and durationโœ… freeOn every row
๐ŸŒ Language detection and de-duplicationโœ… freeOn every row
๐Ÿ”Ž Filtering and sortingโœ… freeFiltered-out rows are not charged for

Both add-ons are off by default. Leave them off and you are charged the transcript rate and nothing else.

๐Ÿ… Rates by tier

The prices above are the standard rate. Higher Apify plans are billed at the discounted tiers below, automatically:

EventFREEBRONZESILVERGOLD
๐Ÿ“ transcript๐Ÿ’ต $0.0025๐Ÿ’ต $0.00217๐Ÿ’ต $0.00183๐Ÿ’ต $0.0015
โฑ๏ธ timestamped-transcript๐Ÿ’ต $0.0009๐Ÿ’ต $0.00077๐Ÿ’ต $0.00063๐Ÿ’ต $0.0005
๐ŸŽฌ srt-export๐Ÿ’ต $0.0009๐Ÿ’ต $0.00077๐Ÿ’ต $0.00063๐Ÿ’ต $0.0005
โ–ถ๏ธ apify-actor-start๐Ÿ’ต $0.00005๐Ÿ’ต $0.00005๐Ÿ’ต $0.00005๐Ÿ’ต $0.00005

๐Ÿ›‘ You are never billed past your limit

The run watches its own charge limit and stops taking new videos when it reaches it, so a long list cannot quietly overshoot the budget you set on the run.