# 🍿 Netflix Search Scraper (`citrine_venus/netflix-search-scraper`) Actor

Netflix Search Scraper extracts Netflix movies and series with IMDb ratings, votes, genres, cast, episodes, posters, plot details, and full country-by-country streaming availability, including added and expiry dates. Perfect for streaming research, licensing, and AI pipelines.

- **URL**: https://apify.com/citrine\_venus/netflix-search-scraper.md
- **Developed by:** [Data Minds](https://apify.com/citrine_venus) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 🍿 Netflix Search Scraper — Movies, Series, IMDb Ratings & Country Availability

**Netflix Search Scraper** is a production-grade [Apify Actor](https://docs.apify.com/platform/actors) for **Netflix catalogue data extraction** — no Netflix account, login or API key needed. Type a search term (or paste a title link) and it returns **movies and series with IMDb ratings, votes, awards and plot, genres, cast & crew, season/episode breakdowns, posters and artwork**, plus the feature nobody else gives you: **full region-by-region streaming availability with added and expiry dates** — streamed to your Apify **Dataset** in real time.

> 💡 **Need a custom version, private integration, or a tailored pipeline?** Email **<hello.dataminds@gmail.com>**.

Built for **streaming analysts**, **content acquisition & licensing teams**, **media researchers**, **film/TV databases and recommendation apps**, **market-entry research** and **AI/LLM data pipelines** — anyone who needs **clean, structured Netflix catalogue data** without an official API that does not exist.

***

### 📑 Table of contents

- [What is Netflix Search Scraper?](#-what-is-netflix-search-scraper)
- [Main features](#-main-features)
- [Who is this Actor for?](#-who-is-this-actor-for)
- [What the scraper does](#%EF%B8%8F-what-the-scraper-does)
- [Inputs it accepts](#-inputs-it-accepts)
- [Filtering configuration](#-filtering-configuration)
- [Output format (Dataset)](#-output-format-dataset)
- [Output fields reference](#-output-fields-reference)
- [Example output (JSON)](#-example-output-json)
- [Quick start](#-quick-start)
- [Input parameters reference](#%EF%B8%8F-input-parameters-reference)
- [Migrating from another Netflix scraper](#-migrating-from-another-netflix-scraper)
- [Reliability & anti-blocking](#%EF%B8%8F-reliability--anti-blocking)
- [Integrations & automation](#-integrations--automation)
- [Pricing & how to control cost](#-pricing--how-to-control-cost)
- [Frequently asked questions (FAQ)](#-frequently-asked-questions-faq)
- [Troubleshooting](#%EF%B8%8F-troubleshooting)
- [Help, support & custom builds](#-help-support--custom-builds)
- [Is scraping Netflix data legal?](#%EF%B8%8F-is-scraping-netflix-data-legal)
- [SEO keywords targeted](#-seo-keywords-targeted)

***

### 🍿 What is Netflix Search Scraper?

Netflix publishes no public API. Its own search box shows you a poster and a title and nothing else — no IMDb score, no cast list, no way to ask *"which countries is this actually streaming in, and when does it leave?"*, and no way to export anything.

This Actor closes that gap:

- **Search the whole Netflix catalogue by keyword** — `fashion`, `true crime`, `korean thriller` — each term searched separately, exactly like typing it into the search box.
- **Or paste links** — a Netflix search URL, or a link to one specific title. Bulk input and file upload supported.
- **Filter like a professional** — movies vs series, release-year range, IMDb rating range, region, audio language, subtitle language, sort order, and "leaving soon" / "added in the last 24 hours".
- **Get the full title record** — title, type, release year, runtime, synopsis, poster and large artwork, Netflix rating, maturity rating, and a direct `netflix.com/title/…` watch link.
- **Get the IMDb layer for free** — rating, vote count, metascore, genres, awards, full plot, IMDb id and link, plus Top-250 flags.
- **Get the availability layer nobody else exposes** — every region a title streams in, the date it was added there, its expiry date, the audio and subtitle languages carried in that region, and which seasons are available. Netflix's own pages never show this, and most scrapers cap it at the first handful of countries.
- **Get cast, crew, genres and full season/episode breakdowns** — opt-in, one toggle each.
- **Stream every finished title to your Dataset** — export to **JSON**, **CSV**, **Excel**, **XML**, or pull them through the [Apify API](https://docs.apify.com/api/v2).

If you have ever needed *"every Netflix thriller from 2018 onward rated 7+, with the countries it streams in and when it expires, as clean rows"* — this is the Actor.

***

### ✨ Main features

- 🔎 **Plain-text catalogue search** — type terms exactly as you would in Netflix's search box; each line is searched separately.
- 🔗 **Links accepted too** — Netflix search URLs and links to individual titles, in one bulk input field with file upload.
- 🎬 📺 **Movies and series** — collect both, or restrict to one with a single toggle.
- 🧰 **Rich filters** — release-year range, IMDb rating range, region + region-match mode (any / all / only these / not in these), audio language, subtitle language, sort order, and availability filters.
- 🌍 **Full region-by-region availability** — the headline feature: every streaming region with **added date**, **expiry date**, **audio & subtitle languages** and **season coverage**, not a truncated first-ten list.
- ⭐ **Complete IMDb layer** — rating, votes, metascore, genres, awards, full plot, IMDb link, Top-250 film and TV flags.
- 🎭 **Cast & crew** — actors, directors, writers and producers, grouped by role.
- 📺 **Season & episode breakdown** — every season with its episode list, numbers, titles, synopses and stills.
- 🖼️ **Posters & artwork** — thumbnail, poster and large artwork URLs for every title.
- 🚦 **Automatic network fallback** — direct ➜ datacenter ➜ residential, sticky after the first switch.
- 🔄 **Automatic source fallback** — if the main catalogue index is unreachable, the run switches to a backup index and still returns data instead of failing.
- 📦 **Live dataset writes** and **nine prebuilt table views** — Overview, Ratings & IMDb, Where it streams, Cast & genres, Seasons & episodes, Artwork & story, Links & ids, Source & quality, Errors.
- 📊 **Run summary** stored in the key-value store, with per-run totals.
- 🔁 **Drop-in compatible** with the input field names other Netflix scrapers on the Store use.

***

### 👥 Who is this Actor for?

- 📊 **Streaming & media analysts** — track what is on Netflix in each market and how it changes.
- 🤝 **Content acquisition and licensing teams** — see exactly which regions carry a title and when the licence expires.
- 🎬 **Film & TV databases, recommendation apps** — bulk-populate a catalogue with ratings, genres, cast and artwork.
- 🌍 **Market-entry and competitive research** — compare catalogue depth across 37 regions.
- 📰 **Journalists & researchers** — back a "what's leaving Netflix" story with real dates.
- 🤖 **AI / LLM pipelines** — clean, structured, typed rows ready for embedding or fine-tuning.
- 📈 **Growth & SEO teams** — build "what to watch" content from live catalogue data.

***

### ⚙️ What the scraper does

1. Reads your search terms and links, and works out what each one is asking for.
2. Runs every search against the catalogue with your filters applied.
3. Walks the result pages until your per-search limit is filled or the results run out.
4. For each title, collects the extra detail the search results never show — IMDb layer, region availability, genres, cast, episodes.
5. Writes each finished title to your Dataset **the moment it is ready**, so an aborted or migrated run keeps everything collected so far.
6. Reports what it could not find as explicit error rows, never as silent gaps.

***

### 📥 Inputs it accepts

| Input | Example | What you get |
|---|---|---|
| 🔎 **Search term** | `fashion` | Every matching movie and series, up to your limit |
| 🔎 **Search term** | `korean thriller` | Same, searched separately from the other terms |
| 🔗 **Netflix search URL** | `https://www.netflix.com/search?q=documentary` | Treated as a search for `documentary` |
| 🔗 **Title link** | a link that contains the title name | That one title, matched by name |
| 🔗 **Netflix title URL** | `https://www.netflix.com/title/81002370` | That one title, looked up by its catalogue id |

Search terms go in **🔎 Search terms**, links go in **🔗 Netflix / catalogue links**. Use either, or both — they run in the same pass.

***

### 🎯 Filtering configuration

| Filter | Values | Notes |
|---|---|---|
| 🎞️ Movies or series | both / movies / series | |
| 📅 Released from / until | any year | Enter them backwards and they are swapped for you |
| ⭐ Min / max IMDb rating | `0`–`10` | Titles with no rating are excluded when a minimum is set |
| 🌍 Regions | 37 Netflix regions | Leave empty to search every region |
| 🧩 Region match | any / all / only these / not in these | How several selected regions combine |
| 🗣️ Audio language | e.g. `English`, `Korean` | Pick from the list or type your own |
| 💬 Subtitle language | e.g. `Spanish` | Same |
| 🧩 Audio & subtitle match | either / both | |
| 🔃 Sort by | relevance, newest, rating, title, year, runtime … | |
| ⏳ Availability | everything / leaving soon / added in the last 24 hours | |

Every filter is optional. Leave one blank to skip it.

***

### 📤 Output format (Dataset)

Each title is written as **one Dataset row, the moment it is finished** — not batched at the end of the run. The Console shows **nine prebuilt views**, so you can jump straight to the section you need:

| View | What it shows |
|---|---|
| ✨ **Overview** | Poster, title, type, year, ratings, runtime, region count, watch link |
| ⭐ **Ratings & IMDb** | Every score, vote count, metascore, genres, awards, IMDb link |
| 🌍 **Where it streams** | Region count and the full per-region breakdown with dates |
| 🎭 **Cast & genres** | Genres plus actors, directors, writers and producers |
| 📺 **Seasons & episodes** | Series only — every season with its episode list |
| 🖼️ **Artwork & story** | Poster, artwork, synopsis, full IMDb plot, maturity rating |
| 🔗 **Links & ids** | Netflix id, IMDb id, and every link for the title |
| 🧭 **Source & quality** | Which search produced the row and how completely it was filled |
| ⚠️ **Errors** | Inputs that returned nothing, and why |

A **run summary** record is also written to the key-value store under `run-summary`.

***

### 📚 Output fields reference

| Field | Type | Description |
|---|---|---|
| `keyword` | string | The search term or title name this row came from |
| `source` | string | Which index answered — `catalogue` or `backup-index` |
| `id` | string / number | Record id in that index |
| `title` | string | Title name |
| `slug` | string | URL-friendly title slug |
| `type` | string | `movie` or `series` |
| `netflixId` | number | Netflix's own catalogue id |
| `netflixUrl` | string | Direct `netflix.com/title/…` watch link |
| `img` / `poster` | string | Artwork and poster URLs |
| `largeImage` | string | High-resolution artwork |
| `synopsis` | string | Short description |
| `avgrating` | number | Catalogue rating |
| `year` | number | Release year |
| `runtimeSeconds` / `runtimeMinutes` | number | Runtime in both units |
| `maturityRating` | string | Age/maturity label |
| `imdbid` / `imdbUrl` | string | IMDb id and link |
| `imdbRating` | number | IMDb rating |
| `imdbVotes` | number | IMDb vote count |
| `imdbMetascore` | string | Metascore |
| `imdbGenre` | string | IMDb genre string |
| `imdbAwards` | string | Awards summary |
| `imdbPlot` | string | Full IMDb plot |
| `tmdbScore` | number | TMDb score, when available |
| `top250` / `top250tv` | number | Top-250 film / TV flags |
| `genres` | array | Catalogue genre labels |
| `cast` | array | `{ role, names[] }` per role |
| `seasons` | array | `{ season, episodeCount, episodes[] }` |
| `availableCountries` | array | Per-region: code, name, added date, expiry date, audio, subtitles, seasons |
| `countryCount` | number | How many regions carry the title |
| `addedDate` | string | When the title was added |
| `lastCheckedDate` | string | When availability was last verified |
| `titledate` | string | Catalogue date for the title |
| `enrichmentStatus` | string | `complete` or `partial` |
| `enrichmentErrors` | array | Anything that could not be collected, spelled out |

> Fields the catalogue does not publish for a given title are simply absent from that row rather than filled in with a guess — check `enrichmentErrors` to see exactly what was missing and why.

***

### 🧾 Example output (JSON)

```json
{
  "keyword": "fashion",
  "source": "catalogue",
  "id": 4877,
  "title": "Emily in Paris",
  "slug": "emily-in-paris",
  "type": "series",
  "netflixId": 81037371,
  "netflixUrl": "https://www.netflix.com/title/81037371",
  "img": "https://occ-0-1433-1432.1.nflxso.net/dnm/api/v6/…jpg",
  "poster": "https://occ-0-1433-1432.1.nflxso.net/dnm/api/v6/…jpg",
  "synopsis": "After landing her dream job in Paris, Chicago marketing executive Emily embraces a new life while juggling work, friends and romance.",
  "avgrating": 6.9,
  "year": 2020,
  "runtimeSeconds": 1800,
  "runtimeMinutes": 30,
  "imdbid": "tt8962124",
  "imdbUrl": "https://www.imdb.com/title/tt8962124",
  "imdbRating": 6.9,
  "imdbVotes": 128441,
  "imdbMetascore": "60",
  "imdbGenre": "Comedy Drama Romance",
  "imdbAwards": "Nominated for 4 Primetime Emmys",
  "imdbPlot": "A young American woman moves to Paris for an unexpected job opportunity…",
  "maturityRating": "TV-MA",
  "largeImage": "https://occ-0-1433-1432.1.nflxso.net/dnm/api/v6/…jpg",
  "top250": 0,
  "top250tv": 0,
  "genres": ["TV Comedies", "Romantic TV Comedies"],
  "cast": [
    { "role": "Actor", "names": [{ "fullname": "Lily Collins" }, { "fullname": "Philippine Leroy-Beaulieu" }] },
    { "role": "Director", "names": [{ "fullname": "Andrew Fleming" }] }
  ],
  "seasons": [
    { "season": 1, "episodeCount": 10, "episodes": [{ "epnum": 1, "title": "Emily in Paris", "synopsis": "…" }] }
  ],
  "availableCountries": [
    {
      "countryId": 78,
      "code": "FR",
      "name": "France",
      "addedDate": "2020-10-02",
      "expiresDate": null,
      "audioLanguages": "English [Original],French",
      "subtitleLanguages": "English,French,Spanish",
      "seasonsAvailable": "S1(10), S2(10)"
    }
  ],
  "countryCount": 31,
  "addedDate": "2020-10-02",
  "lastCheckedDate": "2026-09-01",
  "titledate": "2020-10-02",
  "enrichmentErrors": [],
  "enrichmentStatus": "complete"
}
```

***

### 🚀 Quick start

#### Apify Console

1. Log in at [console.apify.com](https://console.apify.com) → **Actors**.
2. Open **Netflix Search Scraper**.
3. Type a search term under **🔎 Search terms** — or paste links under **🔗 Netflix / catalogue links**.
4. Set **📬 Max titles per search**, and add any filters you want.
5. Click **Start** and watch the run log — every title appears as it is saved.
6. Open the **Output** tab and pick a view, then export to JSON / CSV / XLSX.

#### API

```bash
curl -X POST "https://api.apify.com/v2/acts/<ACTOR_ID>/run-sync-get-dataset-items" \
     -H "Authorization: Bearer $APIFY_TOKEN" \
     -H "Content-Type: application/json" \
     -d '{
       "keywords": ["fashion"],
       "maxItems": 25,
       "type": "movie",
       "minRating": 6.5,
       "countries": ["US", "GB"]
     }'
```

#### Python client

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("<ACTOR_ID>").call(run_input={
    "keywords": ["true crime"],
    "maxItems": 50,
    "type": "series",
    "startYear": 2018,
    "includeCast": True,
    "includeEpisodes": True,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item.get("imdbRating"), item.get("countryCount"))
```

#### More input examples

**Everything leaving Netflix soon in the UK**

```json
{ "keywords": ["drama"], "countries": ["GB"], "filterBy": "Expiring", "maxItems": 100 }
```

**Highly-rated Korean series with English subtitles**

```json
{ "keywords": ["korean"], "type": "series", "minRating": 7.5, "subtitle": "English", "orderBy": "Rating" }
```

**One specific title, with everything switched on**

```json
{ "urls": [{ "url": "https://www.netflix.com/title/81037371" }], "includeCast": true, "includeEpisodes": true }
```

**A market-comparison run across three regions**

```json
{ "keywords": ["documentary"], "countries": ["US", "DE", "JP"], "countryMatch": "and", "maxItems": 200 }
```

***

### ⚙️ Input parameters reference

#### 🚀 Start here

| Field | Type | Default | Description |
|---|---|---|---|
| `urls` | array | `[]` | Netflix search URLs or links to individual titles. Bulk input & file upload |
| `keywords` | array | `[]` | Plain search terms, one per line |

#### 📬 How much to collect

| Field | Type | Default | Description |
|---|---|---|---|
| `maxItems` | integer | `50` | Max titles per search term (1–10 000) |
| `maxScanned` | integer | `20000` | Safety cap on how deep a single search digs |

#### 🎞️ Filter the catalogue

| Field | Type | Default | Description |
|---|---|---|---|
| `type` | string | `""` | `""` / `movie` / `series` |
| `startYear` / `endYear` | integer | – | Release-year range |
| `minRating` / `maxRating` | number | – | IMDb rating range, 0–10 |
| `orderBy` | string | `Relevance` | Sort order |
| `filterBy` | string | `""` | `""` / `Expiring` / `New last 24 hours` |

#### 🌍 Regions & languages

| Field | Type | Default | Description |
|---|---|---|---|
| `countries` | array | `[]` | Region codes; empty = all regions |
| `countryMatch` | string | `or` | `or` / `and` / `unique` / `notin` |
| `audio` / `subtitle` | string | `""` | Language names |
| `audioSubtitleMatch` | string | `or` | `or` / `and` |

#### 🧩 Extra details per title

| Field | Type | Default | Description |
|---|---|---|---|
| `includeImdbExtras` | boolean | `true` | IMDb rating, votes, metascore, awards, plot, artwork |
| `includeCountryAvailability` | boolean | `true` | Full per-region availability with dates |
| `includeGenres` | boolean | `true` | Catalogue genre labels |
| `includeCast` | boolean | `false` | Actors, directors, writers, producers |
| `includeEpisodes` | boolean | `false` | Seasons and episodes for series |

#### 🔬 Advanced

| Field | Type | Default | Description |
|---|---|---|---|
| `genreIds` | string | `""` | Comma-separated catalogue genre ids |
| `personId` | string | `""` | Catalogue person id |

#### 🌍 Network & ⚡ Speed

| Field | Type | Default | Description |
|---|---|---|---|
| `proxyConfiguration` | object | no proxy | Pin your own route, or leave it automatic |
| `backupCountry` | string | `US` | Region used if the run falls back to the backup index |
| `maxConcurrency` | integer | `2` | Titles collected in parallel |
| `maxRequestRetries` | integer | `8` | Attempts per request before giving up |

***

### 🔁 Migrating from another Netflix scraper

Inputs saved for other Netflix Actors on the Store run here unchanged — these field names are all accepted and mapped automatically:

| Their field | Maps to | Notes |
|---|---|---|
| `query` | `keywords` | |
| `actor_query` | `keywords` | Added as an extra search term |
| `genre_query` | `keywords` | Added as an extra search term |
| `startUrls` / `searchUrls` | `urls` | |
| `limit` / `maxResults` / `resultsLimit` | `maxItems` | |
| `type` (`Movie` / `Series`) | `type` | Case-insensitive |
| `start_year` / `end_year` | `startYear` / `endYear` | |
| `min_rating` / `max_rating` | `minRating` / `maxRating` | |
| `filter_by` / `order_by` | `filterBy` / `orderBy` | Same values |
| `genre_ids` / `person_id` | `genreIds` / `personId` | |

Paste your old input JSON straight in — nothing needs renaming.

***

### 🛡️ Reliability & anti-blocking

This Actor starts every run on a **direct connection** — no proxy overhead unless it is actually needed. If the catalogue pushes back, the run automatically and transparently escalates:

**Direct connection ➜ datacenter proxy ➜ residential proxy (3 retries)**

Once the run escalates it **stays on the new route** for every remaining request, and every switch is logged clearly in the run log. You can also pin your own proxy group in **Proxy configuration** to skip the automatic ladder entirely.

On top of the network ladder there is a **second, independent safety net**: if the main catalogue index stops answering altogether, the run switches to a **backup index** and still returns data rather than failing. Backup rows carry a smaller field set — every one of them says so in its own `enrichmentErrors` column, and no field is ever filled in with a guess.

Other reliability behaviour worth knowing:

- Requests are **paced**, not just capped by concurrency — the run limits how fast requests are launched, which is what actually triggers rate limits.
- Every result is **written to the Dataset the moment it is finished**, so an aborted, timed-out or migrated run keeps everything collected so far.
- **Abort and migration are handled gracefully** — the run wraps up and writes its summary instead of dying mid-write.
- Inputs that return nothing become **explicit error rows** with a plain-English reason.

***

### 🔌 Integrations & automation

- **Schedules** — run daily/weekly with `filterBy: "New last 24 hours"` to capture new Netflix additions automatically.
- **Webhooks** — fire `ACTOR.RUN.SUCCEEDED` to your own endpoint when a run finishes.
- **Zapier / Make / n8n** — feed dataset items straight into a spreadsheet, database or Slack alert.
- **MCP / AI agents** — call this Actor as a tool from Claude, Cursor or any MCP-compatible client via [mcp.apify.com](https://mcp.apify.com).
- **REST API** — pull dataset items directly: `GET https://api.apify.com/v2/datasets/{datasetId}/items?format=json`.

***

### 💰 Pricing & how to control cost

This Actor runs on **Apify's pay-per-usage** pricing — you pay for the platform compute, proxy and storage your run consumes. To control cost:

- Start with a low `maxItems` to sample a search before a full harvest.
- Leave `includeCast` and `includeEpisodes` off unless you need them — each adds one request per title.
- Turn `includeCountryAvailability` off if you only want ratings and metadata.
- Leave **Proxy configuration** on automatic — it only escalates to a paid proxy route when actually needed.
- Narrow with filters rather than collecting everything and filtering afterwards.

***

### ❓ Frequently asked questions (FAQ)

**Do I need a Netflix account or an API key?**
No. Nothing is logged into, and there is no key or quota to manage. Only publicly available catalogue data is read.

**Can I see which countries a title streams in?**
Yes — that is the headline feature. Keep **🌍 Full region-by-region availability** on and every row carries a `availableCountries` array with the region, the date it was added, its expiry date, the audio and subtitle languages there, and which seasons are carried.

**Can I find out what is leaving Netflix soon?**
Yes — set **⏳ Availability filter** to *Leaving soon*, optionally with a region selected.

**Does it return IMDb ratings?**
Yes — rating, vote count, metascore, genres, awards and the full plot, with `includeImdbExtras` on (the default).

**Can I get every episode of a series?**
Yes — turn on **📺 Seasons & episodes**. Each series row then carries every season with its episode list, numbers, titles, synopses and stills.

**Why does `maxItems` sometimes return fewer titles?**
Because there genuinely were fewer matches, or your filters removed some. Widen the year/rating range, clear the region filter, or use a broader search term.

**Why do some rows have fewer fields than others?**
Netflix does not publish the same metadata for every title, and if the run had to use the backup index that index carries less. `enrichmentStatus` and `enrichmentErrors` on each row tell you exactly what was and was not collected — nothing is ever invented to fill a gap.

**Can I look a title up by its Netflix id?**
Yes — paste `https://www.netflix.com/title/<id>`. If the main catalogue index is unavailable at that moment, an id on its own cannot be resolved and you get a clear error row saying so; paste the title name instead.

**Is there a limit on how many titles I can collect?**
Up to 10 000 per search term, and you can run as many search terms as you like in one run.

***

### 🛠️ Troubleshooting

| Symptom | Fix |
|---|---|
| A search comes back as an error row | Check the ⚠️ **Errors** view — usually the term was too narrow or the filters excluded everything |
| Fewer titles than `maxItems` | Widen the year/rating range, clear the region filter, or use a broader term |
| `TITLE_ID_UNRESOLVABLE` on a title link | The link only carried a numeric id and the main index was unavailable — paste the title name instead |
| Rows are missing IMDb fields | Turn on **⭐ IMDb ratings, votes, awards & plot**, or the title simply has no IMDb entry |
| No `seasons` on a series | Turn on **📺 Seasons & episodes** — it is off by default because it makes records large |
| Region filter returns nothing | Try `countryMatch: "or"` — `and` requires the title to stream in *every* selected region |
| Run seems slow | Lower `maxRequestRetries`, reduce `maxItems`, or turn off cast/episodes |

***

### 🆘 Help, support & custom builds

Something not working, or need a custom field, private integration or a bespoke pipeline built on top of this Actor? Email **<hello.dataminds@gmail.com>** — we read every message.

***

### ⚖️ Is scraping Netflix data legal?

This Actor only reads **publicly available** catalogue information — the same title, rating and availability data any anonymous visitor can see. It does not log into Netflix, bypass any paywall, or touch private account data, viewing history or video streams. You are responsible for how you use the collected data — respect the applicable terms of service, copyright law, and privacy regulations (GDPR, CCPA, etc.) for your jurisdiction and use case.

***

### 🔑 SEO keywords targeted

netflix scraper, netflix search scraper, netflix api, netflix data scraper, netflix catalogue scraper, netflix movies scraper, netflix series scraper, netflix availability by country, what's leaving netflix, netflix expiring titles, netflix new releases scraper, netflix imdb ratings, netflix title metadata, netflix streaming availability api, unofficial netflix api, netflix content database, netflix region availability, netflix cast and crew data, netflix episode list scraper, streaming catalogue data, apify netflix actor, scrape netflix without api key, netflix market research data, netflix licensing data.

# Actor input Schema

## `urls` (type: `array`):

🎬 Paste links to individual titles or to a search page — one per line, or upload a file. Works with `https://www.netflix.com/title/81002370`, `https://www.netflix.com/search?q=fashion`, and catalogue links that contain the title name. Leave empty if you only want to use search terms below.

## `keywords` (type: `array`):

🗺️ Plain words to search the Netflix catalogue for — for example `fashion`, `true crime`, `korean thriller`. Each line is searched separately, exactly like typing it into the search box.

## `maxItems` (type: `integer`):

📬 How many titles to collect for each search term. A title link always returns exactly one title, whatever this is set to.

## `maxScanned` (type: `integer`):

🧮 Safety cap on how deep a single search digs before giving up. Raise it when a narrow filter means the matches you want sit far down the results.

## `type` (type: `string`):

🎞️ Restrict results to one kind of title.

## `startYear` (type: `integer`):

📅 Earliest release year to include. Leave empty for no lower bound.

## `endYear` (type: `integer`):

📅 Latest release year to include. Leave empty for no upper bound. If you enter the two years the wrong way round they are swapped for you.

## `minRating` (type: `number`):

⭐ Only include titles rated at or above this, on the 0–10 IMDb scale.

## `maxRating` (type: `number`):

⭐ Only include titles rated at or below this, on the 0–10 IMDb scale.

## `orderBy` (type: `string`):

🔃 How the catalogue orders the matches before they are collected.

## `filterBy` (type: `string`):

⏳ Show only titles that are about to leave Netflix, or only titles added in the last 24 hours.

## `countries` (type: `array`):

🌍 Only return titles streaming in these regions. Leave empty to search every region the catalogue covers.

## `countryMatch` (type: `string`):

🧩 With several regions selected: `any` returns titles streaming in at least one, `all` only titles streaming in every one, `only these` titles that stream in your picks and nowhere else, and `not in` titles that stream anywhere except your picks.

## `audio` (type: `string`):

🗣️ Only titles with this audio track — for example `English`, `Spanish`, `Hindi`. Pick from the list or type your own.

## `subtitle` (type: `string`):

💬 Only titles with subtitles in this language. Pick from the list or type your own.

## `audioSubtitleMatch` (type: `string`):

🧩 With both an audio and a subtitle language chosen: `either` matches titles that have one of them, `both` only titles that have both.

## `includeImdbExtras` (type: `boolean`):

⭐ Add the IMDb rating, vote count, metascore, awards, full plot, maturity rating and large artwork to every title.

## `includeCountryAvailability` (type: `boolean`):

🌍 The headline feature: every region a title streams in, with the date it was added, its expiry date, the audio and subtitle languages available there, and which seasons are carried. The search page itself only ever shows the first handful of regions.

## `includeGenres` (type: `boolean`):

🎭 Add the catalogue's own genre labels for every title.

## `includeCast` (type: `boolean`):

🎬 Add actors, directors, writers and producers for every title.

## `includeEpisodes` (type: `boolean`):

📺 For series only: add every season with its episode list, titles, synopses and stills. Can make records large.

## `genreIds` (type: `string`):

🏷️ Comma-separated catalogue genre ids, passed straight through to the search. Leave empty to search all genres.

## `personId` (type: `string`):

🧑‍🎤 A catalogue person id, to return only titles that person worked on. Leave empty to search everyone.

## `proxyConfiguration` (type: `object`):

🚦 By default the run starts on a direct connection with no proxy, and automatically switches to a datacenter and then a residential route only if the catalogue pushes back. Once it switches it stays switched. Pick your own route here to override that.

## `backupCountry` (type: `string`):

🌎 If the main catalogue index is unreachable, the run automatically falls back to a second index that can only look at one region at a time. This is the region it uses.

## `maxConcurrency` (type: `integer`):

🏎️ How many titles to collect details for at the same time.

## `maxRequestRetries` (type: `integer`):

🛡️ Attempts before a request is given up on. The catalogue can be slow to answer, so a generous number here genuinely helps — lower it only if you would rather a struggling run finish quickly than finish complete.

## Actor input object example

```json
{
  "urls": [
    "https://www.netflix.com/search?q=documentary"
  ],
  "keywords": [
    "fashion"
  ],
  "maxItems": 10,
  "maxScanned": 20000,
  "type": "",
  "orderBy": "Relevance",
  "filterBy": "",
  "countries": [],
  "countryMatch": "or",
  "audio": "",
  "subtitle": "",
  "audioSubtitleMatch": "or",
  "includeImdbExtras": true,
  "includeCountryAvailability": true,
  "includeGenres": true,
  "includeCast": false,
  "includeEpisodes": false,
  "genreIds": "",
  "personId": "",
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "backupCountry": "US",
  "maxConcurrency": 2,
  "maxRequestRetries": 8
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `overview` (type: `string`):

No description

## `ratings` (type: `string`):

No description

## `availability` (type: `string`):

No description

## `cast` (type: `string`):

No description

## `episodes` (type: `string`):

No description

## `media` (type: `string`):

No description

## `links` (type: `string`):

No description

## `source` (type: `string`):

No description

## `errors` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://www.netflix.com/search?q=documentary"
    ],
    "keywords": [
        "fashion"
    ],
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("citrine_venus/netflix-search-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "urls": ["https://www.netflix.com/search?q=documentary"],
    "keywords": ["fashion"],
    "maxItems": 10,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("citrine_venus/netflix-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.netflix.com/search?q=documentary"
  ],
  "keywords": [
    "fashion"
  ],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call citrine_venus/netflix-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,citrine_venus/netflix-search-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/0YUYC8aVs9MQmoIFz/builds/TczDHB5d7t0CqYeGf/openapi.json
