# Changelog of YouTube Transcript Scraper Pro (Captions + AI Fallback) (`codepoetry/youtube-transcript-ai-scraper`) Actor

- **URL**: https://apify.com/codepoetry/youtube-transcript-ai-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/codepoetry/youtube-transcript-ai-scraper.md

## Changelog

All notable changes to this actor will be documented here.

### \[1.1.0] — 2026-04-06

#### Changed

- **BREAKING:** `aiFallback` input removed — AI transcription is now always active when no captions are found. Videos without captions are automatically transcribed; use `maxAiMinutes` and `skipAiFallbackIfLongerThan` to control spend
- **BREAKING:** `proxyConfiguration` input removed — proxy is now always active and fully automatic. The actor builds a datacenter + residential escalation ladder internally; no user configuration needed
- `maxAiMinutes` default changed from `0` (unlimited) to `30` to prevent bill shock for new users
- `process_video()` signature: removed `ai_fallback` parameter; replaced `proxy_urls: List[str]` with `proxy_cfgs: list` (ProxyConfiguration objects) for fresh-IP-per-retry
- Proxy URLs are no longer cached at startup — `new_url()` is called at point of use so each retry gets a fresh IP from the rotating pool
- Playlist/channel URL expansion now retries through proxy tiers on bot detection instead of silently returning empty results
- Whisper transcription: added `condition_on_previous_text=False` to prevent hallucination propagation across segments
- Whisper transcription: added explicit `no_speech_threshold=0.6` and `log_prob_threshold=-1.0` to prevent silent segment drops
- Audio download: added `concurrent_fragment_downloads: 5` to speed up DASH/HLS audio downloads
- Audio file detection: added glob fallback when ffmpeg produces a non-WAV extension
- yt-dlp metadata extraction: added `extractor_retries: 3` for extractor-level retry resilience
- Added runtime input validation for `languages`, `subType`, `outputFormats`, `maxResults`, `maxAiMinutes`
- `BOT_DETECTION` added to `error_code` enum in `dataset_schema.json`
- Updated `actor.json` description to reflect always-on proxy and AI
- Updated README: Quick Start, Advanced Options, Proxy section, FAQ, integration examples, and use cases updated to reflect always-on behaviour

### \[1.0.13] — 2026-04-05

#### Changed

- Output schema (`dataset_schema.json`): removed stale `dry_run`, `would_need_ai`, and `estimated_ai_min` fields; added `words` sub-array documentation to `transcript_json` segments; clarified that `available_languages` is only present on error items; expanded `language` field description to reference both YouTube (130+) and Whisper (99) code sets
- Input schema (`input_schema.json`): expanded `languages` field description with 20 common codes; listed all 99 Whisper codes explicitly in `forceWhisperLanguage` description
- `README.md`: moved "What you get" section before "Use cases"; added full Language Reference appendix (130+ YouTube caption codes, 99 Whisper AI codes); added 10 real-world use case sections; updated transcript fields table with AI-specific fields (`language_probability`, `language_was_forced`, `ai_duration_charged_min`, `ai_speech_duration_sec`, `available_languages`); added MCP row to comparison table; added MCP entry to "Who uses it"

#### Fixed

- `available_languages` now propagated to all AI gate error items (spending limit, budget cap, skip-too-long) so callers always know which caption languages YouTube provides on a video
- `Optional[List[str]]` type hint corrected in `scraper.py` `get_video_info` signature

### \[1.0.12] — 2026-04-04

#### Changed

- `input_schema.json`: reordered fields into logical flow (URLs → captions → output → AI → proxy); improved all field descriptions; moved `sectionCaption: "Advanced"` to `skipAiFallbackIfLongerThan`; changed `proxyConfiguration` from `prefill` to `default: {"useApifyProxy": false}` so API calls without explicit proxy input receive a safe default
- `README.md`: moved Quick Start to position 2; added free-credits callout; added limitations section; reordered FAQ (cost questions first); added plain-English pricing intro; converted advanced options to a table; added 10 use-case sections

### \[1.0.11] — 2026-04-04

#### Fixed

- Crash on any run with Proxy Configuration enabled — the Apify SDK 3.x requires `actor_proxy_input=` as a keyword argument; the call was incorrectly passing it positionally (`TypeError`)
- Potential `AttributeError` when proxy configuration is present but disabled (`useApifyProxy: false`) — the SDK correctly returns `None` in that case and the code now guards against it

#### Removed

- `dryRun` input option — Apify's `apify-actor-start` synthetic event is charged on every run regardless of actor code, so a truly free dry run is not possible; `maxAiMinutes` and `skipAiFallbackIfLongerThan` remain available for spend control
- Manual `run_started` charge call — replaced by Apify's automatic `apify-actor-start` synthetic event, which handles per-run startup charging with no code required

### \[1.0] — 2026-04-02

#### Initial release

- Extract transcripts from YouTube videos, playlists, and channels
- Native caption support: auto-generated and manual captions, with language selection
- Speech-to-text AI fallback using a bundled faster-whisper model when no captions exist
- Output formats: JSON (with timestamps), SRT, VTT, plain text (LLM-ready)
- Word-level timestamps option (`wordLevel`)
- Apify Proxy support for rate-limiting resilience
- Pay-Per-Event pricing: `transcript_scraped`, `ai_transcription_min`
- Structured error codes on every failed item so pipelines can filter gracefully
- `maxResults` cap for channels and playlists
- `maxAiMinutes` cap to limit AI transcription spend per run
- Memory locked to 4 GB to guarantee AI transcription stability
