Discogs Search Scraper avatar

Discogs Search Scraper

Pricing

from $0.56 / 1,000 results

Go to Apify Store
Discogs Search Scraper

Discogs Search Scraper

Searches Discogs across releases, master releases, artists and labels. Returns full tracklist, catalog number, community rating, and live marketplace price range for individual releases.

Pricing

from $0.56 / 1,000 results

Rating

0.0

(0)

Developer

Ibnu Adzim

Ibnu Adzim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Searches Discogs, the largest music release database and marketplace — across releases (specific pressings), master releases (the canonical work), artists and labels.

For releases, returns the full tracklist with per-track credits and durations, catalog number, community rating, and the live marketplace price range.


What you get

One row per search hit, plus a SEARCH_SUMMARY row per query.

From search (always) — raw passthrough, shape varies by entityType

Discogs' own clean GraphQL object, spread verbatim, so the fields differ by type. For entityType: "release": discogsId, title, released, country, siteUrl, labels[], formats[], images, primaryArtists[]. Every row carries __typename so you can tell Release/MasterRelease/Artist/Label apart in one dataset.

From the release page (includeReleaseDetails, release only, on by default)

tracklist[] — each track's position, title, credits (remix/featuring artist, when present) and duration — plus, from the page's Schema.org JSON-LD: genre, catalogNumber, recordLabel, releaseOf (the master release + primary artist), aggregateRating (community score and count), and offers (live marketplace offerCount / lowPrice / highPrice).


Input

{
"queries": ["radiohead"],
"entityType": "release",
"genre": "Rock",
"format": "Vinyl",
"maxItems": 50,
"includeReleaseDetails": true,
"surface": "auto", // website first, official API fallback (default)
"discogsToken": "" // optional personal access token: 60 API req/min instead of 25
}

format, genre, style, country, year and decade all genuinely narrow the result count and compose with AND (measured: genre=Rock (5,964) × format=Vinyl (826) → 611 together). format/genre/style need Discogs' own exact facet text — "Trip Hop", not "triphop".

A search term is optional. Leave queries empty and set a filter to browse by facet alone — e.g. every Reggae release in the database.

entityType: four genuinely different shapes

entityTypeReturns__typename
releaseA specific pressingRelease
masterThe canonical work across all its pressingsMasterRelease
artistAn artist/groupArtist
labelA record labelLabel

Verified at the same query (radiohead) these carry genuinely different fields, not the same index re-labelled — master/artist/label results carry no discogsId at all, only a relay id.


Two data surfaces (surface)

Discogs' website sits behind a Cloudflare challenge that, from cloud egress, blocks a random share of requests rather than a fixed list of clients. So the actor has two ways to read the same index and tells you which one it used in every row's _source:

surfaceWhat happensRow shape
auto (default)Website first (fast; Discogs' own GraphQL objects, JSON-LD marketplace price range). Any query the website refuses after 3 exit-IP/fingerprint rotations is restarted from page 1 on the official API; any release page it refuses falls back to the API release endpoint on its own.S1/S2 = website, S3/S4 = API
apiOfficial API only (api.discogs.com). Deterministic, never challenged in our measurements, but rate-limited: 25 requests/min per IP without a token, 60/min with discogsToken.S3/S4
webWebsite only, no fallback.S1/S2

The two shapes are both raw passthrough of what Discogs returns, so they differ: website rows carry __typename, discogsId, siteUrl, labels[], formats[], primaryArtists[]; API rows carry type, id, uri, label[], format[], catno, genre[], style[], community.want/have. Release detail from the website attaches musicReleaseJsonLd (with offers low/high price) and a parsed tracklist (position, title, credits, duration); from the API it attaches releaseApi (the full release object: lowest_price, num_for_sale, community.rating, genres, styles, identifiers, images, notes) and the API's own tracklist (position, title, duration, extraartists[]). Every RESULT row declares all three columns (musicReleaseJsonLd, releaseApi, tracklist), unused ones null.

Known limits

API mode is rate-limited. 25 requests/min per exit IP without a token — one search page (100 results) plus one call per release detail — so 50 releases with details take about two minutes on the API; with a personal access token (discogsToken, generated at discogs.com/settings/developers) it is 60/min. A 429 is waited out (20 s) on a fresh exit IP, up to 4 times.

decade on the API is a year range. The API has no decade filter, so decade: "1990" is sent as year=1990-1999 there (honest: 1,914 vs the website's 1,899 for the same query). An explicit year wins.

A query is never half-and-half. If the website fails mid-query, the whole query restarts on the API from page 1 (the surfaces have different page sizes and shapes), so the pages already fetched are discarded, never mixed.

Detail is release-only. includeReleaseDetails fetches the tracklist and JSON-LD only for entityType: "release". It's a no-op (logged, not an error) for master/artist/label — those detail pages weren't built out for this version.

Filter values are exact-match, not fuzzy. A typo doesn't silently return everything — Discogs is unusually honest here — but it does mean

format: "vinyl"
(lowercase) may not match "Vinyl" depending on the facet's exact casing; use the value as Discogs itself displays it.

Pagination is genuinely honest — 25 results/page, and past the real last page it returns an empty array rather than clamping back to page 1 — so an unlimited crawl (maxItems: 0) terminates correctly, but a broad query can mean tens of thousands of results.


Anti-bot posture

www.discogs.com is behind a Cloudflare managed challenge (

cf-mitigated: challenge
, "Just a moment...") that scores each request; from Apify's egress the same client passes one second and is challenged the next. Measured in-platform on 2026-09-21 across direct, datacenter and residential exits: every Chromium-family TLS profile was challenged 100% of the time;
primp safari_26
with its own header set untouched passed 10/10 search and 25/25 release-page requests. That is the actor's web client (retried once on a fresh exit IP, then firefox_148), and the official API — 24/24 clean on every proxy option — is the floor beneath it. The Apify datacenter proxy is the default: residential was challenged at exactly the same rate here and is billed per GB against ~1 MB search pages. No browser, no captcha solver.

Policy

robots.txt disallows marketplace/account/user-scoped paths (*/marketplace, */sell/*, /users/, /login, /mycollection, etc.) — none of which this actor touches. /search itself is not disallowed for a generic crawler (only a Sogou web spider group disallows it specifically). No ClaudeBot/anthropic-ai group. api.discogs.com/robots.txt is the same file, and the API is Discogs' documented public interface (unauthenticated access allowed with a User-Agent; a token only raises the quota).