Deezer Scraper - Tracks, Albums, Artists, Playlists & Lyrics
Pricing
from $1.20 / 1,000 catalog records
Deezer Scraper - Tracks, Albums, Artists, Playlists & Lyrics
Scrape Deezer by keyword or URL. Extract tracks, albums, artists, playlists, lyrics, radios, charts and public profiles. Get BPM, ISRC, contributors, release dates, availability, full tracklists, artist top tracks and discographies.
Pricing
from $1.20 / 1,000 catalog records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
5
Total users
2
Monthly active users
12 days ago
Last modified
Categories
Features
Share
Deezer Scraper: Music Catalog, Tracks, Albums, Artists, Playlists & Charts
Deezer Scraper turns Deezer's music catalog into a clean JSON API. Search tracks, albums, artists, playlists, radios and public user profiles by keyword, read the global or per-genre charts, or paste any Deezer link and get the full record: complete album and playlist track listings, artist top tracks and discographies, per-track BPM, ISRC, contributors and release dates, fan counts, chart positions, and optional lyrics with line and word timing. Export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- Two ways in. Search by keyword (six entity types), or paste any Deezer link (track, album, artist, playlist, radio, genre or public profile) and the actor picks the right read.
- Full track listings, not truncated samples. Albums and playlists return the collection record plus one row per track, walked across every result page (a 1,075-track playlist was verified to come back complete, not cut at the first hundred).
- Per-track depth on demand. In search mode, switch on detail enrichment to add BPM, the full contributor list, ISRC, release date, disk and track positions, and the per-country availability list - billed per track only when you use it.
- Charts per genre. Read the global or per-genre charts for tracks, albums, artists or playlists in one run.
- Lyrics in any mode. Add plain lyrics, time-synced LRC lines, word-level karaoke timing, songwriters and publishers to every track row, billed only where lyrics were found.
- Built for schedules. Incremental mode returns only new and changed records on recurring runs, and a refused run fails loudly instead of returning an empty dataset.
Use Cases
- Music analytics: build catalogs of tracks, albums and artists with popularity rank, fan counts and chart positions for trend research.
- Playlist monitoring: walk any public playlist on a schedule and get only the tracks added, removed or reordered since the last run.
- Catalog enrichment: attach BPM, ISRC, contributors and release metadata to your own music database.
- Chart tracking: follow the global or per-genre charts daily and diff what moved.
- Content and media tooling: feed previews, cover art and canonical links into apps, bots or newsletters.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
id | "track:3135556" (prefixed with the entity type so mixed runs stay unique) |
deezerType | "track" (also "album", "artist", "playlist", "user", "radio") |
title | "One More Time" |
url | Deezer link to the record |
durationSec | 320 |
artistName / artistId / artistUrl | "Daft Punk" / 27 / artist link |
artistFans | 4500000 |
albumTitle / albumId / albumUrl | "Discovery" / 302127 / album link |
bpm / gain | 122.7 / -9.2 (detail enrichment) |
isrc | "GBDUW0000059" (detail enrichment) |
releaseDate | "2001-03-07" |
contributorNames | ["Daft Punk"] (detail enrichment) |
availableCountries | ["US", "GB", "DE", ...] (detail enrichment) |
trackIds / trackTitles | the collection's full track listing, in order |
collectionContext | "Discovery" (the album or playlist a walked track came from) |
genres | ["Dance", "Electronic"] |
previewUrl | 30-second MP3 preview |
explicitLyrics | false |
lyricsStatus | "found", "not_found" or "failed" (Include lyrics on; empty otherwise) |
lyrics | full lyrics as plain text |
lyricsSynced | time-synced lyrics in LRC format: "[00:00.02]Work it, make it\n..." |
lyricsSyncType | "word", "line" or "none": the timing Deezer has for the song |
lyricsWords | word-level timing, per line: [{"startMs": 9825, "endMs": 13625, "line": "Time stood still", "words": [{"startMs": 9825, "endMs": 9862, "word": "Time"}, ...]}] (word timing on) |
changeType / changedFields / firstSeenAt / lastSeenAt | incremental mode only |
Album rows also carry label, copyright and albumTrackCount; playlist rows carry description, fans and creatorName; artist rows carry artistAlbumCount. Every row records the sourceQuery or chartGenreId that produced it and detailFetched, and lyrics rows add lyricsWriters and lyricsCopyright.
How to Use
- Pick a mode:
search(keyword or charts) orurl(paste links). - Fill in that mode's section: keywords, entity type and charts for search; links and collection depth for URL mode. Filters and sorting apply in both. Switch on detail enrichment if you need BPM, ISRC and contributors on search results.
- Set Max records to control run size and cost, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it through the API.
Search for tracks with full detail:
{"mode": "search","queries": ["daft punk"],"searchType": "track","fetchDetails": true,"maxItems": 50}
Read the global chart for artists:
{"mode": "search","source": "chart","searchType": "artist","chartGenreId": 0,"maxItems": 100}
Walk a playlist's complete track listing:
{"mode": "url","urls": ["https://www.deezer.com/playlist/3155776842"],"maxItems": 500}
Paste an album and an artist, discography included:
{"mode": "url","urls": ["https://www.deezer.com/album/302127","https://www.deezer.com/artist/27"],"includeArtistReleases": true}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/deezer-com-scraper").call(run_input={"mode": "url","urls": ["https://www.deezer.com/album/302127"],})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["deezerType"], item["title"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/deezer-com-scraper').call({mode: 'search',queries: ['daft punk'],searchType: 'track',fetchDetails: true,maxItems: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
What URL mode returns for each link type
| Pasted link | Rows returned |
|---|---|
| Track | one fully detailed track row (that read is the fetch itself, so no surcharge) |
| Album | the album row (label, copyright, genres, full track ids/titles) plus one row per track |
| Artist | the artist row plus their top tracks; optionally the full discography (includeArtistReleases) |
| Playlist | the playlist row (description, fans, creator, full track ids/titles) plus one row per track, walked across every page |
| Radio | the station row plus its current track list |
Chart (/channels/charts, /chart/<genre>/tracks) or genre link | the tracks chart for that genre |
Genre channel page (/channels/<genre>, e.g. /channels/rap) | the genre name is matched to a Deezer catalog genre ("rap" is Rap/Hip Hop) and the tracks chart for that genre is returned; a name that matches no genre is skipped with a warning that says to use Source=Charts with a Genre id |
Search link (/search/<words> or ?q=) | the search results for those words, using the selected entity type |
Artist albums link (/artist/<id>/albums?index=N) | the artist's albums from offset N (a partial scope, never treated as complete) |
Public user profile (/user/<id> or /profile/<id>) | the profile; optionally their public playlists (includeUserCollections) |
Genre radio mix (/mixes/genre/<id>) | read as radio station <id>: the station row plus its current track list |
Links the actor cannot read (podcast shows and episodes, deezer.page.link share links: open the share link in a browser and paste the full deezer.com link) are skipped with a warning in the log, never silently. The Deezer URLs field now ships with a default list of 16 sample links, one per supported link shape. If you switch to URL mode and leave the field untouched, those samples are read (up to Max records); replace or clear them to scrape your own links.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset ID and the actor skips everything already collected there, so you don't pay twice. - Incremental mode (
incrementalMode) is for scheduled runs over the same scope. Each record is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEAREDorEXPIRED(only after a run that scanned the whole scope, and only withemitExpired).stateKeynames or shares the stored state. Records are compared on their content:rank, fan counts, lyrics, the signed preview link and the order of countries and genres are never compared (they stay in the rows), andignoreFieldsForChangeslets you leave out more. A run limited by Max records, Max pages or Resume never produces EXPIRED. With incremental mode off, output is exactly as before.
Dataset views
The dataset has one view per record kind: Overview, Tracks, Albums, Artists, Playlists, Users and radios, Lyrics and Changes (incremental mode), so each table shows only the columns that apply to it.
Send results into your apps (MCP connectors)
Optionally pipe the scraped records into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify โ Settings โ Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the MCP connectors input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where records should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (keyword or charts) or url (paste links). |
queries | array | ["daft punk"] | Keywords to search (search mode). |
searchType | string | track | Restrict a search to track, album, artist, playlist, user or radio. |
source | string | search | search (keywords) or chart (global/per-genre charts). |
chartGenreId | integer | 0 | Genre id for chart mode (0 = global chart). |
urls | array | sample | Deezer links (url mode): track, album, artist, playlist, radio, genre or public profile. |
includeArtistReleases | boolean | false | Artist links also return the full discography. |
includeArtistProfile | boolean | false | Artist rows: also read the artist's Deezer page and fill bio, status and social. One extra page read per artist, no extra charge. |
includeUserCollections | boolean | false | User links also return their public playlists. |
excludeExplicit | boolean | false | Drop explicit-flagged records. |
minDurationSec | integer | 0 | Keep records at least this long in seconds (0 = disabled). |
maxDurationSec | integer | 0 | Keep records at most this long in seconds (0 = disabled). |
sortBy | string | relevance | relevance (source order), title, duration (ascending), fans or rank (highest first, rows without the value last). |
minFans | integer | 0 | Artist rows only: keep artists with at least this many fans. 0 disables it. |
query | string | (none) | One extra keyword, added to queries (both are searched). |
startUrls | array | (none) | Merged with urls; the sample link list is dropped when startUrls is set. With no mode and no keywords, the run uses URL mode. |
proxyConfiguration | object | (none) | Alias for proxy. Used whenever it is filled in and proxy has not been changed from its default; if you change proxy, proxy wins. |
fetchDetails | boolean | false | Search mode: read each track's full detail (BPM, ISRC, contributors, availability). Per-track surcharge. |
includeLyrics | boolean | false | Any mode: add lyrics, LRC-synced lines, songwriters and publisher to every track row. Charged per track with lyrics found. |
lyricsWordTiming | boolean | false | With lyrics on: also return per-word timing in lyricsWords (karaoke). No extra charge. |
maxItems | integer | 20 | Stop after this many records (0 = no limit). |
maxPages | integer | 0 | Max result pages per keyword or link (0 = no limit). |
resumeFromRunId | string | (none) | Continue one interrupted run. |
incrementalMode | boolean | false | Return only new and changed records on scheduled runs. |
stateKey | string | (none) | Name or share an incremental-mode state. |
emitUnchanged | boolean | false | Also return (and bill) unchanged records. |
emitExpired | boolean | false | Also return (and bill) expired records. |
ignoreFieldsForChanges | array | (none) | Incremental mode only: field names (dotted path for nested values) that must not make a record count as UPDATED. They stay in the output. |
proxy | object | Apify Proxy | Connection settings. |
mcpConnectors | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which records are created. |
maxNotifyListings | integer | 50 | Cap on records written to each connector per run. |
Artist rows also carry name, fansCount, hasSmartRadio and images. With includeArtistProfile on, they also carry bio (plain text), status and social (an object with the website, twitter and facebook links the artist has; empty when none), read from the artist's Deezer page. Without the option, or when a page cannot be read, those three are empty. onTour is always empty: Deezer does not publish a tour flag.
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"id": "track:3135556","deezerType": "track","title": "One More Time","url": "https://www.deezer.com/track/3135556","durationSec": 320,"explicitLyrics": false,"isrc": "GBDUW0000059","previewUrl": "https://cdns-preview-d.dzcdn.net/stream/track.mp3","releaseDate": "2001-03-07","bpm": 122.7,"artistId": 27,"artistName": "Daft Punk","artistUrl": "https://www.deezer.com/artist/27","artistFans": 4500000,"albumId": 302127,"albumTitle": "Discovery","albumUrl": "https://www.deezer.com/album/302127","label": "Parlophone (France)","copyright": "(C) 2001 Daft Life Ltd.","genres": ["Dance", "Electronic"],"contributorNames": ["Daft Punk"],"availableCountries": ["US", "GB", "DE"],"collectionContext": null,"detailFetched": true,"changeType": null,"changedFields": [],"firstSeenAt": null,"lastSeenAt": null}
Plan Requirement
No residential connection is needed. The catalog API is open and needs no key, and the default Apify Proxy (datacenter) connection reads it fine; in testing no antibot block was observed, only plain "not found" answers for ids that do not exist. If the selected connection is unavailable, the run logs "The selected connection is unavailable to this run" and continues on a backup connection, then notes "Served over the backup connection" once it works. Apify free plans do not include proxy access at all.
FAQ
How much does it cost?
You pay per record returned (the Catalog record event), plus a small fixed charge for each run start (the Actor start event). Track detail enrichment is billed once per track only when you switch it on in search mode, and the lyrics event is billed only for tracks where lyrics were found when you switch Include lyrics on. Records suppressed as unchanged in incremental mode are not billed. The Pricing tab shows the current rates. Use Max records to cap the cost of any run.
Is it legal to scrape Deezer?
This actor reads Deezer's own public catalog API, which is documented, open and needs no authentication. You are responsible for how you use the data: follow Deezer's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Song recordings, lyrics and artwork can be subject to third-party rights; this actor returns catalog metadata and official preview links, not media files. Lyrics are copyrighted by the publishers listed in lyricsCopyright: check you have the rights you need before republishing them.
Can I get lyrics?
Yes. Turn on Include lyrics and every track row gets its full lyrics, time-synced LRC lines when Deezer has timing (most popular tracks do), the songwriters and the publishers. It works in every mode, including every track of a pasted album or playlist. Lyrics are read in batches, so a 1,000-track playlist adds about 15 seconds. Lyrics are licensed per country: a track Deezer has no lyrics for in the connection's country comes back with lyricsStatus: "not_found" and is not charged. To read lyrics as a given country sees them, choose a proxy country in the connection settings.
Can I get word-by-word (karaoke) timing?
Yes. Also turn on Lyrics: word-level timing and each track with word timing gets lyricsWords: every line with its start and end in milliseconds, and every word inside it with its own start and end. lyricsSyncType: "word" tells you which tracks have it; most popular tracks do. It costs nothing extra but makes each row larger.
Can I get podcasts or shows?
No. Deezer retired the public podcast endpoints: the API answers with an error for every podcast id, and podcast search is rejected. Only the music catalog (tracks, albums, artists, playlists, radios, charts, public profiles) is covered.
Can I get only new or changed tracks on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated records, and unchanged ones are not billed.
Why did my run fail instead of returning an empty dataset?
If the catalog refuses every request, the run stops with a clear message so "no results" is never confused with "nothing could be read". The messages are: "The proxy connection was refused for this account, so no page could be read" (check your proxy credentials or plan), "No results: residential proxies are unavailable on this run ... the backup connection could not load the requested Deezer pages", or "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search." Run it again in a few minutes.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
๐ More scrapers you might like
Pair this actor with these related scrapers from the same team:
| ๐งฉ TIDAL Scraper Scrape TIDAL tracks, albums, artists, playlists and public mixes by search phrase or URL... | ๐งฉ Anghami Scraper Scrape Anghami's public catalog by keyword or player URL. Rows carry their kind (song... |
| ๐ค Udio Scraper Collect public Udio tracks with the complete generation prompt, full lyrics, style tags... | ๐ค Suno Scraper Collect public Suno music data: songs with lyrics, style tags, model version, play and... |
| ๐ Discogs Scraper Scrape the Discogs catalogue by keyword, filter or link: releases, masters, artists and... | ๐งฉ Bandsintown Scraper Scrape Bandsintown concert and festival dates: artist tour calendars, venue profiles... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
- โญ Enjoying it? A quick review on the actor page helps other users find it.