Tony Wang4 min readHow to Scrape JustWatch in 2026 (API & Python)
Scrape JustWatch streaming availability in 2026 — where-to-watch offers, titles, and providers across 120+ countries — DIY, no-code, or a structured API.
The fastest way to scrape JustWatch in 2026 is to call a structured API that returns normalized JSON — where-to-watch offers, title detail, providers, and discovery across 120+ countries — instead of reverse-engineering JustWatch's GraphQL API yourself. JustWatch is the largest "where to watch" database, but it has no self-serve public API and the common unofficial library forbids commercial use. This guide covers all three approaches, what each returns, where each breaks, and the legal basics.
Why scrape JustWatch?
JustWatch maps which titles are streaming where, which powers:
- Streaming availability tracking — know which services carry a title, in which country, at what price.
- "Where to watch" features — add availability data to a media app or guide.
- Catalog & window analysis — track when titles arrive and leave services.
- Competitive OTT research — compare provider catalogs across markets.
Is it legal to scrape JustWatch?
Option 1: DIY in Python (and why it breaks)
JustWatch's site runs on a public GraphQL API, so a DIY scraper replicates those queries:
import requests
# JustWatch serves data from a GraphQL endpoint; you replicate its persisted queries
resp = requests.post(
"https://apis.justwatch.com/graphql",
json={"operationName": "GetSearchTitles", "variables": {"country": "US"}, "query": "..."},
)
It demos and then breaks:
- No self-serve official API. JustWatch's official offering is a partnership/enterprise product — custom data reports and widgets arranged via
[email protected]— not a public key you can sign up for. - The unofficial library is non-commercial. The popular
JustWatchAPIPython library wraps the GraphQL endpoint but its terms prohibit commercial use, so it's off-limits for a product. - GraphQL drift. JustWatch uses persisted/hashed GraphQL queries that change, so replicated queries break when the hashes or schema shift.
- Per-country fan-out. Availability is per country — to know where a title streams worldwide you query each of 120+ locales and stitch the results, all while staying under rate limits.
Option 2: No-code tools
Marketplace "JustWatch availability" actors export CSV/JSON and suit one-off pulls, but they're awkward in an in-product pipeline and inherit the same GraphQL fragility.
Option 3: A structured JustWatch API
For repeatable workflows, a JustWatch scraping API returns normalized JSON with no GraphQL to maintain. Search a title:
curl "https://api.crawlora.net/api/v1/justwatch/search?query=inception&country=US" \
-H "x-api-key: $CRAWLORA_API_KEY"
Then resolve the title id and pull its where-to-watch offers in Python:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/justwatch"
# search returns a JustWatch title id (e.g. tm92641)
hits = requests.get(f"{base}/search", headers=h, params={"query": "inception", "country": "US"}).json()["data"]["results"]
title_id = hits[0]["id"]
offers = requests.get(f"{base}/title/offers", headers=h, params={"id": title_id, "countries": "US,GB"}).json()["data"]
providers = requests.get(f"{base}/providers", headers=h, params={"country": "US"}).json()["data"]
A search response is normalized JSON (real fields):
{
"code": 200,
"msg": "OK",
"data": {
"query": "inception",
"country": "US",
"language": "en",
"results": [
{ "id": "tm92641", "object_type": "MOVIE", "title": "Inception", "year": 2010, "path": "/us/movie/inception", "url": "https://www.justwatch.com/us/movie/inception", "poster_url": "https://images.justwatch.com/poster/302449148/s718/inception.jpg" }
]
}
}
Offers come back per country (fields are illustrative — check the docs): each carries a provider, a monetization_type (flatrate/rent/buy/free/ads), a presentation format (SD/HD/4K), a price, and a deeplink. Use /justwatch/providers to list services, and /justwatch/discover, /provider/titles, /genre/titles, or /popular to browse catalogs. Store one row per offer and re-pull on a schedule.
What you can collect
Public availability metadata: search results (id, type MOVIE/SHOW, title, year, path, url, poster); title detail, media, and similar titles; where-to-watch offers per country (provider, monetization type, format, price, deeplink); the provider list; and discovery by provider, genre, monetization type, or popularity. Public availability data only.
Limitations and common challenges
- No self-serve official API. JustWatch's official data is partnership/enterprise only, and the unofficial Python library is non-commercial — so a commercial product means scraping the public data yourself or via a structured API.
- Availability is per country. Offers are scoped to a country, so worldwide coverage means querying each market you care about and stitching the results.
- Prices and windows change fast. Titles arrive and leave services and prices shift, so re-pull on a schedule rather than trusting a one-time snapshot.
- Public data, not access. This tells you where a title is available; it never circumvents a provider's paywall or DRM.
Where this gets used
- Streaming availability tracking — monitor where titles stream, by country and price.
- "Where to watch" features — power availability data in a media app or guide.
- OTT catalog research — compare provider libraries and release windows across markets.
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 and offers endpoints in the Playground, check the schema in the API docs, and review pricing. Availability answers where a title streams; two neighbouring datasets answer whether anyone is asking: how to scrape Google Trends shows the search demand for a title against the providers that actually carry it, and how to scrape App Store reviews covers how the streaming apps themselves are rated — catalog depth and app quality are the two halves of an OTT comparison. See also how to choose a web scraping API and is web scraping legal — or see what JustWatch availability data reveals in our streaming fragmentation study.
Part of our how-to-scrape guide series — every platform we cover, in one index.
Frequently asked questions
Does JustWatch have an official API?
Not a self-serve one. JustWatch's official offering is a partnership/enterprise product — custom data reports, widgets, and dashboards arranged via [email protected] — not a public key you can sign up for. The popular unofficial JustWatch Python library wraps its GraphQL endpoint but prohibits commercial use, so public scraping (or a structured API) is the practical route for a product.
Can I scrape streaming availability without getting blocked?
JustWatch serves data from a public GraphQL API with persisted queries that change, plus anti-bot and per-country fan-out, so a DIY scraper needs realistic headers, proxies, and upkeep. A structured API handles the GraphQL and proxying behind one key for public availability data.
How do I get where-to-watch offers for a title?
Search the title to get its JustWatch id (e.g. tm92641), then call /justwatch/title/offers with that id and the countries you care about. Each offer carries a provider, monetization type (flatrate/rent/buy/free/ads), a format (SD/HD/4K), a price, and a deeplink.
Why is availability per country?
Streaming rights differ by market, so JustWatch scopes offers to a country. To know where a title streams worldwide you query each country you care about and stitch the results — JustWatch covers 120+ countries.
What JustWatch data can I collect?
Public availability metadata: search results (id, type, title, year, poster), title detail/media/similar, where-to-watch offers per country, the provider list, and discovery by provider, genre, monetization type, or popularity.
Is scraping JustWatch legal?
Collecting public availability facts is generally lower-risk public-web scraping, but JustWatch's terms restrict automated access, the unofficial library is non-commercial, and you must never use this to circumvent a provider's paywall or DRM. Public availability data only. Not legal advice.