# Cdiscount API scraper — France's #2 marketplace (cdiscount.com): search products, read the full listing (EAN, specs, variants, buy-box price with its tax breakdown, reference price, delivery), list every seller's offer, and read reviews. No account, no browser.

> Search cdiscount.com by keyword, with the site's sorts and filters (condition, seller kind, Cdiscount à volonté, minimum rating, brand). Each row is the product's buy-box offer: product code, offer id, title, URL, brand, the buy-box price with its eco-participation/VAT/copy-levy breakdown, the legal reference price and discount when shown, condition, seller (Cdiscount or marketplace, with rating), CDAV flags, star rating, sponsored flag, image, and how many other new/used offers exist.
> ReefAPI engine `cdiscount` · 5 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/cdiscount/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 /cdiscount/v1/search — 1 credit
Search cdiscount.com by keyword, with the site's sorts and filters (condition, seller kind, Cdiscount à volonté, minimum rating, brand). Each row is the product's buy-box offer: product code, offer id, title, URL, brand, the buy-box price with its eco-participation/VAT/copy-levy breakdown, the legal reference price and discount when shown, condition, seller (Cdiscount or marketplace, with rating), CDAV flags, star rating, sponsored flag, image, and how many other new/used offers exist.

**Parameters:**
- `query` (string, required) — Keyword to search on cdiscount.com (French or brand/model words: 'aspirateur robot', 'iphone 15', 'lego technic').
- `page` (integer, optional, default 1) — Result page, 1-based. Cdiscount serves 47 organic listings per page; `total_pages` says how many exist. A page past the end returns an empty page.
- `sort` (enum, optional, default "relevance") — Order of the results — the site's own orderings. Price sorts follow the buy-box price. [one of: relevance, price_asc, price_desc, best_selling, rating, seller_rating]
- `price_min` (number, optional) — Lowest buy-box price in EUR (inclusive). Applied to the returned page; rows below it are dropped and counted in `dropped_outside_price_range`.
- `price_max` (number, optional) — Highest buy-box price in EUR (inclusive).
- `condition` (enum, optional) — Filter by condition (server-side facet). [one of: new, used]
- `seller_kind` (enum, optional) — Restrict to Cdiscount's own offers or to marketplace sellers. [one of: cdiscount, marketplace]
- `cdav_only` (boolean, optional) — Only listings eligible to Cdiscount à volonté (member free shipping).
- `min_rating` (enum, optional) — Minimum customer rating (server-side facet). [one of: 4, 3]
- `brand` (string, optional) — Cdiscount brand slug (as in its brand facet, e.g. 'lego', 'apple').
- `include_sponsored` (boolean, optional, default false) — false (default): Cdiscount's sponsored placements are dropped and counted in `sponsored_dropped`. true: they are returned in place, flagged `is_sponsored` with `advertiser`. `count` always counts organic rows only.
- `include_fallback_results` (boolean, optional, default false) — When no product on the page contains a query word, Cdiscount pads the page with unrelated products. false (default): results are empty and `fallback_results_dropped` counts what was dropped. true: those products are returned apart, in `fallback_results`.
- `max_rotations` (integer, optional, default 4) — Advanced: how many times to retry a difficult request (1-8, default 4).

**Returns:** results[]{position, product_id, offer_id, title, url, brand_id, price, currency=EUR, price_without_vat, reference_price, reference_price_type, reference_price_date, discount_percent, eco_participation, vat_amount, copy_levy, price_includes_eco_fee, unit_price, condition ('new'|'refurbished'|'used'), condition_grade, seller{id, name, is_cdiscount, rating, rating_scale, rating_count, sales_count, expedition_country}, is_cdav, cdav_free_shipping, free_shipping, rating, rating_count, rating_scale, is_sponsored, advertiser, other_new_offers, other_used_offers, lowest_new_offer_price, lowest_used_offer_price, category_id, category_code_path, promotions, image, images}, count (organic rows), sponsored_count (returned sponsored rows, only with include_sponsored=true), sponsored_dropped, total_results (0 when the page was fallback), total_pages, page, page_size, sort, query, did_you_mean, applied_filters, selected_category, dropped_outside_price_range, keyword_matches_on_page, fallback_results_dropped, fallback_total (Cdiscount's count for a dropped fallback page), fallback_results[] (only with include_fallback_results=true), page_notice; rating is rounded to 2 decimals, rating_count is the raw count

**Example request body:**
```json
{
  "query": "aspirateur robot"
}
```

### POST /cdiscount/v1/product/detail — 1 credit
The full Cdiscount product record by URL or product_id: title, brand, EAN, buy-box price with its eco-participation/VAT/copy-levy breakdown, the legal reference price and discount, the 4x instalment option, availability, condition, seller, the number of other new/used offers and their lowest prices, star rating with the 1-5 breakdown, energy label, repairability index, images, specs, description, breadcrumb, variants and the delivery options (cost + date).

**Parameters:**
- `url` (string, optional) — A cdiscount.com product URL. Every search row returns one as `url`.
- `product_id` (string, optional) — Alternative to `url`: the product code (the part after -f-<dept>- in a product URL). Every search row returns it as `product_id`.
- `max_rotations` (integer, optional, default 4) — Advanced: how many times to retry a difficult request (1-8, default 4).

**Returns:** product{product_id, offer_id, sku, title, url, brand, brand_id, ean, manufacturer_model_number, price, currency=EUR, price_without_vat, reference_price, reference_price_type, reference_price_date, discount_percent, eco_participation, vat_amount, copy_levy, price_includes_eco_fee, installment_4x{monthly_amount, first_amount, months, fee_rate_percent, total_fee, is_free}, availability, in_stock, max_quantity, is_preorder, condition, condition_grade, seller{...}, total_offers, total_new_offers, total_used_offers, lowest_new_offer_price, lowest_used_offer_price, rating, rating_count, rating_scale, rating_breakdown, recommended_count, energy_label, repairability_index, image_count, images[], specs[{group, attributes[{name, value}]}], description, short_description, category_code_path, breadcrumb[{name, url}], variants{axes[], current_key, options[{key, product_id, offer_id, url, price, is_current}]}, delivery[{mode, name, price, cdav_price, min_delivery_date, max_delivery_date, speed}], video_url}

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

### POST /cdiscount/v1/product/offers — 1 credit
Every seller's offer for one product (new + used/refurbished), by URL or product_id: each offer's price with its tax breakdown, the legal reference price, condition, the seller (with rating and sales count), CDAV and free-shipping flags, and the offer URL. The buy-box is not always the cheapest, so this is the multi-seller price view.

**Parameters:**
- `url` (string, optional) — A cdiscount.com product URL. Every search row returns one as `url`.
- `product_id` (string, optional) — Alternative to `url`: the product code (the part after -f-<dept>- in a product URL). Every search row returns it as `product_id`.
- `sort` (enum, optional, default "relevance") — Order of the seller offers. [one of: relevance, price_asc, price_desc]
- `page` (integer, optional, default 1) — Offer page, 1-based. Cdiscount serves 4 offers per page.
- `max_rotations` (integer, optional, default 4) — Advanced: how many times to retry a difficult request (1-8, default 4).

**Returns:** offers[]{offer_id, seller{id, name, is_cdiscount, rating, rating_scale, rating_count, sales_count, expedition_country}, price, currency=EUR, price_without_vat, reference_price, discount_percent, eco_participation, vat_amount, condition, condition_grade, is_cdav, cdav_free_shipping, free_shipping, rating, rating_count, url}, count, total_offers, total_pages, page, product{product_id, title}, cheapest, lowest_new_offer_price, lowest_used_offer_price

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

### POST /cdiscount/v1/product/reviews — 1 credit
Customer reviews for a product, by URL or product_id, paged and sortable, with an optional star filter. Each review carries its score, title, text, author nickname, date, per-criterion scores when present, and whether it was syndicated from the brand.

**Parameters:**
- `url` (string, optional) — A cdiscount.com product URL. Every search row returns one as `url`.
- `product_id` (string, optional) — Alternative to `url`: the product code (the part after -f-<dept>- in a product URL). Every search row returns it as `product_id`.
- `page` (integer, optional, default 1) — Review page, 1-based.
- `per_page` (integer, optional, default 10) — Reviews per page (1-50).
- `sort` (enum, optional, default "most_helpful") — Order of the reviews. [one of: most_helpful, newest, oldest, lowest_rating]
- `stars` (string, optional) — Comma-separated star values to keep (1-5), e.g. '1,2' for the low scores.
- `max_rotations` (integer, optional, default 4) — Advanced: how many times to retry a difficult request (1-8, default 4).

**Returns:** reviews[]{id, score, title, content, nickname, date, product_use_date, criterions[{name, score}], source_type, source_name, images[]}, count, total_reviews, average_rating, rating_scale, recommended_count, rating_breakdown, product_id, page, sort

### POST /cdiscount/v1/search/suggest — 1 credit
Cdiscount's autocomplete for a partial query: product suggestions (title, url, price, marketplace flag) and keyword suggestions.

**Parameters:**
- `query` (string, required) — Keyword to search on cdiscount.com (French or brand/model words: 'aspirateur robot', 'iphone 15', 'lego technic').
- `max_rotations` (integer, optional, default 4) — Advanced: how many times to retry a difficult request (1-8, default 4).

**Returns:** suggestions[{title, url, price, currency=EUR, is_marketplace}], keyword_suggestions[{keyword, categories[]}], count

**Example request body:**
```json
{
  "query": "aspirateur robot"
}
```

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