E-commerce
Discogs Marketplace Scraper
Pull live Discogs marketplace pricing for any release ID or search query — per-listing asking price and currency, media and sleeve condition grades, seller username, rating percentage, rating count and ships-from country — plus an optional per-release stats row with the lowest asking price and the number of copies for sale. It joins the release API, the marketplace-stats API and the Cloudflare-fronted marketplace HTML into one flat schema.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
Two row types share one flat schema. The row_type discriminator selects which fields are populated — listing rows carry per-seller pricing, condition grades, and seller ratings; stats rows carry the per-release marketplace aggregate.
What we handle for you
- Per-listing asking prices, condition grades, seller ratings, and ships-from country
- Per-release marketplace stats row (lowest asking price, total active listings,
- Input by release ID (deterministic, fast) or by free-text search query — the search
- Single flat schema with a
row_typediscriminator — easy to join or aggregate - Pydantic v2 input validation — XOR between
releaseIdsandsearchQueryis - Conservative rate-limit pacing at one request every 1.5 seconds (~40 req/min) —
- Per-release fail isolation — one bad release ID logs a warning and the run continues.
Use cases
- Vinyl / CD reseller benchmarking — pull every active listing for releases in your
- Music-collectibles arbitrage — monitor cross-country shipping spreads
- Catalog / label market intel — for a label's release IDs, track
num_for_sale - Journalism / pricing studies — "the cheapest first pressing of Nevermind on
- Marketplace health monitoring — count
stats_blocked_from_sale=truerows across - Seller-quality screening — filter listings by
seller_rating_pct >= 99.0and
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
releaseIds | array | no | List of Discogs release IDs (integers) to scrape. Either releaseIds OR searchQuery must be provided — not both. Find a release ID in the URL: discogs.com/release/249504-Rick-Astley-.... |
searchQuery | string | no | Free-text Discogs search. The Actor resolves the top maxSearchResults hits into release IDs. Either releaseIds OR searchQuery must be provided — not both. |
maxSearchResults | integer | no | Cap on releases resolved from searchQuery. Ignored when releaseIds is set. |
maxPagesPerRelease | integer | no | Hard cap on listings pages fetched per release (each page = 25 listings). Combined with maxListingsPerRelease. |
maxListingsPerRelease | integer | no | Hard cap on listing rows emitted per release. Lower wins when both this and maxPagesPerRelease are set. |
includeStatsRow | boolean | no | When true, emit one extra row_type="stats" row per release with the public marketplace aggregate (lowest_price, num_for_sale, blocked_from_sale). |
useProxy | boolean | no | Route requests through Apify Proxy (BUYPROXIES94952). Default ON — Cloudflare on the Discogs marketplace HTML surface 403s un-proxied Apify datacenter IPs. Turn off only when running locally from a residential ISP. |
{
"releaseIds": [
"249504"
],
"maxSearchResults": 5,
"maxPagesPerRelease": 4,
"maxListingsPerRelease": 100,
"includeStatsRow": true,
"useProxy": true
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
row_typerelease_idrelease_titleartistyearcountryformat_nameformat_descriptionsgenresmaster_idrelease_urllisting_idlisting_urlasking_priceasking_currencyshipping_text
{
"row_type": "listing",
"release_id": 249504,
"release_title": "Never Gonna Give You Up",
"artist": "Rick Astley",
"year": 1987,
"country": "UK",
"format_name": "Vinyl",
"format_descriptions": [
"7\"",
"45 RPM",
"Single",
"Stereo"
],
"genres": [
"Electronic",
"Pop"
],
"master_id": 96559,
"release_url": "https://www.discogs.com/release/249504",
"listing_id": 3761251765,
"listing_url": "https://www.discogs.com/sell/item/3761251765",
"asking_price": 0.5,
"asking_currency": "GBP",
"shipping_text": "+\u00a315.00",
"condition_media": "Very Good Plus (VG+)",
"condition_sleeve": "Generic",
"seller_username": "Ronan266",
"seller_rating_pct": 100.0,
"seller_rating_count": 35,
"seller_country": "United Kingdom",
"stats_lowest_price": null,
"stats_lowest_currency": null,
"stats_num_for_sale": null,
"stats_blocked_from_sale": null,
"scraped_at": "2026-05-16T12:00:00.000Z"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| Result row emitted | $0.0050 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
Limitations
- Asking prices only — no closed-sale history. Discogs hosts sold-price data at
- Public Discogs surfaces only. No authenticated Discogs API calls, no personal
- One snapshot per run. Schedule recurring runs via Apify Schedules for
- 25 listings per page — a Discogs-imposed pagination size. Combined with
- Currency is not normalised. Discogs serves prices in the seller's local currency
- Throughput ~40 req/min. A 10-release run with 4 pages each takes roughly
- 7-day default storage retention on the Apify FREE tier. Export your dataset
FAQ
What is the difference between "discogs price scraper" asking-price data and sold-price history?
/sell/history/{release_id} — login-walled, not accessible without user OAuth. For most reseller and arbitrage workflows the live asking-price distribution is the more actionable signal: it tells you what the market is asking right now, not what it cleared months ago.Does this Actor work as a Discogs marketplace API alternative?
lowest_price and num_for_sale aggregates for any given release. This Actor adds the full per-listing detail — who is selling, at what price, in what condition, shipping from where — by joining the REST endpoints with the marketplace HTML. It is the data layer the official API does not provide.How does it handle blocks and Cloudflare protection?
Retry-After support. You run the Actor; we handle the connection layer.Why does this Actor need a custom `User-Agent` for Discogs?
Application-Name/Version style User-Agent. The Actor sends DevilScrapes/0.1 (+https://apify.com/DevilScrapes) on every API call automatically — nothing to configure.What does `stats_blocked_from_sale=true` mean?
stats_num_for_sale=0 alongside it confirms zero active listings. To identify scarce releases, use WHERE stats_num_for_sale < 5.Can I scrape my own wantlist or private collection?
Can I fetch more than 100 release IDs in one run?
releaseIds at 100 (and maxListingsPerRelease at 500, maxPagesPerRelease at 20). A single run emits at most 100 × 500 + 100 = 50,100 rows. Split larger workloads across multiple runs and concatenate the datasets.Is this the same as a Discogs scraper for bulk catalog export?
Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors