Reverb
Musical instrument marketplace: guitars, synths, pedals and amps with prices in USD, condition grades and per-model price floors.
/reverb/v1/search2 creditsSearch Reverb's live marketplace. Every filter offered here was measured to change the result set: price band, condition, brand, category, the seller's country, the country an item ships to, a year range, free shipping, local pickup, preferred sellers and one shop. Rows carry the price in USD (whatever currency the seller lists in), the condition, the year, the shop, the shipping rate per region and the full description.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| query | optional | — | Free text: a model name, a brand, a serial-era nickname, anything a buyer would type. Optional — leave it out and send a filter instead to browse a whole category or shop. |
| make | optional | — | Brand name(s), exactly as Reverb spells them (Fender, Gibson, Squier, Boss, Roland). Several values are OR-ed: ['Fender','Gibson'] returned 117 853 guitars against 790 216 unfiltered. 🔴 Reverb matches brand FAMILIES: asking for Squier also returns rows whose own `make` field reads 'Fender' (5 of 24 on a measured page — 'Fender Squier Sonic Stratocaster'). Filter on the row's `make` yourself if you need the strict brand. |
| product_type | optional | electric-guitars · acoustic-guitars · bass-guitars · effects-and-pedals · amps · drums-and-percussion · keyboards-and-synths · pro-audio · folk-instruments · orchestral-strings · band-and-orchestra · dj-and-lighting-gear · home-audio · parts · accessories · software | Top-level department. Only ONE value is accepted — an array here is a 400 from the source. Use `category_uuid` for a sub-category such as Solid Body. |
| category_uuid | optional | — | A sub-category uuid from `categories` — e.g. Electric Guitars / Solid Body narrowed the marketplace to 148 331 listings. 🔴 The category SLUG on its own is silently ignored by the source, which is why this API takes the uuid. |
| condition | optional | new · b-stock · mint · excellent · very-good · good · fair · poor · non-functioning · used | Condition grade(s). Several values are OR-ed. 🔴 The source silently ignores a slug it does not know, so this API validates it — and note that Brand New is `new`, not `brand-new`. |
| price_min | optional | 0– | Lowest price in US dollars, inclusive. |
| price_max | optional | 0– | Highest price in US dollars, inclusive. With price_min=1000 this narrowed 'stratocaster' from 76 993 to 8 390. |
| year_min | optional | 1800–2100 | Earliest build year the seller stated. 🔴 Only ~49 % of listings state a year, so a year filter also drops every listing with no year. |
| year_max | optional | 1800–2100 | Latest build year. 1960-1969 left 770 stratocasters of 76 993. |
| item_region | optional | — | Where the ITEM is, as a two-letter country code (US, GB, DE, JP). US 56 778 vs GB 5 051 on the same search. |
| ships_to | optional | — | Only listings that ship to this two-letter country code. 🔴 Leave it out and the source answers for 'Everywhere Else', which is NOT the whole marketplace — pinning ships_to=US cut 'stratocaster' from 77 000 to 41 496. The value actually used is echoed in `ships_to` on every response. |
| shop_id | optional | — | Only this shop's listings. The NUMERIC id — a shop slug here is silently ignored by the source and hands you the whole marketplace, so use `shop/listings` if you only have a slug. |
| handmade | optional | — | Only items the seller marked handmade (2 817 of 76 993). |
| free_shipping | optional | — | Only items that ship free to somewhere (416 of 76 993). 🔴 This is NOT the row's `free_expedited_shipping` flag, which was False on all 8 rows a measured call returned — read `has_free_shipping` and `shipping_rates` to see which region the 0.00 rate is for. |
| local_pickup | optional | — | Only items offering local pickup (26 252 of 76 993). |
| preferred_seller | optional | — | Only Reverb Preferred Sellers (48 914 of 76 993). |
| sort | optional | price_asc · price_desc · newest | Leave empty for Reverb's own relevance order. Only the three orders the source demonstrably applies are offered; it silently ignores any other value. 🔴 The price sort is monotonic in the SELLER's currency, not in the USD you are handed: on a measured `price_desc` page a JPY listing converting to $98,652 came ahead of a USD one at $100,000. Sort by `price_usd` yourself if you need exact USD order. |
| page = 1 | optional | 1– | 1-based page number. The source prints `total_pages: 50` on every envelope no matter how large the result is — that cap is cosmetic and this API ignores it: pages 51, 60, 100 and 200 all return real, distinct rows. Read `total_pages` from this response, which is computed from `total`. |
| limit = 24 | optional | 1–50 | Rows per page, 1-50. 50 is the source's own ceiling; it clamps anything larger instead of refusing it, so this API clamps it too and tells you in `limit`. |
/reverb/v1/listing1 creditOne listing in full: everything a search row carries plus the seller's city and country, the shipping rate to every region it ships to, how many people have viewed and watched it, the offer count, the return and shipping policy, whether it is sold as-is, and the model id that links it to Reverb's model page.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| listing_id | required | — | The numeric Reverb listing id (98282577), the id-slug form (98282577-fender-stratocaster-…) or a reverb.com/item/… URL. Every search row carries the id and the URL. |
/reverb/v1/shop1 creditOne seller's record by slug: name, city and country, whether Reverb marks them a Preferred Seller / quick shipper / quick responder, their feedback count and rating, their shipping and payment policy, and whether the shop is on vacation.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| shop | required | — | The shop slug as it appears in reverb.com/shop/<slug>, or the full shop URL. Search rows carry it as `shop_slug`. |
/reverb/v1/shop/listings3 creditsOne seller's whole inventory, paged — the same rows as `search`, plus the shop record when you addressed it by slug. This is how a dealer's catalogue is mirrored: a shop with 603 listings is 13 calls at 50 rows a page.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| shop | optional | — | The shop slug. Costs one extra upstream call to resolve the slug to the numeric id the marketplace filter needs; pass `shop_id` instead to skip it. |
| shop_id | optional | — | The numeric shop id, from a search row or from `shop`. One of `shop` / `shop_id` is required. |
| query | optional | — | Optional keyword to search inside this seller's inventory. |
| condition | optional | new · b-stock · mint · excellent · very-good · good · fair · poor · non-functioning · used | Condition grade(s), same enum as search. |
| price_min | optional | 0– | Lowest price in US dollars. |
| price_max | optional | 0– | Highest price in US dollars. |
| product_type | optional | — | Department slug, same values as search. |
| sort | optional | price_asc · price_desc · newest | Same three orders as search. |
| page = 1 | optional | 1– | 1-based page number. The source prints `total_pages: 50` on every envelope no matter how large the result is — that cap is cosmetic and this API ignores it: pages 51, 60, 100 and 200 all return real, distinct rows. Read `total_pages` from this response, which is computed from `total`. |
| limit = 24 | optional | 1–50 | Rows per page, 1-50. 50 is the source's own ceiling; it clamps anything larger instead of refusing it, so this API clamps it too and tells you in `limit`. |
/reverb/v1/models2 creditsReverb's MODEL pages — one row per instrument model rather than per listing, each with the lowest live asking price for a NEW one, the lowest for a USED one, and how many of each are for sale. This is the closest thing Reverb publishes to a price guide, and it is a snapshot of asks, not of completed sales. 78 791 models are browsable with no keyword at all.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| query | optional | — | A model or family name. Omit it to walk the whole model catalogue. |
| make | optional | — | Brand name(s). 'les paul' 1 387 models → 799 for Gibson. |
| product_type | optional | — | Department slug, same values as search (935 of the 1 387). |
| category_uuid | optional | — | Sub-category uuid from `categories` (919 of the 1 387). |
| year_min | optional | 1800–2100 | Earliest model year. |
| year_max | optional | 1800–2100 | Latest model year. |
| page = 1 | optional | 1– | 1-based page number. The source prints `total_pages: 50` on every envelope no matter how large the result is — that cap is cosmetic and this API ignores it: pages 51, 60, 100 and 200 all return real, distinct rows. Read `total_pages` from this response, which is computed from `total`. |
| limit = 24 | optional | 1–50 | Rows per page, 1-50. 50 is the source's own ceiling; it clamps anything larger instead of refusing it, so this API clamps it too and tells you in `limit`. |
/reverb/v1/model/detail1 creditOne model page by numeric id: the lowest new and used asking price, the live count of each, Reverb's own star rating and review count for the model, the description and the image.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| model_id | required | — | The numeric model id, from a `models` row (`model_id`) or from a listing's `model_id`. 🔴 The model's slug does NOT work as an id — the source answers 404 for it. Use `models` to look one up by name. |
/reverb/v1/model/listings3 creditsEvery live listing OF one model, not merely matching its name — Reverb keeps a list of the exact product variants behind each model page and this action uses it, so a search for 'Fender American Professional II Stratocaster' that would return 76 000 loose matches returns the 574 that really are one. Two upstream calls: the model page, then its listings.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| model_id | required | — | The numeric model id, from a `models` row (`model_id`) or from a listing's `model_id`. 🔴 The model's slug does NOT work as an id — the source answers 404 for it. Use `models` to look one up by name. |
| condition | optional | new · b-stock · mint · excellent · very-good · good · fair · poor · non-functioning · used | Condition grade(s) — this is how you read only the used market for one model. |
| price_min | optional | 0– | Lowest price in US dollars. |
| price_max | optional | 0– | Highest price in US dollars. |
| sort | optional | price_asc · price_desc · newest | Same three orders as search. |
| page = 1 | optional | 1– | 1-based page number. The source prints `total_pages: 50` on every envelope no matter how large the result is — that cap is cosmetic and this API ignores it: pages 51, 60, 100 and 200 all return real, distinct rows. Read `total_pages` from this response, which is computed from `total`. |
| limit = 24 | optional | 1–50 | Rows per page, 1-50. 50 is the source's own ceiling; it clamps anything larger instead of refusing it, so this API clamps it too and tells you in `limit`. |
/reverb/v1/categories1 creditReverb's whole category tree, flattened: 320 categories with the uuid that `search` and `models` take as `category_uuid`, the department slug that `product_type` takes, and the human name. One call, and it barely changes.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| product_type | optional | — | Only the sub-categories of this department. |
| query | optional | — | Only categories whose name contains this text. |
/reverb/v1/conditionsfreeThe condition grades Reverb uses, with the slug each filter takes and Reverb's own definition of the grade. 🔴 Note that Brand New's slug is `new`, not `brand-new`.
Try in playground →/reverb/v1/brand1 creditOne brand record by slug: its Reverb id, its canonical name — which is the spelling the `make` filter wants — and its header images. There is no brand INDEX to walk: the source's `/brands` route answers with an empty list whatever you ask it.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| brand | required | — | The brand slug as it appears in reverb.com/brand/<slug> — lowercase, hyphenated ('fender', 'gibson', 'electro-harmonix'). |
curl -X POST https://api.reefapi.com/reverb/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{}'{
"ok": true,
"data": { /* the result */ },
"meta": {
"latency_ms": 240,
"record_count": 12,
"completeness_pct": 100
},
"error": null
}