Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the Sellpy API page →
docs / sellpy

Sellpy

Sellpy

base /sellpy/v17 endpoints
post/sellpy/v1/detail2 credits

The complete record of one garment, from BOTH of the source's own back ends in one call: Sellpy's item database and its search index. That means the item's metadata translated into TEN languages, every photograph with the photo TYPE Sellpy shot it as (the robot turntable frames, the brand tag, the sole, the seam, the fabric close-up, the size label and one frame per DEFECT), the full measured defect list, the centimetre measurements, weight in kilos, Sellpy's own sellability score for the item, the intake / photographed / listed timestamps, the warehouse and shelf it sits on — and the price in ALL TWELVE markets at once, which is the only way to see that the seven euro storefronts share one price while SEK, DKK, PLN, CZK and RON are separate rounded lists (one measured item: EUR 48.50 / SEK 580 / DKK 390 / PLN 230 / CZK 1,250 / RON 280). Sellpy employee ids attached to the photos and the warehouse steps are stripped. An unknown id is NOT_FOUND. `language` changes the item's own words here (type, condition, colour, pattern, defect names) because they come from the record's ten translations; the AI keywords and concepts come from the English index, which is the only one carrying every market's price.

ParameterAllowed / rangeDescription
market = EUrequiredEU · SE · DE · AT · NL · BE · FI · FR · DK · PL · CZ · ROWhich Sellpy storefront to read. This is the one parameter you cannot get wrong: it picks BOTH the price list and the live assortment. Measured on brand Gucci, 2,712 indexed items were sellable as 2,139 in EU, 2,170 in SE, 2,155 in CZ and 2,005 in RO, and the engine always applies the storefront's own gate (`price_<market> > 0`) so a row is never returned with a missing price. The seven euro markets (EU, DE, AT, NL, BE, FI, FR) share ONE euro price — identical on 50/50 cross-checked items — while SEK, DKK, PLN, CZK and RON are separate rounded price lists, not conversions (SEK ran 10.00-12.50 per EUR across 50 items).
item_idrequired—A Sellpy item id — the 10-character code in the item url (`sellpy.com/item/GWXZAXqIpE`). Every `search` row returns it as `item_id` and as a ready-made `detail_params`. An id that does not exist answers NOT_FOUND (the source's own Parse error 101), not an empty success.
languageoptionalsv · en · de · nl · fr · da · fi · pl · cs · roThe language the item words come back in (type, colour, condition, pattern, defect names, category path). Defaults to the market's own language, which is what sellpy.com shows there. Only a language whose index actually carries your market's price is accepted — `en` carries all twelve, `nl` carries NL and BE, `de` carries DE and AT, `fr` carries FR and BE, and the rest carry one each — so an impossible pair is rejected instead of being served another country's price. Pick `en` with `market: "SE"` to read Swedish stock in English with every market's price attached.
include_pii = falseoptional—Add the seller's opaque Sellpy id (`seller_ref`) and their intake-bag id to each row. Off by default: sellpy.com never shows who sent an item, Sellpy is the party selling it, and the id is the only thing on this source that links items to one private person. Sellpy employee ids attached to photos and warehouse steps are stripped in every case and this flag does not bring them back.
Try in playground →
post/sellpy/v1/similar2 credits

Sellpy's own vector model, the one that powers 'you might also like' and its semantic search — reached directly. Give it item ids and it returns the nearest garments with their scores; give it free-text phrases and it finds items by MEANING, which is a different thing from the keyword search in `search` ('black leather biker jacket' works without those words appearing anywhere). The ids come back resolved into full rows, priced for your market. Two measured honesty notes: the service IGNORES its own region argument (`SE`, `EU` and a nonsense `XX` returned identical lists) so the engine applies the market gate itself and tells you how many neighbours survived it, and an unknown item id gets HTTP 200 with an empty list, which is answered here as NOT_FOUND.

ParameterAllowed / rangeDescription
market = EUrequiredEU · SE · DE · AT · NL · BE · FI · FR · DK · PL · CZ · ROWhich Sellpy storefront to read. This is the one parameter you cannot get wrong: it picks BOTH the price list and the live assortment. Measured on brand Gucci, 2,712 indexed items were sellable as 2,139 in EU, 2,170 in SE, 2,155 in CZ and 2,005 in RO, and the engine always applies the storefront's own gate (`price_<market> > 0`) so a row is never returned with a missing price. The seven euro markets (EU, DE, AT, NL, BE, FI, FR) share ONE euro price — identical on 50/50 cross-checked items — while SEK, DKK, PLN, CZK and RON are separate rounded price lists, not conversions (SEK ran 10.00-12.50 per EUR across 50 items).
item_idsoptional—Up to 10 item ids to find neighbours for, in one request. Use this OR `text`.
item_idrequired—A Sellpy item id — the 10-character code in the item url (`sellpy.com/item/GWXZAXqIpE`). Every `search` row returns it as `item_id` and as a ready-made `detail_params`. An id that does not exist answers NOT_FOUND (the source's own Parse error 101), not an empty success.
textoptional—Up to 5 free-text phrases to find garments for by MEANING rather than by keyword — Sellpy's own vector service, the one its app uses. 'black leather jacket' returned ten scored neighbours in the measured run. Use this OR `item_ids`.
count = 20optional1–50Neighbours to ask the vector service for, per input. Some of them will not be on sale in your market (the service ignores its own `region` argument — `SE`, `EU` and the nonsense `XX` returned identical lists), so the engine re-checks each one against the market and reports `ids_returned` vs `rows_in_market`.
languageoptionalsv · en · de · nl · fr · da · fi · pl · cs · roThe language the item words come back in (type, colour, condition, pattern, defect names, category path). Defaults to the market's own language, which is what sellpy.com shows there. Only a language whose index actually carries your market's price is accepted — `en` carries all twelve, `nl` carries NL and BE, `de` carries DE and AT, `fr` carries FR and BE, and the rest carry one each — so an impossible pair is rejected instead of being served another country's price. Pick `en` with `market: "SE"` to read Swedish stock in English with every market's price attached.
exclude_reserved = falseoptional—Drop items already in somebody's cart. The source keeps them in the index (93 of 2,139 live Gucci items were reserved), and sellpy.com itself shows them, so the default matches the storefront. Every row carries `is_reserved` either way.
include_all_market_prices = trueoptional—Keep `prices_by_market` on every row. It is filled with whatever the chosen language index carries: all twelve markets on `en`, two on `nl`/`de`/`fr`, one on the rest. Set it false to drop the block from the payload.
include_pii = falseoptional—Add the seller's opaque Sellpy id (`seller_ref`) and their intake-bag id to each row. Off by default: sellpy.com never shows who sent an item, Sellpy is the party selling it, and the id is the only thing on this source that links items to one private person. Sellpy employee ids attached to photos and warehouse steps are stripped in every case and this flag does not bring them back.
Try in playground →
post/sellpy/v1/categories1 credit

Sellpy's whole category tree with a LIVE item count on every node, in the market's own language — four levels, measured at 5 / 25 / 178 / 325 nodes on the EU surface, in one request. The counts come from the same gated search the `search` action runs, so they describe what is actually buyable in that country today (and the top-level words change with the market: 'Women' on EU, 'Kvinna' on SE). Counts on the broad nodes are the source's own estimates and every node says so.

ParameterAllowed / rangeDescription
market = EUrequiredEU · SE · DE · AT · NL · BE · FI · FR · DK · PL · CZ · ROWhich Sellpy storefront to read. This is the one parameter you cannot get wrong: it picks BOTH the price list and the live assortment. Measured on brand Gucci, 2,712 indexed items were sellable as 2,139 in EU, 2,170 in SE, 2,155 in CZ and 2,005 in RO, and the engine always applies the storefront's own gate (`price_<market> > 0`) so a row is never returned with a missing price. The seven euro markets (EU, DE, AT, NL, BE, FI, FR) share ONE euro price — identical on 50/50 cross-checked items — while SEK, DKK, PLN, CZK and RON are separate rounded price lists, not conversions (SEK ran 10.00-12.50 per EUR across 50 items).
parentoptional—Return only the part of the tree under this node, written with ' > ' between levels. Empty returns the whole tree.
depth = 4optional1–4How many levels deep to go. The full tree is 4 levels and measured 5 / 25 / 178 / 325 nodes on the EU surface.
languageoptionalsv · en · de · nl · fr · da · fi · pl · cs · roThe language the item words come back in (type, colour, condition, pattern, defect names, category path). Defaults to the market's own language, which is what sellpy.com shows there. Only a language whose index actually carries your market's price is accepted — `en` carries all twelve, `nl` carries NL and BE, `de` carries DE and AT, `fr` carries FR and BE, and the rest carry one each — so an impossible pair is rejected instead of being served another country's price. Pick `en` with `market: "SE"` to read Swedish stock in English with every market's price attached.
queryoptional—Free-text search over Sellpy's own index: brand, type, model, colour, material and the AI keywords Sellpy writes for each garment. Leave it empty to browse the whole market with filters only — and note that an empty query is what makes `price_asc`/`price_desc` a STRICT order (with a text query the index ranks textual relevance first and only then price; `meta.sort_is_strict` tells you which you got).
include_pii = falseoptional—Add the seller's opaque Sellpy id (`seller_ref`) and their intake-bag id to each row. Off by default: sellpy.com never shows who sent an item, Sellpy is the party selling it, and the id is the only thing on this source that links items to one private person. Sellpy employee ids attached to photos and warehouse steps are stripped in every case and this flag does not bring them back.
Try in playground →
post/sellpy/v1/facets1 credit

The shape of any slice of the catalogue: pick the facets you want and get their values with counts, plus min/max/average for the numeric ones, for exactly the same search `search` would run. This is how you discover the source's own vocabulary before you filter on it — the brand tokens, the size tokens, the defect names, the style tags — and how you measure a market (one request returned the live price band EUR 2.99-11,906.00, mean 23.73, and waists 50-200 cm, mean 77.2). 34 facets are offered; `model` is deliberately absent because the source filters on it but never returns its values.

ParameterAllowed / rangeDescription
market = EUrequiredEU · SE · DE · AT · NL · BE · FI · FR · DK · PL · CZ · ROWhich Sellpy storefront to read. This is the one parameter you cannot get wrong: it picks BOTH the price list and the live assortment. Measured on brand Gucci, 2,712 indexed items were sellable as 2,139 in EU, 2,170 in SE, 2,155 in CZ and 2,005 in RO, and the engine always applies the storefront's own gate (`price_<market> > 0`) so a row is never returned with a missing price. The seven euro markets (EU, DE, AT, NL, BE, FI, FR) share ONE euro price — identical on 50/50 cross-checked items — while SEK, DKK, PLN, CZK and RON are separate rounded price lists, not conversions (SEK ran 10.00-12.50 per EUR across 50 items).
facetsoptionalbrand · type · color · material · material_group · fabric · pattern · condition · size · season · style · brand_group · demography · segment · item_language · neckline · sleeve_length · garment_length · pants_length · waist_rise · defect_type · warehouse · sale_type · category_lvl0 · category_lvl1 · category_lvl2 · category_lvl3 · waist_cm · inner_leg_cm · height_cm · width_cm · length_cm · heel_height_cm · priceAlso return the value counts of these facets for the SAME search, so one call gives you rows plus the shape of what matched. Numeric facets (`price`, `pants_length`, `waist_cm`, `inner_leg_cm`, `height_cm`, `width_cm`, `length_cm`, `heel_height_cm`) come back with min/max/avg/sum as well as value counts, and ONLY those eight do: the source hands out a stats block for any facet with numeric-looking values, which on `brand` produced min 0 / max 6397 on one market and min -417 on another, so it is dropped. `model` is not here on purpose: it FILTERS (model 501 -> 9,904 items) but the source never returns facet values for it.
queryoptional—Free-text search over Sellpy's own index: brand, type, model, colour, material and the AI keywords Sellpy writes for each garment. Leave it empty to browse the whole market with filters only — and note that an empty query is what makes `price_asc`/`price_desc` a STRICT order (with a text query the index ranks textual relevance first and only then price; `meta.sort_is_strict` tells you which you got).
languageoptionalsv · en · de · nl · fr · da · fi · pl · cs · roThe language the item words come back in (type, colour, condition, pattern, defect names, category path). Defaults to the market's own language, which is what sellpy.com shows there. Only a language whose index actually carries your market's price is accepted — `en` carries all twelve, `nl` carries NL and BE, `de` carries DE and AT, `fr` carries FR and BE, and the rest carry one each — so an impossible pair is rejected instead of being served another country's price. Pick `en` with `market: "SE"` to read Swedish stock in English with every market's price attached.
max_facet_values = 20optional1–1000How many values to return per facet, 1-1000. Raise it when you are walking the source's own vocabulary rather than drawing a sidebar: the live size facet alone holds over 200 distinct tokens and the brand facet thousands.
categoryoptional—Restrict to one node of Sellpy's own category tree, written exactly as the tree prints it with ' > ' between levels — `Women`, `Women > Clothing`, `Women > Clothing > Pants & Jeans`, `Women > Clothing > Pants & Jeans > Jeans`. The depth you pass picks the level it filters on. The words are in the market's language ('Kvinna' on `SE`), and the `categories` action returns the whole tree with live counts.
min_priceoptional0–Lowest price, in the MARKET'S OWN currency and MAJOR units (20 = EUR 20.00 on a euro market, 20 SEK on `SE`). Never minor units: the source stores 4850 for EUR 48.50 and the engine does the conversion for you. On the EU surface the index's own stats put the live price band at EUR 2.99 - 11,906.00, mean 23.73.
max_priceoptional0–Highest price, same units as `min_price`.
exclude_reserved = falseoptional—Drop items already in somebody's cart. The source keeps them in the index (93 of 2,139 live Gucci items were reserved), and sellpy.com itself shows them, so the default matches the storefront. Every row carries `is_reserved` either way.
circle_listings = includeoptionalinclude · exclude · onlySellpy has two kinds of listing: the managed one (Sellpy does the photography, grading, pricing, storage and shipping) and 'Circle', where a private person ships directly. MEASURED, and the number is the point: 334,685 Circle items exist in the index, but `p2p:true` plus the EU gate matched ZERO (exact) while `p2p:true` plus the SE gate matched 29,051 (exact). Circle is a SWEDEN-ONLY surface today, so `only` returns nothing outside `market: "SE"` and this engine says so instead of letting it look broken. Every row carries `is_circle_listing`.
last_chance_only = falseoptional—Only items the storefront flags as about to leave the market.
include_pii = falseoptional—Add the seller's opaque Sellpy id (`seller_ref`) and their intake-bag id to each row. Off by default: sellpy.com never shows who sent an item, Sellpy is the party selling it, and the id is the only thing on this source that links items to one private person. Sellpy employee ids attached to photos and warehouse steps are stripped in every case and this flag does not bring them back.
brandoptional—Keep only these brands, as the source spells them. Use the `brands` action for the exact string: `Levi's` matches 0 items. Several values are OR-ed. Measured: Gucci 2,139 of the EU surface.
typeoptional—Garment type in the market's language: Sneakers, Jeans, Dress, Belt, Sunglasses... Measured on a 2,139-row control: Sneakers 144.
modeloptional—Model or line name. This one FILTERS but has no facet values at the source (`501` -> 9,904 items, `Gazelle` -> 1,241), so there is no value list to browse — pass a name you know.
coloroptional—Colour in the market's language. Measured: Black 828 of 2,139.
materialoptional—Declared material. Measured: Leather 431 of 2,139.
material_groupoptional—Sellpy's own material grouping, which adds families and purity labels on top of the raw material ('Natural fibers', 'Synthetic Fibers', '100% Cotton'). Measured: 100% Cotton 150 of 2,139.
fabricoptional—Fabric construction: Denim, Fine knit, Velvet, Corduroy, Tweed... Measured: Denim 46 of 2,139.
patternoptional—Surface pattern in the market's language: Monochrome, Print, Striped, Floral, Checked, Pinstripe, Chevron. Measured on the control: Monochrome 349, Print 156, Striped 48, Floral 22 of 2,139.
conditionoptional—Sellpy's own grade, assigned by Sellpy, not by the seller. The live EU surface splits Very good 4.12M / Good 3.70M / Acceptable 1.20M / New 1.09M; 'Poor' exists in tiny numbers. The value is in the market's own language ('Bra' on SE, 'Sehr gut' on DE), which is why every row also carries `condition_rank` 1-5 and `condition_label_en` — the ladder was read off all ten language indexes, so neither is ever null just because you left English.
sizeoptional—Sellpy's size token, AUDIENCE-SCALE-VALUE: `WMN-INT-M`, `WMN-EU-38`, `MEN-INT-L`, `SHOES-EU-37.5`, `PANTS-INCH-27`, `CHILD-CM-98`, `BELTS-CM-85`, plus `NO SIZE` and `ONE SIZE`. Every row returns it split into audience / scale / value as well as raw. Measured: SHOES-EU-38 54 of 2,139.
seasonoptional—Measured on the control: Spring 931, Summer 899, Fall 385, Winter 231.
styleoptional—Sellpy's own style tag: chic, casual, vintage, urban, minimalist, glamour, athleisure... Measured: chic 1,045 of 2,139.
brand_groupoptional—Sellpy's brand grouping — 'Luxury & High-End', 'Denim', 'American Fashion Heritage', 'Athletic & Sportswear'. Measured: Luxury & High-End 2,121 of the 2,139 Gucci rows.
demographyoptional—The source's own audience label in the market's language: Women, Men, Girls, Boys, Unisex (Adults), Unisex (Kids). Measured: Men 307 of 2,139. `segment` is the coarser, language-free version.
segmentoptional—The language-free audience bucket: women, men, children, unisex, things. Prefer this one when you query several markets.
item_languageoptional—The language of a BOOK or other printed item, not the language the listing is written in (the top-level `language` does that, and the two were deliberately given different names so neither can silently swallow the other). Measured inside the 'Other items' tree: Swedish 32,610, German 23,930, English 10,343.
necklineoptional—Measured: Round neck 117, V-neck 37 of the control.
sleeve_lengthoptional—Measured: Long sleeves 172, Short sleeves 89, Sleeveless 29, Three-quarter sleeve 8.
garment_lengthoptional—Midi / Mini / Maxi. Measured: Midi 58 of the control.
pants_lengthoptional—The trouser length label the source prints, as a STRING of inches: 32, 30, 34, 28... Measured on the Jeans tree: '32' 42,868.
waist_riseoptional—High / Medium / Low. Measured on the Jeans tree: High 24,336, Medium 7,550, Low 5,338.
defect_typeoptional—Sellpy inspects every garment and WRITES DOWN what is wrong with it, so you can filter on the flaw: Light dirt, Scratched, Dirty, Worn, Lightly scratched, Discoloration, Stain, Lightly worn. Measured: Stain 107 of 2,139. Each row returns the full defect list with the spot on the garment.
warehouseoptional—Which Sellpy warehouse holds the item — the live EU surface splits K / M / J. It is the source's own single-letter code and it moves delivery time, nothing else.
sale_typeoptional—How the item is being sold: `regular`, `influencer` (a curated celebrity/creator wardrobe), `business` or `upcycle`. Measured on the live EU surface: regular 11,310,613, influencer 118,245, business 65,280, upcycle 70 — so `influencer` is the one worth asking for and it really is a separate sub-catalogue.
waist_cmoptional—Waist in centimetres, as Sellpy MEASURED the actual garment (not a size label). Grammar: `76` exact, `70-80` band, `>=80`, `<=70`. Measured: 70-80 -> 84 of the 2,139-row control; the index's own stats put live waists at 50-200 cm, mean 77.2.
inner_leg_cmoptional—Measured inner leg length in cm, same grammar as `waist_cm`. Measured: 70-90 -> 57 of the control.
height_cmoptional—Measured height of the item in cm (bags, shoes, objects). Measured: 20-40 -> 80 of the control.
width_cmoptional—Measured width in cm. Measured: 20-40 -> 110 of the control.
length_cmoptional—Measured length in cm. Measured: 20-40 -> 6 of the control.
heel_height_cmoptional—Measured heel height in cm — the filter nobody else has. Measured: >=8 -> 117 of the control.
Try in playground →
post/sellpy/v1/brands1 credit

Resolve brand names the way the source spells them, with both counts that matter. This action is not a convenience, it is a correctness tool: filtering on `Levi's` returns zero items because the real tokens are `Levi Strauss & Co` and `Levi's Premium`. Each row gives the exact string, whether it is a sub-brand, Sellpy's LIFETIME item counter and — in one extra request for the whole page — how many are actually on sale in your market now. Those two numbers are not interchangeable: Gucci reads 43,466 lifetime and 2,139 live. `similar_to` additionally asks Sellpy's brand-similarity model for neighbours of a brand.

ParameterAllowed / rangeDescription
market = EUrequiredEU · SE · DE · AT · NL · BE · FI · FR · DK · PL · CZ · ROWhich Sellpy storefront to read. This is the one parameter you cannot get wrong: it picks BOTH the price list and the live assortment. Measured on brand Gucci, 2,712 indexed items were sellable as 2,139 in EU, 2,170 in SE, 2,155 in CZ and 2,005 in RO, and the engine always applies the storefront's own gate (`price_<market> > 0`) so a row is never returned with a missing price. The seven euro markets (EU, DE, AT, NL, BE, FI, FR) share ONE euro price — identical on 50/50 cross-checked items — while SEK, DKK, PLN, CZK and RON are separate rounded price lists, not conversions (SEK ran 10.00-12.50 per EUR across 50 items).
queryoptional—Prefix or fragment of a brand name. Leave it empty to walk the whole brand list (the source pages that index to 1,000 rows). This action exists because guessing the token fails: `Levi's` matches 0 items, `Levi Strauss & Co` matches 814,658 lifetime and `Levi's Premium` 64,208.
similar_tooptional—Ask Sellpy's own brand-similarity model which brands sit next to this one. 'Nike' returned Nike Air Max, Nike Training, Nike Sportswear, Nike Running, NIKE DRI-FIT, Nike Air Jordan, Nike Pro, The Nike Tee and Adidas, in `similar_brands`. On its own it also seeds the brand lookup, so you get this brand and its sub-brands in `brands` at the same time; pass `query` to look somewhere else instead.
with_live_counts = trueoptional—Also return how many items of each returned brand are ON SALE in your market right now, in one extra request for the whole page. Worth leaving on: the index's own `freq` is a LIFETIME counter and overstates availability by about 20x (Gucci: lifetime 43,466 vs 2,139 live in EU). `live_count_is_exact` says whether the source answered exactly or estimated.
limit = 10optional1–50Rows per requested surface, 1-50. On `suggest` the limit applies to each requested kind separately, and on `brands` it is also the number of brands the live-count sub-queries cover, so keep it modest when `with_live_counts` is on.
languageoptionalsv · en · de · nl · fr · da · fi · pl · cs · roThe language the item words come back in (type, colour, condition, pattern, defect names, category path). Defaults to the market's own language, which is what sellpy.com shows there. Only a language whose index actually carries your market's price is accepted — `en` carries all twelve, `nl` carries NL and BE, `de` carries DE and AT, `fr` carries FR and BE, and the rest carry one each — so an impossible pair is rejected instead of being served another country's price. Pick `en` with `market: "SE"` to read Swedish stock in English with every market's price attached.
include_pii = falseoptional—Add the seller's opaque Sellpy id (`seller_ref`) and their intake-bag id to each row. Off by default: sellpy.com never shows who sent an item, Sellpy is the party selling it, and the id is the only thing on this source that links items to one private person. Sellpy employee ids attached to photos and warehouse steps are stripped in every case and this flag does not bring them back.
Try in playground →
post/sellpy/v1/suggest1 credit

Autocomplete straight out of the storefront's own suggestion indexes, including the one that is really a SEARCH LOG: `queries` returns the phrases Sellpy's shoppers actually typed, each with its popularity and an item-count estimate, per language ('jeans' scored 1,023 on the English surface and 27,187 on the Swedish one, where 'jeansjacka' and 'jeansskjorta' also surface). `entities` returns brand and category entities with the storefront url that opens them, `brands` the brand names with lifetime counts, and `types` the garment-type autocomplete — which is SWEDISH ONLY whatever market you ask for, because the source keeps it on a shared language-less application, and this engine says so rather than pretending it localises.

ParameterAllowed / rangeDescription
market = EUrequiredEU · SE · DE · AT · NL · BE · FI · FR · DK · PL · CZ · ROWhich Sellpy storefront to read. This is the one parameter you cannot get wrong: it picks BOTH the price list and the live assortment. Measured on brand Gucci, 2,712 indexed items were sellable as 2,139 in EU, 2,170 in SE, 2,155 in CZ and 2,005 in RO, and the engine always applies the storefront's own gate (`price_<market> > 0`) so a row is never returned with a missing price. The seven euro markets (EU, DE, AT, NL, BE, FI, FR) share ONE euro price — identical on 50/50 cross-checked items — while SEK, DKK, PLN, CZK and RON are separate rounded price lists, not conversions (SEK ran 10.00-12.50 per EUR across 50 items).
queryrequired—What the shopper has typed so far — a prefix is enough. It is matched against the real search log, so 'jean' already reaches 'jeansjacka' and 'jeanskjol' on the Swedish surface.
kinds = queries,entities,brandsoptionalqueries · entities · brands · typesWhich suggestion surfaces to return. `queries` is the interesting one: it is the real search log, so `jeans` came back with popularity 1,023 on the English surface and 27,187 on the Swedish one.
limit = 10optional1–50Rows per requested surface, 1-50. On `suggest` the limit applies to each requested kind separately, and on `brands` it is also the number of brands the live-count sub-queries cover, so keep it modest when `with_live_counts` is on.
languageoptionalsv · en · de · nl · fr · da · fi · pl · cs · roThe language the item words come back in (type, colour, condition, pattern, defect names, category path). Defaults to the market's own language, which is what sellpy.com shows there. Only a language whose index actually carries your market's price is accepted — `en` carries all twelve, `nl` carries NL and BE, `de` carries DE and AT, `fr` carries FR and BE, and the rest carry one each — so an impossible pair is rejected instead of being served another country's price. Pick `en` with `market: "SE"` to read Swedish stock in English with every market's price attached.
include_pii = falseoptional—Add the seller's opaque Sellpy id (`seller_ref`) and their intake-bag id to each row. Off by default: sellpy.com never shows who sent an item, Sellpy is the party selling it, and the id is the only thing on this source that links items to one private person. Sellpy employee ids attached to photos and warehouse steps are stripped in every case and this flag does not bring them back.
Try in playground →
Built for volume
5M+ requests a day

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.

Missing a source?
We build it

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.

Support
2 minute median reply

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.

One key, one balance
Every API included

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.