Scrape IMDb or Use IMDb Datasets: Ratings, Cast and Reviews
For IMDb ratings, vote counts, titles and principal cast, start with IMDb's own non-commercial datasets: seven gzipped TSV files, refreshed daily, at no charge for personal and non-commercial use, with no review texts. Full cast lists, user reviews and any commercial use need IMDb's licensed data (sold through AWS Data Exchange, with a User Reviews add-on), because IMDb forbids robots and screen scraping without its written permission (Can I use IMDb data in my software?). Where you hold that permission, ProxyField's Web Scraping API is designed to fetch public IMDb pages for $0.50 per 1,000 successful results over plain HTTP, or $0.20 from 10,000 results in one purchase; it is in development, so access is through Contact sales. To run your own scraper, ProxyField residential proxies start with the Easy Trial: 1 GB for $2.95.
Through the sales team on our 24/7 live chat
| Fetch | Entry | Volume, from |
|---|---|---|
| HTTP | $0.50 | $0.20 |
| JS rendering | $2.00 | $1.00 |
Billed on successful results only.
IMDb datasets or scraping: which for ratings, cast and reviews?
Use the datasets for anything they hold, a licence for what they don't, and scraping only with IMDb's permission. IMDb's help page says that data not in its datasets "is not available for non-commercial usage" and that you "may not use data mining, robots, screen scraping, or similar" tools on its website (Can I use IMDb data in my software?).
Read moreShow less
| You need | IMDb non-commercial datasets | IMDb's licensed data (data.imdb.com) | Scraping the public pages |
|---|---|---|---|
| Ratings and vote counts | Yes: title.ratings.tsv.gz (averageRating, numVotes) | Yes: the "IMDb Ratings" product | Title page; only with IMDb's written permission |
| Principal cast and crew | Yes: title.principals.tsv.gz (category, job, characters); title.crew.tsv.gz (directors, writers) | Yes: "IMDb Essential Metadata" (title and name data) | /fullcredits; only with permission |
| Complete cast list | No: title.principals lists principal cast and crew, not every credit | Licence needed: the licensed metadata or the IMDb API (GraphQL) | /fullcredits; only with permission |
| User review texts | No | Licence needed: the "User Reviews" add-on dataset | /reviews; review texts are user content, so add copyright to the terms question |
| Commercial use | No: personal and non-commercial only | Yes, under IMDb's licence | Not without IMDb's written permission |
| Freshness | Refreshed daily | Updated daily | Each time you fetch |
| How you get it | Download from datasets.imdbws.com | AWS Data Exchange | Your scraper, or an API, with permission |
| Cost | No charge | Priced by IMDb on AWS Data Exchange | $0.50 per 1,000 pages (API design), $0.20 from 10,000 |
Decision rule:
-
Ratings, votes, titles, genres, runtimes or principal cast for a personal or non-commercial project: download the datasets and stop there.
-
Complete cast, review texts, or any commercial product: contact IMDb about licensing first.
-
Scraping IMDb pages: only with IMDb's express written permission, and then within the pace it sets. ProxyField's rule for every site is public pages only, and follow the site's terms (acceptable use).
In numbers: the datasets cost nothing for non-commercial use and refresh daily; IMDb's licensed products update daily and are priced on AWS Data Exchange; fetching pages through ProxyField's Web Scraping API is designed to cost $0.50 per 1,000 successful results, or $0.20 from 10,000, and only with IMDb's permission.
IMDb's dataset files and columns
IMDb publishes seven files at https://datasets.imdbws.com/. Each one is a gzipped, tab-separated UTF-8 file with a header row, and \N marks a missing value. Since March 18, 2024 the files have been backed by a new data source (IMDb non-commercial datasets).
| File | Columns | Use it for |
|---|---|---|
title.basics.tsv.gz | tconst, titleType, primaryTitle, originalTitle, isAdult, startYear, endYear, runtimeMinutes, genres | titles, years, runtimes, genres |
title.ratings.tsv.gz | tconst, averageRating, numVotes | ratings and vote counts |
title.principals.tsv.gz | tconst, ordering, nconst, category, job, characters | principal cast and crew, with characters |
title.crew.tsv.gz | tconst, directors, writers | directors and writers |
name.basics.tsv.gz | nconst, primaryName, birthYear, deathYear, primaryProfession, knownForTitles | people |
title.akas.tsv.gz | titleId, ordering, title, region, language, types, attributes, isOriginalTitle | local titles by country and language |
title.episode.tsv.gz | tconst, parentTconst, seasonNumber, episodeNumber | series episodes |
tconst is the title ID that starts with tt and nconst the person ID that starts with nm; they join the files to each other and to IMDb's page URLs. This reads the rating of one title with Python's standard library:
import csv, gzip, urllib.request
urllib.request.urlretrieve("https://datasets.imdbws.com/title.ratings.tsv.gz", "title.ratings.tsv.gz")
with gzip.open("title.ratings.tsv.gz", "rt", encoding="utf-8") as f:
for row in csv.DictReader(f, delimiter="\t", quoting=csv.QUOTE_NONE):
if row["tconst"] == "tt0111161":
print(row["averageRating"], row["numVotes"])
breakIMDb pages and the data on them
Every movie, series and episode on IMDb has a tt title ID and every person an nm name ID, and each ID opens a family of pages. With IMDb's permission, the Web Scraping API is designed to fetch any of them and return the page; your code takes the fields out. ProxyField sells no separate IMDb API with pre-parsed fields.
| IMDb page | Example URL | What the page shows |
|---|---|---|
| Title page | imdb.com/title/tt0111161/ | Title, year, type, rating, vote count, genres, runtime, plot, director, writers, top cast, release date, poster |
| Full credits | imdb.com/title/tt0111161/fullcredits | Complete cast with characters, and crew by department |
| User reviews | imdb.com/title/tt0111161/reviews | Review title, text, rating, date, helpfulness votes |
| Ratings breakdown | imdb.com/title/tt0111161/ratings | Votes by star rating |
| Person page | imdb.com/name/nm0000151/ | Name, roles, known-for titles, biography summary |
| Charts | imdb.com/chart/top/, imdb.com/chart/moviemeter/ | Top 250 by rating, most popular titles right now |
| Advanced search | imdb.com/search/title/?genres=comedy&title_type=feature | Titles filtered by genre, type, year, rating or votes |
A title page carries its key facts as structured data in a script tag of type application/ld+json (name, rating, vote count, genres, director, actors), which changes far less often than the visible markup. Lists that grow when a visitor clicks "more", such as long review threads, need JS rendering or the next batch's URL.
Titles and release dates can differ by the visitor's country and language. ProxyField has 61.2M+ residential IPs in the United States and 16.6M+ in the United Kingdom; the API's country parameter takes the proxy pool's 195+ countries as two-letter codes such as us.
What you send
The API's design: a POST to https://api.proxyfield.io/v1/scrape with an Authorization: Bearer <api_key> header and a JSON body of url, render (false for plain HTTP, true for JS rendering), country and output (html, markdown, text or json). Parameter reference: API documentation.
# The request as designed (in development; access through Contact sales)
curl https://api.proxyfield.io/v1/scrape \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.imdb.com/title/tt0111161/", "render": false, "country": "us", "output": "json"}'Example response (shortened; content is the page's HTML, with the structured data inside):
{
"metadata": {"id": "req_de07941f46c4223d", "api": "web_scrape", "status": "success", "billed": true},
"status_code": 200,
"final_url": "https://www.imdb.com/title/tt0111161/",
"content_type": "text/html; charset=utf-8",
"content": "<!DOCTYPE html><html lang=\"en-US\">…<script type=\"application/ld+json\">…</html>"
}Pricing: $0.50 per 1,000 IMDb pages, $0.20 from 10,000
You pay only for successful results, and every response says whether it was billed. Not billed: error responses, blocked and timed-out requests, and our internal retries. Billed: a page the target answered, including a 404 or 410 and a sign-in page served with a 200 status. Up to 20 concurrent requests per account, and batches of up to 1,000 URLs. The API is paid from the same crypto balance as proxies, which never expires; there is no subscription or monthly fee. For access, contact sales through the sales team on our 24/7 live chat.
| Mode | Price per 1,000 successful results | From 10,000 results in one purchase |
|---|---|---|
| Plain HTTP | $0.50 | $0.20 |
| JS rendering | $2.00 | $1.00 |
| Workload | Pages | At $0.50 | At $0.20 |
|---|---|---|---|
| 5,000 titles, rating and votes, daily (30-day month) | 150,000 | $75 | $30 |
| 50,000 title pages and their full credits, once | 100,000 | $50 | $20 |
| 1,000 titles, first review page, monthly | 1,000 | $0.50 | – |
For ratings alone, the daily title.ratings file is the cheaper route when your use is non-commercial. All prices: pricing.
Through the sales team on our 24/7 live chat
Run your own IMDb scraper with Python
With IMDb's permission, this script fetches one title page through a ProxyField residential IP and prints the fields from its structured data. It needs pip install requests beautifulsoup4.
import json
import requests
from bs4 import BeautifulSoup
proxy = "http://<login>-country-us-city-new_york:<password>@gate.proxyfield.io:7000"
url = "https://www.imdb.com/title/tt0111161/"
resp = requests.get(url, proxies={"http": proxy, "https": proxy},
headers={"User-Agent": "Mozilla/5.0", "Accept-Language": "en-US"},
timeout=30)
soup = BeautifulSoup(resp.text, "html.parser")
tag = soup.find("script", type="application/ld+json")
if resp.status_code != 200 or tag is None:
print("Refused or changed page:", resp.status_code)
else:
d = json.loads(tag.string)
r = d.get("aggregateRating", {})
print(d.get("name"), d.get("datePublished"), r.get("ratingValue"), r.get("ratingCount"))
print([a.get("name") for a in d.get("actor", [])])-
Take the
ttIDs from the datasets (title.basics) instead of crawling charts and search. -
Fetch only the pages the datasets lack, a second or two apart per IP, or at the pace IMDb sets.
-
Read the structured data first; fall back to the page for fields it lacks.
-
Store each record under its
ttID with the date of the check.
The username format is <login>-country-us-city-new_york; other countries take their two-letter code, as in -country-gb, and -session-<id>-ttl-<seconds> (30 to 129,600 seconds, 20 minutes by default) keeps one IP. Residential proxies cost $2.95/GB for 1 GB down to $1.95/GB from 1,000 GB, with no subscription; the traffic never expires, and all purchases are final. More on Python.
When IMDb refuses a request
A request without browser headers looks automated, and a site may answer it with a 403 or an empty page; many requests from one IP get slowed down. If IMDb refuses your requests, treat it as an answer: stop, and check that your use is covered by the datasets or IMDb's permission before you continue.
What people use IMDb data for
- Film and TV research: ratings, genres and cast across decades (the datasets cover most of it).
- Recommendation systems and data science projects built on ratings and credits.
- Release and popularity tracking: vote counts over time from the daily ratings file.
- Catalog enrichment: matching a streaming or retail catalog to IMDb IDs.
IMDb's conditions of use and the law
IMDb's conditions of use and its help page forbid data mining, robots and screen scraping on its website without its express written permission, so scraping IMDb without that permission breaches its terms. Ratings, years and credits are facts, while plot summaries, posters and review texts can be protected by copyright, so keep facts and short excerpts and do not republish content. For the wider question, read Is Web Scraping Legal? US, EU and UK Rules (2026). This is not legal advice.
More scrapers
- Review scraper API: public review pages from other sites.
- YouTube scraper: trailers, channels and comments on the same Web Scraping API.
- Google SERP API: Google results for film and series queries, $1.20 per 1,000 successful results, $0.80 from 10,000.
- All scrapers: scrapers.
Scrape IMDb or Use IMDb Datasets FAQ
24/7 support by live chat, including help with setup and integration.
How much does it cost to scrape IMDb?
ProxyField's Web Scraping API is priced at $0.50 per 1,000 successful IMDb pages over plain HTTP, $0.20 from 10,000 results in one purchase, and $2.00 per 1,000 with JS rendering; it is in development, through Contact sales. Checking 5,000 titles daily is 150,000 pages a month: $75, or $30 at the volume price, while IMDb's daily ratings file costs nothing for non-commercial use.
Should I use IMDb's downloadable datasets or scrape IMDb pages to get movie ratings, cast lists and user reviews?
Use the datasets for ratings and principal cast: title.ratings.tsv.gz has averageRating and numVotes, and title.principals.tsv.gz the principal cast, refreshed daily, for personal and non-commercial use. They have no review texts and not every credit, and IMDb says data outside them is not available for non-commercial use, so complete cast lists and reviews need IMDb's licensed data (the IMDb API or the User Reviews add-on on AWS Data Exchange). Scraping IMDb's pages is forbidden by its conditions of use without its written permission.
Is there an official IMDb API?
Yes, a licensed one: the IMDb API, a GraphQL API sold only through AWS Data Exchange, next to licensed datasets such as IMDb Ratings, IMDb Essential Metadata and a User Reviews add-on (data.imdb.com). For personal and non-commercial use, IMDb also publishes seven dataset files, refreshed daily, at no charge.
What's in IMDb's non-commercial datasets?
Seven gzipped TSV files: title.basics, title.ratings, title.principals, title.crew, title.akas, title.episode and name.basics. They hold titles, years, genres, runtimes, ratings, vote counts, principal cast and crew, local titles, episodes and people, joined by tt and nm IDs.
How do I scrape IMDb data?
First check whether the datasets hold your fields; if they do, download them instead. With IMDb's permission, collect the tt IDs, fetch each title page with browser headers and read its application/ld+json block, which holds name, rating, votes, genres, director and actors.
What data can I get from IMDb?
From the datasets: titles, years, runtimes, genres, ratings, vote counts, principal cast and crew, episodes and people. The pages also show plots, full credits, charts and user reviews, which need IMDb's licence or permission.
What are the main IMDb page types?
Title pages, full credits, user reviews, ratings breakdowns, person pages, charts such as the Top 250, and advanced search results. Each hangs off a stable tt or nm ID, the same IDs the datasets use.
Which IMDb pages hold movie details, reviews and cast data?
The title page for details, /fullcredits for the complete cast and crew, and /reviews for user reviews. The datasets already cover the title page's rating, votes, genres and principal cast.
How do I scrape IMDb reviews?
The datasets contain no review texts, and reviews are user content, so start with IMDb's licensed User Reviews add-on. With permission, fetch imdb.com/title/<tt-id>/reviews; threads that load more on click need JS rendering, at $2.00 per 1,000 pages on the API's design.
What's the best Python library for scraping IMDb?
ProxyField's examples on this page use requests with BeautifulSoup and the json module for title pages you may fetch, and Python's gzip and csv modules for the 7 dataset files. pandas reads the TSV files too, and Playwright is needed only for lists that load on click.
Show 10 more questionsShow fewer questions
Is IMDb still server-rendered enough for BeautifulSoup scraping?
Title pages carry a structured data block in the HTML that BeautifulSoup can read, so test a sample first. Long review threads and advanced search results load further items with scripts, which BeautifulSoup alone does not run.
Why do Python requests get blocked on IMDb?
A request with the library's default user agent and no browser headers looks automated, and IMDb's conditions forbid robots without permission. If IMDb refuses your requests, check that your use is covered by the datasets or IMDb's permission before you continue.
What's the rate limit for scraping IMDb?
IMDb grants no scraping allowance: its conditions forbid robots without its written permission, so the pace is whatever IMDb agrees to. Without permission, the daily dataset files are the route for bulk data.
Do I need an account to get IMDb data?
No for the datasets: they download from datasets.imdbws.com without signing in. A scraper should never sign in, and lists or ratings tied to an account are not public data.
Can I get IMDb data for a specific country?
Yes: title.akas lists each title's local names by region and language. Release dates and titles on the pages can differ by the visitor's country, and ProxyField residential proxies target country, region and city across 412M+ IPs in 195+ countries.
How do I get structured JSON from IMDb?
Convert the dataset TSV rows to JSON, one record per tt ID, which needs no scraping. On a page you may fetch, the application/ld+json block is already JSON with name, rating, votes, genres, director and actors.
Which programming languages can I use to get IMDb data?
Any language that reads gzip and tab-separated files handles the datasets: Python, Node.js, Go, Java, PHP or Ruby. A scraping API is called the same way from each.
Can I try an IMDb scraper before paying for volume?
For the API, contact sales with the pages and volume you need; you are billed only for successful results. To test your own scraper, start with the Easy Trial: 1 GB of residential traffic for $2.95, with no subscription, and the traffic never expires.
What does IMDb's robots.txt allow?
IMDb's robots.txt at imdb.com/robots.txt lists the paths closed to crawlers; read it and leave those paths alone. It is separate from the conditions of use, which forbid scraping without IMDb's written permission whatever robots.txt allows.
Is it legal to scrape IMDb?
IMDb's conditions of use forbid screen scraping without its express written permission, so scraping breaches its terms; whether it breaks a law depends on what you collect and how you use it. Ratings, years and credits are facts, while plots, posters and review texts can be protected by copyright; this is not legal advice.
Related pages
Collect IMDb or Use IMDb Datasets pages with the Web Scraping API
Billed on successful results only. Contact sales for the Web Scraping API and the volume you need, or run your own scraper on residential proxies. 24/7 live chat helps with setup and integration.