How to Scrape TVMaze TV Show & Episode Data in 2026
Pull TV shows, episodes, cast, schedules and people from the open TVMaze REST API — no key, no browser. Build TV datasets for analytics, ML and EPG apps.
If you’re building a TV analytics dashboard, training a recommendation model, or powering a “what’s on tonight” feature, you need structured show data: genres, networks, ratings, full episode lists, cast, and a daily schedule. The obvious commercial APIs are metered and keyed. TVMaze, by contrast, runs a free and fully open REST API — no key, no OAuth, no login — that covers shows, episodes, cast, people, and country-level schedules. The catch is that its responses are nested and endpoint-specific: the show index paginates one way, episodes come per-show, cast is a separate call, and schedules join across resources. This guide covers what TVMaze exposes and how to pull flat, analysis-ready TV data from it.
What’s worth extracting
The scraper flattens TVMaze responses into clean rows, 40+ fields across the modes. Every row carries three universal fields plus mode-specific data:
Universal (on every item):
_mode— which mode produced the row, so you can mix modes in one dataset and filter later.url— a clean link back to the TVMaze page.scrapedAt— an ISO 8601 scrape timestamp.
Shows (showIndex, searchShows, showDetails):
id,name,type(Scripted, Animation, Reality…),language,genres(array),status(Running/Ended/TBD),premiered/ended,rating(TVMaze average),network,runtime,image(poster), an HTML-strippedsummary, andimdbId— plus a TheTVDB cross-reference ID from TVMaze’sexternals.
Episodes (episodes): showName, season, number, name, airdate, runtime, per-episode rating, and summary.
Cast (cast): showName, personName, characterName, personCountry, personBirthday, personGender, self/voice boolean flags, and personUrl.
Schedule (schedule): airdate, airtime, showName, showNetwork, season/number, episode name, showGenres, and showRating.
People (people): id, name, country, birthday/deathday, gender, and image.
How the source works
The scraper calls the open TVMaze REST API directly over HTTP — no headless browser. Seven modes share one input form, and each maps to a TVMaze endpoint:
showIndex— paginate the entire TVMaze catalogue at 250 shows per page. This is the high-volume mode for building a complete shows dataset.searchShows/people— free-text search for shows or people by name.showDetails— rich metadata for a show (or a batch viashowIds), optionally with an embeddedcast[]list.episodes— every episode of a series byshowId.cast— cast-to-character mappings for a show.schedule— a full day of airings for acountry, each joined to its show’s network, genres, and rating.
Building a catalogue dataset needs almost nothing:
{
"mode": "showIndex",
"startPage": 0,
"maxResults": 500
}
Pulling every episode of a long-running series (here The Simpsons, show ID 83):
{
"mode": "episodes",
"showId": "83",
"maxResults": 2000
}
Today’s US TV schedule for an EPG feature:
{
"mode": "schedule",
"country": "US",
"date": "2026-07-06"
}
The ID-based modes (showDetails, episodes, cast) need a numeric showId — the integer in a TVMaze show URL (tvmaze.com/shows/169/... gives 169). Person modes need a personId. The usual workflow is searchShows or people first to discover IDs, then feed them into the detail modes.
The access reality
TVMaze is a free, open API built for developers, so there’s no anti-bot wall — the friction is structural, in how the data is shaped and split:
- Data is endpoint-specific, and modes fill different fields. A
schedulerow hasairtimeandshowNetwork; anepisodesrow hasseasonand per-episoderating; acastrow hascharacterName. You can’t get episode-level ratings from the show index — you have to runepisodesmode. The_modetag on every row exists precisely so you can keep multiple modes in one dataset and filter them apart afterward. - IDs are the join key, and you usually discover them first. Most detail modes are ID-driven. If you don’t already have show IDs, the natural first step is a
searchShowspass to resolve names to IDs, then the ID-based modes. Building this yourself means a two-step pipeline. showIndexis the volume path; other modes are targeted. OnlyshowIndexguarantees bulk output — it walks the whole catalogue 250 at a time, and a single run can pull thousands of shows by raisingmaxResults.episodes,cast, andscheduleare scoped to one show or one day.- Summaries arrive as HTML. TVMaze returns
summaryfields wrapped in HTML tags. The scraper strips them to plain text, so you don’t have to sanitize markup downstream. - No key, but respect the source. No auth is required, but you’re still hitting a community-run API. The scraper reads it over plain HTTP at a reasonable pace.
▶ Run the TVMaze Scraper on Apify — one run pulls a catalogue of shows, a full episode list, a day’s TV schedule, or cast mappings from the open TVMaze API. No key, no browser, no login. Export to JSON, CSV, or Excel.
Example output
A trimmed showDetails record for Breaking Bad:
{
"_mode": "showDetails",
"id": 169,
"name": "Breaking Bad",
"type": "Scripted",
"language": "English",
"genres": ["Drama", "Crime", "Thriller"],
"status": "Ended",
"premiered": "2008-01-20",
"ended": "2013-09-29",
"runtime": 60,
"rating": 9.2,
"network": "AMC",
"imdbId": "tt0903747",
"image": "https://static.tvmaze.com/uploads/images/original_untouched/0/2400.jpg",
"summary": "Breaking Bad follows protagonist Walter White, a chemistry teacher...",
"url": "https://www.tvmaze.com/shows/169/breaking-bad",
"scrapedAt": "2026-07-06T14:00:00.000Z"
}
The imdbId (tt0903747) is what lets you join TVMaze rows to IMDb or TheTVDB datasets — the cross-reference that makes TVMaze useful as an enrichment source, not just a standalone one.
Use cases
- TV and streaming analytics — build a shows dataset with genres, networks, premiere years, and ratings, then chart trends in a BI tool.
- Recommendation engines and ML — bulk-ingest shows, genres, ratings, and cast to train content-based or collaborative recommenders.
- EPG / what’s-on apps — pull a country’s daily schedule (a single US day returns well over 100 airings) to power an electronic program guide.
- Catalog enrichment — enrich your own media catalog with TVMaze metadata, posters, runtimes, networks, and IMDb/TheTVDB cross-IDs via
showDetails. - Market and competitor research — track which networks air the most shows, benchmark a series’ episode ratings over time, or monitor a genre’s back catalog.
- AI agents and RAG — wrap the actor as a tool so an LLM can answer “what sci-fi shows air on the BBC?” or embed show summaries for retrieval.
Cost and effort: build vs. managed
The TVMaze API is free and keyless, so the trade-off is purely engineering time:
- Building from scratch — you’d learn seven endpoints and their differing shapes, write the
showIndexpagination (250/page), build the search-then-ID two-step pipeline, join schedule rows to show metadata, strip HTML from summaries, and flatten nested genre and external-ID structures. Each mode is a small task; together they add up. - Using the managed actor — pick a mode, fill the fields it needs, run. Pricing is pay-per-result: a fraction of a cent per record, plus a trivial per-run start fee. A 500-show catalogue crawl or a full episode list costs a few cents.
The value is that all seven modes, the pagination, the HTML stripping, and the cross-reference IDs are already wired into one form — you don’t rebuild the plumbing for each mode.
Common pitfalls
Specifics of TVMaze that catch people out:
- You can’t get everything from one mode. The most common mistake is expecting episode ratings or cast from the show index. Those live in
episodesandcastmodes. Plan which modes you need up front, and use_modeto keep them straight in a combined dataset. - IDs come from a search step, not thin air. If you don’t have show or person IDs, run
searchShows/peoplefirst. Feeding a wrongshowIdintoepisodesreturns the wrong show’s episodes, silently. genresandshowGenresare arrays. Show rows carry genres as a JSON array. If you’re exporting to a flat CSV, decide how to serialize the array (join on a delimiter) rather than assuming a single value.- Ratings can be null. The TVMaze
ratingaverage isn’t set for every show or episode. Treat a null rating as “unrated,” not as zero, or you’ll skew any average you compute. - Schedule is one country, one day.
schedulemode returns a single country’s airings for a single date. To build a week or cover multiple countries, run it once per day/country and combine — it isn’t a bulk range query. showIndexis the only guaranteed high-volume mode. If you need thousands of rows, that’s the mode to use, raisingmaxResults. The targeted modes are scoped by design and won’t fill a large dataset on their own.
Wrapping up
TVMaze gives you a genuinely open, keyless TV data source — the work is in its seven endpoint shapes and the search-then-detail pattern, not in getting past any wall. If you want one show’s metadata, hit the API directly. If you want a catalogue-scale dataset, full episode lists, daily schedules, and cast with IMDb cross-references all in one consistent, flattened output, a managed actor collapses the seven modes into one form and hands you clean rows.
▶ Open the TVMaze Scraper on Apify — one run yields a TV shows dataset, a full episode list, a day’s schedule, or cast mappings with IMDb IDs; no key, no browser, no login. Export to JSON, CSV, or Excel, and start on Apify’s free monthly credit.
Related guides
How to Extract Social Profiles from Domains in Bulk (2026)
Find Twitter/X, LinkedIn, Instagram, YouTube, and 15 more social profiles across thousands of domains — one row per profile with handle and source, no API key.
How to Scrape IMDb Movies, TV Ratings & Reviews in 2026
Search IMDb by genre, year, rating and votes, then pull title details, cast, episodes and user reviews via IMDb's own GraphQL — no API key, no browser.
How to Scrape MyAnimeList Anime & Manga Ratings 2026
Pull MyAnimeList anime and manga data — ratings, rankings, seasonal charts, characters and recommendations — via the free Jikan API. No key, no OAuth needed.