# DramaBox Scraper - Short Dramas, Series & Episodes (`abotapi/dramabox-com-scraper`) Actor

Scrape DramaBox short-drama series by browsing the catalogue or entering a series ID. Extract series metadata, genres, view counts, follower counts and complete episode lists. Requires a residential proxy connection.

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

## Pricing

from $1.20 / 1,000 product 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

## DramaBox Scraper - Series, Episodes & Catalog Data

DramaBox Scraper turns DramaBox, the short-drama streaming catalog, into a clean data API. Browse the featured catalog, paste series ids or links, and get structured records with series metadata, genres and tags, view and follow counts, full episode lists with lock status and durations, and related-series recommendations - then export to JSON, CSV or Excel, or pull the results straight into your app through the API.

### Why This Scraper?

- **Two ways in.** Browse the featured catalog rows, or paste series ids and links - both yield structured series records.
- **Full episode lists.** Every series carries its chapter list: episode numbers, names, lock status, durations - capped at 300 per series with an honest truncation flag.
- **Catalog depth.** Genres, labels and tags, view and follow counts, shelf dates, cover art, and recommended-series ids on every detail record.
- **Change kinds.** Filter the dataset by record kind (browse card vs full series detail) to feed exactly the downstream job you have.
- **Built for schedules.** Incremental mode returns only new and changed series on recurring runs, and a refused run fails loudly instead of returning an empty dataset.
- **Honest failures.** A series id that does not exist is named in the error; a refused run never reads as an empty catalog.

### Use Cases

- **Who:** short-drama analysts - track view and follow counts, episode counts and catalog additions across the DramaBox catalog on a schedule.
- **Who:** content researchers - collect synopses, genres and episode structures for market studies.
- **Who:** recommendation builders - harvest related-series graphs from every detail record.

### Data You Get

> Sample shape: one series record, from a live record.

| Field | Example |
|---|---|
| `recordId` | dramabox:series:42000028173 |
| `bookId` | 42000028173 |
| `title` | Love Is A Dangerous Game |
| `introduction` | Olivia is dragged by her husband… |
| `chapterCount` | 43 |
| `episodeCount` | 43 |
| `viewCount` | 59925250 |
| `followCount` | 2347797 |
| `labels` | \["Billionaire", "Forbidden Love"] |
| `tags` | \["Billionaire", "Forbidden Love"] |
| `episodes` | \[{"episodeId": "701673570", "indexStr": "001", "name": "第一集", "locked": false, "durationSeconds": 102}] |
| `recommendBookIds` | \["42000101262", "…"] |
| `language` | ENGLISH |
| `url` | https://www.dramabox.com/drama/42000028173/Love-Is-A-Dangerous-Game |
| `changeType` | NEW |

### How to Use

1. Pick a mode: **Browse catalog** reads the featured series shelves on DramaBox's home page; **Series detail** fetches full records with episode lists for the IDs or URLs you provide.
2. In detail mode, add one series id (42000028173) or link (https://www.dramabox.com/drama/42000028173/Love-Is-A-Dangerous-Game) per entry.
3. Set **Max items** for the run cap (20 by default; 0 runs until the walk ends naturally) and **Max episodes per series** caps each episode list (300 by default).
4. Run the actor and export the dataset, or select an MCP connector to send records into your apps.

**Browse the catalog:**

```json
{"mode": "browse", "maxItems": 30}
```

**Series detail by id:**

```json
{"mode": "detail", "series": ["42000028173"], "maxItems": 5}
```

**Series detail by link:**

```json
{"mode": "detail", "series": ["https://www.dramabox.com/drama/42000028173/Love-Is-A-Dangerous-Game"], "maxItems": 5}
```

**Watch a series on a schedule:**

```json
{"mode": "detail", "series": ["42000028173"], "incrementalMode": true, "stateKey": "db-watch", "maxItems": 0}
```

#### Run it from your code

**Run it from Python:**

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("abotapi/dramabox-scraper").call(run_input={
    "mode": "detail",
    "series": ["42000028173"],
    "maxItems": 5,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

**Run it from JavaScript:**

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('abotapi/dramabox-scraper').call({
  mode: 'detail', series: ['42000028173'], maxItems: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

#### Tips

- This catalog serves over residential connections only - the shared datacenter pool is refused at the edge, so the proxy default is residential and runs need a plan that includes it.
- The catalog exposes no reviews, ratings or user comments on any web or app surface this actor can reach anonymously; episode and series data are the catalog's full public depth.

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

Optionally send records into the apps you already use through MCP connectors: set **MCP connectors** (for example a Notion database) and cap the export with **Max items to export per connector**. The export is a gated side channel: it never changes the dataset.

| Field | What it does |
|---|---|
| `mcpConnectors` | Connector ids to export to (empty = no export). |
| `notionParentPageUrl` | URL or id of the Notion parent page (required for the Notion connector). |
| `maxNotifyListings` | Cap on records written to each connector per run. |

### Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `browse` | Browse the featured home shelves, or fetch series details by ID or URL. |
| `series` | array | - | Series IDs (42000028173) or full URLs, one entry per series (detail mode). Each output is one dataset record with episodes nested inside it. |
| `maxItems` | integer | `20` | The single cap on the run: stop after this many records. |
| `maxEpisodesPerSeries` | integer | `300` | Cap on episodes carried per series record. |
| `proxy` | object | residential | The catalog refuses datacenter IPs; keep the residential default. |
| `resumeFromRunId` | string | - | Paste a previous run ID or dataset ID to continue a large crawl without returning or charging for records already collected there. |
| `incrementalMode` | boolean | `false` | Track changes across scheduled runs; suppress and never bill unchanged records. |
| `stateKey` | string | - | Optional name for the incremental baseline. |
| `emitUnchanged` | boolean | `false` | Also return unchanged records, marked and billed. |
| `emitExpired` | boolean | `false` | Also return disappeared records, marked and billed. |
| `ignoreFieldsForChanges` | array | - | Extra top-level fields excluded from change detection. |
| `mcpConnectors` | array | - | Connector ids to export to (empty = no export). |
| `notionParentPageUrl` | string | - | URL or id of the Notion parent page (required for the Notion connector). |
| `maxNotifyListings` | integer | `50` | Cap on records written to each connector per run. |

### Output Example

> Sample shape: one series record, from a live record.

**Live record: Love Is A Dangerous Game**

```json
{
  "recordId": "dramabox:series:42000028173",
  "bookId": "42000028173",
  "title": "Love Is A Dangerous Game",
  "chapterCount": 43,
  "episodeCount": 43,
  "viewCount": 59925250,
  "followCount": 2347797,
  "labels": ["Billionaire", "Forbidden Love"],
  "url": "https://www.dramabox.com/drama/42000028173/Love-Is-A-Dangerous-Game"
}
```

### Plan Requirement

This actor needs an Apify plan that includes residential proxies (the catalog refuses datacenter IPs). If runs fail with connection errors on the free plan, upgrade the plan or supply your own proxy URLs.

### FAQ

#### How much does it cost?

The actor is pay per event: a start fee per run, a per-record fee for every series returned, a detail surcharge for each series fetched by ID or URL, and an episode event for each episode included in a successfully returned record. Episodes omitted by **Max episodes per series** are not charged. Exact prices are on the actor's Pricing tab. `Max items` caps series records, while **Max episodes per series** caps delivered episode units.

#### Is it legal to scrape DramaBox?

The actor reads the public catalog pages of the DramaBox website: the same series, episode and metadata any visitor sees without an account. It does not access accounts, streaming or checkout. You are responsible for using the data in line with the site's terms of use, privacy law such as GDPR or CCPA, and applicable regulations; personal data of identifiable individuals requires a lawful basis.

#### Does it scrape episode comments or reviews?

No. DramaBox publishes comments only inside its mobile app behind a device-registered API; the website exposes none (verified October 2026 across the catalog payloads and site JavaScript), so there is nothing to collect. Series metadata, episodes, view/follow counts and recommendations are the catalog's full public depth.

#### Can I get only new or changed series on a schedule?

Yes. Turn on **Incremental mode** and schedule the actor. The first run returns everything matching as NEW; later runs return only NEW and UPDATED records. View-count moves, new episodes and cover changes all count as changes. Use **State key** to keep a monitoring campaign stable, and **Emit unchanged** or **Emit expired** only if you also want those rows (they return and bill extra rows).

#### Why did my run fail instead of returning an empty dataset?

A run that never got a single readable answer fails loudly with a connection message instead of reporting an empty catalog; a series id that does not exist is named in the error rather than silently skipped.

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

Yes. Every record is plain JSON over the dataset API, and the MCP connector export sends rows straight into tools like Notion. Point an agent at the dataset items endpoint with the input above.

### 🔗 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/pinedrama-scraper"><b>PineDrama Scraper</b></a><br>Scrape the PineDrama short-drama catalogue: series with watch counts, episode counts...</td><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></tr>
<tr><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><td>⚽ <a href="https://apify.com/abotapi/hotstar-com-scraper"><b>JioHotstar Scraper</b></a><br>Scrape the JioHotstar catalog by content type or URL. Extract shows, movies, episodes...</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/tunein-radio-podcast-scraper"><b>TuneIn Scraper</b></a><br>Scrape TuneIn by keyword, category, genre, location or URL. Extract stations and podcasts...</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/dramabox-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`):

Browse catalog reads the featured series shelves shown on DramaBox's home page. Series detail fetches one full record, including its episode list, for each series ID or URL you provide below.

## `series` (type: `array`):

Only used in Series detail mode. Add one DramaBox series ID (42000028173) or full series URL (https://www.dramabox.com/drama/42000028173/Love-Is-A-Dangerous-Game) per entry. Each entry becomes one dataset record containing the series and its episode list.

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

The single cap on the run: stop after collecting this many records. Set 0 for no cap.

## `maxEpisodesPerSeries` (type: `integer`):

Cap on episodes carried per series record (the full list is truncated with an honest flag beyond this).

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

The catalog refuses datacenter IPs - keep the residential default (requires a plan that includes residential proxies). If runs still fail, supply your own proxy URLs.

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

Paste a previous run ID or dataset ID to continue that interrupted run without returning or charging for records already collected there. For recurring monitoring of the same series, use Recurring updates below instead.

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

Turn this on for daily or recurring monitoring. The first run returns all matching records as NEW. Later runs return only NEW and UPDATED records.

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

Optional. Name this monitoring campaign to keep its memory stable. Leave empty to key the memory on this run setup automatically.

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

Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns and bills extra rows you already have.

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

Off by default. Turn on to also return records that were present before but are no longer found, marked EXPIRED. Only produced when a run covered its whole setup.

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

Output field names that should NOT mark a record as UPDATED. scrapedAt is always ignored because it is stamped fresh on every fetch. View and follow counts are always ignored (they move on every fetch).

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

Optionally send records into the apps you already use through MCP connectors. Empty means no export.

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

URL or id of the Notion page under which record pages are created. Required to enable the Notion connector.

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

Cap on records written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "browse",
  "series": [
    "42000028173"
  ],
  "maxItems": 20,
  "maxEpisodesPerSeries": 300,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

No description

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

No description

## `reviews` (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": "browse",
    "series": [
        "42000028173"
    ],
    "maxItems": 20,
    "maxEpisodesPerSeries": 300,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    },
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false,
    "maxNotifyListings": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/dramabox-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": "browse",
    "series": ["42000028173"],
    "maxItems": 20,
    "maxEpisodesPerSeries": 300,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
    "maxNotifyListings": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/dramabox-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": "browse",
  "series": [
    "42000028173"
  ],
  "maxItems": 20,
  "maxEpisodesPerSeries": 300,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "maxNotifyListings": 50
}' |
apify call abotapi/dramabox-com-scraper --silent --output-dataset

```

## MCP server setup

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