# NetEase Cloud Music Scraper (`parsebird/netease-cloud-music-scraper`) Actor

Scrape NetEase Cloud Music (网易云音乐) toplists and playlists: rank, previous rank, track, artists, album, release date, duration, popularity, explicit flag and play counts for all 64 official charts.

- **URL**: https://apify.com/parsebird/netease-cloud-music-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.79 / 1,000 track 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

### NetEase Cloud Music Scraper

NetEase Cloud Music Scraper extracts **chart rankings and playlist tracks from [NetEase Cloud Music (网易云音乐)](https://music.163.com/#/discover/toplist)**, one of China's largest music streaming apps, and returns them as clean JSON, CSV or Excel.

<table><tr>
<td style="border-left:4px solid #C20C0C;padding:12px 16px;font-weight:600">
Scrape all 64 official NetEase toplists in one run, or any public playlist by ID or link, and get the rank, previous rank, track, artists, album, release date, popularity, explicit flag and play counts on every row.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Use the Apify Actor "parsebird/netease-cloud-music-scraper" (call it via ApifyClient) to scrape NetEase Cloud Music (music.163.com, 网易云音乐) toplists and playlists. Example (JavaScript): const { ApifyClient } = require('apify-client'); const client = new ApifyClient({ token: '<APIFY_TOKEN>' }); const run = await client.actor('parsebird/netease-cloud-music-scraper').call({ playlistIds: ['19723756', '3779629', '3778678'], maxItems: 500 }); const { items } = await client.dataset(run.defaultDatasetId).listItems(); Inputs (all optional): playlistIds (array of NetEase playlist/toplist IDs or URLs such as https://music.163.com/#/playlist?id=3778678 or 163cn.tv short links; empty = all official toplists), maxItems (integer, default 10, 0 = no cap, counts track records across all playlists), maxTracksPerPlaylist (integer, default 0 = all; e.g. 10 for the top 10 of every chart). Each output row is one track in one playlist: playlistId, playlistName, playlistType (toplist/playlist), playlistUrl, playlistCoverUrl, playlistCreator, playlistCreatorId, playlistTrackCount, playlistPlayCount, playlistSubscribedCount, playlistUpdatedAt, playlistUpdateFrequency, rankPosition, previousRank, rankChange, chartNote, trackId, trackName, trackAlias, trackTranslatedName, durationMs, artists (comma-separated), artistIds (comma-separated), albumId, albumName, albumCoverUrl, publishTimeMs, releaseDate (YYYY-MM-DD, China time), trackShareUrl, mvId, mvUrl, isExplicit, feeType (free/free_low_quality/vip/album_purchase), maxAudioQuality, popularityScore (0-100), addedToPlaylistAt, snapshottedAt. API docs: https://apify.com/parsebird/netease-cloud-music-scraper/api. Get a token at https://console.apify.com/settings/integrations.
```

### What is NetEase Cloud Music Scraper?

**NetEase Cloud Music Scraper** is an [Apify Actor](https://apify.com/actors) that collects track data from **NetEase Cloud Music** (网易云音乐, music.163.com): the official charts such as 飙升榜 (Soaring), 新歌榜 (New Songs), 热歌榜 (Hot Songs), the Chinese rap chart and the NetEase copies of Billboard, UK and Oricon charts, plus any public user playlist. You don't need a NetEase account, an API key or a Chinese phone number. Click **Start** and download the results.

It works as a **NetEase Cloud Music API alternative** for two jobs:

- **Toplists (charts)**: leave the input empty to get every official NetEase toplist, with each track's current rank and, where NetEase provides it, its rank in the previous edition.
- **Playlists**: paste playlist IDs or links to get the full track list of any public playlist, including very long ones.

### What can NetEase Cloud Music Scraper do?

- 📈 **All official charts in one run**: the list of toplists is read live from NetEase, so new charts are picked up automatically (64 on October 17, 2026).
- 🔼 **Rank movement**: `previousRank` and `rankChange` show which songs climbed or dropped since the last chart update, and `chartNote` carries NetEase's own labels such as weeks on the chart.
- 📜 **Full playlists**: user playlists come back complete, not cut off at the 10 tracks NetEase's simple public playlist endpoint returns without login. A 9,205-track playlist took under 2 minutes.
- 🏷️ **Rich track data**: artists and artist IDs, album and cover, release date, duration, popularity score, explicit flag, fee type (free or VIP), best available audio quality and MV link.
- 🔗 **Flexible input**: plain IDs, music.163.com links (with or without `#/`), mobile `y.music.163.com` links and `163cn.tv` share links all work.
- 🔟 **Top N per chart**: set `maxTracksPerPlaylist` to 10 to get the top 10 of every chart and nothing else.
- ⏱️ **Platform features**: [schedule](https://docs.apify.com/platform/schedules) daily or weekly runs to build a chart history, call the Actor through the [Apify API](https://docs.apify.com/api/v2), get [webhooks](https://docs.apify.com/platform/integrations/webhooks) when a run finishes, and connect it to [Make, Zapier, n8n, Google Sheets, Slack and more](https://apify.com/integrations). Export as JSON, CSV, Excel, XML or HTML.

### What data can you extract from NetEase Cloud Music?

| Field | Description |
|-------|-------------|
| `playlistName`, `playlistId`, `playlistType` | Chart or playlist the row belongs to; `toplist` for official NetEase charts |
| `playlistPlayCount`, `playlistSubscribedCount` | Total plays and saves of the playlist |
| `playlistUpdatedAt`, `playlistUpdateFrequency` | Last update time and NetEase's schedule label (e.g. 每周四更新, updated every Thursday) |
| `rankPosition` | Position in the chart or playlist (1 = top) |
| `previousRank`, `rankChange` | Rank in the previous chart edition and places gained (negative = dropped) |
| `chartNote` | NetEase's chart label, e.g. 连续在榜17周 (17 weeks on the chart) |
| `trackName`, `trackAlias`, `trackTranslatedName` | Song title, alternative titles and translated title |
| `artists`, `artistIds` | All credited artists and their NetEase IDs |
| `albumName`, `albumId`, `albumCoverUrl` | Album and cover image |
| `releaseDate`, `publishTimeMs` | Release date (China time) and raw timestamp |
| `durationMs` | Track length in milliseconds |
| `popularityScore` | NetEase popularity score, 0–100 |
| `isExplicit` | NetEase's explicit-content flag |
| `feeType`, `maxAudioQuality` | Free / VIP / album purchase, and best quality offered (standard to hi-res) |
| `trackShareUrl`, `mvUrl` | Links to the song page and its music video |
| `addedToPlaylistAt`, `snapshottedAt` | When the track entered the playlist, and when this run read it |

### How to scrape NetEase Cloud Music

1. Open [NetEase Cloud Music Scraper](https://apify.com/parsebird/netease-cloud-music-scraper) in Apify Console and create a free Apify account if you don't have one.
2. Leave **Playlist IDs or URLs** empty to scrape every official chart, or paste chart IDs, playlist IDs or links.
3. Set **Max tracks** (0 = everything) and, if you only want the top of each chart, **Max tracks per playlist**.
4. Click **Start** and wait for the run to finish. All 64 charts take about 1.5 minutes.
5. Download the dataset as JSON, CSV, Excel or HTML, or read it through the API.

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `playlistIds` | array | `[]` | NetEase playlist or toplist IDs, or links. Empty = all official toplists |
| `maxItems` | integer | `10` | Maximum track records across all playlists. 0 = no cap |
| `maxTracksPerPlaylist` | integer | `0` | Keep only the top N tracks of each playlist. 0 = all |

Values that aren't playlist IDs or links (for example an album or song link) are skipped with a warning. Playlists that don't exist or are private are reported in the log, and the run continues with the rest.

#### Example: three charts

```json
{
    "playlistIds": ["19723756", "3779629", "3778678"],
    "maxItems": 500
}
```

#### Example: top 10 of every official chart

```json
{
    "maxItems": 0,
    "maxTracksPerPlaylist": 10
}
```

#### Example: a user playlist from a link

```json
{
    "playlistIds": ["https://music.163.com/#/playlist?id=2064374432"],
    "maxItems": 0
}
```

#### Official NetEase toplist IDs

These IDs come from NetEase's own toplist list on October 17, 2026. Some lists of chart IDs online pair the IDs with the wrong names, so check here if a chart looks off. NetEase adds and retires charts from time to time, and the scraper always uses the current list when the input is empty.

| Toplist ID | Name | Chart |
|------------|------|-------|
| 19723756 | 飙升榜 | Soaring (fastest-rising songs, daily) |
| 3779629 | 新歌榜 | New songs |
| 2884035 | 原创榜 | Original (independent artists, weekly) |
| 3778678 | 热歌榜 | Hot songs (200 tracks) |
| 991319590 | 网易云中文说唱榜 | Chinese rap |
| 14028249541 | 网易云全球说唱榜 | Global rap |
| 1978921795 | 网易云电音榜 | Electronic |
| 71384707 | 网易云古典榜 | Classical |
| 71385702 | 网易云ACG榜 | ACG (anime, comics and games) |
| 745956260 | 网易云韩语榜 | Korean |
| 5059644681 | 网易云日语榜 | Japanese |
| 2809513713 | 网易云欧美热歌榜 | Western hot songs |
| 2809577409 | 网易云欧美新歌榜 | Western new songs |
| 5059633707 | 网易云摇滚榜 | Rock |
| 5059661515 | 网易云民谣榜 | Folk |
| 5059642708 | 网易云国风榜 | Guofeng (Chinese traditional style) |
| 6723173524 | 网络热歌榜 | Internet hits |
| 9651277674 | AI歌曲榜 | AI songs |
| 60198 | 美国Billboard榜 | US Billboard |
| 180106 | UK排行榜周榜 | UK weekly chart |
| 60131 | 日本Oricon榜 | Japan Oricon |
| 3812895 | Beatport全球电子舞曲榜 | Beatport electronic dance |

The other official charts include the VIP charts, the 音乐合伙人 (music partner) charts, language charts (Russian, Vietnamese, Thai) and car-owner charts. A run with an empty input returns all of them.

### Output example

One record per track per playlist. A real row from the US Billboard chart (October 17, 2026):

```json
{
    "playlistId": 60198,
    "playlistName": "美国Billboard榜",
    "playlistType": "toplist",
    "playlistUrl": "https://music.163.com/playlist?id=60198",
    "playlistCoverUrl": "https://p1.music.126.net/rwRsVIJHQ68gglhA6TNEYA==/109951165611413732.jpg",
    "playlistCreator": "Billboard公告牌",
    "playlistCreatorId": 48171,
    "playlistTrackCount": 93,
    "playlistPlayCount": 653940224,
    "playlistSubscribedCount": 1326063,
    "playlistUpdatedAt": "2026-10-14T03:12:22.316Z",
    "playlistUpdateFrequency": "每周三更新",
    "rankPosition": 5,
    "previousRank": 10,
    "rankChange": 5,
    "chartNote": null,
    "trackId": 3345979944,
    "trackName": "Dracula (JENNIE Remix)",
    "trackAlias": null,
    "trackTranslatedName": null,
    "durationMs": 209763,
    "artists": "Tame Impala, JENNIE",
    "artistIds": "102939,12061232",
    "albumId": 360699204,
    "albumName": "Dracula (Remix)",
    "albumCoverUrl": "https://p2.music.126.net/56eOJJo5rwoiE3A2Kd8kdQ==/109951172685715168.jpg",
    "publishTimeMs": 1770307200000,
    "releaseDate": "2026-02-06",
    "trackShareUrl": "https://music.163.com/song?id=3345979944",
    "mvId": 34729195,
    "mvUrl": "https://music.163.com/mv?id=34729195",
    "isExplicit": true,
    "feeType": "vip",
    "maxAudioQuality": "exhigh",
    "popularityScore": 100,
    "addedToPlaylistAt": "2026-10-08T02:43:14.879Z",
    "snapshottedAt": "2026-10-17T05:33:51.790Z"
}
```

You can download the dataset in JSON, HTML, CSV or Excel from the Output tab, or set the input on the [Input tab](https://apify.com/parsebird/netease-cloud-music-scraper/input-schema).

### Use NetEase Cloud Music Scraper from Python or JavaScript

Install the Apify client (`pip install apify-client` or `npm install apify-client`) and use your [API token](https://console.apify.com/settings/integrations).

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")

run = client.actor("parsebird/netease-cloud-music-scraper").call(run_input={
    "maxItems": 0,
    "maxTracksPerPlaylist": 10,
})

for track in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(track["playlistName"], track["rankPosition"], track["trackName"], track["artists"], track["rankChange"])
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<APIFY_TOKEN>' });

const run = await client.actor('parsebird/netease-cloud-music-scraper').call({
    playlistIds: ['19723756', 'https://music.163.com/#/playlist?id=3778678'],
    maxItems: 300,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((t) => console.log(t.playlistName, t.rankPosition, t.trackName, t.artists));
```

### Use cases

- **Chart tracking**: schedule a daily or weekly run and store the results to follow how songs move on the Soaring, New and Hot charts over time.
- **A\&R and scouting**: spot fast risers on the Soaring and Original charts, or new names on the rap and electronic charts, before they break elsewhere.
- **Music licensing and market research**: see which Chinese, Korean, Japanese and Western songs lead in China, with artist and album credits.
- **Playlist migration**: export a NetEase playlist's track names, artists, albums and durations to rebuild it on Spotify, Apple Music or YouTube Music.
- **Data and AI projects**: build datasets of Chinese chart music with release dates, popularity and explicit flags.

### How it works

The scraper reads NetEase Cloud Music's public web endpoints, the same ones music.163.com uses, without logging in. It first loads the list of official toplists, then reads each playlist's full track ID list and fetches track details in batches of 1,000. Songs NetEase has taken down still keep their place in the playlist but have no details, so they are skipped and the run log reports how many. In that case `rankPosition` keeps the original position, so a number can be missing from the sequence. When a song has no release date of its own, the album's release date is used.

### How much does it cost to scrape NetEase Cloud Music?

NetEase Cloud Music Scraper uses pay-per-event pricing. You pay per track record saved to the dataset, and platform usage (compute and data transfer) is included in that price.

| Plan | Price per track | Price per 1,000 tracks |
|------|-----------------|------------------------|
| Free | $0.00099 | **$0.99** |
| Bronze | $0.00089 | **$0.89** |
| Silver | $0.00079 | **$0.79** |
| Gold | $0.00079 | **$0.79** |

On October 17, 2026, a run of all 64 official charts (`maxItems: 0`) saved 5,235 tracks. That costs about $5.18 on the Free plan and $4.14 on Silver or Gold. The top 10 of every chart (637 tracks, as a few charts have fewer than 10) costs about $0.63 on the Free plan. To control spend, set `maxItems` or `maxTracksPerPlaylist`. The run also stops at the maximum cost per run you set in Apify Console.

### Is it legal to scrape NetEase Cloud Music?

This Actor only reads chart and playlist information that NetEase Cloud Music shows publicly on music.163.com, without logging in. It doesn't download audio. Scraping publicly available data is generally legal, but you are responsible for how you use it and for following NetEase's terms of service, especially if you republish cover art. If you aren't sure, consult a lawyer. Read more on the [Apify blog about web scraping legality](https://blog.apify.com/is-web-scraping-legal/).

This Actor is unofficial and isn't affiliated with, endorsed by or sponsored by NetEase.

### Other music scrapers from ParseBird

- [Spotify Play Count Scraper](https://apify.com/parsebird/spotify-play-count-scraper): exact Spotify play counts, monthly listeners and followers for artists, albums and tracks.
- [SoundCloud Scraper](https://apify.com/parsebird/soundcloud-scraper): SoundCloud tracks, playlists and artist profiles with plays, likes and reposts.
- [Genius.com Scraper](https://apify.com/parsebird/genius-scraper): songs, full lyrics, credits and artist profiles from Genius.

### FAQ

**Which charts does it scrape when the input is empty?**
Every official toplist NetEase lists at the time of the run: 64 on October 17, 2026, about 5,200 tracks in total. Toplists have between 7 and 200 tracks each.

**Why is `previousRank` empty for some tracks?**
NetEase only gives a previous rank for tracks that were in the last edition of the chart, so new entries have none. For user playlists, `rankChange` is always empty because a playlist's order isn't a ranking.

**Does it return all tracks of a big playlist?**
Yes. NetEase's simple public playlist endpoint returns only 10 tracks of a user playlist without login, but this Actor reads the full track list. The largest one tested had 9,205 tracks. Songs NetEase has removed are skipped (369 in that playlist).

**What do `feeType` values mean?**
`free` = free to play, `free_low_quality` = free at standard quality with higher quality for VIP members, `vip` = NetEase VIP members only, `album_purchase` = requires buying the album.

**How accurate is `isExplicit`?**
It is NetEase's own explicit label. Most Western rap tracks carry it, but NetEase doesn't label every explicit song, so treat `false` as "not labeled".

**Can it download songs or lyrics?**
No. It returns track information only. For lyrics, try the [Genius.com Scraper](https://apify.com/parsebird/genius-scraper).

**Can I get the data through an API?**
Yes. Use the [API tab](https://apify.com/parsebird/netease-cloud-music-scraper/api) or the Python and JavaScript examples above. You can also run it from Make, Zapier or n8n.

**Something is missing or broken?**
Open an issue on the [Issues tab](https://apify.com/parsebird/netease-cloud-music-scraper/issues).

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/netease-cloud-music-scraper/changelog.md

# Actor input Schema

## `playlistIds` (type: `array`):

Add NetEase playlist or toplist IDs (e.g. 3778678) or links such as https://music.163.com/#/playlist?id=3778678. Short 163cn.tv share links work too. Leave empty to scrape all official toplists (64 charts, about 5,300 tracks).

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

Stop after this many track records across all playlists. 0 = no cap.

## `maxTracksPerPlaylist` (type: `integer`):

Keep only the top N tracks of each playlist, for example 10 to get the top 10 of every chart. 0 = all tracks.

## Actor input object example

```json
{
  "maxItems": 10,
  "maxTracksPerPlaylist": 0
}
```

# 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 = {
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/netease-cloud-music-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 = { "maxItems": 10 }

# Run the Actor and wait for it to finish
run = client.actor("parsebird/netease-cloud-music-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 '{
  "maxItems": 10
}' |
apify call parsebird/netease-cloud-music-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/netease-cloud-music-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/aIb23LqSIPPlddT7p/builds/HnZghJRoQQw9Lq5g4/openapi.json
