Tony Wang6 min readHow to Scrape IMDb in 2026 (API & Python)
Scrape IMDb in 2026 — titles, cast and crew, ratings, reviews, and awards — DIY, no-code, or a structured API, with the legal reality of IMDb's terms.
The fastest way to scrape IMDb in 2026 is to call a structured API that returns normalized JSON — title detail, cast and crew, ratings, user reviews, and awards — instead of parsing IMDb's server-rendered pages yourself. IMDb is the web's default movie and TV database, but it has no self-serve public API, and its terms explicitly restrict automated access more than most sites in this series. This guide covers all three approaches, what each returns, where each breaks, and the legal reality up front.
Why scrape IMDb?
IMDb's title and people data anchors most film/TV products, which powers:
- Catalog enrichment — attach canonical title, cast, rating, and genre data to a media app, watchlist, or internal dataset.
- Recommendation and discovery — build "similar titles" or genre/era-based recommendation features.
- Reception and sentiment research — track how a title's rating and review tone move over time.
- Talent and filmography tracking — follow a director's or actor's body of work and award history.
- Streaming comparison research — pair title/rating data with where a title is actually available to see what's acclaimed versus what's easy to watch.
Is it legal to scrape IMDb?
Option 1: DIY in Python (and why it breaks)
IMDb's pages are server-rendered from an embedded JSON blob rather than clean semantic HTML, so a DIY scraper parses that blob out of the page:
import requests
from bs4 import BeautifulSoup
resp = requests.get(
"https://www.imdb.com/title/tt1375666/",
headers={"User-Agent": "Mozilla/5.0 (compatible; research-bot/1.0)"},
)
soup = BeautifulSoup(resp.text, "html.parser")
# Title, rating, and genres live inside a __NEXT_DATA__ / structured-data
# JSON blob, not selectable markup — you parse JSON out of a <script> tag
It demos and then breaks:
- The ToS is explicit, and it's enforced. Unlike several platforms in this series, IMDb's Conditions of Use and
robots.txtdon't just restrict a login-walled feature — they name data mining and screen scraping directly, so real risk (not just a theoretical one) starts here. - No stable markup. The page is Next.js-rendered with data embedded as JSON in a script tag; the shape shifts with redesigns and A/B tests, breaking your parser without warning.
- Anti-bot at Amazon scale. IMDb sits behind Amazon-grade infrastructure — datacenter IPs and naive clients get rate-limited or blocked quickly.
- Everything paginates separately. Full cast and crew, reviews, episodes-by-season, and awards each live on their own paginated sub-page — one page load never gets you a whole title.
Option 2: No-code tools and free datasets
IMDb publishes its own Non-Commercial Datasets — daily-refreshed TSV files at datasets.imdbws.com covering titles, names, ratings, and crew. They're the honest first stop for offline, personal batch work, but the license is personal and non-commercial only, and the files skip plot summaries, reviews, and images entirely — so anything commercial, or needing those fields, has to go elsewhere. Marketplace scraper actors fill some of that gap for one-off pulls, but they're awkward in a pipeline and carry the same ToS exposure as DIY.
Option 3: A structured IMDb API
For a repeatable, permission-scoped workflow, an IMDb scraping API returns normalized JSON with no page parsing to maintain. Search a title or person:
curl "https://api.crawlora.net/api/v1/imdb/search?query=inception" \
-H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"query": "inception",
"limit": 10,
"results": [
{ "id": "tt1375666", "title": "Inception", "url": "https://www.imdb.com/title/tt1375666/", "year": "2010" }
]
}
}
Then resolve the id and pull detail, credits, and reviews in Python:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/imdb"
hits = requests.get(f"{base}/search", headers=h, params={"query": "inception"}).json()["data"]["results"]
title_id = hits[0]["id"]
title = requests.get(f"{base}/title", headers=h, params={"id": title_id}).json()["data"]
credits = requests.get(f"{base}/title/credits", headers=h, params={"id": title_id}).json()["data"]
reviews = requests.get(f"{base}/title/reviews", headers=h, params={"id": title_id, "limit": 20}).json()["data"]
Title detail is normalized JSON (real fields — check the docs):
{
"code": 200,
"msg": "OK",
"data": {
"id": "tt1375666",
"title": "Inception",
"year": "2010",
"runtime_minutes": 148,
"genres": ["Action", "Adventure", "Sci-Fi"],
"rating_value": 8.8,
"public_page_derived": true
}
}
Credits return by section (Cast, Directed by, Writing Credits, …), each row carrying name, url, and — for cast — character:
{
"data": {
"id": "tt1375666",
"sections": [
{ "name": "Cast", "slug": "cast", "credits": [
{ "name": "Leonardo DiCaprio", "url": "https://www.imdb.com/name/nm0000138/", "character": "Dom Cobb" }
] }
]
}
}
People work the same way: /imdb/name by id (nm0634240) returns bio, birth info, professions, and known-for titles; /imdb/name/credits returns their filmography. Awards (/imdb/title/awards), episodes by season (/imdb/title/episodes), keywords, technical specs, and parental guide all follow the same id-in, normalized-JSON-out shape. Store one row per title (or per review, per credit) and re-run on a schedule.
What you can collect
Public title and person metadata: search results (id, title, url, year); title detail (rating, genre, runtime, plot, release date, cast, directors); full cast and crew by section; user reviews (title, rating, helpful votes, spoiler flag); awards; episodes by season; keywords, technical specs, parental guide, trivia, goofs, quotes, and filming locations; company credits; and person profiles (bio, birth info, professions, known-for, filmography). Public metadata only.
Limitations and common challenges
- The most legally cautious guide in this series. IMDb's terms are explicit about prohibiting automated collection — scope any project to public reference fields, never bulk-republish full review text, and get written permission for large-scale commercial use.
- Brittle, JSON-in-HTML markup. DIY parsing needs constant upkeep as IMDb's rendering changes.
- Anti-bot at Amazon's scale. Expect rate-limiting and blocking on naive or datacenter-IP requests.
- Per-title fan-out. Reviews, episodes, and full credits each paginate separately, so a complete title record means several calls, not one.
- Public data only. This collects what IMDb already shows publicly — never a way around a login wall or a way to build a competing catalog product.
Where this gets used
- Catalog enrichment — attach canonical title, cast, and rating data to a media product.
- Recommendation engines — power "similar titles" and genre-based discovery.
- Reception research — track rating and review trends for a title over time.
- Talent tracking — follow a director's or actor's filmography and awards.
Sources
Start collecting
Try it first, free: run any public URL through the Free Web Scraper, or check whether a site blocks bots with the Anti-Bot Checker — no signup.
Test the search, title, and credits endpoints in the Playground, check the schema in the API docs, and review pricing. IMDb tells you what a title is, who made it, and how it's rated; JustWatch tells you where it's actually streaming — pair the two for a full "what's good and where can I watch it" pipeline. Curious whether anyone's actually searching for a title? How to scrape Google Trends pairs rating data with real search demand. On the reception side, how to scrape Trustpilot reviews covers the same rating/review pattern for businesses instead of titles. On the money side, how to scrape Box Office Mojo shares the same tt-prefixed title ids and adds the gross and chart data IMDb itself doesn't track. See also how to choose a web scraping API and is web scraping legal.
Part of our how-to-scrape guide series — every platform we cover, in one index.
Frequently asked questions
Does IMDb have an official API?
No self-serve one. IMDb's official offering is enterprise B2B data licensing (available via AWS Data Exchange, reportedly with a six-figure minimum), and its free Non-Commercial Datasets are personal/non-commercial-only bulk TSV files that skip plot, reviews, and images — a structured API is the practical route for commercial or field-rich use.
Is scraping IMDb legal?
IMDb is stricter than most platforms in this series: its Conditions of Use and robots.txt explicitly prohibit data mining and screen scraping without written consent. Treat this as public reference data only — titles, credited names, aggregate ratings, and the review text IMDb displays publicly — never bulk-republish full reviews, and get written permission from IMDb's licensing team for large-scale commercial use. Not legal advice.
How do I get a movie or show's cast and crew?
Search or already hold the IMDb title id (e.g. tt1375666), then call /imdb/title/credits. It returns sections — Cast, Directed by, Writing Credits, and more — each with name, profile url, and, for cast, the character played.
Can I get IMDb ratings and review text?
Yes. /imdb/title returns the aggregate rating_value and rating_count for a title; /imdb/title/reviews returns individual public review rows (title, rating, helpful votes, spoiler flag). Public reviews only — this doesn't return private account activity.
Can I look up actors and directors, not just titles?
Yes. /imdb/name by person id (e.g. nm0634240) returns bio, birth info, professions, and known-for titles; /imdb/name/credits returns their full filmography.
Can I track episodes and seasons for a TV show?
Yes — /imdb/title/episodes accepts a season parameter and paginates per season, so pull one season at a time to build a full episode list for a series.
Are IMDb's free Non-Commercial Datasets enough instead of an API?
For personal, offline batch work on core fields (title, year, genre, basic ratings), yes. But the license bars commercial use, and the files omit plot, reviews, images, and anything more current than the daily refresh — a live API covers both gaps.