# ReelShort Scraper - Short-Drama Catalog, Cast & Engagement (`abotapi/reelshort-com-scraper`) Actor

Scrape the ReelShort vertical short-drama catalog: titles, synopses, themes and full tag taxonomy, episode counts, cast with IMDb links, view and collect counts. Search, curated shelves, genres or paste title links. Resume, incremental updates and MCP export included.

- **URL**: https://apify.com/abotapi/reelshort-com-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Stats:** 1 total users, 1 monthly users, 80.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 title records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## ReelShort Scraper - Short-Drama Catalog, Cast & Engagement

Scrape ReelShort, the vertical short-drama catalog: titles, synopses, themes and the full tag taxonomy, episode counts, cast with IMDb links, view and collect counts. Search by keyword, walk curated shelves or genres, or paste title links.

### Why This Scraper?

- **Four ways in.** Keyword search, ten curated shelves (New Release, TOP, Reel Original and more), the 216-tag genre taxonomy, or pasted title/shelf/genre/search links.
- **Fuller rows than the catalog-only incumbents.** Every title carries its synopsis, full tag list with categories, engagement signals and, with enrichment on, cast with IMDb links, video, duration and dates: 52 fields.
- **Keyword search the rival lacks.** The incumbent only walks shelves and categories; this actor adds full-text search across the catalog.
- **Resumable and incremental.** Interrupted runs resume by run ID; scheduled runs emit only new, updated and expired rows.
- **Honest about limits.** ReelShort publishes no title reviews or per-episode lists on any public surface; the actor documents both instead of inventing them.
- **Priced to beat the incumbent.** Tiered pricing undercuts the rival flat rate from Bronze down.

### Use Cases

- **Who:** trend analysts tracking what charts by theme, trope and release date.
- **Who:** casting researchers using the cast index with IMDb links no public database covers.
- **Who:** studios and licensors comparing engagement signals across titles and genres.

### Data You Get

> Sample shape: one row per title, from a live record.

| Field | Example |
|---|---|
| `title` | The Billionaire's Sister Strikes Back |
| `bookId` | 3169557e34eb |
| `url` | https://www.reelshort.com/episodes/episode-1-... |
| `synopsis` | Full synopsis text |
| `themes` | Billionaire, Revenge |
| `tags` | 7 taxonomy entries with categories |
| `readCount` | 14546455 |
| `collectCount` | 183089 |
| `score` | 9183 (search cards) |
| `chapterCount` | 47 |
| `durationSec` | 233 (first episode) |
| `cast` | \[{name, photo, imdbUrl}] (when published) |
| `imdbId` | tt37855561 (when published) |
| `releaseDate` | 2026-09-01T00:00:00+00:00 |
| `cover` | Cover image URL |
| `bookSource` | Source code from the title payload |
| `videoUrl` | First-episode video URL |
| `genre` | Affair (genre mode) |
| `searchKeyword` | billionaire (search mode) |
| `changeType` | NEW |

### How to Use

1. Pick a mode: `SEARCH` (keywords), `SHELF` (curated shelves), `GENRE` (genre/trope names or the whole tag index), or `URLS` (pasted links).
2. Keep `fetchDetails` on for full title pages (cast, IMDb, full tags, video, dates), or switch it off for faster card-only rows.
3. Set `maxItems` to bound the run. Every mode paginates until the catalog ends or the cap hits.

**Example input (keyword search):**

```json
{"mode": "SEARCH", "searchQueries": ["billionaire"], "maxItems": 20, "fetchDetails": true}
```

**Example input (one shelf):**

```json
{"mode": "SHELF", "shelves": ["new-release"], "maxItems": 20, "fetchDetails": true}
```

**Example input (genres):**

```json
{"mode": "GENRE", "genres": ["Affair", "Billionaire"], "maxItems": 20}
```

**Example input (pasted links):**

```json
{"mode": "URLS", "listingUrls": ["https://www.reelshort.com/episodes/episode-1-..."]}
```

#### Run it from your code

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("abotapi/reelshort-com-scraper").call(run_input={
    "mode": "SEARCH",
    "searchQueries": ["billionaire"],
    "maxItems": 20,
    "fetchDetails": True,
})
```

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('abotapi/reelshort-com-scraper').call({
    mode: 'SEARCH',
    searchQueries: ['billionaire'],
    maxItems: 20,
    fetchDetails: true,
});
```

> Sample shape: one row per title, from a live record.

### Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | string | SHELF | SEARCH, SHELF, GENRE or URLS |
| `searchQueries` | string\[] | ,  | SEARCH mode keywords |
| `shelves` | string\[] | all ten | SHELF mode shelf keys |
| `genres` | string\[] | ,  | GENRE mode plain names |
| `crawlTagIndex` | boolean | false | GENRE mode: walk the whole tag index |
| `maxTags` | integer | 0 (unlimited) | GENRE mode tag cap with the index on |
| `listingUrls` | string\[] | ,  | URLS mode pasted links |
| `fetchDetails` | boolean | true | Read every title page |
| `maxPages` | integer | 0 (unlimited) | Page cap per scope |
| `maxItems` | integer | 20 | Title cap (0 = unlimited) |
| `proxy` | object | datacenter | Connection (Residential recommended) |
| `resumeFromRunId` | string | ,  | Resume an interrupted run |
| `incrementalMode` | boolean | false | Emit only changed rows on schedules |
| `stateKey` | string | ,  | Custom incremental baseline key |
| `emitUnchanged` | boolean | false | Also emit unchanged rows |
| `emitExpired` | boolean | false | Emit tombstones for vanished titles |
| `ignoreFieldsForChanges` | string\[] | ,  | Extra fields excluded from change detection (incremental mode only) |
| `mcpConnectors` | string\[] | ,  | Forward rows into your apps |
| `notionParentPageUrl` | string | ,  | Notion export target page |
| `maxNotifyListings` | integer | 50 | Connector export cap |

### Output Example

> Sample shape: one row per title, from a live record.

**Example row (enriched title):**

```json
{
  "title": "The Billionaire's Sister Strikes Back",
  "readCount": 14546455,
  "collectCount": 183089,
  "chapterCount": 47,
  "tags": [{"name": "Billionaire", "category": null}],
  "changeType": "NEW"
}
```

### Plan Requirement

Runs on the datacenter connection by default (measured open on every endpoint, works on every plan). For the most reliable results, select Residential proxies; the actor escalates to residential automatically when the default is refused (billed to your plan).

### Send results into your apps (MCP connectors)

Add connector IDs under `mcpConnectors` to forward rows into your apps (Notion and more) after the run. Export is fail-safe: it never touches the dataset and never fails the run.

### FAQ

#### How much does a run cost?

One dataset-item event per title plus one detail-enrichment event per enriched title; see the pricing tab.

#### Is it legal to scrape ReelShort?

The actor reads only publicly available catalog pages, the same as a browser visit. Review the site terms and your local rules for your use case.

#### Can I run it on a schedule?

Yes. Combine `incrementalMode` with a state key so scheduled runs emit only new, updated and expired rows.

#### Why did my run report partial results?

Long walks can approach the run timeout; the actor then ends itself with the rows collected so far and a `Partial results:` status instead of timing out. Raise the timeout for the full catalog.

#### Where are the reviews?

ReelShort publishes no title or episode reviews, ratings or comments on any public page, API or app surface the actor can reach anonymously (verified across the site, its bundles and its Android app). The actor ships everything the catalog exposes and documents this gap instead of inventing data.

#### Why no per-episode rows?

The full episode list loads through an encrypted request the site ties to its own session; anonymous replay is refused. Rows carry episode counts and first-episode metadata instead.

#### Can I use it with AI agents or MCP?

Yes. Add connector IDs under `mcpConnectors` to forward rows into your apps after the run; export never fails the run.

### 🔗 More scrapers you might like

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🧩 <a href="https://apify.com/abotapi/goodshort-catalog-scraper"><b>GoodShort Scraper</b></a><br>Scrape the GoodShort short-drama catalog: titles with exact views, follows, genres and...</td><td>🧩 <a href="https://apify.com/abotapi/pinedrama-scraper"><b>PineDrama Scraper</b></a><br>Scrape the PineDrama short-drama catalogue: series with watch counts, episode counts...</td></tr>
<tr><td>🧩 <a href="https://apify.com/abotapi/anilist-anime-manga-scraper"><b>AniList Anime &amp; Manga Scraper</b></a><br>Scrape AniList anime and manga: titles (romaji/English/native), scores, popularity...</td><td>🧩 <a href="https://apify.com/abotapi/webtoons-com-scraper"><b>WEBTOON Scraper</b></a><br>Scrape the WEBTOON catalog into structured data. Extract series, genres, rankings and...</td></tr>
<tr><td>⚽ <a href="https://apify.com/abotapi/bookmyshow-scraper"><b>BookMyShow Scraper</b></a><br>Scrape BookMyShow movies and live events by city, category or URL. Extract genres...</td><td>🧩 <a href="https://apify.com/abotapi/anghami-catalog-scraper"><b>Anghami Scraper</b></a><br>Scrape Anghami's public catalog by keyword or player URL. Rows carry their kind (song...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/reelshort-com-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

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

How to select titles: keyword SEARCH, curated SHELF walk, GENRE taxonomy walk, or pasted URLS.

## `searchQueries` (type: `array`):

SEARCH mode only: one or more keywords (e.g. billionaire, werewolf). Each query is walked in order.

## `shelves` (type: `array`):

SHELF mode only: curated homepage shelves to walk. Empty = all ten curated shelves.

## `genres` (type: `array`):

GENRE mode only: plain genre, trope or actor names (e.g. Affair, Billionaire, Werewolf). Resolved against the site's live tag taxonomy.

## `crawlTagIndex` (type: `boolean`):

GENRE mode only: walk every tag in the live taxonomy instead of the genres list above (large crawl — combine with maxTags and maxItems).

## `maxTags` (type: `integer`):

GENRE mode with the tag index on: cap how many tags are walked (0 = no cap).

## `listingUrls` (type: `array`):

URLS mode only: paste title/episode links (/episodes/...), shelf links (/shelf/...), genre links (/movie-genres/...) or search links (/search?keywords=...). One example of each shape is shown below.

## `fetchDetails` (type: `boolean`):

Read every title's page for the full tag taxonomy, cast with IMDb links, video, duration and dates. Off = faster card-only rows.

## `maxPages` (type: `integer`):

Cap pages walked per shelf, genre or search (0 = no page cap; maxItems still stops the run).

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

Stop after this many titles (0 = no limit). The only cap that stops a run early.

## `proxy` (type: `object`):

Datacenter connection by default (measured open on every endpoint, works on every plan). Residential is recommended for the most reliable results; the actor escalates to residential automatically when the default is refused (billed to your plan).

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

Continue an interrupted run: paste its run ID and already-collected titles are skipped.

## `incrementalMode` (type: `boolean`):

Track titles across scheduled runs: only NEW, UPDATED and (optionally) EXPIRED rows are emitted.

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

Custom key for the incremental baseline (empty = derived from the search scope).

## `emitUnchanged` (type: `boolean`):

In incremental mode, also emit rows that did not change since the previous run.

## `emitExpired` (type: `boolean`):

In incremental mode, emit a tombstone row for titles that disappeared from the scope.

## `ignoreFieldsForChanges` (type: `array`):

Extra field names excluded from incremental change detection (counters and rotations are ignored by default).

## `mcpConnectors` (type: `array`):

Send collected rows into your apps (Notion and more) after the run. Fail-safe: export never fails the run.

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

Notion export target: paste the parent page URL.

## `maxNotifyListings` (type: `integer`):

Cap rows sent to connectors per run.

## Actor input object example

```json
{
  "mode": "SHELF",
  "searchQueries": [
    "billionaire"
  ],
  "genres": [
    "Affair",
    "Billionaire"
  ],
  "crawlTagIndex": false,
  "maxTags": 5,
  "listingUrls": [
    "https://www.reelshort.com/episodes/episode-1-daisy-tucker-and-mr-nyc-68955a832bc50c718b009d8d-fxcfjh1dzy",
    "https://www.reelshort.com/shelf/new-release-short-movies-dramas-51003505",
    "https://www.reelshort.com/movie-genres/affair-movies-QWZmYWly",
    "https://www.reelshort.com/search?keywords=billionaire&type=movies",
    "https://www.reelshort.com/movie-genres/all-movies",
    "https://www.reelshort.com/tags/story-beats/affair-movies-676d210e4582b53a14081aeb"
  ],
  "fetchDetails": true,
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

No description

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

No description

## `changes` (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 = {
    "mode": "SHELF",
    "searchQueries": [
        "billionaire"
    ],
    "genres": [
        "Affair",
        "Billionaire"
    ],
    "maxTags": 5,
    "listingUrls": [
        "https://www.reelshort.com/episodes/episode-1-daisy-tucker-and-mr-nyc-68955a832bc50c718b009d8d-fxcfjh1dzy",
        "https://www.reelshort.com/shelf/new-release-short-movies-dramas-51003505",
        "https://www.reelshort.com/movie-genres/affair-movies-QWZmYWly",
        "https://www.reelshort.com/search?keywords=billionaire&type=movies",
        "https://www.reelshort.com/movie-genres/all-movies",
        "https://www.reelshort.com/tags/story-beats/affair-movies-676d210e4582b53a14081aeb"
    ],
    "fetchDetails": true,
    "maxItems": 20,
    "proxy": {
        "useApifyProxy": true
    },
    "resumeFromRunId": "",
    "stateKey": "",
    "notionParentPageUrl": "",
    "maxNotifyListings": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/reelshort-com-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 = {
    "mode": "SHELF",
    "searchQueries": ["billionaire"],
    "genres": [
        "Affair",
        "Billionaire",
    ],
    "maxTags": 5,
    "listingUrls": [
        "https://www.reelshort.com/episodes/episode-1-daisy-tucker-and-mr-nyc-68955a832bc50c718b009d8d-fxcfjh1dzy",
        "https://www.reelshort.com/shelf/new-release-short-movies-dramas-51003505",
        "https://www.reelshort.com/movie-genres/affair-movies-QWZmYWly",
        "https://www.reelshort.com/search?keywords=billionaire&type=movies",
        "https://www.reelshort.com/movie-genres/all-movies",
        "https://www.reelshort.com/tags/story-beats/affair-movies-676d210e4582b53a14081aeb",
    ],
    "fetchDetails": True,
    "maxItems": 20,
    "proxy": { "useApifyProxy": True },
    "resumeFromRunId": "",
    "stateKey": "",
    "notionParentPageUrl": "",
    "maxNotifyListings": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/reelshort-com-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 '{
  "mode": "SHELF",
  "searchQueries": [
    "billionaire"
  ],
  "genres": [
    "Affair",
    "Billionaire"
  ],
  "maxTags": 5,
  "listingUrls": [
    "https://www.reelshort.com/episodes/episode-1-daisy-tucker-and-mr-nyc-68955a832bc50c718b009d8d-fxcfjh1dzy",
    "https://www.reelshort.com/shelf/new-release-short-movies-dramas-51003505",
    "https://www.reelshort.com/movie-genres/affair-movies-QWZmYWly",
    "https://www.reelshort.com/search?keywords=billionaire&type=movies",
    "https://www.reelshort.com/movie-genres/all-movies",
    "https://www.reelshort.com/tags/story-beats/affair-movies-676d210e4582b53a14081aeb"
  ],
  "fetchDetails": true,
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true
  },
  "resumeFromRunId": "",
  "stateKey": "",
  "notionParentPageUrl": "",
  "maxNotifyListings": 50
}' |
apify call abotapi/reelshort-com-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/reelshort-com-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/1LPnoYEj0xLTkHCr1/builds/zfb9tny86iLJszci1/openapi.json
