# Kuku TV & Kuku FM Show Details & Episodes API (`spider_studio/kuku-tv-series-detail`) Actor

Extract Kuku TV (Kuku FM) show details and every released episode by show ID: genres, tropes, cast, ratings, and episode lists. Export via API or Dataset.

- **URL**: https://apify.com/spider_studio/kuku-tv-series-detail.md
- **Developed by:** [Tarique](https://apify.com/spider_studio) (community)
- **Categories:** Automation, Social media, Videos
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 successful show ids

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

### Kuku TV and Kuku FM show details and episode list scraper API

**Kuku TV & Kuku FM Show Details & Episodes API** is a **Kuku TV series detail scraper** for [Kuku FM](https://kukufm.com/) audio series and short-drama reels. Submit up to 1,000 show IDs and receive structured show metadata: titles, synopses, genres, tropes, episode and season counts, cast and crew, ratings, age ratings, and cover art. Flip `includeEpisodes` on to add the complete released episode list in the same run.

It works as a Kuku TV API alternative for catalog enrichment, content research, and metadata pipelines. No Kuku FM account, login, or app installation is required.

### Why use this Kuku TV series scraper?

- Resolve up to 1,000 Kuku TV `showId` values into complete show metadata in one run.
- Optionally pull every released episode of a show, in order, from a single `showId` — no separate episode-ID lookup needed.
- Capture genres, tropes, content descriptors, and age ratings for editorial classification.
- Collect flattened cast and crew groups with IDs, roles, and follower counts.
- Receive one Dataset item per show with the complete raw payload preserved.
- Export results to JSON, CSV, Excel, XML, or HTML.
- Integrate with the Apify API, schedules, webhooks, Make, n8n, or cloud storage.

Typical use cases include **Kuku TV show metadata extraction**, Kuku FM catalog research, genre and trope analysis, content moderation metadata, and building a normalized series database.

### What Kuku TV show data can the API extract?

| Field | Type | Description |
| --- | --- | --- |
| `showId` | integer or null | Kuku TV show ID. |
| `success` | boolean | Whether the row is a successfully retrieved show. |
| `slug` | string or null | URL slug of the show. |
| `title` | string or null | Show title. |
| `description` | string or null | Primary synopsis. |
| `descriptionSecondary` | string or null | Alternate synopsis returned by the API. |
| `authorName` | string or null | Author or creator name. |
| `language` | string or null | Language slug. |
| `languageLabel` | string or null | Language name in its own script. |
| `contentType` | string or null | Content type, such as `Series`. |
| `genre` | string or null | Primary genre, such as `Thriller`. |
| `tropes` | array | Story tropes, such as `Contract Marriage`. |
| `episodeCount` | integer or null | Number of released episodes. |
| `totalEpisodeCount` | integer or null | Released episodes plus unreleased placeholder cards. |
| `unreleasedEpisodeCount` | integer or null | Unreleased placeholder cards the show advertises. |
| `hasArtificialScarcity` | boolean or null | Whether the show pads its list with unreleased placeholders. |
| `seasonCount` | integer or null | Number of seasons. |
| `durationSeconds` | integer or null | Total runtime in seconds. |
| `listenCount` | integer or null | Lifetime listen count. |
| `commentCount` | integer or null | Comment count reported for the show. |
| `reviewCount` | integer or null | Review count. |
| `overallRating` | number or null | Average rating when the show has reviews. |
| `ageRating` | string or null | Age rating, such as `A`. |
| `contentDescriptors` | array | Advisory descriptors, such as `Strong Language`. |
| `isPremium` | boolean or null | Whether the show is a premium title. |
| `isReel` | boolean or null | Whether the show is a vertical short-drama reel. |
| `isFictional` | boolean or null | Whether the show is marked as fiction. |
| `isSafeForKids` | boolean or null | Whether the show is marked safe for children. |
| `isAdultContent` | boolean or null | Whether the show is marked adult content. |
| `isVerified` | boolean or null | Whether the creator is verified. |
| `monetizationType` | string or null | Monetization model, such as `coin_ads` or `subscription`. |
| `completionStatus` | string or null | Publish status label, such as `Ongoing` or `Completed`. |
| `publishedOn` | string or null | First publication timestamp. |
| `coverImageUrl` | string or null | Original cover image URL. |
| `thumbnailUrl` | string or null | Portrait thumbnail URL. |
| `shareImageUrl` | string or null | Social share image URL. |
| `dynamicLink` | string or null | Kuku FM short link. |
| `credits` | object or null | Cast and crew flattened by the groups the API returned, for every group with members. |
| `creditCounts` | object or null | Number of people in each credit group, including empty groups. |
| `uri` | string or null | Kuku TV deep link, such as `app://kukufm/show/...`. |
| `webUrl` | string or null | Public `kukufm.com` show URL. |
| `episodes` | array or null | Released episodes in show order, or `null` when `includeEpisodes` is `false`. |
| `episodesReturned` | integer or null | Number of episodes in `episodes`. |
| `episodesHasMore` | boolean or null | Whether the API signalled further episode pages. |
| `episodePages` | integer or null | Total episode pages the API reports for this show. |
| `episodePagesFetched` | integer or null | Episode pages this run actually fetched. |
| `firstLockedEpisodeTitle` | string or null | Title of the first locked episode. |
| `lastUnlockedEpisodeIndex` | integer or null | Index of the last unlocked episode. |
| `unreleasedSkipped` | integer or null | Placeholder cards skipped while building `episodes`. |
| `data` | object or null | Complete raw show payload exactly as the API returned it. |
| `error` | string or null | Error message for a failed show ID. |

Credit group names differ per show, so `credits` and `creditCounts` are derived from whatever the API returns. Observed groups include `casts`, `producers`, `writers`, `lead_writers`, `directors`, `video_creators`, and `dubbing_studios`. Each person is `{id, name, role, isPrimary, followerCount}`.

### How to get Kuku TV show details by ID

1. Open the Actor's **Input** tab.
2. Add one or more numeric show IDs to `showIds`. Use the `showId` returned by the Kuku TV Search Actor, or the trailing number of a `kukufm.com/show/...` URL.
3. Turn `includeEpisodes` on only when you also want the episode list; each episode record is billed separately.
4. Click **Start**.
5. Open the Dataset to inspect, filter, download, or integrate the results.

### How much does Kuku TV show detail extraction cost?

Two events are charged. FREE-tier users pay **$4 per 1,000 successfully resolved show IDs** ($0.004 per show) and **$3 per 1,000 episode records** ($0.003 per episode). Users on BRONZE, SILVER, GOLD, PLATINUM, and DIAMOND tiers pay **$3 per 1,000 shows** ($0.003) and **$2 per 1,000 episode records** ($0.002 per episode).

`includeEpisodes` is off by default, so a metadata-only run charges one show event per ID. Turning it on charges one `episode` event per released episode record returned in the `episodes` array. Diagnostic rows with `success: false`, unreleased placeholder cards, and duplicate input IDs are never charged.

Example: a 56-episode show with the episode list enabled costs $0.003 + 56 × $0.002 = $0.115 on a paid tier, versus $0.003 without it.

There is no monthly result cap. Paid Apify platform usage for the run — compute and proxy bandwidth — is billed separately by Apify.

### Input

See the **Input** tab for all options. `showIds` accepts up to 1,000 numeric IDs. Duplicates are ignored while their first-seen order is preserved. `includeEpisodes` defaults to `false`, so a metadata-only run never pays for the episode list.

```json
{
  "showIds": ["282775", "277495", "274988"],
  "includeEpisodes": false
}
```

### Output

You can download the Dataset in formats such as JSON, HTML, CSV, or Excel.

```json
{
  "showId": 282775,
  "success": true,
  "slug": "the-billionaire-mafia-king-who-bought-his-bride",
  "title": "The Billionaire Mafia King Who Bought His Bride",
  "authorName": "Subhajit Chatterjee",
  "language": "english",
  "languageLabel": "English",
  "contentType": "Series",
  "genre": "Thriller",
  "tropes": ["Contract Marriage", "Marriage Drama", "Mistaken Identity"],
  "episodeCount": 56,
  "seasonCount": 1,
  "listenCount": 828771,
  "ageRating": "A",
  "isPremium": true,
  "monetizationType": "coin_ads",
  "completionStatus": "Ongoing",
  "credits": {"producers": [{"id": 243264762, "name": null, "role": "producer", "isPrimary": false, "followerCount": null}]},
  "creditCounts": {"producers": 1},
  "webUrl": "https://kukufm.com/show/the-billionaire-mafia-king-who-bought-his-bride",
  "episodeCount": 56,
  "totalEpisodeCount": 56,
  "unreleasedEpisodeCount": 0,
  "episodesReturned": 56,
  "episodePagesFetched": 1,
  "unreleasedSkipped": 0,
  "episodes": [
    {"episodeId": 1685164, "index": 1, "seasonNo": 1, "title": "Episode 1", "durationSeconds": 134, "isLocked": false, "coinsToUnlock": 10}
  ],
  "error": null
}
```

### Kuku TV show detail use cases

- Enrich a `showId` list collected from Kuku TV search with full metadata.
- Pull every episode of a show in order, then hand individual `episodeId` values to the Episode Details or Episode Comments Actors.
- Classify a catalog by genre, trope, age rating, and content descriptors.
- Track episode and season counts across releases.
- Build a normalized Kuku FM series database for analytics or AI training sets.
- Feed cast and crew graphs into entity-resolution or creator-monitoring tooling.

### Related Kuku TV Actors

| Actor | Purpose |
| --- | --- |
| [Kuku TV & Kuku FM Show Search Scraper API](https://apify.com/spider_studio/kuku-tv-search) | Discover `showId` values by keyword, genre, or trope. |
| [Kuku TV & Kuku FM Episode Details & Video URL API](https://apify.com/spider_studio/kuku-tv-episode-detail) | Resolve an `episodeId` from this Actor's `episodes` array into the full per-episode record. |
| [Kuku TV & Kuku FM Episode Comments Scraper API](https://apify.com/spider_studio/kuku-tv-episode-comments) | Export the public comments and listener profiles behind each episode. |
| [Kuku TV & Kuku FM Episode Video Downloader API](https://apify.com/spider_studio/kuku-tv-episode-download-kvs) | Download each episode and store a playable MP4 plus a metadata sidecar in the run's Apify Key-value store. |

Also from the same publisher: [Hongguo short-drama Actors](https://apify.com/spider_studio/hongguo-series-detail) for the Hongguo Duanju catalog.

### Frequently asked questions

#### Where do I find Kuku TV show IDs?

Use the **Kuku TV & Kuku FM Show Search Scraper API**, which returns a `showId` for every matching show. The numeric ID also appears at the end of a `kukufm.com/show/...` page URL.

#### Do I need a Kuku TV or Kuku FM account?

No. Every endpoint used by this Actor is public, so no login, token, or app installation is required.

#### Why is `overallRating` sometimes null?

Kuku TV only populates the rating after a show has reviews. Shows with `reviewCount: 0` return `null`.

#### Why do credit groups differ between shows?

The upstream API returns different credit groups per show. The Actor discovers the groups dynamically, exposes every group with members in `credits`, and reports every group count in `creditCounts`.

#### Does this Actor include the episode list?

Only when you ask for it. `includeEpisodes` defaults to `false`, so a default run returns show metadata alone. Set it to `true` and each show row also carries an `episodes` array with every released episode in show order, plus `episodeCount`, `episodesReturned`, `episodePagesFetched`, `firstLockedEpisodeTitle`, and `lastUnlockedEpisodeIndex`.

#### Why is `episodeCount` smaller than `totalEpisodeCount`?

`totalEpisodeCount` includes the unreleased placeholder cards that some shows pad their list with, labelled "Releasing Tomorrow" in the Kuku FM apps. `episodeCount` counts only episodes that actually exist. A measured example: one show reports `episodeCount: 481`, `totalEpisodeCount: 941`, and `unreleasedEpisodeCount: 460`.

#### Why are some advertised episodes missing from `episodes`?

Those entries are `artificially_scarce` placeholder cards: they have an ID, a title, and a release tag, but no duration, no artwork, no lock state, and no season. Their IDs return HTTP 404 from the single-episode endpoint, so the Actor counts them in `unreleasedEpisodeCount` and `unreleasedSkipped` instead of listing them. Every ID in `episodes` is a real episode.

#### Does the episode list cost extra?

Yes. The episode list is billed as a second event, one `episode` event per released episode record returned. That is why it is off by default: a metadata-only run costs one show event per ID, while enabling the episode list adds $3 per 1,000 episode records on a FREE-tier account and $2 per 1,000 on a paid tier.

#### Do the episodes include playable URLs?

No. The episode-list endpoint returns an empty `videoUrl` for anonymous callers, so the Actor does not publish a `videoUrl` column in this Actor. Each episode carries an `audioUrl` and artwork. Use the Episode Details Actor when you need the full per-episode record.

#### Can I request more than 1,000 shows in one run?

Split larger catalogs across multiple runs or use the Apify API to start the Actor with several input batches.

### Legal use and support

Use the Actor lawfully and respect Kuku FM's terms, copyright, rate limits, privacy rules, and applicable law. It is intended for public catalog information and does not access private user accounts.

Use the **Issues** tab for support and the **API** tab for generated integration examples.

# Actor input Schema

## `showIds` (type: `array`):

Numeric Kuku TV show IDs to resolve. Use the `showId` field returned by the Kuku TV Search Actor, or the trailing number of a kukufm.com/show/ URL. Duplicates are ignored while order is preserved.

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

Also fetch every released episode of each show into the `episodes` array. Each episode record is charged as an extra `episode` event, so leave this off when you only need show metadata. Unreleased placeholder cards are counted in `unreleasedEpisodeCount` instead of being listed, because their IDs are not resolvable episodes.

## Actor input object example

```json
{
  "showIds": [
    "282775",
    "277495"
  ],
  "includeEpisodes": false
}
```

# Actor output Schema

## `dataset` (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 = {
    "showIds": [
        "282775",
        "277495"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("spider_studio/kuku-tv-series-detail").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 = { "showIds": [
        "282775",
        "277495",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("spider_studio/kuku-tv-series-detail").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 '{
  "showIds": [
    "282775",
    "277495"
  ]
}' |
apify call spider_studio/kuku-tv-series-detail --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,spider_studio/kuku-tv-series-detail"
        }
    }
}
```

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/b9KwP7Kcu0E52oSx1/builds/7NpZTZDtR6OHFbkbv/openapi.json
