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
2
Total users
1
Monthly active users
21 hours ago
Last modified
Categories
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 |
| Public user profile | the profile; optionally their public playlists (includeUserCollections) |
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. With incremental mode off, output is exactly as before.
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. |
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 or duration. |
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. |
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. |
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
The default connection setting works out of the box on every plan. The catalog API is open and needs no key; the connection is only there to keep large runs polite.
FAQ
How much does it cost?
You pay per record returned, with track detail enrichment billed only when you switch it on in search mode, and lyrics billed only for tracks where lyrics were found when you switch Include lyrics on. 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, use a residential connection with that country set.
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". 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... |
| 🤖 Suno Scraper Collect public Suno music data: songs with lyrics, style tags, model version, play and... | 🤖 Udio Scraper Collect public Udio tracks with the complete generation prompt, full lyrics, style tags... |
| 🧩 Bandsintown Scraper Scrape Bandsintown concert and festival dates: artist tour calendars, venue profiles... | 🛒 Discogs Scraper Scrape the Discogs catalogue by keyword, filter or link: releases, masters, artists and... |
💬 Support & custom scrapers
- 🐞 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 abotapi@proton.me or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.