# Ximalaya Scraper 喜马拉雅: Podcasts & Comments (`getascraper/ximalaya-scraper`) Actor

Scrape Ximalaya (喜马拉雅) album and episode metadata, host/creator profiles, play and subscriber counts, and paginated track comments from China's dominant podcast/audiobook platform. Direct play URLs for free tracks only - paid/VIP tracks are never bypassed.

- **URL**: https://apify.com/getascraper/ximalaya-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Social media, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.90 / 1,000 episode records

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## 🎙️ Ximalaya Scraper 喜马拉雅: Podcasts & Comments

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#FBF4F0;border:1px solid #F4DDD3;border-top:4px solid #C2410C;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Get Ximalaya album, episode, and comment data ready for your spreadsheet in minutes.</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Turn any Ximalaya (喜马拉雅) album link into structured host, catalog, and comment data, including tracks with thousands of comments spread across 100+ pages.</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F4DDD3;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#7C2D0C">💬 Full comment threads</span><br>
<span style="font-size:12px;color:#57534E">Every comment on a track, not a sample. One validated track carried 2,904 comments across 106 pages</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F4DDD3;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#7C2D0C">📻 Complete catalog</span><br>
<span style="font-size:12px;color:#57534E">Album metadata, host profile, and the full episode list in one run</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F4DDD3;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#7C2D0C">🔒 Paywall respected</span><br>
<span style="font-size:12px;color:#57534E">Play URLs for free tracks only. Paid and VIP tracks are never faked or bypassed</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #F4DDD3;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#7C2D0C">🔁 Built-in monitoring</span><br>
<span style="font-size:12px;color:#57534E">Optional incremental mode remembers the last comment seen and fetches only what's new</span>
</td>
</tr>
</table>

Give this Actor an album link, an album ID, or a track link, and it returns structured data straight from **Ximalaya (喜马拉雅)**, China's largest podcast and audiobook platform: album title, cover, category, play count, subscriber count, and host/creator profile; the full paginated episode list with duration and play counts; and full paginated comments per episode, complete with commenter nickname, avatar, likes, and replies. Built for market researchers tracking Chinese audio content, social-listening teams monitoring what listeners say about a show, and competitive intelligence analysts benchmarking creators. Runs on the Apify platform with scheduling, integrations (Make, Zapier, Google Sheets), and run monitoring built in.

### 🔍 What does Ximalaya Scraper do?

This Actor reads data directly from [ximalaya.com](https://www.ximalaya.com), the way the site's own free pages already do, and returns it as clean, structured rows.

Give it an album (专辑) link or ID and it returns the album's title, cover image, category, play count, subscriber count, tags, intro text, and the host/creator's profile (name, avatar, follower count, bio). It then walks the album's full episode (声音) list, returning each track's title, duration, play count, and creation date, plus a direct play URL for **free** tracks. Turn on comments and it also pulls every comment on each episode: text, commenter nickname and avatar, like count, reply count, and full reply threads, paginated all the way to the end.

You can also point it at a single track link for a comments-only lookup, useful for monitoring listener reaction to one episode without pulling the whole album.

### 💡 Why use Ximalaya Scraper?

- **I am a market researcher or China-media analyst** tracking podcast and audiobook trends, comparing play counts and subscriber growth across shows without opening each album by hand.
- **I am a social-listening or sentiment analyst** monitoring what listeners actually say about a show's episodes, using the full comment thread instead of a sampled handful.
- **I am a competitive intelligence analyst** benchmarking creators' play counts, subscriber counts, and catalog size across Ximalaya's top hosts.
- **I am a China-content aggregator or licensing scout** building a catalog of shows and episodes with real, current metadata instead of stale placeholder text.

### 🚀 How to use Ximalaya Scraper

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#FBF4F0;border:1px solid #F4DDD3;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#C2410C;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Add albums or tracks</span><br>
<span style="font-size:12px;color:#57534E">Paste a Ximalaya album link or ID, or a track link for a comments-only lookup.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#FBF4F0;border:1px solid #F4DDD3;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#C2410C;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Run the Actor</span><br>
<span style="font-size:12px;color:#57534E">It reads the album's own public data feed directly, no sign-in needed.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#FBF4F0;border:1px solid #F4DDD3;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#C2410C;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Export your results</span><br>
<span style="font-size:12px;color:#57534E">Download albums, episodes, and comments as one structured dataset.</span>
</td>
</tr>
</table>

### ⚙️ Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `albums` | array of strings | No | A numeric album ID (e.g. `61`) or a full album URL (e.g. `https://www.ximalaya.com/album/61`) for each album. Returns album metadata, host profile, the episode list, and (if comments are on) paginated comments per episode. |
| `tracks` | array of strings | No | A numeric track ID or a full track URL (e.g. `https://www.ximalaya.com/sound/93969607`) for each track. Ximalaya has no standalone track-metadata lookup, so a bare track only returns its comments. Requires `includeComments` to be on. For full episode details, add the parent album instead. |
| `maxEpisodes` | integer | No | Maximum number of episodes to fetch per album. Defaults to `50`. Set higher for a full catalog, lower for a quick sample. |
| `includeComments` | boolean | No | Fetch paginated comments for every episode processed, and for any bare track entries. Defaults to `true`. Required for track-only entries. |
| `maxCommentPagesPerTrack` | integer | No | Comment pages fetched per track, 20 comments per page. Defaults to `5`. Caps cost on popular tracks that can run past 100 pages. |
| `since` | string | No | Skip comments at or older than this ISO timestamp (e.g. `2026-07-01T00:00:00Z`) and stop early once older comments are reached. Leave blank to always fetch the newest comments. |
| `incrementalComments` | boolean | No | Remember the newest comment seen per track and automatically resume from there on the next run, for recurring comment-monitoring jobs. Defaults to `false`. |
| `proxyConfiguration` | object | No | Proxy routing settings. Defaults to Apify's datacenter proxy, which is sufficient for this target. |

### 📦 Output

Download the results as a spreadsheet, a table, or structured data ready for your own systems. Each run produces three kinds of rows in one dataset: albums, episodes, and comments.

Album row:

````

{
"recordType": "album",
"albumId": 61,
"title": "郭德纲于谦相声全集",
"albumUrl": "https://www.ximalaya.com/album/61",
"categoryTitle": "相声评书",
"playCount": 314125061,
"subscriberCount": 864526,
"isPaid": false,
"anchorName": "德云社郭德纲相声VIP",
"anchorFansCount": 21630164,
"anchorProfileUrl": "https://www.ximalaya.com/zhubo/1000202"
}

```

Episode row, a free track (real play URL) next to a paid track (no play URL, exactly as the platform itself serves it):

```

{
"recordType": "episode",
"trackId": 93969607,
"title": "《杂学唱》郭德纲、于谦",
"duration": 1518,
"playCount": 13217891,
"isPaid": false,
"hasFreePlayUrl": true,
"playUrl64": "http://aod.cos.tx.xmcdn.com/group44/M02/77/1D/wKgKjFsiJ1yA4OFoALlgkb6HsOM878.mp3"
}

```
```

{
"recordType": "episode",
"trackId": 610848482,
"title": "我有五个大佬师兄001-救了个人",
"duration": 483,
"playCount": 60882,
"isPaid": true,
"hasFreePlayUrl": false
}

```

Comment row:

```

{
"recordType": "comment",
"commentId": 1030139445,
"trackId": 93969607,
"content": "\[酷]",
"nickname": "Cu橙子",
"likes": 1,
"replyCount": 0,
"commentTime": "2026-06-21T16:01:15.000Z",
"permalink": "https://www.ximalaya.com/sound/93969607/1030139445/"
}

````

### 📊 Output data fields

| Field | Type | Description |
| --- | --- | --- |
| `recordType` | string | `album`, `episode`, or `comment`. Use this to filter the dataset by row type. |
| `albumId` / `title` / `albumUrl` | number / string | Album ID, title, and canonical URL. |
| `coverUrl` | string | Album cover image URL. |
| `categoryId` / `categoryTitle` | number / string | Content category, such as 相声评书 (comedy/storytelling) or 有声书 (audiobook). |
| `tags` | array of strings | Album tags, when set. |
| `shortIntro` | string | Short album description. |
| `playCount` / `subscriberCount` | number | Total plays and subscribers for the album. |
| `isPaid` | boolean | Whether the album (or, on an episode row, the track) is paid content. |
| `createDate` / `updateDate` | string | Album creation and last-update date. |
| `anchorUid` / `anchorName` / `anchorProfileUrl` | number / string | Host/creator ID, display name, and profile link. |
| `anchorAvatarUrl` / `anchorFansCount` / `anchorPersonalSignature` / `anchorTracksCount` / `anchorAlbumsCount` | string / number / string / number / number | Host profile enrichment: avatar, follower count, bio, and total tracks/albums published. |
| `trackId` / `albumTitle` / `trackUrl` | number / string | Episode ID, parent album title, and canonical URL. |
| `duration` | number | Episode length in seconds. |
| `orderNo` | number | Episode position within the album. |
| `isFree` / `isVideo` | boolean | Free-listen and video-episode flags, as reported by Ximalaya. |
| `createdAt` | string | Episode publish timestamp. |
| `playUrl64` / `playUrl32` / `playUrlAacv164` / `playUrlAacv224` | string | Direct play URLs. Present **only** for free tracks; omitted entirely for paid/VIP tracks, never faked. |
| `hasFreePlayUrl` | boolean | `true` when at least one play URL above is present. The reliable way to check the free/paid boundary. |
| `commentId` / `content` / `createAtText` / `commentTime` | number / string | Comment ID, text, the site's own relative/date label, and a parsed ISO timestamp. |
| `nickname` / `avatarUrl` | string | Commenter's public display name and avatar. |
| `likes` / `replyCount` / `replies` | number / number / array of objects | Like count, reply count, and reply thread (each with `content`, `nickname`, `commentTime`). |
| `permalink` | string | Direct link to the comment. |
| `scrapedAt` | string | Timestamp when this row was collected. |

### 💰 Pricing

This Actor uses pay-per-result pricing: you pay for the rows you actually get back, and nothing for an empty run. There is no subscription and no minimum spend. Use `maxEpisodes` and `maxCommentPagesPerTrack` to control run size, and turn off `includeComments` for a lighter, faster run when you only need catalog data.

### ⭐ Enjoying Ximalaya Scraper 喜马拉雅: Podcasts & Comments?

<table width="100%">
<tr>
<td style="padding:20px 24px 14px;background:#FBF4F0;border:1px solid #F4DDD3;border-left:5px solid #C2410C;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">Getting a full picture of a show's audience without reading every comment by hand?</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other researchers and social-listening teams tracking Chinese audio content find it. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#C2410C;border:1px solid #F4DDD3;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/ximalaya-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### ✨ Tips

- Paste either the album's numeric ID or its full ximalaya.com link, both work identically.
- Turn off `includeComments` for a faster run when you only need catalog metadata.
- Lower `maxCommentPagesPerTrack` for a light sample; a single popular episode can carry over 100 pages of comments.
- Turn on `incrementalComments` and re-run on a schedule to catch new comments only, instead of re-fetching the same history every time.
- A missing `playUrl64` on an episode row means the track is paid or VIP content, not a scraping error. This Actor never bypasses Ximalaya's own paywall.

### ❓ FAQ, disclaimers, and support

##### Does it get blocked?

Ximalaya's public data endpoints did not show rate-limiting or bot-detection during testing, so this Actor runs on standard datacenter proxy routing by default. A residential proxy option is available in the input if you ever see blocking in your own runs.

##### Does it extract paid or VIP audio?

No, and it never will. Free tracks return a working play URL because Ximalaya's own servers serve one anonymously. Paid and VIP-priced tracks return nothing in that field, exactly matching what an anonymous visitor sees on the site. `hasFreePlayUrl` tells you which case you're looking at for each episode.

##### How fresh is the data?

Every run reads the album, episode, and comment data directly at run time. There is no cached or stale data.

##### 喜马拉雅评论怎么爬取? (How do I scrape Ximalaya comments?)

Add the track's link or ID to the `tracks` field, or add its parent album to `albums` with `includeComments` on. The Actor returns every comment on the episode, including nickname, like count, and replies, paginated to the end (or to your page cap).

##### 如何获取喜马拉雅专辑数据? (How do I get Ximalaya album data?)

Paste the album's link or numeric ID into the `albums` field and run the Actor. It returns the album's title, category, play count, subscriber count, host profile, and full episode list in one structured dataset.

##### Is scraping Ximalaya data legal?

This Actor only reads data that Ximalaya's own free, logged-out pages already serve publicly, and it never accesses or bypasses paid content. That said, Ximalaya's terms of service name automated scraping tools as a prohibited way to collect platform content, which is stricter language than many sites use. This Actor does not evade that restriction technically, it simply reads open data the same way a browser does. You are responsible for reviewing Ximalaya's Terms of Service and deciding whether your specific use case complies with it before relying on this Actor for production use.

##### Found a bug or need a field added?

Open an issue on the Actor's **Issues** tab. Custom solutions are available on request.

### 🔗 Other actors

- [Kugou Music Scraper: 酷狗音乐 Catalog, Charts & Lyrics](https://apify.com/getascraper/kugou-music-scraper) ↗ - scrapes song catalog, chart, and lyrics data from Kugou Music.
- [Xigua Video Search Scraper: Keyword, Comments & Video Links](https://apify.com/getascraper/xigua-video-search-scraper) ↗ - searches Xigua Video by keyword and returns video links and comments.
- [che168 Used Car Scraper: Autohome 二手车 Listings, Dealer Profiles & Phone Reveals](https://apify.com/getascraper/che168-car-scraper) ↗ - scrapes used-car listings and dealer profiles from China's largest car marketplace.
- [Lianjia Scraper: Resale Listings, Price, Community](https://apify.com/getascraper/lianjia-real-estate-scraper) ↗ - scrapes resale apartment listings, pricing, and community data from Lianjia.

# Actor input Schema

## `albums` (type: `array`):

One entry per album: a numeric album ID (e.g. 61) or a full ximalaya.com album URL (e.g. https://www.ximalaya.com/album/61). Returns album metadata, host/creator profile, the paginated episode list, and (if enabled below) paginated comments per episode.
## `tracks` (type: `array`):

One entry per track/episode: a numeric track ID or a full ximalaya.com track URL (e.g. https://www.ximalaya.com/sound/93969607). Ximalaya has no standalone track-metadata endpoint, so a bare track only yields its comments (requires "Include comments" enabled below) - for full episode metadata, look up the parent album instead.
## `maxEpisodes` (type: `integer`):

Maximum number of episodes/tracks to fetch and output per album, paginated 20 at a time from the source API. Set high to fetch a whole catalog; set low for a quick sample.
## `includeComments` (type: `boolean`):

Fetch paginated comments for every episode processed from albums, and for any bare track entries above. Required for track-only entries - it's the only data obtainable for a track without its parent album.
## `maxCommentPagesPerTrack` (type: `integer`):

Comment pages fetched per track (20 comments/page). Caps compute cost on popular tracks - one validated track alone had 106 pages of comments. Lower this for a lighter sample, raise it (or use incremental monitoring below) to go deeper over multiple runs.
## `since` (type: `string`):

Skip comments at or older than this date/time, and stop paginating a track's comments once older comments are reached. Leave blank to fetch the newest comments up to the page cap above on every run.
## `incrementalComments` (type: `boolean`):

Remember the newest comment timestamp seen per track (in this Actor's key-value store) and automatically resume from there on the next run - a "since last run" mode for recurring comment/sentiment monitoring. Combine with a schedule for ongoing monitoring.
## `proxyConfiguration` (type: `object`):

Datacenter proxy is the default and expected to be sufficient. Switch to residential only if you observe blocking in production.

## Actor input object example

```json
{
  "albums": [
    "https://www.ximalaya.com/album/61"
  ],
  "tracks": [],
  "maxEpisodes": 5,
  "includeComments": true,
  "maxCommentPagesPerTrack": 1,
  "incrementalComments": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
````

# Actor output Schema

## `albumsEpisodesComments` (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 = {
    "albums": [
        "https://www.ximalaya.com/album/61"
    ],
    "maxEpisodes": 5,
    "includeComments": true,
    "maxCommentPagesPerTrack": 1,
    "incrementalComments": false,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/ximalaya-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 = {
    "albums": ["https://www.ximalaya.com/album/61"],
    "maxEpisodes": 5,
    "includeComments": True,
    "maxCommentPagesPerTrack": 1,
    "incrementalComments": False,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

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

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

```

## CLI example

```bash
echo '{
  "albums": [
    "https://www.ximalaya.com/album/61"
  ],
  "maxEpisodes": 5,
  "includeComments": true,
  "maxCommentPagesPerTrack": 1,
  "incrementalComments": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call getascraper/ximalaya-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=getascraper/ximalaya-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Ximalaya Scraper 喜马拉雅: Podcasts & Comments",
        "description": "Scrape Ximalaya (喜马拉雅) album and episode metadata, host/creator profiles, play and subscriber counts, and paginated track comments from China's dominant podcast/audiobook platform. Direct play URLs for free tracks only - paid/VIP tracks are never bypassed.",
        "version": "0.1",
        "x-build-id": "thNvETk2YZSQ9edX2"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/getascraper~ximalaya-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-getascraper-ximalaya-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/getascraper~ximalaya-scraper/runs": {
            "post": {
                "operationId": "runs-sync-getascraper-ximalaya-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/getascraper~ximalaya-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-getascraper-ximalaya-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "albums": {
                        "title": "Albums (ID or URL)",
                        "type": "array",
                        "description": "One entry per album: a numeric album ID (e.g. 61) or a full ximalaya.com album URL (e.g. https://www.ximalaya.com/album/61). Returns album metadata, host/creator profile, the paginated episode list, and (if enabled below) paginated comments per episode.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "tracks": {
                        "title": "Tracks (ID or URL) - comments only",
                        "type": "array",
                        "description": "One entry per track/episode: a numeric track ID or a full ximalaya.com track URL (e.g. https://www.ximalaya.com/sound/93969607). Ximalaya has no standalone track-metadata endpoint, so a bare track only yields its comments (requires \"Include comments\" enabled below) - for full episode metadata, look up the parent album instead.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxEpisodes": {
                        "title": "Max episodes per album",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of episodes/tracks to fetch and output per album, paginated 20 at a time from the source API. Set high to fetch a whole catalog; set low for a quick sample.",
                        "default": 10
                    },
                    "includeComments": {
                        "title": "Include comments",
                        "type": "boolean",
                        "description": "Fetch paginated comments for every episode processed from albums, and for any bare track entries above. Required for track-only entries - it's the only data obtainable for a track without its parent album.",
                        "default": true
                    },
                    "maxCommentPagesPerTrack": {
                        "title": "Max comment pages per track",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Comment pages fetched per track (20 comments/page). Caps compute cost on popular tracks - one validated track alone had 106 pages of comments. Lower this for a lighter sample, raise it (or use incremental monitoring below) to go deeper over multiple runs.",
                        "default": 2
                    },
                    "since": {
                        "title": "Only comments after",
                        "type": "string",
                        "description": "Skip comments at or older than this date/time, and stop paginating a track's comments once older comments are reached. Leave blank to fetch the newest comments up to the page cap above on every run."
                    },
                    "incrementalComments": {
                        "title": "Incremental comment monitoring",
                        "type": "boolean",
                        "description": "Remember the newest comment timestamp seen per track (in this Actor's key-value store) and automatically resume from there on the next run - a \"since last run\" mode for recurring comment/sentiment monitoring. Combine with a schedule for ongoing monitoring.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Datacenter proxy is the default and expected to be sufficient. Switch to residential only if you observe blocking in production.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
