# Micolet API — live data from micolet.com, Spain's managed second-hand fashion marketplace (women, men, kids), across its eight storefronts: Spain, France, Belgium, Portugal, the UK, Italy, Germany and Poland. Every row is ONE physical garment that Micolet itself inspected, graded and priced: brand, type, size, colours, condition grade, season, the current price with the original retail price and markdowns, and whether it is still available or already SOLD (sold items stay listed with their last price — 1,047,186 sold vs 102,329 available dresses on one day). Each storefront has its OWN price list, so `detail` takes a `market` and states which storefront and currency it read. Search with 11 measured filters, read the full item page with every photo and the seller's closet, browse any seller's closet, resolve brand ids. No login, no API key.

> Search or browse one storefront and department, 48 rows per page as the site pages them. Every row is a unique garment with its own size, condition grade and price in the storefront's currency, plus the euro list price and the original retail price. Rows come in the site's own order (no sort exists): available garments first, then sold ones, each flagged `is_sold`. The meta reports the site's own three counts (total / available / sold). Every filter here was measured biting against the unfiltered control in the same run; the ones the site silently ignores are not offered. Paging stops at the site's 100-page ceiling.
> ReefAPI engine `micolet` · 5 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/micolet/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/micolet/v1/search — 3 credits
Search or browse one storefront and department, 48 rows per page as the site pages them. Every row is a unique garment with its own size, condition grade and price in the storefront's currency, plus the euro list price and the original retail price. Rows come in the site's own order (no sort exists): available garments first, then sold ones, each flagged `is_sold`. The meta reports the site's own three counts (total / available / sold). Every filter here was measured biting against the unfiltered control in the same run; the ones the site silently ignores are not offered. Paging stops at the site's 100-page ceiling.

**Parameters:**
- `market` (enum, optional, default "ES") — Which Micolet storefront to read. It picks the PRICE LIST, not just the language: each storefront prices the same garment differently (item 8417448: ES 9.49 · PT 9.99 · FR 9.99 · BE 10.49 · DE 10.99 · UK 10.99 EUR · IT 12.49 · PL 12.49 EUR; median markup over Spain on 12 dresses: PT +5.1%, FR +8.8%, BE +14.3%, DE/UK +18.9%, IT/PL +33.9%). The UK shows pounds and Poland zloty, converted from that storefront's euro price at one rate. Measured to depend on the storefront only, not on where the request comes from. Default ES (micolet.com). [one of: ES, FR, BE, PT, GB, IT, DE, PL]
- `department` (enum, optional, default "women") — Which department to search. The site keeps them on separate roots and silently IGNORES a gender/age query parameter (measured: same 7,334,815 total), so this is a real switch, not a filter. Measured totals on ES: women 7,334,817, men 576,039, kids 411,459 (sold included). [one of: women, men, kids]
- `query` (string, optional) — Free-text search, matched in the STOREFRONT'S language: 'jeans' on the UK men's root returned 62,790 rows, the Spanish 'vaqueros' on the UK women's root 14. Brand names work everywhere ('levis' 20,728 vs brand id 19 20,725 on ES).
- `category` (enum, optional) — Micolet's own category id. Ids are shared by the three departments (`54` = jackets: 440,746 for women, 50,583 for men). Use `categories` for the local names and the sub-type tags. An id the site does not know is HTTP 404 at the source and is rejected here. [one of: 1, 3, 4, 8, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56]
- `tag_id` (array, optional) — Sub-type tag ids from `categories` (216 = casual dress: 774,960 of 1,149,513 dresses). Several ids are OR-ed. An unknown id returns 0 rows (measured).
- `brand_id` (array, optional) — Brand ids from the `brands` action (Levi's = 19, Zara = 3, Mango = 15). Several ids are OR-ed (Zara+Mango dresses: 199,571). Unknown id -> 0 rows.
- `color` (array, optional) — Colour codes, OR-ed (red 88,921 + blue 80,980 -> red,blue 168,884 dresses). Closed list on purpose: the site does NOT ignore an unknown colour, it matches the items with no colour recorded (`nonsense` -> 494 rows), which would look like a real answer. [one of: beige, black, blue, brown, gold, green, grey, multicolor, navy_blue, orange, pink, purple, red, silver, white, yellow]
- `size` (array, optional) — Letter sizes, OR-ed (s 312,911 · s,m 656,489 dresses). [one of: xs, s, m, l, xl, xxl, 3xl, 4xl, 5xl, 6xl, 7xl]
- `numeric_size` (array, optional) — Numeric sizes as the site writes them: EU clothing 32-70 and shoe sizes (38 -> 49,691 dresses). A size the category does not use returns 0 rows (`37` on dresses), it is not ignored.
- `condition` (enum, optional) — Only the two grades the site can filter on: `new` (new with tags, 146,370 dresses) and `flaw` (small defect). 'Good' is the default grade and the site IGNORES `condition=good` (returned the unfiltered total), so it is not offered. [one of: new, flaw]
- `season` (enum, optional) — Season. Both values INCLUDE all-season garments: spring-summer matched 1,073,824 of 1,149,515 dresses. [one of: autumn-winter, spring-summer]
- `min_price` (number, optional) — Lowest price, in the STOREFRONT'S display currency (EUR, GBP on GB, PLN on PL) — the site applies it that way: `20-50` on dresses gave ES 44,876, UK 43,515 and PL 375,365.
- `max_price` (number, optional) — Highest price, in the storefront's display currency. Either bound may be used alone.
- `page` (integer, optional, default 1) — 1-based page of 48 rows (fixed by the site). The source stops at page 100 (4,800 rows): page 101, 500, 2000 and 99999 all came back EMPTY, so paging past 100 is rejected here — narrow the filters instead.
- `exclude_sold` (boolean, optional, default false) — Drop SOLD rows from the page. The site lists sold garments after the available ones (POMPOM dresses: 8 available, then 22 sold) and its headline count is mostly sold (dresses: 102,329 available of 1,149,515). Default false returns what the storefront shows, each row flagged `is_sold`, because the sold rows carry their last price.

**Returns:** items[]{item_id, url, title, name, brand, category, colors[], size, size_number, size_label, condition, condition_label_en, season, price{amount,currency,display}, price_from_attribute, price_eur_list, original_price{}, pre_markdown_price{}, is_marked_down, discount_pct, is_sold, image, market, detail_params{}} + meta{market, currency, host, department, page, per_page, page_cap, total, total_available, total_sold, rows_on_page, sold_rows_dropped, filters_applied{}, source_url}

**Example request body:**
```json
{
  "market": "ES",
  "category": "3",
  "condition": "new"
}
```

### POST https://api.reefapi.com/micolet/v1/detail — 2 credits
The full item page of one garment on one storefront: title, brand, type, the breadcrumb, colour codes, letter and numeric size, condition grade, season, the localized detail list exactly as printed, the current price in the storefront's currency with the euro list price, the original retail price and the pre-markdown price, the discount (computed AND the site's own figure), availability (available / sold / reserved), every photo in standard and zoom size, and the SELLER: the closet id and name the page shows, with the parameters to open that closet. A dead id is NOT_FOUND. Each storefront prices the same garment separately (DE/UK +18.9%, IT/PL +33.9% median over Spain), so to compare countries call `detail` once per `market`; the response states the market, currency and host it was read on.

**Parameters:**
- `item_id` (string, required) — The garment's numeric id — the `item_id` of any search row, or the last number of a micolet URL (/vestidos/pompom/8417448). Ids are shared by all eight storefronts.
- `market` (enum, optional, default "ES") — Which Micolet storefront to read. It picks the PRICE LIST, not just the language: each storefront prices the same garment differently (item 8417448: ES 9.49 · PT 9.99 · FR 9.99 · BE 10.49 · DE 10.99 · UK 10.99 EUR · IT 12.49 · PL 12.49 EUR; median markup over Spain on 12 dresses: PT +5.1%, FR +8.8%, BE +14.3%, DE/UK +18.9%, IT/PL +33.9%). The UK shows pounds and Poland zloty, converted from that storefront's euro price at one rate. Measured to depend on the storefront only, not on where the request comes from. Default ES (micolet.com). [one of: ES, FR, BE, PT, GB, IT, DE, PL]

**Returns:** item{item_id, url, title, name, brand, category, colors[], size, size_number, size_label, condition, condition_label_en, season, price{amount,currency,display}, price_from_attribute, price_eur_list, original_price{}, pre_markdown_price{}, is_marked_down, discount_pct, is_sold, image, market, detail_params{}, brand_display, breadcrumb[]{name,url}, facts[]{label,value}, discount_pct_source, availability, ld_availability, ld_item_condition, ld_price, ld_currency, description, photos[]{url,zoom_url}, photo_count, seller{kind,seller_id,name,closet_url,seller_params}} + meta{market, currency, host, price_witness_agrees}

**Example request body:**
```json
{
  "market": "ES",
  "item_id": "2390405"
}
```

### POST https://api.reefapi.com/micolet/v1/seller — 3 credits
A seller's public closet ('El armario de ...'): the closet name, the site's own counts (total / available / sold — one measured closet: 1,146 garments, 128 available) and its garments 48 per page, filterable with the same measured filters as `search` (colour pink -> 37 of 1,146). An unknown closet id is NOT_FOUND.

**Parameters:**
- `seller_id` (string, required) — The seller's closet id: `seller.seller_id` of a `detail` record, or the number in a /armario/<id> URL.
- `market` (enum, optional, default "ES") — Which Micolet storefront to read. It picks the PRICE LIST, not just the language: each storefront prices the same garment differently (item 8417448: ES 9.49 · PT 9.99 · FR 9.99 · BE 10.49 · DE 10.99 · UK 10.99 EUR · IT 12.49 · PL 12.49 EUR; median markup over Spain on 12 dresses: PT +5.1%, FR +8.8%, BE +14.3%, DE/UK +18.9%, IT/PL +33.9%). The UK shows pounds and Poland zloty, converted from that storefront's euro price at one rate. Measured to depend on the storefront only, not on where the request comes from. Default ES (micolet.com). [one of: ES, FR, BE, PT, GB, IT, DE, PL]
- `query` (string, optional) — Free-text search, matched in the STOREFRONT'S language: 'jeans' on the UK men's root returned 62,790 rows, the Spanish 'vaqueros' on the UK women's root 14. Brand names work everywhere ('levis' 20,728 vs brand id 19 20,725 on ES).
- `category` (enum, optional) — Micolet's own category id. Ids are shared by the three departments (`54` = jackets: 440,746 for women, 50,583 for men). Use `categories` for the local names and the sub-type tags. An id the site does not know is HTTP 404 at the source and is rejected here. [one of: 1, 3, 4, 8, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56]
- `tag_id` (array, optional) — Sub-type tag ids from `categories` (216 = casual dress: 774,960 of 1,149,513 dresses). Several ids are OR-ed. An unknown id returns 0 rows (measured).
- `brand_id` (array, optional) — Brand ids from the `brands` action (Levi's = 19, Zara = 3, Mango = 15). Several ids are OR-ed (Zara+Mango dresses: 199,571). Unknown id -> 0 rows.
- `color` (array, optional) — Colour codes, OR-ed (red 88,921 + blue 80,980 -> red,blue 168,884 dresses). Closed list on purpose: the site does NOT ignore an unknown colour, it matches the items with no colour recorded (`nonsense` -> 494 rows), which would look like a real answer. [one of: beige, black, blue, brown, gold, green, grey, multicolor, navy_blue, orange, pink, purple, red, silver, white, yellow]
- `size` (array, optional) — Letter sizes, OR-ed (s 312,911 · s,m 656,489 dresses). [one of: xs, s, m, l, xl, xxl, 3xl, 4xl, 5xl, 6xl, 7xl]
- `numeric_size` (array, optional) — Numeric sizes as the site writes them: EU clothing 32-70 and shoe sizes (38 -> 49,691 dresses). A size the category does not use returns 0 rows (`37` on dresses), it is not ignored.
- `condition` (enum, optional) — Only the two grades the site can filter on: `new` (new with tags, 146,370 dresses) and `flaw` (small defect). 'Good' is the default grade and the site IGNORES `condition=good` (returned the unfiltered total), so it is not offered. [one of: new, flaw]
- `season` (enum, optional) — Season. Both values INCLUDE all-season garments: spring-summer matched 1,073,824 of 1,149,515 dresses. [one of: autumn-winter, spring-summer]
- `min_price` (number, optional) — Lowest price, in the STOREFRONT'S display currency (EUR, GBP on GB, PLN on PL) — the site applies it that way: `20-50` on dresses gave ES 44,876, UK 43,515 and PL 375,365.
- `max_price` (number, optional) — Highest price, in the storefront's display currency. Either bound may be used alone.
- `page` (integer, optional, default 1) — 1-based page of 48 rows (fixed by the site). The source stops at page 100 (4,800 rows): page 101, 500, 2000 and 99999 all came back EMPTY, so paging past 100 is rejected here — narrow the filters instead.
- `exclude_sold` (boolean, optional, default false) — Drop SOLD rows from the page. The site lists sold garments after the available ones (POMPOM dresses: 8 available, then 22 sold) and its headline count is mostly sold (dresses: 102,329 available of 1,149,515). Default false returns what the storefront shows, each row flagged `is_sold`, because the sold rows carry their last price.

**Returns:** seller{seller_id, name, closet_title, closet_url} + items[]{item_id, url, title, name, brand, category, colors[], size, size_number, size_label, condition, condition_label_en, season, price{amount,currency,display}, price_from_attribute, price_eur_list, original_price{}, pre_markdown_price{}, is_marked_down, discount_pct, is_sold, image, market, detail_params{}} + meta{market, currency, host, department, page, per_page, page_cap, total, total_available, total_sold, rows_on_page, sold_rows_dropped, filters_applied{}, source_url}

**Example request body:**
```json
{
  "market": "ES",
  "seller_id": "111823"
}
```

### POST https://api.reefapi.com/micolet/v1/brands — 1 credit
Resolve a brand name to the id `search` filters on, straight from the site's own brand autocomplete (10 rows for 'levi', 14 for 'zara' in the measured run). Brand ids are the same on every storefront.

**Parameters:**
- `query` (string, required) — Start of a brand name. The site returns its own match list, alphabetically (measured: 10 rows for 'levi' -> levi & fiona, Levi's (19), LEVIATHAN ...; 14 for 'zara').
- `market` (enum, optional, default "ES") — Which Micolet storefront to read. It picks the PRICE LIST, not just the language: each storefront prices the same garment differently (item 8417448: ES 9.49 · PT 9.99 · FR 9.99 · BE 10.49 · DE 10.99 · UK 10.99 EUR · IT 12.49 · PL 12.49 EUR; median markup over Spain on 12 dresses: PT +5.1%, FR +8.8%, BE +14.3%, DE/UK +18.9%, IT/PL +33.9%). The UK shows pounds and Poland zloty, converted from that storefront's euro price at one rate. Measured to depend on the storefront only, not on where the request comes from. Default ES (micolet.com). [one of: ES, FR, BE, PT, GB, IT, DE, PL]

**Returns:** brands[]{brand_id, name, search_params{}} + meta{market, query}

**Example request body:**
```json
{
  "query": "levi"
}
```

### POST https://api.reefapi.com/micolet/v1/categories — 2 credits
The 15 category ids `search` accepts, with their English names, the storefront's own local sub-type tags (tag ids + local labels, read live from the storefront's menu) and which departments list each category.

**Parameters:**
- `market` (enum, optional, default "ES") — Which Micolet storefront to read. It picks the PRICE LIST, not just the language: each storefront prices the same garment differently (item 8417448: ES 9.49 · PT 9.99 · FR 9.99 · BE 10.49 · DE 10.99 · UK 10.99 EUR · IT 12.49 · PL 12.49 EUR; median markup over Spain on 12 dresses: PT +5.1%, FR +8.8%, BE +14.3%, DE/UK +18.9%, IT/PL +33.9%). The UK shows pounds and Poland zloty, converted from that storefront's euro price at one rate. Measured to depend on the storefront only, not on where the request comes from. Default ES (micolet.com). [one of: ES, FR, BE, PT, GB, IT, DE, PL]

**Returns:** categories[]{category_id, name_en, departments[], tags[]{tag_id,label}} + meta{market, tag_count}

**Example request body:**
```json
{
  "market": "ES"
}
```

## 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=micolet
- Human docs page: https://reefapi.com/docs/micolet
- Overview page: https://reefapi.com/micolet-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
