YouTube Movies & TV Catalog Scraper
Under maintenancePricing
Pay per usage
YouTube Movies & TV Catalog Scraper
Under maintenanceScrapes YouTube's Movies & TV storefront for any region into a structured, daily-refreshed catalog: titles, credits, genres, full audio/subtitle language lists, direct links and availability.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Midar
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 days ago
Last modified
Categories
Share
Turns YouTube's Movies & TV storefront into a structured, daily-refreshable dataset — no official API for this exists. Point it at a region and get back every title currently listed there: names, credits, genres, full audio and subtitle language lists, direct links and live availability.
Why this instead of scraping the page yourself
- No browser needed. Talks to YouTube's internal data API directly, so runs are fast and cheap.
- Region-correct by construction. YouTube keys its entire catalog off the request's IP — including using different video IDs for the same film in different countries. This actor pairs the region parameter with a matching proxy automatically, a trap that's easy to get wrong by hand.
- Full language lists, not summaries. Most scrapes stop at "English (+19 more)". This one reads the labelled per-title language table and returns every dubbed audio track and every subtitle language by name — with machine-translated subtitles kept separate from human-authored ones.
- Stateful. Re-running the actor doesn't just re-scrape from scratch: it tracks which titles it has already seen, adds new releases, and re-checks older titles to catch ones that quietly dropped out of the catalog.
What you get (one record per title)
{"youtubeId": "SttkHPYZAQo","title": "Project Hail Mary","originalTitle": "Project Hail Mary","year": 2026,"genre": "Action & Adventure","genres": ["Action & Adventure", "Sci-Fi", "Drama"],"directors": ["Christopher Miller", "Phil Lord"],"cast": ["Ryan Gosling", "Sandra Hüller", "..."],"studio": "MGM TVOD","durationSeconds": 9383,"ageRating": "PG-13","offerType": "Buy or rent","directLink": "https://www.youtube.com/watch?v=SttkHPYZAQo","thumbnailUrl": "https://i.ytimg.com/vi_webp/SttkHPYZAQo/movieposter.webp","available": true,"audioLanguages": ["English", "French (France)", "German", "..."],"subtitleLanguages": ["English", "German", "Spanish", "..."],"autoSubtitleLanguages": [],"hasCzechAudio": false,"hasCzechSubtitles": false}
See the Output tab for the complete field reference.
A note on prices
YouTube hides numeric buy/rent prices from logged-out requests entirely —
there's no way around that without a personal account's session, which this
actor deliberately never uses (a shared credential would put every user's
traffic on one Google account and risk it getting banned). offers is
therefore always empty and priceRequiresAuth is always true. Everything
else — catalog, credits, languages, live availability — is complete.
Input
| Field | Default | Notes |
|---|---|---|
gl | US | Region code. Must match the proxy country — see below. |
hl | en | Interface language for titles/labels. |
enrichDetails | true | Fetch each title's page for credits, languages, synopsis. |
recheckAvailability | true | Re-check known titles to catch ones removed from sale. |
recheckIntervalDays | 5 | Spreads re-checks across runs instead of hitting everything every time. |
forceRecheckAll | false | One-off full refresh, ignoring the interval. |
seedVideoIds | — | Extra YouTube video IDs to track alongside the storefront. |
proxyConfiguration | Apify Proxy | Use a proxy in the same country as gl. A mismatch silently returns the wrong region's catalog rather than erroring. |
Running it daily
Add an Apify Schedule (e.g. once a day). Each run publishes a full snapshot to the dataset and persists its own catalog state, so new releases get added and stale/removed titles get flagged automatically over time.
Limitations
- Prices are not available (see above).
- YouTube's internal API can change its response shape without notice; parsing is defensive, but if a run ever returns near-zero results, that's the most likely cause — please open an issue.