# Wethenew API — sneakers and streetwear from wethenew.com (Paris resale marketplace): search and collections with every product's from-price, and one product with EVERY EU size's two offers — the marketplace price and Wethenew's own 48-hour express price and stock — plus style code, barcode, brand and model. Prices in the currency of the market you choose (EUR, AED, PLN, SAR). No login, no key.

> Search Wethenew's catalogue by model, colourway or style code, with brand, model, category, express-delivery, stock and price filters. Each row has the cheapest buyable size and the in-stock EU sizes, in the chosen market's currency.
> ReefAPI engine `wethenew` · 4 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/wethenew/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/wethenew/v1/search — 2 credits
Search Wethenew's catalogue by model, colourway or style code, with brand, model, category, express-delivery, stock and price filters. Each row has the cheapest buyable size and the in-stock EU sizes, in the chosen market's currency.

**Parameters:**
- `query` (string, required) — What to search for: a model (dunk low, air jordan 4, samba), a colourway (panda, bred) or a style code (DD1391-100). The source's own full-text search.
- `brand` (string, optional) — Only this brand as the site lists it (Nike, Air Jordan, Adidas, New Balance, ASICS, Salomon …). Case is matched for you against the source's own list; meta.facets.brand shows the values with counts.
- `model` (string, optional) — Only this model line as the site lists it (Air Jordan 4, Dunk Low, Samba, Gel-Kayano 14, NB 2002R …); meta.facets.model shows the values with counts.
- `category` (string, optional) — Streetwear category (Hoodie, T-Shirt, Crewneck, Short …); meta.facets.category shows the values. Sneakers carry no category.
- `express_only` (boolean, optional, default false) — Only products Wethenew holds in its own stock with 48-hour delivery.
- `in_stock_only` (boolean, optional, default true) — true (default, as the site) = only products with a buyable size; false also lists sold-out products.
- `min_price` (number, optional) — Only products with at least one size priced at or above this amount in the market's currency. The source matches ANY size's price (sold-out sizes included), so a row's price_from can sit outside the range.
- `max_price` (number, optional) — Only products with at least one size priced at or below this amount (same basis as min_price).
- `sort` (enum, optional, default "relevance") — Result order. [one of: relevance]
- `country` (string, optional, default "FR") — The market whose prices you want, two letters (233 markets). AE prices in AED, PL in PLN, SA in SAR, every other market in EUR. Every price in the answer says its currency; the exit network never changes it.
- `language` (enum, optional, default "EN") — Language of descriptions and collection titles (product names are not translated by the source). [one of: EN, FR, DE, ES, IT, NL, PL, AR]
- `limit` (integer, optional, default 40) — Rows per page, 1-40 (the site's own page size is 40).
- `cursor` (string, optional) — Next page: pass meta.next_cursor from the previous answer, with the same query, filters and sort.

**Returns:** rows[]: product_id, handle (give it to `product`), url, title, brand, model, product_type, style_code, in_stock, price_from (cheapest BUYABLE size, either offer), price_from_size (EU), price_from_offer (marketplace | express), express_price_from, express_price_from_size, price_min_all_sizes (Shopify's min over every size incl. sold-out — not a buyable price), sizes_in_stock[] (EU), express_sizes_in_stock[], currency, country, image, created_at. meta: total (search only; stops at 1000 → total_capped), in_stock_total (collection), has_more, next_cursor, sort, filters_applied, facets{brand, model, category, availability, express_delivery}[{value, count}], country, currency, warnings.

**Example request body:**
```json
{
  "query": "dunk low",
  "country": "FR"
}
```

### POST https://api.reefapi.com/wethenew/v1/collection — 2 credits
One collection (a brand, a model line or a theme such as livraison-48h) with the same filters and row shape as `search`, and five sort orders.

**Parameters:**
- `collection` (string, required) — A collection handle as in the site's URLs /collections/<handle>: brands (nike, adidas, new-balance), lines (air-jordan-1, nike-dunk-low, adidas-samba), themes (all-sneakers, livraison-48h, les-best-sellers) — or the full URL.
- `brand` (string, optional) — Only this brand as the site lists it (Nike, Air Jordan, Adidas, New Balance, ASICS, Salomon …). Case is matched for you against the source's own list; meta.facets.brand shows the values with counts.
- `model` (string, optional) — Only this model line as the site lists it (Air Jordan 4, Dunk Low, Samba, Gel-Kayano 14, NB 2002R …); meta.facets.model shows the values with counts.
- `category` (string, optional) — Streetwear category (Hoodie, T-Shirt, Crewneck, Short …); meta.facets.category shows the values. Sneakers carry no category.
- `express_only` (boolean, optional, default false) — Only products Wethenew holds in its own stock with 48-hour delivery.
- `in_stock_only` (boolean, optional, default true) — true (default, as the site) = only products with a buyable size; false also lists sold-out products.
- `min_price` (number, optional) — Only products with at least one size priced at or above this amount in the market's currency. The source matches ANY size's price (sold-out sizes included), so a row's price_from can sit outside the range.
- `max_price` (number, optional) — Only products with at least one size priced at or below this amount (same basis as min_price).
- `sort` (enum, optional, default "default") — Result order. [one of: default, best_selling, newest, price_asc, price_desc]
- `country` (string, optional, default "FR") — The market whose prices you want, two letters (233 markets). AE prices in AED, PL in PLN, SA in SAR, every other market in EUR. Every price in the answer says its currency; the exit network never changes it.
- `language` (enum, optional, default "EN") — Language of descriptions and collection titles (product names are not translated by the source). [one of: EN, FR, DE, ES, IT, NL, PL, AR]
- `limit` (integer, optional, default 40) — Rows per page, 1-40 (the site's own page size is 40).
- `cursor` (string, optional) — Next page: pass meta.next_cursor from the previous answer, with the same query, filters and sort.

**Returns:** rows[]: product_id, handle (give it to `product`), url, title, brand, model, product_type, style_code, in_stock, price_from (cheapest BUYABLE size, either offer), price_from_size (EU), price_from_offer (marketplace | express), express_price_from, express_price_from_size, price_min_all_sizes (Shopify's min over every size incl. sold-out — not a buyable price), sizes_in_stock[] (EU), express_sizes_in_stock[], currency, country, image, created_at. meta: total (search only; stops at 1000 → total_capped), in_stock_total (collection), has_more, next_cursor, sort, filters_applied, facets{brand, model, category, availability, express_delivery}[{value, count}], country, currency, warnings.

**Example request body:**
```json
{
  "collection": "air-jordan-4"
}
```

### POST https://api.reefapi.com/wethenew/v1/product — 2 credits
One product in full: every EU size with its US size, the marketplace offer and the 48-hour express offer (each with price, buyable flag, variant id, barcode; express with its stock count), the cheapest buyable size, style code, brand, model, description, collections and images. Give `handle` (from a row) or `style_code`.

**Parameters:**
- `handle` (string, optional) — The product's `handle` from a search or collection row, as is — or its wethenew.com/products/... URL. Give `handle` or `style_code`.
- `style_code` (string, optional) — A manufacturer style code (AQ9129-101, DD1391-100). The product whose sizes carry exactly this code is returned. Give `handle` or `style_code`.
- `country` (string, optional, default "FR") — The market whose prices you want, two letters (233 markets). AE prices in AED, PL in PLN, SA in SAR, every other market in EUR. Every price in the answer says its currency; the exit network never changes it.
- `language` (enum, optional, default "EN") — Language of descriptions and collection titles (product names are not translated by the source). [one of: EN, FR, DE, ES, IT, NL, PL, AR]

**Returns:** product{product_id, handle, url, title, brand, model, product_type, style_code, description, express_delivery, available, country, currency, price_from, price_from_size, price_from_offer, express_price_from, express_price_from_size, price_max_in_stock, price_min_all_sizes, price_max_all_sizes (these two include sold-out sizes), sizes_in_stock[], express_sizes_in_stock[], sizes_total, sizes_available, sizes[]{size_eu, size_us, size (letter sizes), available, lowest_price, marketplace{variant_id, price, currency, available, compare_at_price, barcode, variant_title, shopify_available_for_sale}, express{… same …, quantity}}, collections[]{handle, title}, images[], tags[], created_at, updated_at}. meta: availability_rule, flag_conflicts, price_label_mismatch.

**Example request body:**
```json
{
  "handle": "air-jordan-4-vivid-sulfur"
}
```

### POST https://api.reefapi.com/wethenew/v1/suggest — 1 credit
The site's own search-as-you-type: matching products (handle, title, brand), collections (handle, title) and query completions.

**Parameters:**
- `query` (string, required) — The start of a search (two letters or more).
- `limit` (integer, optional, default 10) — How many products and collections, 1-10 each.
- `country` (string, optional, default "FR") — The market whose prices you want, two letters (233 markets). AE prices in AED, PL in PLN, SA in SAR, every other market in EUR. Every price in the answer says its currency; the exit network never changes it.
- `language` (enum, optional, default "EN") — Language of descriptions and collection titles (product names are not translated by the source). [one of: EN, FR, DE, ES, IT, NL, PL, AR]

**Returns:** products[]{handle, title, brand}, collections[]{handle, title}, queries[].

**Example request body:**
```json
{
  "query": "jordan 4"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=wethenew
- Human docs page: https://reefapi.com/docs/wethenew
- Overview page: https://reefapi.com/wethenew-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
