Reverb Scraper — Sold Listings & Price Guide
Pricing
Pay per event
Reverb Scraper — Sold Listings & Price Guide
Pull Reverb's sold-listing-based estimated value range for any musical-gear search via the Reverb price-guide API — used-price lows and highs plus make, model, year, finish — export to JSON or CSV. One row per price guide. No login; we handle the retries.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
18 hours ago
Last modified
Categories
Share
Reverb Scraper — Sold Listings & Price Guide Data
We do the dirty work so your dataset stays clean. 😈
$5.05 / 1,000 rows — Pull Reverb's sold-listing-based estimated value range for any musical gear search. One row per price guide entry: priceLow, priceHigh, make, model, year, finish, product type — the same signal Reverb's own price-guide pages publish. We handle the blocks, the retries, and the fingerprint rotation. You get clean JSON.
The Reverb Price Guide is the internet's largest public database of musical-instrument valuations, computed directly from completed sales ("We look at sold listings — based on how much gear in the same condition has sold for on Reverb recently"). Reverb offers no bulk export and no public API for estimates. This reverb scraper walks the price-guide search API, fetches each matching guide's estimated value range from Reverb's GraphQL endpoint, and emits one flat dataset row per guide — ready for reseller pricing models, gear-investment tracking, insurance valuations, or used-instrument market journalism.
🎯 What this scrapes
One row per Reverb price-guide entry. Each row carries the estimated sold-based value range (low and high) alongside full gear context. The marketplace_url links to Reverb's live marketplace search for the item — useful for cross-referencing current asking prices against the estimated value.
| Field | Type | Description |
|---|---|---|
guide_id | integer | Reverb price-guide entry ID |
guide_title | string | Human-readable title (e.g. Fender Stratocaster 1979 Red) |
make | string | null | Manufacturer (e.g. Fender) |
model | string | null | Model name (e.g. Stratocaster) |
year | string | null | Year string — Reverb mixes 1979 / 1970s |
finish | string | null | Finish / colour (e.g. Red, Sunburst) |
product_type | string | null | Reverb category (e.g. Electric Guitars, Tube Combos) |
estimate_low_amount | number | null | Low end of estimated value, original currency |
estimate_low_cents | integer | null | Low end in smallest currency unit (e.g. cents) |
estimate_low_display | string | null | Reverb's pre-formatted low estimate (e.g. $935) |
estimate_high_amount | number | null | High end of estimated value, original currency |
estimate_high_cents | integer | null | High end in smallest currency unit |
estimate_high_display | string | null | Reverb's pre-formatted high estimate (e.g. $1,320) |
estimate_currency | string | null | ISO 4217 currency code (e.g. USD) |
marketplace_url | string | Reverb marketplace search link for this gear |
scraped_at | string | ISO 8601 UTC datetime this row was written |
🔥 Features
- Sold-data signal, not speculative listing prices — Reverb's estimated value range is computed from actual completed transactions on the platform. The
priceLow/priceHighpair is the same figure Reverb displays on their own price-guide pages under the heading "Estimated Value." - Two-stage pipeline — supply a free-text
query(e.g.fender stratocaster) and the Actor pages Reverb's price-guide search API, optionally filters byproductType, then fetches each matching guide's estimate via Reverb's GraphQL endpoint. One row out per guide. - Or skip the search entirely — supply explicit
guideIdsand the Actor goes straight to the estimate fetch. Useful for incremental crawls, watch-lists, and price-monitoring pipelines. maxGuidescap — generic queries likefendermatch tens of thousands of price-guide entries; the cap (default 20, up to 200) keeps fan-out bounded and cost predictable.- Pydantic v2 input validation — XOR between
queryandguideIdsenforced before any network call;maxGuidesbounds enforced at parse time. - We rotate browser fingerprints —
curl-cffiwith Chrome/Firefox/Safari TLS impersonation means Reverb's servers see real-browser traffic, not raw Python. - We retry with exponential backoff —
408 / 429 / 503trigger a retry sequence (2 → 4 → 8 → 16 → 30 s, max 5 attempts) withRetry-Afterhonoured. - We rotate proxies on every block — Apify Proxy handles IP rotation so a single rate-limited IP never stalls your run.
- Clean, Pydantic-validated rows — every dataset row passes schema validation before it lands. ISO 8601 timestamps, stable column names, no partial writes.
- Pay only for results that land — no data, no charge beyond the small
actor-startwarm-up fee.
💡 Use cases
- Reseller pricing models — fetch estimated value ranges for every variant of a model (Gibson Les Paul, all years and finishes), feed the
estimate_low/estimate_highpairs into your pricing algorithm, and stop pricing by gut. - Gear-investment and vintage-appreciation tracking — schedule weekly runs for canonical vintage models (1959 Les Paul, 1965 Fender Twin Reverb) and watch the estimate bands move over time. The data is direct from Reverb's sold-price engine.
- Insurance valuation — pull estimates for a specific instrument and export them as a defensible "current market value" backed by Reverb's own sold-data methodology. Works for individual items or entire collections.
- Used-gear market journalism — Reverb's estimates are the de facto standard for secondhand instrument values. Pull a category-wide sweep (
productType=Electric Guitars,query=gibson) and you have the dataset behind a market-movement story. - Buy / sell price-band alerts — combine with a downstream notification workflow: if
estimate_low_amountfor a target guide crosses a threshold, fire an alert. The Actor'sguideIdsmode makes repeated single-guide polling cheap. - Shop inventory appraisal — for a guitar shop doing a bulk valuation, run one
guideIdsbatch against all catalogue SKUs and get the Reverb-anchored estimate for every piece in the warehouse.
⚙️ How to use it
- Open the Actor input form in Apify Console.
- Provide either
query(free-text search) orguideIds(explicit Reverb price-guide IDs). Providing both or neither raises a validation error before any network call. - Optionally narrow
querymode withproductType— case-insensitive match against Reverb's category column. Common values:Electric Guitars,Bass Guitars,Tube Combos,Solid State Combos,Pedals,Synths,Drum Sets. - Set
maxGuidesto cap how many estimate rows to emit (default 20, up to 200). Generic queries can match tens of thousands of entries; the cap keeps cost predictable. - Leave
useProxyon (default) — we use it for IP rotation and stability. Disable only when debugging locally. - Click Start. Results stream into the default dataset as JSON, CSV, Excel, or XML.
Search for one model — top 20 estimates
{"query": "fender stratocaster","productType": "Electric Guitars","maxGuides": 20,"useProxy": true}
Direct guide-ID mode (skip the search)
{"guideIds": ["18677", "1404", "1021"],"useProxy": true}
Wide category sweep
{"query": "gibson les paul","productType": "Electric Guitars","maxGuides": 200,"useProxy": true}
📥 Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | XOR | — | Free-text search passed to Reverb's price-guide API. XOR with guideIds. Prefilled: fender stratocaster. |
guideIds | string[] | XOR | — | Explicit Reverb price-guide IDs to fetch estimates for (skips the search stage). |
productType | string | no | — | Case-insensitive filter on product_type (query mode only). E.g. Electric Guitars, Pedals. |
maxGuides | integer | no | 20 | Cap on estimate rows emitted (1–200). The Actor over-fetches search results to hit this target after skipping guides without a published estimate. |
useProxy | boolean | no | true | Route requests through Apify Proxy for IP rotation and stability. |
Exactly one of query or guideIds must be provided.
📤 Output
One row per Reverb price-guide entry that has a published estimate. Field shapes match the table in the "What this scrapes" section above. Export to JSON, CSV, Excel, or XML from the Apify Console.
Example row (live run, 2026-06-01):
{"guide_id": 18677,"guide_title": "Fender Stratocaster 1979 Red","make": "Fender","model": "Stratocaster","year": "1979","finish": "Red","product_type": "Electric Guitars","estimate_low_amount": 935.0,"estimate_low_cents": 93500,"estimate_low_display": "$935","estimate_high_amount": 1320.0,"estimate_high_cents": 132000,"estimate_high_display": "$1,320","estimate_currency": "USD","marketplace_url": "https://reverb.com/marketplace?query=Fender+Stratocaster+1979+Red","scraped_at": "2026-06-01T06:03:40+00:00"}
Guides that Reverb hasn't published an estimate for (roughly 20% of search results) are skipped cleanly — the Actor over-fetches search pages to compensate and still reach maxGuides rows.
💰 Pricing
This Actor is priced per-event — you pay only for results that land in your dataset.
| Event | Price (USD) | When charged |
|---|---|---|
actor-start | $0.05 | Once at the start of each run |
result-row | $0.005 | Per estimate row written to the dataset |
A run of 20 guides (the default) costs $0.15 total. A full 200-guide sweep costs $1.05. The default maxGuides=20 keeps trial runs cheap.
Gear-pricing SaaS tools charge $50–200/month per seat for used-instrument valuation data. Reverb publishes no bulk export. This Actor is the only programmatic way to pull this signal at scale.
🚧 Limitations
- One row per guide, not per transaction — Reverb retired its per-transaction public endpoint in 2026. The estimated value range is Reverb's current authoritative sold-data signal; individual transaction-level rows (sale date, condition, buyer-paid amount) are no longer available from any public Reverb API path.
- ~20% of guides have no published estimate — Reverb only computes an estimate when enough recent sold data exists for that specific guide. Guides without estimates are skipped; the Actor over-fetches to compensate.
- No individual condition tiers — Reverb's estimate is a single range across all conditions for that guide. Condition-stratified pricing requires downstream logic on your side.
- Day-precision
scraped_at— the estimate itself carries no timestamp from Reverb;scraped_atrecords when this Actor fetched the row. - Individual guide pages are gone — Reverb retired
reverb.com/price-guide/guide/<id>pages (they 301 to a search landing). Themarketplace_urlcolumn links to Reverb's marketplace search instead, which shows current live listings for the gear. - Generic queries may exhaust
maxGuidesquickly —query=fendermatches tens of thousands of entries; the Actor walks search pages untilmaxGuidesrows have been emitted. Tighten withproductTypeand a more specific query for targeted results. - Currency is whatever Reverb returns — most estimates are in USD;
estimate_currencytells you which.
❓ FAQ
Q: Why did the output shape change from per-transaction to per-guide?
Reverb retired the public /api/priceguide/{id}/transactions endpoint in 2026 — it now returns empty results for every guide. The estimated value range (fetched from Reverb's GraphQL endpoint) is the current authoritative sold-data signal Reverb publishes. We made the change in v0.3.0 rather than ship an Actor that emits zero rows.
Q: Is the estimated value range really based on sold listings? Yes — Reverb's own price-guide pages state: "We look at sold listings, which means that the value you see is based on how much gear in the same condition has sold for on Reverb recently." This reverb scraper fetches that same figure programmatically.
Q: Is there an official Reverb API for sold listings or price guide data? Reverb has no official public API for sold listing data or bulk price guide exports. Reverb's own documentation does not cover programmatic access to the price guide — no reverb api key, no OAuth, no documented endpoint. This Actor is the only programmatic route to Reverb sold listings at scale.
Q: What is "reverb data export" and how do I do it? Reverb offers no native bulk data export. You can't download reverb sold listings as CSV or JSON from the Reverb dashboard. This Actor is the reverb data export path: run it with your search terms or guide IDs and download the results as JSON, CSV, Excel, or XML from the Apify Console.
Q: How do I get estimates for a fixed list of gear items?
Use guideIds mode. Supply the numeric guide IDs as strings. You can find a guide's ID from the guide_id field of any previous run, or by inspecting Reverb's price-guide search results.
Q: Why does maxGuides cap the output but the Actor sometimes fetches more pages?
Reverb doesn't tell us upfront which guides have a published estimate. The Actor over-fetches search results — walking more guide entries than maxGuides — to ensure it reaches the requested count after skipping guides without estimates. Billing is still based only on rows actually emitted.
Q: What happens when zero estimates are found?
The Actor exits with a non-zero status code and sets a clear status message (No estimate rows emitted — N guides inspected). You'll see it in the run summary. You will still be charged the actor-start fee.
Q: Can I poll a single guide repeatedly for price changes?
Yes. Use guideIds mode with a single ID. The actor-start fee is $0.05 and the one row emitted costs $0.005 — about 5.5 cents per poll. Apify's Scheduler can automate this on any interval.
Q: Does the Actor de-duplicate across runs?
No. Each run emits fresh rows from the current Reverb data. De-dup on guide_id downstream if you're accumulating results over time.
💬 Your feedback
This Actor is built and maintained by Devil Scrapes. If a Reverb search returns fewer rows than expected, if you notice the estimate shape has changed upstream, or if you need a feature (condition-tier breakdown, scheduled monitoring mode), open an issue on the Actor page and we'll patch it within a release cycle. The target blocks; we get back up.