Where can I watch this, and in which country
The Streaming Availability API returns where-to-watch data as clean JSON.
12 active endpoints, on 0, 1 and 2 credit tiers.
- POST/streaming/v1/search
- POST/streaming/v1/browse
- POST/streaming/v1/trending
- POST/streaming/v1/title
- POST/streaming/v1/availability
- POST/streaming/v1/new
- POST/streaming/v1/countries
- +5 more
What Streaming Availability endpoints does ReefAPI ship?
12 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Streaming Availability API
3 of 12 endpoints, ready to run
Every offer for a title across the countries you name: provider, monetisation type, quality, price and currency, and a direct link to the title on that service.
{ "ok": true, "meta": { "api": "streaming", "endpoint": "availability", "mode": "live", "latency_ms": 1796.4, "record_count": 111, "cache_hit": false }, "data": { "id": "tm92641", "countries": { "DE": [ { "provider": "RTL+", "provider_id": 2750, "provider_technical_name": "rtlplus", "type": "FLATRATE", "quality": "SD", "price": null, "price_value": null, "currency": "EUR", "url": "https://plus.rtl.de/video-tv/filme/inception-173222", "element_count": 0, "available_to": null, "icon": "/icon/347709926/s100/rtlplus.png" }, { "provider": "RTL+", "provider_id": 2750, "provider_technical_name": "rtlplus", "type": "FLATRATE", "quality": "HD", "price": null, "price_value": null, "currency": "EUR", "url": "https://plus.rtl.de/video-tv/filme/inception-173222", "element_count": 0, "available_to": null, "icon": "/icon/347709926/s100/rtlplus.png" }, { "provider": "RTL+ Max Amazon Channel", "provider_id": 2578, "provider_technical_name": "amazonrtl", "type": "FLATRATE", "quality": "HD", "price": null, "price_value": null, "currency": "EUR", "url": "https://watch.amazon.de/detail?gti=amzn1.dv.gti.04a9f72c-f9c8-c4d1-f97b-6d7ad986a51f", "element_count": 0, "available_to": null, "icon": "/icon/338149088/s100/amazonrtl.png" } ], "GB": [ { "provider": "HBO Max Amazon Channel", "provider_id": 1825, "provider_technical_name": "amazonhbomax", "type": "FLATRATE", "quality": "HD", "price": null, "price_value": null, "currency": "GBP", "url": "https://watch.amazon.co.uk/detail?gti=amzn1.dv.gti.04a9f72c-f9c8-c4d1-f97b-6d7ad986a51f", "element_count": 0, "available_to": "2026-12-31", "icon": "/icon/343788557/s100/amazonhbomax.png" }, { "provider": "HBO Max Amazon Channel", "provider_id": 1825, "provider_technical_name": "amazonhbomax", "type": "FLATRATE", "quality": "4K", "price": null, "price_value": null, "currency": "GBP", "url": "https://watch.amazon.co.uk/detail?gti=amzn1.dv.gti.04a9f72c-f9c8-c4d1-f97b-6d7ad986a51f", "element_count": 0, "available_to": "2026-12-31", "icon": "/icon/343788557/s100/amazonhbomax.png" }, { "provider": "HBO Max Amazon Channel", "provider_id": 1825, "provider_technical_name": "amazonhbomax", "type": "FLATRATE", "quality": "SD", "price": null, "price_value": null, "currency": "GBP", "url": "https://watch.amazon.co.uk/detail?gti=amzn1.dv.gti.04a9f72c-f9c8-c4d1-f97b-6d7ad986a51f", "element_count": 0, "available_to": "2026-12-31", "icon": "/icon/343788557/s100/amazonhbomax.png" } ], "US": [ { "provider": "fuboTV", "provider_id": 257, "provider_technical_name": "fubotv", "type": "FLATRATE", "quality": "SD", "price": null, "price_value": null, "currency": "USD", "url": "https://www.fubo.tv/welcome/program/MV002624410000?irmp=1206980&irad=599309", "element_count": 0, "available_to": "2026-08-31", "icon": "/icon/316727345/s100/fubotv.png" }, { "provider": "fuboTV", "provider_id": 257, "provider_technical_name": "fubotv", "type": "FLATRATE", "quality": "HD", "price": null, "price_value": null, "currency": "USD", "url": "https://www.fubo.tv/welcome/program/MV002624410000?irmp=1206980&irad=599309", "element_count": 0, "available_to": "2026-08-31", "icon": "/icon/316727345/s100/fubotv.png" }, { "provider": "MGM+ Amazon Channel", "provider_id": 583, "provider_technical_name": "amazonepix", "type": "FLATRATE", "quality": "SD", "price": null, "price_value": null, "currency": "USD", "url": "https://watch.amazon.com/detail?gti=amzn1.dv.gti.178a7a3d-a6e9-4d84-adbf-e373c301dd58", "element_count": 0, "available_to": "2026-09-01", "icon": "/icon/302467404/s100/amazonepix.png" } ] } } }
How the Streaming Availability API works
Streaming Availability is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 184 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Answering 'is it on anything I already pay for'
The question is never just where a film streams. It is where it streams in one country, on a subscription rather than a rental, and at what price if not.
{"query": "Inception", "countries": ["US", "GB", "DE"]}Returns offers grouped by country, each with the monetisation type — a subscription offer and a rental are the same field with different values.
{"country": "DE"}The full provider list for a country, so you can map the offers against what a user actually subscribes to.
One title across three countries came back with over a hundred offers in a single call, each carrying its provider, type, quality and a deep link.
curl -X POST https://api.reefapi.com/streaming/v1/availability \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{}'{
"ok": true,
"data": { … },
"meta": {
"api": "streaming",
"endpoint": "availability",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}Provider codes the packages filter actually accepts
packages does not take the technical_name that the providers action returns. It takes JustWatch's short package codes, and an unrecognized code is silently ignored rather than rejected, so a wrong value looks like a working call over the entire catalog. Each code below was verified by browsing US movies and checking that every returned title carried an offer from that provider. The last column is the US movie count that code filtered down to.
| packages code | Provider every result carried | US movie catalog size |
|---|---|---|
| nfx | Netflix, including Netflix Standard with Ads | 4,570 |
| amp | Amazon Prime Video, including Prime Video with Ads | 22,777 |
| dnp | Disney Plus | 1,405 |
| hlu | Hulu | 1,233 |
| mxx | HBO Max, including HBO Max Amazon Channel | 1,871 |
| pmp | Paramount Plus Essential and Premium | 811 |
| pct | Peacock Premium and Premium Plus | 873 |
| atp | Apple TV, the subscription service | 123 |
| itu | Apple TV Store, the rent and buy storefront | 49,456 |
| cru | Crunchyroll | 252 |
| any unrecognized code | no filter is applied at all | 162,472, the unfiltered total |
packages filters which titles come back, not which offers hang off them. A browse restricted to nfx still returns each title's full offer list, Amazon and Apple TV Store rows included. The only way to confirm the filter took effect is to compare meta.total against the unfiltered 162,472.
What an offer actually says
Measured across several countries and a large provider list.
Rights are sold per territory, so the same title is on a subscription in one country, a rental in another and absent in a third. Asking for several countries in one call is the shape the question actually has, and the response keys the offers by country rather than flattening them.
Subscription, rental, purchase and free-with-ads are different answers to 'can I watch this tonight'. Each offer carries its type alongside the price and currency, so a filter for 'included in something I pay for' is one predicate rather than a heuristic.
Offers carry a deep link to the title on that provider, not to the provider's home page. That is the difference between a feature that answers a question and one that starts a search.
One country returned over three hundred services. Any interface that asks a user to pick their subscriptions needs that list to be per country and current, and it is its own endpoint rather than something to hardcode.
Catalogues change constantly as licensing windows open and close. An offer is true when it is read; nothing about it promises the title will still be there next month, which is exactly why this is a live lookup rather than a dataset.
What people build with Streaming Availability
The jobs this data is most often used for.
endpoints
credits per call
Streaming-guide apps call search and availability to show where a title streams.
Media apps use new and trending to surface what just landed on services.
Regional tools use countries to localize availability for a user.
What Streaming Availability data costs
The cheapest call here is 0 credits, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 184 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/streaming/v1/availability \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{}'import requests
r = requests.post(
"https://api.reefapi.com/streaming/v1/availability",
headers={"x-api-key": REEF_KEY},
json={},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Streaming Availability.
Get a free key →Why does packages with the value netflix return the whole catalog?▾
Because netflix is the technical_name from the providers action, not a packages code, and unrecognized package values are dropped instead of rejected. Measured side by side on US movies: packages nfx reported meta.total 4,570 and every row carried a Netflix offer, while packages netflix reported 162,472 and the first rows were Peacock and Amazon rentals. Both returned ok true. Compare meta.total against the unfiltered count before trusting a filtered feed.
Why is price null on a Netflix offer but a real number on a rental?▾
Subscription offers have no per-title price, so type FLATRATE comes back with price null and price_value null while currency is still filled in from the market. Rent and buy offers carry both: a measured RENT offer in the US returned price $3.99 and price_value 3.99, and the same film in Turkey returned price TRY 24.99 and price_value 24.99. Use price_value for arithmetic and price only for display, since its formatting follows the market.
Which countries are covered, and does the provider list change between them?▾
The countries action returns 147 ISO-2 markets and reports its source as a static market reference, so treat it as the list of markets you may ask for rather than a live health check. Mainland China is not in it. Provider coverage varies sharply by market: the providers action returned 347 entries for US and 72 for TR. Ask providers per country instead of assuming a service exists there.
Why does Prime Video have two different technical names?▾
JustWatch registers a service per market, so the same brand can carry a different id and technical_name in each. Prime Video came back as technical_name amazonprime with provider_id 9 in the US, and as amazonprimevideo with provider_id 119 in Turkey. Match offers on the human-readable provider field or on a per-country id map, never on a technical_name you hardcoded from one market.
What is a node id, and where do I get one?▾
Every JustWatch object has a prefixed node id: tm for a movie, ts for a show, tse for a season. Breaking Bad is ts4 and Inception is tm92641. Search and browse rows return it as id, with the numeric part repeated as object_id. title, availability, seasons and episodes all take it directly, which skips the resolve-by-name step and removes the risk of matching the wrong title.
Why do results from the new action have null ids and no offers?▾
new is a change feed, not a metadata feed. A measured leaving-soon call on Netflix US returned rows where external_ids.imdb, external_ids.tmdb, every scoring field, runtime and age_certification were all null and offers was an empty list. The only populated block is new_offer, which carries the provider, the type, available_to and date_created. Take the node id from the row and call title if you need the rest.
How current is availability, and what does available_to mean?▾
Offers are fetched at call time, so what you get is the state right then and there is no as-of timestamp in the response. available_to is the forward-looking part: the date an offer is scheduled to expire, null when no end has been announced. Measured examples: an HBO Max Amazon Channel offer in GB carried available_to 2026-12-31, and a Netflix US title on the leaving feed carried available_to 2026-08-31 with date_created 2026-08-03, the day that offer first appeared.
Do title fields change with the country I ask for?▾
Some do. Requesting ts4 with country GB returned path /uk/tv-series/breaking-bad and age_certification 18, while the US call returned the US path and TV-MA. Age ratings are per-market strings with no shared scale, and an empty string turns up where a title is unrated, so test for both the empty string and null. Title, year, runtime and the imdb and tmdb external ids stay the same across markets.
What is the Streaming Availability API?▾
Streaming Availability API is a ReefAPI endpoint group for streaming availability It returns live JSON through POST requests under /streaming/v1.
Is the Streaming Availability API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Streaming Availability calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Streaming Availability login or account?▾
No login to Streaming Availability is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Streaming Availability data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Streaming Availability API use?▾
Streaming Availability actions currently cost 1-2 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Streaming Availability from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call streaming actions with the same key, credit pool and JSON envelope used by normal REST requests.
25 Media, Film & Knowledge APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Streaming Availability, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 183 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-30.