# DramaWave.tv Scraper — Short-Drama Catalog, Genres & Episodes (`signalbench/dramawave-tv-scraper`) Actor

Scrape the dramawave.tv short-drama catalog in 19 languages: titles, synopses, genres, episode lists and the originating platform (ReelShort, FreeReels, PineDrama). Public-JSON based (no browser) — fast and cheap.

- **URL**: https://apify.com/signalbench/dramawave-tv-scraper.md
- **Developed by:** [SignalBench](https://apify.com/signalbench) (community)
- **Categories:** Videos, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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

## DramaWave.tv Scraper — Short-Drama Catalog, Genres & Episodes

Scrape the **dramawave.tv** short-drama catalog in **19 languages**: titles,
synopses, genres, episode lists, paywall shape, and — most usefully — **which
platform each title was originally published on**. API-first (reads the site's
own public JSON, **no browser**), so runs are fast, cheap, and reliable. Export
as **JSON, CSV, Excel, or XML**, or pull straight through the Apify API into
your app, agent, notebook, or spreadsheet.

> ### ⚠️ Read this first: which "DramaWave" is this?
>
> This Actor scrapes **`dramawave.tv`**, a third-party short-drama **aggregator**
> that re-hosts other platforms' catalogs.
>
> It is **NOT** the *DramaWave* mobile app published by Skywork AI
> (`mydramawave.com`, App Store / Google Play). That product has **no public web
> catalog at all** — its official site is a bare landing page with no title
> listing — so there is nothing there to scrape.
>
> Every row this Actor returns is attributed in the **`platform`** field to the
> platform it actually came from: **ReelShort**, **FreeReels**, **PineDrama**,
> and others depending on language. If you need first-party ReelShort or DramaBox
> data with real engagement counts, use the dedicated ReelShort and DramaBox
> scrapers instead — and **dedupe against them** before merging this dataset in.

> **No per-datapoint games, never charged for failures.** Flat **$2 per 1,000
> titles** ($0.002 each), billed only per title actually stored. Empty, invalid,
> or failed lookups are never stored and never charged — a no-result search
> costs **$0.00**.

### What it scrapes

| Field | Description |
|---|---|
| **platform / platformSlug** | The originating platform the title was re-hosted from (ReelShort, FreeReels, PineDrama, …) — the single most useful field on this site |
| **id / uniqueKey / language** | Numeric ID plus the cross-language-safe `{lang}:{id}` key |
| **title / slug / url** | Localized title, slug, and canonical URL |
| **description** | Full localized synopsis (details mode) |
| **genres / tags / primaryGenre** | Genre names, their slugs, and the single primary genre (details mode) |
| **episodes + episodeList\[]** | Episode count, and optionally the full list — number, title, duration, free/locked |
| **status / audioType** | `ongoing` / `completed`; subtitled vs dubbed |
| **pricingMode / freeEpisodes** | Paywall shape, e.g. `first_free` with 12 free episodes |
| **cover** | Cover image URL, CDN transform params stripped for full resolution |
| **releaseDate** | ISO-8601 — but see the honesty notes below |
| **trendRank / trendWatchSeconds** | Trending mode only |

#### Honesty notes — what this source *cannot* give you

These are measured facts about the site, not caveats-in-case. They're here so you
don't build on data that isn't there:

- **`views` is effectively dead.** Across 124 sampled English titles, **zero** had
  a non-zero view count; the site-wide maximum observed anywhere was 560. It is
  emitted as-is and must **not** be used for ranking. `trendWatchSeconds` is
  never aliased into it — different unit entirely.
- **`follows` is always `null`.** The site has no follow/subscriber concept.
  Nothing is substituted for it.
- **`cast` is always `[]`.** The field exists in the site's schema but is
  unpopulated (0 of 32 sampled titles), and its 54 actor pages 404.
- **`rating` is meaningless.** Nearly every title shows a default 4.8 with
  `ratingsCount: 0`. The count is emitted so you can see that for yourself.
- **`releaseDate` is dramawave.tv's *ingest* date**, not the original platform's
  release date.
- **The genre taxonomy is noisy** — it contains untranslated i18n placeholders,
  Portuguese names leaking into English responses, and a few person names used as
  genres. Genre slugs are **language-specific**.
- **Each language is a separate catalog.** The same drama appears once per
  language with a *different* numeric ID and a *different* localized slug. Dedupe
  on `uniqueKey`; there is no reliable cross-language join key.
- **The smaller language catalogs are not reliably in that language.** Rows served
  under e.g. `lang=ar` frequently carry Portuguese, Malay or English titles and
  English genre names. `language` faithfully reports which catalog the row came
  from — it is not a guarantee about the text. English and Portuguese, the two
  largest catalogs, are consistent.

### Modes

- **Full catalog** — pages through every title in the chosen language(s).
- **By genre** — server-side filtered by genre slug (language-specific). An
  unknown slug fails immediately with the live list of valid ones.
- **By source platform** — one originating platform's re-hosted catalog, e.g.
  `reelshort` (~2,820 English titles), `freereels` (~3,550).
- **Search** — free-text title search.
- **Trending** — the site's own top-40 ranking. ⚠️ This measures **dramawave.tv's
  own traffic**, which is tiny (the #1 title accrues roughly eight hours of total
  viewing per day). It is not a proxy for real platform popularity, and it isn't
  the default mode for that reason.
- **Specific title URLs** — scrape exactly the URLs you provide. Both
  `/{lang}/drama/{slug}` and the prefix-less Portuguese `/drama/{slug}` work.

### Cost control

`maxItems` is a hard cap — **1 stored title = 1 charge**. Turning
**Include genres, synopsis & full metadata** *off* halves the request count (the
listing endpoint alone has no synopsis or genres) for a faster, cheaper run.

### Input example

```json
{
    "mode": "creator",
    "language": ["en"],
    "creatorSlugs": ["reelshort"],
    "maxItems": 200,
    "includeDetails": true
}
```

### Output example

```json
{
    "source": "dramawave.tv",
    "platform": "FreeReels",
    "platformSlug": "freereels",
    "id": 43295,
    "uniqueKey": "en:43295",
    "title": "A Fortune Fell Into My Hands",
    "slug": "a-fortune-fell-into-my-hands",
    "url": "https://dramawave.tv/en/drama/a-fortune-fell-into-my-hands",
    "language": "en",
    "views": 0,
    "follows": null,
    "likesCount": 0,
    "episodes": 66,
    "genres": ["Identity Twist", "Revenge"],
    "tags": ["identity-twist", "revenge"],
    "primaryGenre": "Revenge",
    "releaseDate": "2026-08-21T17:31:43-03:00",
    "cast": [],
    "cover": "https://static-v1.mydramawave.com/vt/prod/cover/b9f00c4f-42d5-4aa7-9c1a-011da8046eb5.jpg",
    "description": "Poor rural student Chen Fei discovers he is the lost heir to a billion-dollar fortune…",
    "rating": 4.8,
    "ratingsCount": 0,
    "status": "ongoing",
    "audioType": "leg",
    "pricingMode": "first_free",
    "freeEpisodes": 12,
    "episodeList": [],
    "scrapedAt": "2026-08-21T21:21:33.520Z"
}
```

### Scope & compliance

- **Catalog metadata only.** The site's video-stream endpoints
  (`/api/dramas/hls`, `/api/dramas/dbx`) are **never** requested, no
  authenticated route is ever touched, and no comments or user data are collected.
- The catalog endpoints used here are **explicitly allow-listed in the site's
  `robots.txt`**. Trending is the one exception — it is not allow-listed, which is
  why it is opt-in rather than the default.
- Requests are capped at 120/minute with a default concurrency of 5, because this
  is a small single-operator site.
- Cover images are emitted as **URLs only** and are never re-hosted. They are
  hotlinked by the site from the originating platforms' CDNs and may rotate.

# Actor input Schema

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

What to scrape. **Full catalog** pages through every title in the chosen language(s). **By genre** / **By source platform** / **Search** filter that catalog server-side. **Trending** returns the site's own top-40 ranking (see the warning on that field). **Specific title URLs** scrapes only the URLs you provide.

## `language` (type: `array`):

Each language is a **separate catalog** on this site, with its own rows, its own IDs and its own localized slugs — the same drama appears once per language. Approximate title counts: en 6,570 · pt 5,650 · id 2,320 · es 1,940 · fr 1,680 · de 1,620 · tr 1,360 · it 1,280 · ro 1,270 · pl 1,170 · th 1,100 · ja 1,010 · vi 980 · zh 790 · cs 740 · ko 690 · ar 640 · ru 470 · bg 300.

## `genreSlugs` (type: `array`):

Genre **slugs**, which are language-specific — e.g. `identity-twist`, `the-comeback`, `family-drama`, `billionaire` for English; `vinganca`, `vida-urbana`, `crescimento-feminino` for Portuguese. Numeric genre IDs do **not** work. An unknown slug fails fast with the live list of valid slugs for that language.

## `creatorSlugs` (type: `array`):

Which originating platform's re-hosted catalog to scrape, by slug — e.g. `reelshort` (~2,820 English titles), `freereels` (~3,550), `pinedrama` (~200). Availability varies by language; an unknown slug fails fast with the live list.

## `searchTerms` (type: `array`):

Free-text search over titles, e.g. `billionaire` (~271 English matches). Each term is paginated independently.

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

⚠️ **Read before using.** This ranking reflects dramawave.tv's **own** traffic, which is very small (the #1 title accrues roughly eight hours of total viewing per day). It is **not** a proxy for what is trending on ReelShort, DramaBox or the DramaWave app. It also returns a fixed 40 titles with no pagination.

## `titleUrls` (type: `array`):

dramawave.tv drama URLs, e.g. https://dramawave.tv/en/drama/the-great-and-powerful-genie (Portuguese URLs have no language prefix: https://dramawave.tv/drama/ouco-o-coracao-das-donas).

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

Maximum number of titles to store. This caps your cost — 1 stored title = 1 charge.

## `includeDetails` (type: `boolean`):

Fetch each title's detail endpoint to add **synopsis, genres, status, audio type and paywall shape** — none of which exist on the listing endpoint. Costs 1 extra request per title. Turn off for a fast, cheap ID/title/cover/episode-count-only run.

## `includeEpisodeList` (type: `boolean`):

Add the full episode list (number, title, duration in seconds, free/locked). Requires "Include genres, synopsis & full metadata". Never includes video stream URLs.

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

Parallel requests. dramawave.tv is a small single-operator site — please keep this low.

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

Apify Proxy. **Not required** — this is an open public JSON API that answers direct requests fine. Enable it only if you hit rate limiting.

## Actor input object example

```json
{
  "mode": "catalog",
  "language": [
    "en"
  ],
  "genreSlugs": [
    "identity-twist"
  ],
  "creatorSlugs": [
    "reelshort"
  ],
  "searchTerms": [
    "billionaire"
  ],
  "trendingPeriod": "week",
  "titleUrls": [],
  "maxItems": 50,
  "includeDetails": true,
  "includeEpisodeList": false,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped titles in JSON.

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

All scraped titles as a CSV export.

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

Open the run and its dataset in the Apify Console.

# 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 = {
    "language": [
        "en"
    ],
    "genreSlugs": [
        "identity-twist"
    ],
    "creatorSlugs": [
        "reelshort"
    ],
    "searchTerms": [
        "billionaire"
    ],
    "titleUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalbench/dramawave-tv-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 = {
    "language": ["en"],
    "genreSlugs": ["identity-twist"],
    "creatorSlugs": ["reelshort"],
    "searchTerms": ["billionaire"],
    "titleUrls": [],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("signalbench/dramawave-tv-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 '{
  "language": [
    "en"
  ],
  "genreSlugs": [
    "identity-twist"
  ],
  "creatorSlugs": [
    "reelshort"
  ],
  "searchTerms": [
    "billionaire"
  ],
  "titleUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call signalbench/dramawave-tv-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,signalbench/dramawave-tv-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/ggCTSSvAJwGYmNLMz/builds/5CtyqS7CFRWYH2Dn5/openapi.json
