# Lamoda API scraper — lamoda.ru, Russia's largest fashion e-commerce site: keyword search, category listings, full product cards (price and struck price, per-size stock, attributes, seller) and customer reviews. No account, no browser.

> Search the whole Lamoda catalogue by keyword and/or category, brand, gender and colour (at least one of query, category_id or brand_id). Rows carry the price, struck price, per-size stock (uncapped on this surface), colours and category.
> ReefAPI engine `lamoda` · 4 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/lamoda/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/lamoda/v1/search — 3 credits
Search the whole Lamoda catalogue by keyword and/or category, brand, gender and colour (at least one of query, category_id or brand_id). Rows carry the price, struck price, per-size stock (uncapped on this surface), colours and category.

**Parameters:**
- `query` (string, optional) — Search words, Russian or Latin (brand names work: 'кеды nike'). Case does not matter.
- `category_id` (integer, optional) — Optional Lamoda category id (the number in /c/<id>/… URLs, or category_id / category_ids from any row), e.g. 15 = women's shoes, 129 = low sneakers.
- `brand_id` (integer, optional) — Optional Lamoda brand id (brand_id from any row), e.g. 1163 = adidas Originals. One per call.
- `gender` (enum, optional) — Optional: only products for this audience (the site's own gender segment). [one of: women, men, girls, boys, children, unisex]
- `color_id` (integer, optional) — Optional Lamoda colour id, e.g. 615 = white, 647 = beige.
- `page` (integer, optional, default 1) — Result page (1-based). The source stops at result 10 000; a later page is refused.
- `limit` (integer, optional, default 50) — Rows per page, 1-50 (the source's own maximum).

**Returns:** results[{position, product_id (Lamoda SKU), title, model, brand, brand_id, gender, url, image, images[], price (what the buyer pays now, RUB), was_price (struck original, only when discounted), discount_percent (computed from the two prices), discount_percent_site (the site's own figure), price_type (original | onsite | onsite_promo …, the source's own type of the price applied), promotion{type, price, percent, ends_at} (a timed promotion already in price), promo_code_price{price, promocode, percent, ends_at} (only with a code, never in price), price_display, currency, available, stock_quantity (sum over sizes), stock_cap (null = not capped), sizes[{size, size_system, brand_size, brand_size_system, size_sku, stock_quantity, stock_capped, available}], colours[], category_id, category_ids[], tags[], badges[]}], count, page, limit, total_results (the source's own figure), last_page, has_more, query, applied_filters

**Example request body:**
```json
{
  "query": "кеды",
  "limit": 20
}
```

### POST https://api.reefapi.com/lamoda/v1/category — 3 credits
List one Lamoda category, 60 rows a page, with the site's sorts, the on-sale filter, an optional keyword, brand and gender. Rows add rating, review count and seasons; per-size stock on this surface is capped at 10 by the source (stock_capped says when).

**Parameters:**
- `category_id` (integer, required) — Lamoda category id (the number in /c/<id>/… URLs), e.g. 15 = women's shoes, 17 = women's clothing.
- `query` (string, optional) — Optional keyword inside the category.
- `brand_id` (integer, optional) — Optional Lamoda brand id (brand_id from any row), e.g. 1163 = adidas Originals. One per call.
- `gender` (enum, optional) — Optional: only products for this audience (the site's own gender segment). [one of: women, men, girls, boys, children, unisex]
- `on_sale` (boolean, optional) — true = only discounted products, false = only full-price products.
- `sort` (enum, optional, default "popular") — Order of the listing, the site's own sorts. The site orders by its own price key, so with price_asc / price_desc a row can sit out of order on the published price (3 of 59 steps on a 2026-10-15 page). [one of: popular, new, price_asc, price_desc, discount, new_sale]
- `page` (integer, optional, default 1) — Listing page of 60 rows (1-167; the source repeats page 167 after that).

**Returns:** results[{position, product_id (Lamoda SKU), title, model, brand, brand_id, gender, url, image, images[], price (what the buyer pays now, RUB), was_price (struck original, only when discounted), discount_percent (computed from the two prices), discount_percent_site (the site's own figure), price_type (original | onsite | onsite_promo …, the source's own type of the price applied), promotion{type, price, percent, ends_at} (a timed promotion already in price), promo_code_price{price, promocode, percent, ends_at} (only with a code, never in price), price_display, currency, available, stock_quantity (sum over sizes), stock_cap (null = not capped), sizes[{size, size_system, brand_size, brand_size_system, size_sku, stock_quantity, stock_capped, available}], colours[], category_id, category_ids[], tags[], badges[], is_returnable, rating, rating_scale, review_count, seasons[], seller_id, stock_capped, sizes_from_other_products[] (sibling SKUs whose sizes the listing merged in; each size carries its own product_id)}], count, page, total_pages, total_results, has_more, page_clamped, sort_applied, category{id, name}, applied_filters

**Example request body:**
```json
{
  "category_id": 15,
  "sort": "price_asc"
}
```

### POST https://api.reefapi.com/lamoda/v1/product — 2 credits
One full Lamoda product card by SKU or URL: title, brand, supplier article, description, attributes, price and struck price, every size with its stock (the card caps stock at 20 per size), colours, season, collection, category path, rating, review and question counts, seller and its legal owner.

**Parameters:**
- `product_id` (string, optional) — Lamoda SKU, exactly as search/category rows return it in product_id (e.g. RTLAFQ471301).
- `url` (string, optional) — Alternatively a lamoda.ru product URL (/p/<sku>/…).

**Returns:** product{product_id, title, model, seo_title, brand, brand_id, supplier_article, gender, product_type, url, images[], description, price, was_price, discount_percent, discount_percent_site, price_type, promotion{type, price, percent, ends_at}, promo_code_price{price, promocode, percent, ends_at}, price_display, currency, available, stock_quantity, stock_cap, stock_capped, sizes[{size, size_system, brand_size, brand_size_system, size_sku, stock_quantity, stock_capped, available, other_systems[]}], size_scale, colours[], seasons[], collection, attributes[{key, name, value}], category{id, name}, breadcrumbs[{id, name, slug}], category_ids[], rating, rating_scale, review_count, question_count, photo_review_count, tags[], badges[], is_returnable, is_tryon, seller{id, name, business_model, is_lamoda}, legal_owner{company_name, shop_name, business_model, tax_id, registration_number, country, city, address, postcode, description, terms, delivery_terms}}

**Example request body:**
```json
{
  "product_id": "RTLAFQ471301"
}
```

### POST https://api.reefapi.com/lamoda/v1/reviews — 1 credit
Customer reviews of one Lamoda product, paged: star rating, text, author's display name, date, the size bought, size fit, likes and photos.

**Parameters:**
- `product_id` (string, required) — Lamoda SKU (product_id from search/category/product).
- `sort` (enum, optional, default "date") — Review order. [one of: date, rating, likes, relevance]
- `direction` (enum, optional, default "desc") — Sort direction. [one of: desc, asc]
- `page` (integer, optional, default 1) — Review page (1-based).
- `limit` (integer, optional, default 20) — Reviews per page, 1-50.

**Returns:** reviews[{review_id, rating, text, author, created_at, size_bought, size_sku, purchase_status, colour, is_bought, is_verified, like_count, dislike_count, photos[], size_fit, width_fit}], count, page, limit, total_reviews, total_photos, has_more, product_id, sort_applied

**Example request body:**
```json
{
  "product_id": "RTLAFQ471501"
}
```

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