Selency
Selency
/selency/v1/search2 creditsSearch selency's 335,938 live second-hand vintage and design furniture listings with the source's own filters: free text, the 3-level category tree, style/period, material, colour, designer, the seller's country, the French department, price and list-price bounds, discount depth, width, height, depth and weight in real units, lot size, quality grade, and the negotiable / discounted / professional-seller / ambassador / handmade / authenticated / retail / trade-price flags. Every listing is a one-off, so every row carries its own price in EUR, its own measured dimensions, the country it ships from and the delivery methods its seller supports. `total` is exact up to 10,000 rows and an estimate above that — each response says which, in `total_is_exact`.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| query | optional | — | Free text over listing titles. The source's own search is language-aware, so pair it with `language`: 'coffee table' finds English titles, 'table basse' French ones. |
| language = en | optional | en · fr | Which of selency's two published locales to read. Both carry the SAME listings at the SAME price in EUR — verified field by field on 8 listings read from both indices in the same minute — so this only changes the language of titles, descriptions, category names and material/style labels, plus the language of the delivery labels. The French index is the complete one: it carried 335,938 listings against the English index's 335,860 (a 78-row, 0.02% lag). |
| category | optional | — | Category, as a slug from the categories action — a root (furniture, seating, lighting, decor, tableware, art, linens-soft-furnishings, garden-accessories, kids / meubles, chaises, eclairer, decorer, art-de-la-table, art, linge-de-maison, mobilier-de-jardin-terrasse, kids-enfant-vintage), or any of the 65 second-level or 126 third-level slugs (coffee-table, bedside-lamp-and-table-lamp, plaster-bust ...). Either language's slug is accepted and a numeric category id works too. Repeatable: several categories are OR-ed. Resolved against selency's own tree before the search is sent, because the source answers an unknown value with HTTP 200 and ZERO rows rather than an error. |
| style | optional | vintage · classic · world-s-craft · scandinavian · art-deco · design · contemporary · mid-century · industrial · modernist-bauhaus · bohemia · brutalist · space-age · art-nouveau · seventies · memphis | Style / period, selency's own 16 values. This is the field that carries the era: art-deco 20,892, mid-century 13,334, space-age 3,924, art-nouveau 3,719, brutalist 4,258, seventies 2,040, memphis 826, modernist-bauhaus 5,424. Language-free (the slug is identical on both indices), unlike the human label, which is translated. |
| material | optional | wood · ceramics-porcelain-and-earthenware · glass-and-crystal · wool-cotton · metal · linen · brass · paper · oak · teak · fabric · chrome · canvas · leather · rattan-and-wicker · iron · plastic · walnut · silver-plated-metal · aluminium · opaline · bronze · mahogany · bamboo · terracotta · marble · stone-and-plaster · stainless-steel · rosewood · velvet · plexiglass · resin · silver-material · leatherette · copper · fiberglass · melting · travertine · granite · bakelite · enamelled-sheet · formica · jute · rope · concrete · skin · slate · elm-burl · zinc · feather · terrazo | Material, selency's own 51 values — including the woods it separates by species (oak 8,779, teak 7,083, walnut 4,023, mahogany 2,922, rosewood 1,631, elm-burl) and the stones (marble 2,299, travertine 659, granite 527, slate). Language-free. |
| color | optional | multicolour · wooden · brown · white · transparent · black · golden · beige · blue · silver · green · red · grey · orange · pink · yellow · printed · ecru · burgundy · purple · turquoise · midnight-blue · terracotta | Colour, selency's own 23 values. Language-free. |
| designer | optional | — | Designer or manufacturer, exactly as selency publishes the name ('Paulin, Pierre', 'Jacobsen, Arne', 'Eames, Charles et Ray', 'Thonet, Michael', 'Ducaroy, Michel', 'Artemide', 'Stilnovo'). Call the facets action with facet=designer for the full list with counts. Sparse by nature: 5 of 200 sampled listings name one. |
| country | optional | FR · NL · BE · PL · IT · DE · TR · CZ · MA · ES · GB · DK · HU · SI · SE · AT · SK · PT · CH · MC · LU · LV · RO · US · TN · GE · LT · IE · NO · FI · EE · IN · GR · BG | The country the seller ships FROM — selency is EU-wide: FR 208,250, NL 19,793, BE 15,446, PL 14,053, IT 13,969, DE 13,914, TR 12,247, CZ 7,248, MA 5,859, ES 5,615, GB 5,006, DK 4,193 and 22 more. This is NOT a shipping destination and nothing in this API depends on where the call is made from. |
| department | optional | — | French department, as a 2-digit code: 75 Paris (18,099), 59 Nord (11,377), 44 Loire-Atlantique (7,229), 78 Yvelines (6,433), 33 Gironde (5,055) ... 94 codes in all. Filled on 94 of 200 sampled listings, because only French sellers carry one. |
| region | optional | Ile-de-France | The source's `region` tag. It is a one-value field on this source: measured over the whole 335,936-row catalogue it carries 'Ile-de-France' and nothing else (filled on 25 of 200 sampled rows), so in practice it is a 'greater Paris' switch. Published as the single-value filter it measurably is, rather than implied to be a full region taxonomy. |
| collection | optional | Produits a 200 balles | A curated selency collection. One collection exists on the source today, and the attribute is present ONLY on the French index — send language=fr with it, or the English index returns nothing. |
| quality_mark | optional | excellent · good · basic | selency's own listing-quality grade, with its own label taken from the source's own string. ⚠️ It grades the LISTING (photos, description, completeness), not the item's physical condition: every listing on this source is second-hand `UsedCondition` and there is no condition ladder to filter on. |
| min_price | optional | 0– | Lowest effective price in EUR (the discounted price when there is one). Prices are EUR on every country surface; there is no second price list and nothing here is converted. |
| max_price | optional | 0– | Highest effective price in EUR. |
| min_list_price | optional | 0– | Lowest price BEFORE any discount. Use this when you want the seller's original ask rather than today's price. |
| max_list_price | optional | 0– | Highest price before any discount. |
| min_discount | optional | 0–100 | Minimum discount percentage off the list price. 20,829 listings are 30% off or more; 58,709 carry any discount at all. |
| min_width | optional | 0– | Minimum width in CENTIMETRES. |
| max_width | optional | 0– | Maximum width in CENTIMETRES. ⚠️ A listing whose seller left a dimension blank carries 0 upstream (measured: width 0 on 10,664 listings, height 0 on 11,946, weight 0 on 25,396) — this engine returns those as null, but a `max_*` filter will still match them, because upstream 0 really is less than your ceiling. Pair it with the matching `min_*` to exclude them. |
| min_height | optional | 0– | Minimum height in CENTIMETRES. |
| max_height | optional | 0– | Maximum height in CENTIMETRES (see max_width about blank = 0). |
| min_depth | optional | 0– | Minimum depth in CENTIMETRES. |
| max_depth | optional | 0– | Maximum depth in CENTIMETRES (see max_width about blank = 0). |
| min_weight | optional | 0– | Minimum weight in KILOGRAMMES. |
| max_weight | optional | 0– | Maximum weight in KILOGRAMMES — the practical proxy for 'something a courier can actually take' (see max_width about blank = 0). |
| min_batch_quantity | optional | 1–8 | Minimum number of pieces in the lot. 1 on 253,697 listings; 2 on 35,536, 3 on 8,224, 4 on 9,849, 6 on 8,494, 8 on 14,437. Set 2 to get only sets (chairs, glasses, plates). |
| max_batch_quantity | optional | 1–8 | Maximum number of pieces in the lot. |
| negotiable | optional | — | Only listings where selency accepts an offer (263,427 of 335,936), or only those where it does not. The detail action also returns `reserved_price_eur` where the seller has pre-agreed a floor. |
| discounted | optional | — | Only listings whose price has been cut (58,709). |
| pro_seller | optional | — | Only professional sellers (245,251) or only private individuals. The seller action proves which: a professional shop carries a real company registration number, a private one carries null. |
| ambassador_seller | optional | — | Only selency 'ambassador' sellers (103,381). |
| min_seller_rating | optional | 0–5 | Minimum seller rating out of 5. The distribution is top-heavy: 180,014 listings sit with a 5.0 seller and 220,634 with 4.9 or better, so this bites hardest below 4.5. |
| min_seller_reviews | optional | 0– | Minimum number of reviews the seller has collected. |
| handmade | optional | — | Only handmade pieces (35,189). |
| authenticated | optional | — | Only pieces whose authenticity selency has approved (9,059 of 335,936) — the scarcest flag on the source and the one that matters for designer attribution. |
| retail | optional | — | Only new/retail stock rather than second-hand. Rare on this source: 536 listings. |
| pro_price | optional | — | Only listings that publish a trade (pro-buyer) price (104,332). |
| trade_program | optional | — | Only listings inside selency's trade programme (85,161). |
| delivery | optional | selency · seller · cocolis · mondial_relay · custom · colissimo | Keep only listings offering a delivery method. These are the METHODS a seller supports, not a price: the price per destination comes from the detail action's delivery grid, and `colissimo` is published on just 7 listings so do not build on it. |
| seller | optional | — | Shop id, from any listing's `seller.shop_id` or from the seller action. Repeatable. |
| published_after | optional | — | Only listings published on or after this date (YYYY-MM-DD). selency publishes roughly 1,600 a day: 8,036 listings carried a publish date inside the five days before 2026-10-08. |
| published_before | optional | — | Only listings published on or before this date (YYYY-MM-DD). |
| sort = relevance | optional | relevance · newest · price_asc · price_desc | The source's own four orderings (it publishes three sort replicas beside its default index). Anything else is refused with the list, because the source would ignore it and silently answer in relevance order. |
| page = 1 | optional | 1–10000 | 1-based page. The reachable window is 10,000 rows per ordering: past it the source returns an EMPTY page rather than repeating its last one (measured: with 100 rows per page, page 99 is full and pages 100, 101 and 120 are all empty), and meta.stop_reason says window_reached. To go deeper, narrow the filters or change `sort`. |
| page_size = 20 | optional | 1–100 | Rows per page, 1-100. The source honours up to 1,000 (3.44 MB raw) and clamps there; this engine caps at 100 (347 KB raw, 0.6 s) to stay inside the gateway's request budget. |
| include_pii = false | optional | — | Kept for contract compatibility. It changes nothing here: selency publishes a marketplace display name that it has already reduced to a first name and a surname initial, plus a shop country and rating aggregates, and no personal contact detail at all — so there is nothing to hold back. |
/selency/v1/detail2 creditsOne listing in full, from selency's own keyless product API: the seller's description in BOTH languages (one call returns both), every photo, the material / colour / style / designer records with their own slugs and labels, width, height and depth in centimetres and weight in kilogrammes, the full price block (list, current, pro-buyer, the seller's pre-agreed reserve where it exists, the marketplace fee and the seller payout), the category with its ancestors, the seller's shop record including whether it is a registered business or a private individual, and — kept strictly separate from the price — the delivery grid the seller published, with each offer stamped with the destination it is priced for.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| id | required | — | The listing's SKU as the URL shows it (H5H72TBH), its internal id, or the full product URL. A delisted or unknown listing answers a clean NOT_FOUND. |
| language = en | optional | en · fr | Which of selency's two published locales to read. Both carry the SAME listings at the SAME price in EUR — verified field by field on 8 listings read from both indices in the same minute — so this only changes the language of titles, descriptions, category names and material/style labels, plus the language of the delivery labels. The French index is the complete one: it carried 335,938 listings against the English index's 335,860 (a 78-row, 0.02% lag). |
| include_delivery = true | optional | — | Also return the per-listing delivery grid. The prices in it are the seller's own per-destination figures and do NOT depend on where this call is made from (verified byte-identical from six exit countries). selency's own carrier option publishes no price and comes back as null, not 0. |
| include_breadcrumb = true | optional | — | Also return the listing's full category path. |
| include_story = false | optional | — | Also return selency's editorial 'story' record (history, tips, fact). Usually empty: it exists for curated pieces only. |
| include_seller_stats = true | optional | — | Also return the seller's rating, review count, live and sold counts and days open. |
| include_pii = false | optional | — | Kept for contract compatibility. It changes nothing here: selency publishes a marketplace display name that it has already reduced to a first name and a surname initial, plus a shop country and rating aggregates, and no personal contact detail at all — so there is nothing to hold back. |
/selency/v1/similar2 creditsThe listings selency itself considers closest to a given one, with its own similarity distance on each. This is the practical substitute for comparable sold prices on a source where every piece is unique and nothing is kept after it sells: it answers 'what else like this is on the market, and at what price'. The source caps the set at 20 and reports `total: 20` whatever the real number is, so that cap is declared rather than passed off as a count.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| id | required | — | The listing's SKU, internal id, or product URL. |
| language = en | optional | en · fr | Which of selency's two published locales to read. Both carry the SAME listings at the SAME price in EUR — verified field by field on 8 listings read from both indices in the same minute — so this only changes the language of titles, descriptions, category names and material/style labels, plus the language of the delivery labels. The French index is the complete one: it carried 335,938 listings against the English index's 335,860 (a 78-row, 0.02% lag). |
| include_pii = false | optional | — | Kept for contract compatibility. It changes nothing here: selency publishes a marketplace display name that it has already reduced to a first name and a surname initial, plus a shop country and rating aggregates, and no personal contact detail at all — so there is nothing to hold back. |
/selency/v1/categories1 creditselency's own category tree — 9 roots, 65 second-level and 126 third-level nodes — with each node's French and English name AND slug side by side, its parent, its examples text and its image. This is where the `category` parameter's values come from, and why that parameter never has to be guessed: the source answers an unknown category value with HTTP 200 and zero rows rather than an error.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| language = en | optional | en · fr | Which of selency's two published locales to read. Both carry the SAME listings at the SAME price in EUR — verified field by field on 8 listings read from both indices in the same minute — so this only changes the language of titles, descriptions, category names and material/style labels, plus the language of the delivery labels. The French index is the complete one: it carried 335,938 listings against the English index's 335,860 (a 78-row, 0.02% lag). |
| category | optional | — | Return only this branch (a slug in either language, or a category id). Omit for the whole tree. |
| depth = 3 | optional | 1–3 | How many levels to return. The source's tree is exactly 3 deep. |
| include_pii = false | optional | — | Kept for contract compatibility. It changes nothing here: selency publishes a marketplace display name that it has already reduced to a first name and a surname initial, plus a shop country and rating aggregates, and no personal contact detail at all — so there is nothing to hold back. |
/selency/v1/facets1 creditThe source's own filter values with its own counts, for any scope you can search — the whole catalogue, a category, a free-text query, or any combination of the search filters. Use it to discover the 200+ filterable designer names, the 94 French departments, the 51 materials or the price range inside a category before you search. ⚠️ The counts are selency's own counters and they are exact only while the set is small: measured against the number of rows the same filter actually returns, they agreed to the row on 19 of 26 country filters (up to 7,248 rows) and then drifted by up to 13.5% above roughly 10,000 — so treat a large count as an estimate.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| facet | optional | batch_quantity · category_level1 · category_level2 · category_level3 · collection · color · country · department · designer · material · price · quality_mark · region · seller · seller_rating · style · width | Which filter dimensions to describe. Default: category_level1, style, material, color, country, designer, quality_mark and price. `price` and `width` come back as min/max/avg statistics rather than a value list. |
| query | optional | — | Scope the counts to a free-text search. |
| language = en | optional | en · fr | Which of selency's two published locales to read. Both carry the SAME listings at the SAME price in EUR — verified field by field on 8 listings read from both indices in the same minute — so this only changes the language of titles, descriptions, category names and material/style labels, plus the language of the delivery labels. The French index is the complete one: it carried 335,938 listings against the English index's 335,860 (a 78-row, 0.02% lag). |
| category | optional | — | Category, as a slug from the categories action — a root (furniture, seating, lighting, decor, tableware, art, linens-soft-furnishings, garden-accessories, kids / meubles, chaises, eclairer, decorer, art-de-la-table, art, linge-de-maison, mobilier-de-jardin-terrasse, kids-enfant-vintage), or any of the 65 second-level or 126 third-level slugs (coffee-table, bedside-lamp-and-table-lamp, plaster-bust ...). Either language's slug is accepted and a numeric category id works too. Repeatable: several categories are OR-ed. Resolved against selency's own tree before the search is sent, because the source answers an unknown value with HTTP 200 and ZERO rows rather than an error. |
| style | optional | vintage · classic · world-s-craft · scandinavian · art-deco · design · contemporary · mid-century · industrial · modernist-bauhaus · bohemia · brutalist · space-age · art-nouveau · seventies · memphis | Scope the counts to these styles. |
| material | optional | wood · ceramics-porcelain-and-earthenware · glass-and-crystal · wool-cotton · metal · linen · brass · paper · oak · teak · fabric · chrome · canvas · leather · rattan-and-wicker · iron · plastic · walnut · silver-plated-metal · aluminium · opaline · bronze · mahogany · bamboo · terracotta · marble · stone-and-plaster · stainless-steel · rosewood · velvet · plexiglass · resin · silver-material · leatherette · copper · fiberglass · melting · travertine · granite · bakelite · enamelled-sheet · formica · jute · rope · concrete · skin · slate · elm-burl · zinc · feather · terrazo | Scope the counts to these materials. |
| color | optional | multicolour · wooden · brown · white · transparent · black · golden · beige · blue · silver · green · red · grey · orange · pink · yellow · printed · ecru · burgundy · purple · turquoise · midnight-blue · terracotta | Scope the counts to these colours. |
| designer | optional | — | Scope the counts to these designers. |
| country | optional | FR · NL · BE · PL · IT · DE · TR · CZ · MA · ES · GB · DK · HU · SI · SE · AT · SK · PT · CH · MC · LU · LV · RO · US · TN · GE · LT · IE · NO · FI · EE · IN · GR · BG | Scope the counts to these seller countries. |
| department | optional | — | Scope the counts to these French departments. |
| region | optional | Ile-de-France | Scope the counts to the source's single region value. |
| collection | optional | Produits a 200 balles | Scope the counts to a curated collection (language=fr). |
| quality_mark | optional | excellent · good · basic | Scope the counts to these listing-quality grades. |
| min_price | optional | 0– | Scope the counts to this price floor in EUR. |
| max_price | optional | 0– | Scope the counts to this price ceiling in EUR. |
| negotiable | optional | — | Scope the counts to negotiable listings. |
| discounted | optional | — | Scope the counts to discounted listings. |
| pro_seller | optional | — | Scope the counts to professional sellers. |
| max_values = 100 | optional | 1–1000 | How many values per facet. The source's own cap is 1,000; the designer facet needs more than 200 to be complete. |
| include_pii = false | optional | — | Kept for contract compatibility. It changes nothing here: selency publishes a marketplace display name that it has already reduced to a first name and a surname initial, plus a shop country and rating aggregates, and no personal contact detail at all — so there is nothing to hold back. |
/selency/v1/seller2 creditsA seller's public shop record: whether it is a registered business (with its company registration number) or a private individual, the country it ships from, its ambassador and trade-programme status, how long it has been open, its rating, review count and live and sold listing counts — and optionally its current listings and the reviews buyers left. Selency publishes a display name it has already reduced to a first name and a surname initial, and no address, phone or e-mail anywhere on this surface.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| id | required | — | Shop id — either the id a listing's `seller.shop_id` carries, the UUID the detail action returns, or the id in a /shops/... URL. All three forms are accepted. |
| language = en | optional | en · fr | Which of selency's two published locales to read. Both carry the SAME listings at the SAME price in EUR — verified field by field on 8 listings read from both indices in the same minute — so this only changes the language of titles, descriptions, category names and material/style labels, plus the language of the delivery labels. The French index is the complete one: it carried 335,938 listings against the English index's 335,860 (a 78-row, 0.02% lag). |
| include_listings = true | optional | — | Also return the shop's current listings. |
| include_reviews = false | optional | — | Also return the reviews buyers left, with rating, comment, date and the listing they refer to. The buyer's surname is in the source's payload and is not forwarded — buyer identity is out of scope for this API. |
| page = 1 | optional | 1–10000 | 1-based page. The reachable window is 10,000 rows per ordering: past it the source returns an EMPTY page rather than repeating its last one (measured: with 100 rows per page, page 99 is full and pages 100, 101 and 120 are all empty), and meta.stop_reason says window_reached. To go deeper, narrow the filters or change `sort`. |
| page_size = 20 | optional | 1–100 | Rows per page, 1-100. The source honours up to 1,000 (3.44 MB raw) and clamps there; this engine caps at 100 (347 KB raw, 0.6 s) to stay inside the gateway's request budget. |
| include_pii = false | optional | — | Kept for contract compatibility. It changes nothing here: selency publishes a marketplace display name that it has already reduced to a first name and a surname initial, plus a shop country and rating aggregates, and no personal contact detail at all — so there is nothing to hold back. |
/selency/v1/suggest1 creditselency's own query suggestions — 29,301 of them — each with the popularity the source assigns it and the catalogue page it points at. This is the source's real demand signal: what people actually type, in its own words, per language.
| Parameter | Allowed / range | Description | |
|---|---|---|---|
| query | optional | — | Prefix or term to complete. Omit for the most popular suggestions overall. |
| language = en | optional | en · fr | Which of selency's two published locales to read. Both carry the SAME listings at the SAME price in EUR — verified field by field on 8 listings read from both indices in the same minute — so this only changes the language of titles, descriptions, category names and material/style labels, plus the language of the delivery labels. The French index is the complete one: it carried 335,938 listings against the English index's 335,860 (a 78-row, 0.02% lag). |
| page_size = 20 | optional | 1–50 | How many suggestions to return, 1-50. |
| include_pii = false | optional | — | Kept for contract compatibility. It changes nothing here: selency publishes a marketplace display name that it has already reduced to a first name and a surname initial, plus a shop country and rating aggregates, and no personal contact detail at all — so there is nothing to hold back. |
curl -X POST https://api.reefapi.com/selency/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"art deco brass lamp","language":"en","sort":"relevance","page_size":20}'{
"ok": true,
"data": { /* the result */ },
"meta": {
"latency_ms": 240,
"record_count": 12,
"completeness_pct": 100
},
"error": null
}Measured at 60 requests a second across the fleet, with no central bottleneck. Volume pricing is on request, and per-key limits are raised for high-volume accounts.
Tell us a site we do not cover yet and it becomes an engine. A customer asked for bestprice.gr on a Sunday and it was in the catalog the next day.
Median time from a question in the live chat to the first answer, measured across every answered conversation. Setup help included, no support tier to buy.
No per-site plans and no separate subscriptions. One key and one credit pool across the whole catalog, so adding a source costs nothing up front.
Planning something large? Tell us the volume and the sources and we will come back with what it costs and what we would have to build.