# Deezer Music Scraper (`zerobreak/deezer-music-scraper`) Actor

Deezer Music Scraper is a Python tool designed to extract track details, album metadata, artist profiles, playlists, and global music charts from Deezer. It exports structured music catalog data into clean CSV or JSON formats for audio analytics and market research.

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

## Pricing

from $2.99 / 1,000 results

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

## Deezer Scraper: Tracks, Artists, Albums, Playlists, Charts and ISRC Lookup (Free)

<p align="center">
  <img src="https://imgur.com/f8WxjXh.png" alt="Deezer Scraper" width="800" />
</p>

Collect and organize publicly available Deezer music catalog information, including tracks, artists, albums, playlists, charts, and catalog collections. Enrich artist records with fan counts, top tracks, discography, and related artists. Capture track ISRCs, album UPCs, labels, BPM, and release dates when available.

Charts depend on the country associated with the run's IP address. Preview links are temporary 30-second audio previews; this actor stores the URL rather than downloading the audio.

### Use Cases

- **Music marketing and A\&R:** Research artist fan counts, album counts, and related artists before outreach.
- **Playlist pitching:** Organize playlist fan counts, track counts, and creator information.
- **ISRC and UPC matching:** Match tracks using ISRCs and organize album metadata, including UPCs, labels, and release dates.
- **Chart tracking:** Collect chart entries by genre and market.
- **Music datasets:** Build structured collections of search results, discographies, and editorial selections for music research.

### What Data Does This Deezer Scraper Extract?

The actor supports several collection modes:

- **Search:** Find tracks, artists, albums, or playlists using search phrases.
- **Artists:** Collect artist details, with optional nested top tracks, discography, and related artists.
- **Albums:** Collect album information and optionally include the full track list.
- **Tracks:** Collect track metadata and support ISRC-based lookups.
- **Playlists:** Collect playlist metadata and optionally include tracks across subsequent pages.
- **Charts:** Collect chart entries for tracks, artists, albums, playlists, and podcasts, with chart positions.
- **Catalog:** Collect genres, editorial sections, and radio listings, or retrieve tracks for specified radio IDs.

Missing or unavailable records are saved as `NO_DATA` rows. Quota failures are retried and recorded as `QUOTA` if they persist. Duplicate records are removed using the record type and ID, and `maxItems` limits the number of output rows.

Example artist record:

```json
{
  "type": "artist",
  "recordKind": "artist",
  "id": 27,
  "name": "Daft Punk",
  "url": "ARTIST_PROFILE_URL",
  "albumsCount": 12,
  "fans": 5219714,
  "hasRadio": true
}
```

The output preserves `type`, `title`, and `description` alongside the dataset-friendly fields `recordKind`, `itemTitle`, and `summaryText`.

### Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | Collection mode: `search`, `artists`, `albums`, `tracks`, `playlists`, `charts`, or `catalog`. |
| `searchType` | string | `track` | Search category: `track`, `artist`, `album`, or `playlist`. |
| `queries` | array | `["daft punk"]` | Search phrases, one per line. |
| `ids` | array | Empty | Deezer IDs, Deezer URLs, short links, or ISRCs such as `GBDUW0000059`. |
| `includeTopTracks` | boolean | `true` | Include top tracks in artist records. |
| `includeAlbums` | boolean | `false` | Include an artist's discography. |
| `includeRelated` | boolean | `false` | Include related artists with their IDs, names, and fan counts. |
| `includeTracks` | boolean | `true` | Include album and playlist tracks, including subsequent pages. |
| `genreId` | integer | `0` | Chart genre ID. `0` represents all genres. |
| `chartTypes` | array | `["tracks"]` | Chart categories: `tracks`, `artists`, `albums`, `playlists`, or `podcasts`. |
| `maxItems` | integer | `200` | Maximum number of data rows, from 1 to 10,000. |
| `maxRequestsPer5s` | integer | `40` | Shared request pacing limit. Maximum allowed setting: 50 per five seconds. |
| `timeoutSecs` | integer | `300` | Maximum total run duration in seconds. |
| `requestTimeoutSecs` | integer | `30` | Timeout for an individual request. |

#### Example Input: Search for Tracks

```json
{
  "mode": "search",
  "searchType": "track",
  "queries": ["daft punk"],
  "maxItems": 50,
  "maxRequestsPer5s": 40,
  "timeoutSecs": 300,
  "requestTimeoutSecs": 30
}
```

#### Example Input: ISRC and Track Lookup

```json
{
  "mode": "tracks",
  "ids": [
    "GBDUW0000059",
    "TRACK_URL"
  ]
}
```

An ISRC and a track URL can resolve to different track IDs. If their IDs differ, both records are retained.

### Output Fields

| Field | Type | Description |
|---|---|---|
| `recordKind` | string | Record category: track, artist, album, playlist, genre, editorial, radio, or podcast. Also available as `type`. |
| `itemTitle` | string | Record title. Also available as `title`. |
| `summaryText` | string | Playlist or podcast description. Also available as `description`. |
| `id` | integer | Deezer record ID. |
| `name` | string | Artist or catalog item name. |
| `url` | string | Link to the corresponding Deezer page. |
| `isrc` | string | Track International Standard Recording Code. |
| `upc` | string | Album Universal Product Code. |
| `label` | string | Album label, when available. |
| `fans` | integer | Artist, album, or playlist fan count, when available. |
| `albumsCount` | integer | Artist album count. |
| `previewUrl` | string | Temporary 30-second preview URL, when available. |
| `releaseDate` | string | Album release date. |
| `chartPosition` | integer | 1-based position within the chart pages read. Only present on rows from `charts` mode; the field is omitted on all other rows. |
| `tracks` | array | Nested album or playlist tracks. |
| `topTracks` | array | Artist top tracks, when enabled. |
| `albums` | array | Artist discography, when enabled. |
| `related` | array | Related artist information, when enabled. |
| `error` | string | Error category: `NO_DATA`, `QUOTA`, `INVALID_INPUT`, or `HTTP_<code>`. |
| `code` | integer | Error code or HTTP status code, when available. |
| `input` | string | Original query, ID, or URL associated with an error. |

### Limits and Error Handling

#### Request Limits

The actor uses a default pacing limit of 40 requests per five seconds, with a configured maximum of 50 per five seconds. It runs at most five requests concurrently.

When quota errors occur, the actor waits between five and ten seconds before retrying, for up to five attempts. If the failure persists, the record is saved with a `QUOTA` error.

#### Search Results and Pagination

Search results may be limited even when more matching records exist. Requests for large result sets can return fewer records than expected, and pagination may stop after a few hundred results.

For broader coverage, try multiple simpler search phrases rather than complex combinations of artist and track filters.

#### Chart Localization

Chart results depend on the country associated with the run's IP address. A run originating from one country may not return the chart for another market. If you need country-specific results, configure your run's network settings accordingly.

#### Preview URLs

Preview links point to temporary 30-second audio previews and can expire. The actor stores the preview URL but does not download the audio file. Do not assume that a stored preview link will remain available indefinitely.

### FAQ

#### Why are the charts from a different country?

Chart availability depends on the country associated with the run's IP address. Check your network configuration if you need results for a particular market.

#### Why does a search return fewer records than expected?

Search results and pagination may be limited, even when additional matching records exist. Try multiple search phrases and adjust `maxItems` where appropriate.

#### How long do preview links last?

Preview links are temporary 30-second audio URLs. They may expire, so do not treat them as permanent audio assets. The actor saves the URL rather than the audio file.

#### What does an error row mean?

- `NO_DATA`: The requested record is missing or unavailable.
- `QUOTA`: A quota-related failure persisted after retries.
- `INVALID_INPUT`: The supplied input could not be processed.
- `HTTP_<code>`: Another request failure, represented by its status or error code when available.

### Trademark Notice

Deezer and its related names, logos, and trademarks belong to their respective owners. They are used in this documentation solely to identify the source of the data and do not imply affiliation, sponsorship, endorsement, or partnership.

### Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, sponsored by, or otherwise officially associated with Deezer.

### Is Web Scraping Legal?

Collecting information that is already public is generally legal. Scraping is not the same thing as hacking, and there is no single law that bans it. The limits are the usual ones: do not break into accounts, do not take private or confidential data, and be careful with personal data and copyrighted works. A site's terms can also restrict how you access it. Facts such as a public name, price, or rating are not the same thing as republishing someone's article or photo.

This actor collects information from public pages. It does not log in and it does not bypass access controls.

For a longer explanation, see Apify's article [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

# Actor input Schema

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

What to collect. Search runs a query. Artists, albums, tracks, and playlists take ids or deezer.com URLs. Charts read a genre chart. Catalog lists genres, editorial sections, and radios.

## `searchType` (type: `string`):

Which Deezer search index to use when mode is search: tracks, artists, albums, or playlists. Plain text queries work. Quoted advanced syntax often returns nothing.

## `queries` (type: `array`):

One search phrase per line, used in search mode. Example: daft punk. Results are shallow, usually a few hundred hits, and each query is paged until Deezer stops or maxItems is reached.

## `ids` (type: `array`):

One id, deezer.com URL, link.deezer.com short link, or 12-character ISRC per line. Examples: 27, https://www.deezer.com/artist/27, https://www.deezer.com/album/302127, GBDUW0000059. ISRC lookup is for tracks mode. In catalog mode these are radio ids.

## `includeTopTracks` (type: `boolean`):

In artists mode, nest Deezer's top tracks on each artist row.

## `includeAlbums` (type: `boolean`):

In artists mode, nest the artist discography (album id, title, release date, fans) on each artist row.

## `includeRelated` (type: `boolean`):

In artists mode, nest related artists as id, name, and fans.

## `includeTracks` (type: `boolean`):

In albums and playlists mode, follow the track list, including tracks.next on large playlists, and nest those tracks on the row.

## `genreId` (type: `integer`):

Genre id for charts mode. 0 means all genres. Genre ids come from catalog mode.

## `chartTypes` (type: `array`):

Which chart lists to read in charts mode. Deezer can return an empty albums chart. Podcasts are included when you select them.

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

Stop after this many data rows. Duplicate type plus id pairs are skipped and do not count twice. The free cap is 10,000.

## `maxRequestsPer5s` (type: `integer`):

Shared pace for every request in the run. Deezer's reported quota is 50 requests per 5 seconds per IP. This value is capped at 50 and defaults to 40. The actor also keeps at most 5 requests in flight.

## `timeoutSecs` (type: `integer`):

Stop the run after this many seconds. Rows already saved stay in the dataset.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for a single Deezer response before recording a failure for that call.

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

Optional proxy for Deezer requests. Charts follow the exit IP's country, so pick a country when you need a specific national chart. Leave this off to use the platform IP directly.

## Actor input object example

```json
{
  "mode": "search",
  "searchType": "track",
  "queries": [
    "daft punk"
  ],
  "ids": [
    "27",
    "https://www.deezer.com/track/3135556",
    "GBDUW0000059"
  ],
  "includeTopTracks": true,
  "includeAlbums": false,
  "includeRelated": false,
  "includeTracks": true,
  "genreId": 0,
  "chartTypes": [
    "tracks"
  ],
  "maxItems": 200,
  "maxRequestsPer5s": 40,
  "timeoutSecs": 300,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `tracks` (type: `string`):

Tracks with title, artist, album, ISRC, rank, release date, and URL.

## `artists` (type: `string`):

Artists with name, fan count, and album count.

## `albums` (type: `string`):

Albums with title, artist, UPC, label, release date, and track count.

## `playlists` (type: `string`):

Playlists with title, fans, and track count.

## `catalog` (type: `string`):

Genres, editorial sections, and radios.

## `errors` (type: `string`):

Inputs that failed, with NO_DATA, QUOTA, or HTTP status.

## `dataset` (type: `string`):

Every row from the run, without a table view applied.

# 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 = {
    "queries": [
        "daft punk"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("zerobreak/deezer-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 = {
    "queries": ["daft punk"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("zerobreak/deezer-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 '{
  "queries": [
    "daft punk"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call zerobreak/deezer-music-scraper --silent --output-dataset

```

## MCP server setup

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