# Vestiaire Collective API scraper — the luxury resale marketplace (vestiairecollective.com): search for-sale and sold second-hand designer listings in 23 buyer countries with the price that country pays, read a full listing (seller price vs buyer fee, price drop, condition, measurements, seller type and sales history, shipping), browse a seller's listings and autocomplete. No account, no browser.

> Search Vestiaire Collective listings by keyword and/or brand, model and category, for sale or sold, with the site's own sorts and filters (department, condition, colour, material, seller badge, Direct Shipping, price range, listed after). Each row: product id and url, name, brand, model, category, condition, size, colours, the price a buyer in that country pays with the original price and price-drop %, sold flag, likes, listing date, seller id and badge, the item's country, local-delivery and Direct Shipping flags, and images. A query with no genuine match returns empty (padding counted in fallback_results_dropped); the site's own spelling correction is reported.
> ReefAPI engine `vestiaire` · 4 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/vestiaire/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, `Authorization: Bearer <key>`) and your assistant can call these actions directly.

## Endpoints

### POST /vestiaire/v1/search — 2 credits
Search Vestiaire Collective listings by keyword and/or brand, model and category, for sale or sold, with the site's own sorts and filters (department, condition, colour, material, seller badge, Direct Shipping, price range, listed after). Each row: product id and url, name, brand, model, category, condition, size, colours, the price a buyer in that country pays with the original price and price-drop %, sold flag, likes, listing date, seller id and badge, the item's country, local-delivery and Direct Shipping flags, and images. A query with no genuine match returns empty (padding counted in fallback_results_dropped); the site's own spelling correction is reported.

**Parameters:**
- `country` (enum, optional, default "us") — Buyer country (ISO-2; 'uk' accepted for gb). Prices include Vestiaire's buyer fee for delivery to this country, and the currency and language follow it. Default us. [one of: us, gb, fr, de, it, es, nl, be, at, ie, pt, gr, fi, ch, se, dk, pl, hk, sg, au, ca, jp, kr]
- `currency` (enum, optional) — Override the country's currency with one of the 13 currencies Vestiaire prices in. [one of: EUR, USD, GBP, HKD, SGD, AUD, CAD, PLN, CHF, SEK, DKK, JPY, KRW]
- `language` (enum, optional) — Language of names, categories, conditions and URLs; the keyword search follows it. Default: the country's language. [one of: en, fr, de, it, es, nl, sv, ko, zh]
- `query` (string, optional) — Keyword (brand, model, item). Optional when a brand, model, category or seller filter is given.
- `include_fallback_results` (boolean, optional, default false) — When a query matches nothing, Vestiaire pads the page with unrelated listings. They are dropped by default (fallback_results_dropped counts them); true returns them apart in fallback_results.
- `status` (enum, optional, default "available") — For-sale listings, sold listings (price research) or both. [one of: available, sold, all]
- `sort` (enum, optional, default "relevance") — Result order. [one of: relevance, newest, price_asc, price_desc]
- `gender` (enum, optional, default "all") — Department. [one of: all, women, men, kids]
- `condition` (enum, optional) — Item condition. [one of: never_worn_with_tag, never_worn, very_good, good, fair]
- `brand_id` (string, optional) — Vestiaire brand id (rows and suggest return brand_id; 50 = Chanel).
- `model_id` (string, optional) — Vestiaire model id (rows return model_id; 7597 = Chanel Timeless/Classique).
- `category_id` (string, optional) — Top category id, per department: women 2 clothing, 3 shoes, 5 bags, 6 accessories, 63 jewellery; men's ids differ (12 clothing, 13 shoes …). Rows return base_category_id; include_facets lists them with their department.
- `color_id` (string, optional) — Colour id (14 black, 1 white …; include_facets lists them).
- `material_id` (string, optional) — Material id (3 leather, 2 cotton …; include_facets lists them).
- `seller_badge` (enum, optional) — Only listings from sellers with this Vestiaire badge. [one of: expert, trusted]
- `direct_shipping` (boolean, optional, default false) — Only listings eligible for Direct Shipping (sent by the seller straight to the buyer).
- `price_min` (number, optional) — Minimum price in the response currency.
- `price_max` (number, optional) — Maximum price in the response currency.
- `listed_after` (string, optional) — Only listings created on or after this date (YYYY-MM-DD, UTC).
- `page` (integer, optional, default 1) — 1-based page. Vestiaire serves results up to offset 1000.
- `page_size` (integer, optional, default 48) — Rows per page (up to 200).
- `include_facets` (boolean, optional, default false) — Also return facet counts (brands, categories, colours, conditions, item countries, seller badges, materials, price ranges, sold) with their ids.

**Returns:** results[]{product_id, url, name, brand, brand_id, model, model_id, gender, base_category, base_category_id, category, category_id, condition, condition_id, size, color, colors[], price, currency, original_price, price_drop_percent, sold, likes, listed_at, seller_id, seller_badge, seller_is_official_store, item_country_code, local_delivery, direct_shipping, duty_free, editor_picks[], description, image, images[]}, count, total_results, total_is_capped, page, page_size, has_more, status, sort, country, currency, language, facets (include_facets), query, corrected_query, keyword_matches_on_page, fallback_results_dropped

**Example request body:**
```json
{
  "country": "us",
  "query": "chanel bag"
}
```

### POST /vestiaire/v1/product/detail — 2 credits
One Vestiaire Collective listing in full, by product id or URL, priced for a buyer country: name, brand, model, category path, condition, colour, material, size, measurements, the seller's description, price with seller price vs buyer fee (and whether the fee includes authentication), the flat fees listed apart, original price and price drop, negotiable, sold with sold date, reserved, Direct Shipping, likes, listing date, the seller (username, private or professional, country, badges, items listed and sold, last-6-months sales history) and shipping to that country (ships from, dispatch delay, buyable), plus every image.

**Parameters:**
- `country` (enum, optional, default "us") — Buyer country (ISO-2; 'uk' accepted for gb). Prices include Vestiaire's buyer fee for delivery to this country, and the currency and language follow it. Default us. [one of: us, gb, fr, de, it, es, nl, be, at, ie, pt, gr, fi, ch, se, dk, pl, hk, sg, au, ca, jp, kr]
- `currency` (enum, optional) — Override the country's currency with one of the 13 currencies Vestiaire prices in. [one of: EUR, USD, GBP, HKD, SGD, AUD, CAD, PLN, CHF, SEK, DKK, JPY, KRW]
- `language` (enum, optional) — Language of names, categories, conditions and URLs; the keyword search follows it. Default: the country's language. [one of: en, fr, de, it, es, nl, sv, ko, zh]
- `product_id` (string, optional) — Vestiaire product id (the number before .shtml in a product URL; rows return product_id).
- `url` (string, optional) — A vestiairecollective.com product URL instead of product_id.

**Returns:** product{product_id, url, name, brand, brand_id, model, model_id, gender, base_category, category, category_id, subcategory, breadcrumb[{name,url}], condition, color, material, size, size_standard, measurements[{name,value}], measurement_unit, watch_mechanism, watch_strap_material, packaging[], description, original_description, original_description_language, price, currency, original_price, price_drop_percent, seller_original_price, price_breakdown{seller_price, buyer_fee, buyer_fee_percent, buyer_fee_includes_authentication}, flat_buyer_fees[{type,amount,currency,description}], duties_and_taxes, negotiable, sold, sold_at, reserved, available, local, direct_shipping, consignment, prohibited, likes, listed_at, tags[], seller{id, username, type, segment, country_code, country, badges[], rating_badge, items_listed, items_sold, on_vacation, sales_history{sold, shipped_within_7_days, cancelled, period_start, period_end}}, shipping{ships_from, destination_country, dispatch_within_days, dispatch_day, buyable, prohibited, prohibited_reason, cost_min, cost_max, cost_currency}, images[], image}, country, currency, language

**Example request body:**
```json
{
  "country": "us",
  "product_id": "71015602"
}
```

### POST /vestiaire/v1/seller/listings — 2 credits
One seller's Vestiaire Collective listings (for sale, sold or both) with the same row fields, sorts and filters as search. Use status=sold for a seller's sales record.

**Parameters:**
- `seller_id` (string, required) — Vestiaire seller id (search rows and product/detail return it).
- `country` (enum, optional, default "us") — Buyer country (ISO-2; 'uk' accepted for gb). Prices include Vestiaire's buyer fee for delivery to this country, and the currency and language follow it. Default us. [one of: us, gb, fr, de, it, es, nl, be, at, ie, pt, gr, fi, ch, se, dk, pl, hk, sg, au, ca, jp, kr]
- `currency` (enum, optional) — Override the country's currency with one of the 13 currencies Vestiaire prices in. [one of: EUR, USD, GBP, HKD, SGD, AUD, CAD, PLN, CHF, SEK, DKK, JPY, KRW]
- `language` (enum, optional) — Language of names, categories, conditions and URLs; the keyword search follows it. Default: the country's language. [one of: en, fr, de, it, es, nl, sv, ko, zh]
- `query` (string, optional) — Keyword (brand, model, item). Optional when a brand, model, category or seller filter is given.
- `status` (enum, optional, default "available") — For-sale listings, sold listings (price research) or both. [one of: available, sold, all]
- `sort` (enum, optional, default "relevance") — Result order. [one of: relevance, newest, price_asc, price_desc]
- `gender` (enum, optional, default "all") — Department. [one of: all, women, men, kids]
- `condition` (enum, optional) — Item condition. [one of: never_worn_with_tag, never_worn, very_good, good, fair]
- `brand_id` (string, optional) — Vestiaire brand id (rows and suggest return brand_id; 50 = Chanel).
- `model_id` (string, optional) — Vestiaire model id (rows return model_id; 7597 = Chanel Timeless/Classique).
- `category_id` (string, optional) — Top category id, per department: women 2 clothing, 3 shoes, 5 bags, 6 accessories, 63 jewellery; men's ids differ (12 clothing, 13 shoes …). Rows return base_category_id; include_facets lists them with their department.
- `color_id` (string, optional) — Colour id (14 black, 1 white …; include_facets lists them).
- `material_id` (string, optional) — Material id (3 leather, 2 cotton …; include_facets lists them).
- `seller_badge` (enum, optional) — Only listings from sellers with this Vestiaire badge. [one of: expert, trusted]
- `direct_shipping` (boolean, optional, default false) — Only listings eligible for Direct Shipping (sent by the seller straight to the buyer).
- `price_min` (number, optional) — Minimum price in the response currency.
- `price_max` (number, optional) — Maximum price in the response currency.
- `listed_after` (string, optional) — Only listings created on or after this date (YYYY-MM-DD, UTC).
- `page` (integer, optional, default 1) — 1-based page. Vestiaire serves results up to offset 1000.
- `page_size` (integer, optional, default 48) — Rows per page (up to 200).
- `include_facets` (boolean, optional, default false) — Also return facet counts (brands, categories, colours, conditions, item countries, seller badges, materials, price ranges, sold) with their ids.

**Returns:** results[]{product_id, url, name, brand, brand_id, model, model_id, gender, base_category, base_category_id, category, category_id, condition, condition_id, size, color, colors[], price, currency, original_price, price_drop_percent, sold, likes, listed_at, seller_id, seller_badge, seller_is_official_store, item_country_code, local_delivery, direct_shipping, duty_free, editor_picks[], description, image, images[]}, count, total_results, total_is_capped, page, page_size, has_more, status, sort, country, currency, language, facets (include_facets), seller_id

### POST /vestiaire/v1/suggest — 1 credit
Vestiaire Collective autocomplete for a partial keyword: matching brands with their brand_id and URL, and the phrase suggestions the search box shows.

**Parameters:**
- `query` (string, required) — Partial keyword.
- `country` (enum, optional, default "us") — Buyer country (ISO-2; 'uk' accepted for gb). Prices include Vestiaire's buyer fee for delivery to this country, and the currency and language follow it. Default us. [one of: us, gb, fr, de, it, es, nl, be, at, ie, pt, gr, fi, ch, se, dk, pl, hk, sg, au, ca, jp, kr]
- `language` (enum, optional) — Language of names, categories, conditions and URLs; the keyword search follows it. Default: the country's language. [one of: en, fr, de, it, es, nl, sv, ko, zh]
- `limit` (integer, optional, default 10) — Maximum brands and maximum phrase suggestions.

**Returns:** brands[{brand_id, name, url}], suggestions[{text}], count, query, country, language

**Example request body:**
```json
{
  "country": "us",
  "query": "chan"
}
```

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