Design and vintage resale, with the prices pieces actually sold for
Whoppah is a Netherlands-based marketplace for second-hand design and vintage pieces - furniture, lighting, art, decoration, tableware and designer bags - and this API reads it as JSON with no account and no key.
6 active endpoints, on 1, 2 and 3 credit tiers.
- POST/whoppah/v1/search
- POST/whoppah/v1/detail
- POST/whoppah/v1/shipping
- POST/whoppah/v1/similar
- POST/whoppah/v1/seller
- POST/whoppah/v1/facets
What Whoppah endpoints does ReefAPI ship?
6 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Whoppah API
6 of 6 endpoints, ready to run
Find design and vintage pieces by brand, style, size and price - or what they sold for
// Press "Try it" and this pane shows exactly what the // live site returned this second — including an empty // result, if that is the truth. No key, no account.
How the Whoppah API works
Whoppah is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 491 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Price a design piece from what comparable pieces sold for
Whoppah keeps its sold listings with their final price, so you can price a piece from real sales instead of asking prices. Three calls.
Find the exact brand, designer and style slugs inside the category, with live counts, so the next calls filter on values Whoppah actually has.
The sold comparables: each row's sold_price_eur is what it went for, next to its wear grade, lot size and dimensions. total is exact with the default keyword matching.
The live market for the same thing: asking prices, previous prices, discounts and the minimum bid where the seller accepts bids.
A price band built on sales, not on asking prices alone: what comparable pieces sold for, what the same thing is listed at today, and how far sellers have already cut.
curl -X POST https://api.reefapi.com/whoppah/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"eames","language":"en","page_size":24}'{
"ok": true,
"data": { … },
"meta": {
"api": "whoppah",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}What a Whoppah field actually contains
Fields that read differently from how they look, and the limits worth knowing before you build on them. Every row was measured against live Whoppah responses on 2026-10-14, including the ones that go against us.
| Field | What it holds |
|---|---|
| price_eur | The buy-now price today, in euros. Whoppah has one price list for all six storefront languages - 25 sofas read in all six languages in the same minute had identical ids, prices, previous prices, minimum bids and dimensions, and the same total (11,416). It is null on a sold listing, never the stale asking price: a sold dining set's record still says 800 while it sold for 700, so the 800 comes back as last_asking_price_eur in detail and the 700 as sold_price_eur. |
| previous_price_eur and discount_pct | previous_price_eur is the seller's earlier price, and it is not always higher - one set of chairs went from 600 to 750 - so it is not called a list or was price. discount_pct is Whoppah's own figure where it shows one (14 of 40 sofas, 0 of 40 vases sampled). |
| min_bid_eur | The lowest bid the seller accepts, only while the listing accepts bids. Two details measured: search rows round it UP to a whole euro (86 where the listing's record says 85.50), and a listing that has switched bidding off can still carry an old minimum in its record (180 on a 257 listing) - that one is returned as null, because it is not an offer you can make. |
| sold and sold_price_eur | 36,108 listings are sold and stay searchable with the price they sold for. status: sold in search returns only those, status: available only what can still be bought; by default you get both and every row says which. |
| dimensions_cm and weight_kg | Width, height and depth in centimetres and weight in kilogrammes - the units are Whoppah's own, confirmed by its product pages' structured data (CMT, '3 kg'). They are what the seller typed, and some sellers type a placeholder: 1,784 listings give a width of 1 cm or less (90 of them sofas) and 3,889 a height of 1 cm or less, while 142 claim a width of 10 m or more. Those rows keep the value and carry a dimension_warnings flag, so nobody sorts a sofa by a 1 cm width. |
| listed_courier_prices (detail) and the shipping action | Two different shipping figures, both from Whoppah. The listing publishes a courier price per destination country; the checkout gives a live quote for an address. For one lamp in the same minute they agreed for the Netherlands (95), Belgium (117) and Austria (255) and disagreed for Germany (grid 278, quote 182) and France (309 vs 277). detail returns the grid, shipping returns the quote with the grid price next to it and grid_matches_quote. Neither depends on where the call comes from: the same listings read from twelve different network locations, in the Netherlands, Germany, the UK, the US, France and elsewhere, were identical every time. |
| total and total_is_exact | Exact with the default match: keyword - for 'eames' the total said 1,010 and paging through returned exactly 1,010 different listings. match: hybrid is the website's own default and adds meaning-based matches, but its total is an estimate (it said 1,011 and paged out 1,181 rows, 21 of them repeats), so those responses say total_is_exact: false. match: semantic stops at 500. Browsing without a query is exact to the last row: 222,006 listings, last page partial, then empty. |
| filter_mismatch | Whoppah filters on its search index, and a listing edited minutes ago can still be matched on its old values while the row shows the new ones - one 495 listing came back under a 500 minimum because its price had been cut two hours earlier. It is rare (about 1 row in 100 on the pages where it happened) and the row is kept, with filter_mismatch naming the filter it now contradicts. |
| category, brand, designer, artist, style, material, color | Slugs, the same in every language ('mid-century-modern', 'vitra', 'eames', 'dining-chairs'). The facets action lists them with live counts. An unknown value is refused by name rather than answered with an empty result, because Whoppah itself answers a typo with zero rows. |
| seller | As Whoppah publishes it: display_name (a business's shop name, or a private seller's chosen name), kind private or business, the expert-seller badge, rating, review count, live listings and completed sales, member since and the countries they sell from. Search rows carry only seller_id; the name comes from detail or seller. No address, phone or e-mail is published. |
| location | The item's city and country, as the product page shows it. The country filter is the item's country, not a delivery destination - use free_shipping_to or the shipping action for that. |
| not returned | Search rows carry no seller name, city, category or brand name (only the ids). No bid history, no buyer identity, no review texts. Facet lists stop at the top 100 values. Nothing behind a login: favourites, messages, offers and checkout are out of scope. |
Prices are EUR throughout. Measured on 2026-10-14: two identical live runs of 41 cases each, 41 of 41 passing both times, plus the recon probes behind each row above.
Countries, languages, currency, shipping and counts - measured
The questions a cross-border resale API has to answer, each checked live on 2026-10-14.
One shared catalogue of 222,006 listings (185,846 for sale, 36,108 sold) with items in 25 countries: NL 100,217 - FR 34,036 - BE 26,418 - DE 19,913 - IT 9,169 - CZ 7,441 - ES 6,717 - PL 6,291 - GB 3,138 and 16 more. The country filter is where the item is.
Chooses one of six storefront languages - en, nl, de, fr, es, it - for titles, descriptions, category and attribute names and the listing URL. Prices, filters and counts are identical in all six; the seller's original wording is returned beside the translation in detail.
Yes - EUR on every storefront, one price list.
No. Twelve different network locations, in five countries and more, returned byte-identical prices, courier grids and quotes. The destination is a parameter of the shipping action.
Yes with the default keyword matching (1,010 stated, 1,010 returned) and when browsing without a query. The website's hybrid matching is offered too, flagged total_is_exact: false.
Sold prices, yes: 36,108 sold listings keep their final sale price. There is no per-listing history of price changes beyond the previous price.
What people build with Whoppah
The jobs this data is most often used for.
endpoints
credits per call
Price a design piece from real sales: search status: sold for the same brand or designer and category, and read the final sale prices next to the live asking prices of the pieces still for sale.
Source stock with real constraints: a sideboard under 180 cm wide, in teak, mid-century modern, under 1,500 EUR, located in the Netherlands or Belgium, with courier delivery, newest first.
Quote landed cost for a cross-border buyer: the shipping action for a German or French address next to the listing's own courier price, with delivery-day windows.
Watch a dealer: a business seller's profile with rating, review count, live listings and completed sales, plus their newest listings or their sold history.
What Whoppah data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 491 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/whoppah/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"eames","language":"en","page_size":24}'import requests
r = requests.post(
"https://api.reefapi.com/whoppah/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "eames",
"language": "en",
"page_size": 24
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Whoppah.
Get a free key →Do I need a Whoppah account or key?▾
No. Everything this API reads is Whoppah's public marketplace: search, listings, sold listings, delivery quotes, related listings and public seller profiles. Nothing behind a login is touched.
Can I get the price a piece actually sold for?▾
Yes. Whoppah keeps sold listings searchable with their final sale price - 36,108 of them on 2026-10-14. Pass status: sold to search only those, with any of the usual filters, for example every sold Eames piece or every sold Thonet dining chair. On a sold row price_eur is null and sold_price_eur carries what it went for.
Are prices different on the Dutch, German or French storefront?▾
No. One price list in euros behind all six storefront languages: 25 sofas read in en, nl, de, fr, es and it in the same minute had identical prices, dimensions and totals. The language parameter changes titles, descriptions and category names, not prices or counts.
Does the shipping cost depend on where I call from?▾
No. The same listings were read from twelve different network locations - in the Netherlands, Germany, the UK, the US, France and elsewhere - and every price, every courier grid and every delivery quote was byte-identical. The destination is a parameter you pass to the shipping action - a country, and optionally a postcode, city and street for the address-priced courier.
Why does the shipping action sometimes disagree with the listing's courier price?▾
Because Whoppah publishes two figures and they do not always match: the per-country price on the listing and the live quote its checkout gives. For one lamp they matched for the Netherlands, Belgium and Austria and differed for Germany (278 vs 182) and France (309 vs 277). The shipping action returns both with grid_matches_quote, so you can choose.
Is the total count reliable?▾
With the default keyword matching, yes, to the row. The website's own hybrid matching gives an estimate and can repeat a listing on the next page; you can still ask for it with match: hybrid, and the response says total_is_exact: false when you do.
What happens if I pass a brand or category Whoppah does not have?▾
You get a clear INVALID_PARAM naming the value. Whoppah itself answers an unknown value with zero results, which would look like an empty market, so this API checks the value first: closed lists are checked locally, and brand, designer, artist, category, style, material and colour against Whoppah's own answer.
Which countries do the items come from?▾
25. The Netherlands 100,217 listings, France 34,036, Belgium 26,418, Germany 19,913, Italy 9,169, Czechia 7,441, Spain 6,717, Poland 6,291, the UK 3,138, Hungary 2,350, Denmark 1,700 and 14 smaller ones. The country parameter filters on where the item is.
What is the Whoppah API?▾
Whoppah API is a ReefAPI endpoint group for the dutch-born design and vintage resale market: 222,006 listings of furniture, lighting, art and designer bags from sellers in 25 countries, including 36,108 sold pieces with their final sale price. It returns live JSON through POST requests under /whoppah/v1.
Is the Whoppah API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Whoppah calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Whoppah login or account?▾
No login to Whoppah is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Whoppah data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Whoppah API use?▾
Whoppah actions currently cost 1-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Whoppah from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call whoppah actions with the same key, credit pool and JSON envelope used by normal REST requests.
231 E-commerce & Marketplaces APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Whoppah, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 490 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-10-14.