# Changelog of YouTube Transcript Scraper 📝 (bulk, any language) (`tagadanar/youtube-transcript-extractor`) Actor

- **URL**: https://apify.com/tagadanar/youtube-transcript-extractor/changelog.md
- **Full Actor documentation**: https://apify.com/tagadanar/youtube-transcript-extractor.md

## Changelog

### 2026-09-02

- Fixed: videos whose id contains `-` (a legal YouTube id character) failed on
  the residential rung with "Expected string `sessionId` to match
  /^\[\w.\_~]+$/" and were reported as "never returned a usable response". The
  proxy session id is now sanitised before use.

### 0.1.5 (2026-08-29)

- **Fixed: a short run gave up after one proxy exit.** The time guard priced
  every retry at its worst case — a full 45-second timeout — and refused to
  start an exit it could not fit several times over. On a 100-second run that
  left room for two attempts, and on a 60-second one for a single attempt, so
  the run tried the free datacenter exit, took YouTube's "Sign in to confirm
  you're not a bot" refusal in about a third of a second, and stopped there
  without ever trying the residential exits that are the only thing known to
  clear that check. Both ladders — the player call and the caption download —
  now measure the time each attempt actually takes: every exit is tried while
  the clock allows, and only a genuinely spent run stops early. The same fix
  keeps a rate-limited caption download from becoming a silent gap in the
  dataset on a short run.
- **Fixed: a run that ran out of time said it had been blocked.** A video whose
  ladder the clock cut short was reported as bot-gated, and the run summary
  claimed YouTube had refused every exit when one had been tried. A video
  stopped by the clock now reports the clock — "N of M proxy exits tried before
  the crawl box closed" — is never counted as blocked, and the wall verdict is
  reserved for a ladder that really was walked to the end. Nothing about it is
  charged either way.

### 2026-08-29

- The run now watches its own clock. A long list used to be killed by the
  platform timeout mid-video, losing every transcript that had not been pushed
  yet. The actor now stops starting new videos while there is still time to
  charge and deliver what it collected, and ends **successfully** with a status
  message saying "Stopped at the run time limit: N transcript(s) delivered,
  raise the run timeout or lower Max videos."
- Both retry ladders are bounded by the time actually left, not by a fixed
  number of rungs. One video could previously burn almost ten minutes — four
  player attempts, each able to fire a second request, then five caption
  attempts — past the point where the run had time for it. No proxy connection
  is opened when there is no time left to use it.
- Honest limits in the input form: **Max videos** now tops out at 650, which is
  what a default 3600-second run can actually finish (about 5.5 seconds per
  video), instead of advertising 5,000 that no run could reach. **Video URLs or
  IDs** accepts up to 650 entries per run.
- Every run now ends with a status message built from what was really
  delivered. "No usable captions" is only ever said about videos YouTube
  actually described — a run that hit the bot check now leads with the wall
  instead.

### 0.1.0 (2026-08-28)

First release.

- Transcripts for a list of YouTube videos in one run. Watch links, youtu.be
  links, Shorts links, embed links and bare video IDs all work, mixed together,
  and duplicates are removed before anything is charged.
- Every record carries the transcript twice over: one plain-text string for
  LLM work, and timed segments with a start and a duration for subtitles,
  chapter markers and search inside video.
- Title, channel, duration, view count and the full list of caption tracks the
  video has come on the same row.
- Language preference is an ordered list. A plain code like `en` matches
  `en-GB` too, human-written subtitles are preferred over speech recognition
  inside the same language, and when none of your languages exists YouTube's
  own machine translation is used instead (the row says so).
- Videos with no captions, private, members-only, age-restricted, deleted or
  refused by YouTube's bot check come back as a row explaining which, and are
  never charged.
- Very long videos are cut at 400,000 characters or 40,000 segments so one
  four-hour lecture cannot blow up a dataset item, with a flag on the row.
- One all-in price per transcript. Residential proxies and compute are on us,
  and there is no proxy setting to configure.
