E-commerce
Reverb Scraper — Sold Listings & Price Guide
Pull Reverb's sold-listing-based estimated value range — low and high, in amount, cents and Reverb's own display string — for any musical-gear price guide, straight from the GraphQL node reverb.com/price-guide itself fires. Reverb retired its per-guide web pages and publishes no bulk export; this is one flat row per guide with make, model, year, finish and a live marketplace link.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
One row per Reverb price guide. Each row carries the estimated sold-based value range (low and high) alongside 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.
What we handle for you
- 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." - Free-text search, one call — supply a query (e.g.
fender stratocaster) and the Actor drives the same price-guide search Reverb's own site uses, reading each matching guide's estimated value range straight from the results. One row out per guide, no second round-trip. - Or skip the search entirely — supply explicit
guideIdsand the Actor goes straight to Reverb's per-guide estimate endpoint. Useful for incremental crawls, watch-lists, and price-monitoring pipelines. maxGuidescap — generic queries likefendermatch thousands of guides; 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 (
query=gibson les paul,maxGuides=200) 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.
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 |
|---|---|---|---|
query | string | no | Free-text search passed to Reverb's price-guide search (e.g. fender stratocaster). Matches Reverb's model-family price guides (not individual listings), each with an estimated value range. Either query OR guideIds must… |
guideIds | array | no | Explicit Reverb price-guide entry IDs to drill into directly (skips the search stage). Each ID is fetched for its estimated value. Either query OR guideIds must be provided — not both. |
productType | string | no | Deprecated. Reverb's current search API no longer exposes a product-type field, so this filter is accepted for back-compat but ignored. Refine results by making the query more specific instead (e.g. fender precision… |
maxGuides | integer | no | Cap on how many price-guide estimate rows to emit. The Actor over-fetches search entries to reach this many rows after skipping guides without a published estimate. Range 1-200. |
useProxy | boolean | no | Route requests through Apify Proxy (BUYPROXIES94952). Recommended ON for stability. Disable only for debugging. |
{
"guideIds": [
"1404",
"1021"
],
"maxGuides": 20,
"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.
guide_idguide_titlemakemodelyearfinishproduct_typeestimate_low_amountestimate_low_centsestimate_low_displayestimate_high_amountestimate_high_centsestimate_high_displayestimate_currencymarketplace_urlscraped_at
{
"guide_id": 126164,
"guide_title": "Fender American Professional II Stratocaster",
"make": "Fender",
"model": "American Professional II Stratocaster",
"year": null,
"finish": null,
"product_type": null,
"estimate_low_amount": 868.0,
"estimate_low_cents": 86800,
"estimate_low_display": "$868",
"estimate_high_amount": 1266.0,
"estimate_high_cents": 126600,
"estimate_high_display": "$1,266",
"estimate_currency": "USD",
"marketplace_url": "https://reverb.com/marketplace?query=Fender+American+Professional+II+Stratocaster",
"scraped_at": "2026-07-11T08:03:07+00:00"
} 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
- 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.
querymode returns model-family guides — Reverb's current search groups gear by model (e.g.Fender American Professional II Stratocaster), not by individual year/finish variant, and the estimate is the range across its used-condition tiers.yearandfinishare thereforenullinquerymode. For a specific year/finish variant, useguideIdsmode with that guide's ID.guide_iddiffers by mode — inquerymodeguide_idis the guide's Canonical Sell Page (CSP) ID;guideIdsmode expects the legacy price-guide node ID. Reverb runs these as separate systems, so aquery-modeguide_idcannot be fed back intoguideIdsmode.- 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 thousands of guides; the Actor walks search results untilmaxGuidesrows have been emitted. Use a more specific query for targeted results. - Currency is whatever Reverb returns — most estimates are in USD;
estimate_currencytells you which. productTypeis accepted but ignored — Reverb's current search API exposes no category filter field. Refine results with a more specificqueryinstead (e.g.fender precision bassinstead of a category filter).
FAQ
Q: Why did the output shape change from per-transaction to per-guide?
/api/priceguide/{id}/transactions endpoint in 2026 — it now returns empty results for every guide. The estimated value range 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. In v0.4.0, Reverb also retired the public REST price-guide search, so query mode was rewired to the same search Reverb's own price-guide page runs — no change to the output columns.Q: Is the estimated value range really based on sold listings?
Q: Is there an official Reverb API for sold listings or price guide data?
Q: What is "reverb data export" and how do I do it?
Q: How do I get estimates for a fixed list of gear items?
guideIds mode. Supply the legacy numeric price-guide IDs as strings. Note that guideIds mode uses Reverb's legacy price-guide node IDs — a different ID space from the CSP IDs that query mode returns in guide_id, so the two aren't interchangeable. Find legacy IDs from earlier guideIds-mode runs or from Reverb's price-guide URLs.Q: Why does `maxGuides` cap the output but the Actor sometimes fetches more pages?
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?
No estimate rows emitted — N guides inspected) — a search that ran and matched nothing isn't a failure. You'll see it in the run summary. You're still charged the actor-start fee (the search itself ran), but not the per-row result-row fee since nothing was emitted.Q: Can I poll a single guide repeatedly for price changes?
guideIds mode with a single ID. The actor-start fee is $0.20 and the one row emitted costs $0.005 — about 20.5 cents per poll. Apify's Scheduler can automate this on any interval.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