# Carrefour France API scraper (carrefour.fr): search groceries and non-food, read full product records with struck and loyalty-card prices, compare Carrefour and marketplace offers, read reviews, browse categories and promotions, and price against any drive store. No account, no browser.

> Search carrefour.fr by keyword with the site's sorts and filters (brand, price range, promotions, own brand, organic, Nutri-Score, any listed facet). Each row: EAN, title, brand, URL, the price with the struck price and discount, loyalty-card offers, multi-buy offers, the unit price, seller (Carrefour or marketplace), availability, rating, Nutri-Score and how many other offers exist. Prices follow the chosen store (store_id / postal_code).
> ReefAPI engine `carrefour-fr` · 11 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/carrefour-fr/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 /carrefour-fr/v1/search — 2 credits
Search carrefour.fr by keyword with the site's sorts and filters (brand, price range, promotions, own brand, organic, Nutri-Score, any listed facet). Each row: EAN, title, brand, URL, the price with the struck price and discount, loyalty-card offers, multi-buy offers, the unit price, seller (Carrefour or marketplace), availability, rating, Nutri-Score and how many other offers exist. Prices follow the chosen store (store_id / postal_code).

**Parameters:**
- `query` (string, required) — Search keyword (French), e.g. 'lait', 'aspirateur robot', 'nutella'.
- `page` (integer, optional, default 1) — Result page (30 products per page).
- `sort` (enum, optional, default "relevance") — The site's own sort orders. Price sorts order products by their LOWEST offer (lowest_offer_price), which can be a marketplace offer below the row's buy-box price. [one of: relevance, price_asc, price_desc, unit_price_asc, unit_price_desc, rating]
- `brand` (array, optional) — Brand filter, one or more (comma-separated), as listed in available_filters (field facet_marque), e.g. 'LACTEL,CANDIA'.
- `price_min` (number, optional) — Minimum price in EUR (the site's price filter).
- `price_max` (number, optional) — Maximum price in EUR (the site's price filter).
- `on_promotion` (boolean, optional) — Only products with a running promotion (including loyalty-card offers).
- `carrefour_brand` (boolean, optional) — Only Carrefour's own-brand products.
- `organic` (boolean, optional) — Only organic products.
- `nutriscore` (array, optional) — Nutri-Score grades to keep (comma-separated), e.g. 'A,B'. [one of: A, B, C, D, E]
- `facet` (array, optional) — Any other facet the site lists in available_filters, as 'field=value' (repeat or comma-separate for several).
- `include_unavailable` (boolean, optional, default false) — Also list products that cannot be bought right now (the site hides them by default).
- `store_id` (string, optional) — Price and stock for this drive/pickup store (a `store_id` from the `stores` action). Default: carrefour.fr's national online catalogue.
- `postal_code` (string, optional) — French postal code: prices for the nearest drive/pickup store (echoed in `store`). Use instead of store_id.
- `include_sponsored` (boolean, optional, default false) — Keep sponsored rows (flagged is_sponsored). Default: dropped and counted in sponsored_dropped.
- `max_rotations` (integer, optional, default 4) — Maximum fresh exits to try before giving up.
- `include_fallback_results` (boolean, optional, default false) — When carrefour.fr pads a no-match keyword with loosely similar products, return them in fallback_results (default: dropped and counted).

**Returns:** results[]{position, product_id (EAN), ean, title, brand, url, product_type ('product'|'marketplace'), business_type ('food'|'non-food'), category, category_path[], packaging, format, price, currency=EUR, was_price, discount_amount, discount_percent, promotion_label, promotion_ends, loyalty_price, loyalty_offers[{type, label, card_credit, min_quantity, discount_percent, card_credit, card_credit_scope ('unit'|'lot'), credit_basis, price_after_credit (single-unit offers only), lot_price, lot_price_after_credit, valid_from, valid_until}], multibuy_offers[{type, label, quantity, total_price, regular_total, valid_until}], promotion_badges[], unit_price, unit_of_measure, unit_price_label, unit_price_basis ('price'|'regular_price'), offer_id, seller{id, name, is_carrefour, rating, rating_count, rating_scale, url}, shipping_cost, free_shipping, free_shipping_minimum, delivery_days_min, delivery_days_max, availability, in_stock, low_stock, other_offers_count, other_offers_lowest_price, lowest_offer_price (min of the row price and the other offers' lowest; the value the site's price sorts use), rating, review_count, rating_scale, nutriscore, labels[], highlight, is_best_seller, is_new, is_sponsored, image}, count (organic rows), total_results, total_pages, page, page_size, sort, applied_filters, sponsored_dropped, sponsored_count, search_type, available_filters[{field, label, type, selected, values[{value, label, count, selected}], price_range_eur}], has_next_page, store{store_id, store_code, name, is_default, …}, query, did_you_mean, autocorrected, related_searches[], keyword_matches_on_page, fallback_results_dropped, fallback_total, fallback_results[] (only with include_fallback_results=true), page_notice, redirected_to, redirect_type ('category'|'promotions'|'brand'|null)

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

### POST /carrefour-fr/v1/product/detail — 1 credit
The full carrefour.fr product record by EAN or URL: title, brand, category breadcrumb, the buy-box price with struck price, loyalty-card and multi-buy offers, unit price, availability, every offer (Carrefour store, Carrefour home delivery, marketplace sellers with rating and shipping), rating with the per-star breakdown, description, key features, characteristics, ingredients and nutrition, storage/usage information, Nutri-Score, energy class, dimensions, images and variants (colour/size with their own EAN and price).

**Parameters:**
- `product_id` (string, optional) — Product EAN (8-14 digits); every search row returns it as product_id.
- `url` (string, optional) — carrefour.fr product URL (alternative to product_id).
- `store_id` (string, optional) — Price and stock for this drive/pickup store (a `store_id` from the `stores` action). Default: carrefour.fr's national online catalogue.
- `postal_code` (string, optional) — French postal code: prices for the nearest drive/pickup store (echoed in `store`). Use instead of store_id.
- `max_rotations` (integer, optional, default 4) — Maximum fresh exits to try before giving up.

**Returns:** product{product_id, ean, internal_id, title, short_title, brand, url, product_type, business_type, category, breadcrumb[{name, url}], offer_id, fulfilment, seller{…}, price, currency=EUR, was_price, discount_amount, discount_percent, promotion_label, promotion_ends, loyalty_price, loyalty_offers[], multibuy_offers[], promotion_badges[], unit_price, unit_of_measure, unit_price_label, unit_price_basis, shipping_cost, free_shipping, delivery_days_min, delivery_days_max, availability, in_stock, low_stock, max_order_quantity, is_preorder, offers_count, cheapest_offer{offer_id, seller, price, shipping_cost, total_price}, offers[] (as product/offers), rating, review_count, rating_scale=5, rating_breakdown_percent{1..5}, description, key_features[], characteristics[{id, name, values[]}], composition{ingredients, allergens, regulated_name, nutrition[{name, per, value, daily_value_percent}]}, information{storage, …}, packaging, format, origin, nutriscore, ecoscore, energy_class, repairability_or_sustainability_index, legal_guarantee_years, labels[], warnings[], weights_and_measures[{type, value, unit}], delivery_info, images[], image_count, variants[{product_id, title, url, attributes{color, size, …}, lowest_price, offers_published, image}], is_best_seller}, store{…}

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

### POST /carrefour-fr/v1/product/offers — 1 credit
Every offer on one carrefour.fr product (by EAN or URL): the Carrefour store offer, Carrefour home delivery and each marketplace seller, with price, struck price, loyalty offers, shipping cost and delivery time, seller rating, stock and warranty add-ons, plus the cheapest offer.

**Parameters:**
- `product_id` (string, optional) — Product EAN (8-14 digits); every search row returns it as product_id.
- `url` (string, optional) — carrefour.fr product URL (alternative to product_id).
- `sort` (enum, optional, default "price_asc") — Order of the offers. [one of: price_asc, price_desc, as_listed]
- `store_id` (string, optional) — Price and stock for this drive/pickup store (a `store_id` from the `stores` action). Default: carrefour.fr's national online catalogue.
- `postal_code` (string, optional) — French postal code: prices for the nearest drive/pickup store (echoed in `store`). Use instead of store_id.
- `max_rotations` (integer, optional, default 4) — Maximum fresh exits to try before giving up.

**Returns:** offers[]{offer_id, is_buy_box, fulfilment ('store'|'carrefour_home_delivery'|'marketplace'|'physical_store'), seller{id, name, is_carrefour, rating, rating_count, rating_scale, url}, price, currency=EUR, was_price, discount_amount, discount_percent, promotion_label, promotion_ends, loyalty_price, loyalty_offers[], multibuy_offers[], promotion_badges[], unit_price, unit_of_measure, unit_price_label, unit_price_basis, shipping_cost, free_shipping, free_shipping_minimum, delivery_days_min, delivery_days_max, total_price, availability, in_stock, low_stock, max_order_quantity, is_preorder, is_new, express_delivery, relay_point_eligible, offer_note, warranty_options[{name, price, ean}]}, count, product{product_id, title, url}, cheapest{offer_id, seller, price, shipping_cost, total_price}, marketplace_offers, carrefour_offers, sort, store{…}

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

### POST /carrefour-fr/v1/product/reviews — 1 credit
Verified customer reviews of a carrefour.fr product (by EAN or URL), paged, sortable and filterable by star rating: rating, title, text, author display name, review and order dates and the review source.

**Parameters:**
- `product_id` (string, optional) — Product EAN (8-14 digits); every search row returns it as product_id.
- `url` (string, optional) — carrefour.fr product URL (alternative to product_id).
- `page` (integer, optional, default 1) — Review page.
- `per_page` (integer, optional, default 20) — Reviews per page (max 100).
- `sort` (enum, optional, default "newest") — Review order. [one of: newest, oldest, rating_desc, rating_asc]
- `stars` (integer, optional) — Only reviews with this star rating (1-5).
- `max_rotations` (integer, optional, default 4) — Maximum fresh exits to try before giving up.

**Returns:** reviews[]{author, is_anonymous, rating, rating_scale=5, title, text, review_date, order_date, source}, count, total_reviews (for the star filter when given), page, per_page, total_pages, sort, stars, product_id

### POST /carrefour-fr/v1/seller/reviews — 1 credit
Buyer reviews of a carrefour.fr marketplace seller, newest or oldest first: rating, the tags the buyer picked, author display name and dates.

**Parameters:**
- `seller_id` (string, required) — Marketplace seller id (offers[].seller.id).
- `page` (integer, optional, default 1) — Review page.
- `per_page` (integer, optional, default 20) — Reviews per page (max 100).
- `sort` (enum, optional, default "newest") — Review order (the site offers no star filter or rating sort for sellers). [one of: newest, oldest]
- `max_rotations` (integer, optional, default 4) — Maximum fresh exits to try before giving up.

**Returns:** reviews[]{author, rating, rating_scale=5, tags[], review_date, created_date}, count, total_reviews, page, per_page, total_pages, sort, seller_id, seller_url

### POST /carrefour-fr/v1/seller/profile — 1 credit
A carrefour.fr marketplace seller's public page: name, logo, description, return policy, shipping zone and delivery time, rating, and the legal notice the site publishes (company name, registration and VAT numbers, business address, legal representative, terms URL).

**Parameters:**
- `seller_id` (string, required) — Marketplace seller id (offers[].seller.id).
- `max_rotations` (integer, optional, default 4) — Maximum fresh exits to try before giving up.

**Returns:** seller{seller_id, name, slug, url, logo, banner, description, return_policy, rating, rating_count, rating_scale, shipping{delivery_days_min, delivery_days_max, free_shipping_minimum, zone, fees[{type, amount}]}, company_name, company_id, vat_number, legal_representative, address{street, postal_code, city, region, country}, terms_url}

### POST /carrefour-fr/v1/seller/products — 2 credits
Everything a carrefour.fr marketplace seller lists, with the same sorts, filters and row fields as search.

**Parameters:**
- `seller_id` (string, required) — Marketplace seller id (offers[].seller.id).
- `page` (integer, optional, default 1) — Result page (30 products per page).
- `sort` (enum, optional, default "relevance") — The site's own sort orders. Price sorts order products by their LOWEST offer (lowest_offer_price), which can be a marketplace offer below the row's buy-box price. [one of: relevance, price_asc, price_desc, unit_price_asc, unit_price_desc, rating]
- `brand` (array, optional) — Brand filter, one or more (comma-separated), as listed in available_filters (field facet_marque), e.g. 'LACTEL,CANDIA'.
- `price_min` (number, optional) — Minimum price in EUR (the site's price filter).
- `price_max` (number, optional) — Maximum price in EUR (the site's price filter).
- `on_promotion` (boolean, optional) — Only products with a running promotion (including loyalty-card offers).
- `carrefour_brand` (boolean, optional) — Only Carrefour's own-brand products.
- `organic` (boolean, optional) — Only organic products.
- `nutriscore` (array, optional) — Nutri-Score grades to keep (comma-separated), e.g. 'A,B'. [one of: A, B, C, D, E]
- `facet` (array, optional) — Any other facet the site lists in available_filters, as 'field=value' (repeat or comma-separate for several).
- `include_unavailable` (boolean, optional, default false) — Also list products that cannot be bought right now (the site hides them by default).
- `store_id` (string, optional) — Price and stock for this drive/pickup store (a `store_id` from the `stores` action). Default: carrefour.fr's national online catalogue.
- `postal_code` (string, optional) — French postal code: prices for the nearest drive/pickup store (echoed in `store`). Use instead of store_id.
- `include_sponsored` (boolean, optional, default false) — Keep sponsored rows (flagged is_sponsored). Default: dropped and counted in sponsored_dropped.
- `max_rotations` (integer, optional, default 4) — Maximum fresh exits to try before giving up.

**Returns:** results[]{position, product_id (EAN), ean, title, brand, url, product_type ('product'|'marketplace'), business_type ('food'|'non-food'), category, category_path[], packaging, format, price, currency=EUR, was_price, discount_amount, discount_percent, promotion_label, promotion_ends, loyalty_price, loyalty_offers[{type, label, card_credit, min_quantity, discount_percent, card_credit, card_credit_scope ('unit'|'lot'), credit_basis, price_after_credit (single-unit offers only), lot_price, lot_price_after_credit, valid_from, valid_until}], multibuy_offers[{type, label, quantity, total_price, regular_total, valid_until}], promotion_badges[], unit_price, unit_of_measure, unit_price_label, unit_price_basis ('price'|'regular_price'), offer_id, seller{id, name, is_carrefour, rating, rating_count, rating_scale, url}, shipping_cost, free_shipping, free_shipping_minimum, delivery_days_min, delivery_days_max, availability, in_stock, low_stock, other_offers_count, other_offers_lowest_price, lowest_offer_price (min of the row price and the other offers' lowest; the value the site's price sorts use), rating, review_count, rating_scale, nutriscore, labels[], highlight, is_best_seller, is_new, is_sponsored, image}, count (organic rows), total_results, total_pages, page, page_size, sort, applied_filters, sponsored_dropped, sponsored_count, search_type, available_filters[{field, label, type, selected, values[{value, label, count, selected}], price_range_eur}], has_next_page, store{store_id, store_code, name, is_default, …}, seller_id, seller_url

### POST /carrefour-fr/v1/category — 2 credits
Browse a carrefour.fr category (e.g. 'cremerie/laits', 'image-son/televiseurs') with the same sorts, filters, store pricing and row fields as search.

**Parameters:**
- `category` (string, required) — Category path as in the site's URL /r/<path> (e.g. 'cremerie/laits', 'image-son/televiseurs') or the full category URL.
- `page` (integer, optional, default 1) — Result page (30 products per page).
- `sort` (enum, optional, default "relevance") — The site's own sort orders. Price sorts order products by their LOWEST offer (lowest_offer_price), which can be a marketplace offer below the row's buy-box price. [one of: relevance, price_asc, price_desc, unit_price_asc, unit_price_desc, rating]
- `brand` (array, optional) — Brand filter, one or more (comma-separated), as listed in available_filters (field facet_marque), e.g. 'LACTEL,CANDIA'.
- `price_min` (number, optional) — Minimum price in EUR (the site's price filter).
- `price_max` (number, optional) — Maximum price in EUR (the site's price filter).
- `on_promotion` (boolean, optional) — Only products with a running promotion (including loyalty-card offers).
- `carrefour_brand` (boolean, optional) — Only Carrefour's own-brand products.
- `organic` (boolean, optional) — Only organic products.
- `nutriscore` (array, optional) — Nutri-Score grades to keep (comma-separated), e.g. 'A,B'. [one of: A, B, C, D, E]
- `facet` (array, optional) — Any other facet the site lists in available_filters, as 'field=value' (repeat or comma-separate for several).
- `include_unavailable` (boolean, optional, default false) — Also list products that cannot be bought right now (the site hides them by default).
- `store_id` (string, optional) — Price and stock for this drive/pickup store (a `store_id` from the `stores` action). Default: carrefour.fr's national online catalogue.
- `postal_code` (string, optional) — French postal code: prices for the nearest drive/pickup store (echoed in `store`). Use instead of store_id.
- `include_sponsored` (boolean, optional, default false) — Keep sponsored rows (flagged is_sponsored). Default: dropped and counted in sponsored_dropped.
- `max_rotations` (integer, optional, default 4) — Maximum fresh exits to try before giving up.

**Returns:** results[]{position, product_id (EAN), ean, title, brand, url, product_type ('product'|'marketplace'), business_type ('food'|'non-food'), category, category_path[], packaging, format, price, currency=EUR, was_price, discount_amount, discount_percent, promotion_label, promotion_ends, loyalty_price, loyalty_offers[{type, label, card_credit, min_quantity, discount_percent, card_credit, card_credit_scope ('unit'|'lot'), credit_basis, price_after_credit (single-unit offers only), lot_price, lot_price_after_credit, valid_from, valid_until}], multibuy_offers[{type, label, quantity, total_price, regular_total, valid_until}], promotion_badges[], unit_price, unit_of_measure, unit_price_label, unit_price_basis ('price'|'regular_price'), offer_id, seller{id, name, is_carrefour, rating, rating_count, rating_scale, url}, shipping_cost, free_shipping, free_shipping_minimum, delivery_days_min, delivery_days_max, availability, in_stock, low_stock, other_offers_count, other_offers_lowest_price, lowest_offer_price (min of the row price and the other offers' lowest; the value the site's price sorts use), rating, review_count, rating_scale, nutriscore, labels[], highlight, is_best_seller, is_new, is_sponsored, image}, count (organic rows), total_results, total_pages, page, page_size, sort, applied_filters, sponsored_dropped, sponsored_count, search_type, available_filters[{field, label, type, selected, values[{value, label, count, selected}], price_range_eur}], has_next_page, store{store_id, store_code, name, is_default, …}, category, category_url

### POST /carrefour-fr/v1/deals — 2 credits
carrefour.fr's promotions hub: every product with a running promotion (struck prices, loyalty-card credits, multi-buy offers, catalogue offers), with the same sorts, filters, store pricing and row fields as search.

**Parameters:**
- `page` (integer, optional, default 1) — Result page (30 products per page).
- `sort` (enum, optional, default "relevance") — The site's own sort orders. Price sorts order products by their LOWEST offer (lowest_offer_price), which can be a marketplace offer below the row's buy-box price. [one of: relevance, price_asc, price_desc, unit_price_asc, unit_price_desc, rating]
- `brand` (array, optional) — Brand filter, one or more (comma-separated), as listed in available_filters (field facet_marque), e.g. 'LACTEL,CANDIA'.
- `price_min` (number, optional) — Minimum price in EUR (the site's price filter).
- `price_max` (number, optional) — Maximum price in EUR (the site's price filter).
- `on_promotion` (boolean, optional) — Only products with a running promotion (including loyalty-card offers).
- `carrefour_brand` (boolean, optional) — Only Carrefour's own-brand products.
- `organic` (boolean, optional) — Only organic products.
- `nutriscore` (array, optional) — Nutri-Score grades to keep (comma-separated), e.g. 'A,B'. [one of: A, B, C, D, E]
- `facet` (array, optional) — Any other facet the site lists in available_filters, as 'field=value' (repeat or comma-separate for several).
- `include_unavailable` (boolean, optional, default false) — Also list products that cannot be bought right now (the site hides them by default).
- `store_id` (string, optional) — Price and stock for this drive/pickup store (a `store_id` from the `stores` action). Default: carrefour.fr's national online catalogue.
- `postal_code` (string, optional) — French postal code: prices for the nearest drive/pickup store (echoed in `store`). Use instead of store_id.
- `include_sponsored` (boolean, optional, default false) — Keep sponsored rows (flagged is_sponsored). Default: dropped and counted in sponsored_dropped.
- `max_rotations` (integer, optional, default 4) — Maximum fresh exits to try before giving up.

**Returns:** results[]{position, product_id (EAN), ean, title, brand, url, product_type ('product'|'marketplace'), business_type ('food'|'non-food'), category, category_path[], packaging, format, price, currency=EUR, was_price, discount_amount, discount_percent, promotion_label, promotion_ends, loyalty_price, loyalty_offers[{type, label, card_credit, min_quantity, discount_percent, card_credit, card_credit_scope ('unit'|'lot'), credit_basis, price_after_credit (single-unit offers only), lot_price, lot_price_after_credit, valid_from, valid_until}], multibuy_offers[{type, label, quantity, total_price, regular_total, valid_until}], promotion_badges[], unit_price, unit_of_measure, unit_price_label, unit_price_basis ('price'|'regular_price'), offer_id, seller{id, name, is_carrefour, rating, rating_count, rating_scale, url}, shipping_cost, free_shipping, free_shipping_minimum, delivery_days_min, delivery_days_max, availability, in_stock, low_stock, other_offers_count, other_offers_lowest_price, lowest_offer_price (min of the row price and the other offers' lowest; the value the site's price sorts use), rating, review_count, rating_scale, nutriscore, labels[], highlight, is_best_seller, is_new, is_sponsored, image}, count (organic rows), total_results, total_pages, page, page_size, sort, applied_filters, sponsored_dropped, sponsored_count, search_type, available_filters[{field, label, type, selected, values[{value, label, count, selected}], price_range_eur}], has_next_page, store{store_id, store_code, name, is_default, …}

### POST /carrefour-fr/v1/search/suggest — 1 credit
carrefour.fr's autocomplete for a partial keyword: keyword suggestions and keyword-in-category suggestions, each with its search URL.

**Parameters:**
- `query` (string, required) — Partial keyword to complete.
- `max_rotations` (integer, optional, default 4) — Maximum fresh exits to try before giving up.

**Returns:** suggestions[{keyword, url}], category_suggestions[{keyword, category, url}], count

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

### POST /carrefour-fr/v1/stores — 1 credit
Find Carrefour stores near a French postal code or a latitude/longitude, nearest first: name, banner, format, address, distance, today's opening hours and the drive/pickup services whose `store_id` prices search, category, deals, product/detail and product/offers for that store.

**Parameters:**
- `postal_code` (string, optional) — French postal code to search around (or give latitude + longitude).
- `latitude` (number, optional) — Latitude (with longitude) — alternative to postal_code.
- `longitude` (number, optional) — Longitude (with latitude).
- `mode` (enum, optional, default "picking") — Which stores to list. [one of: picking, delivery, all]
- `page` (integer, optional, default 1) — Result page.
- `per_page` (integer, optional, default 10) — Stores per page (max 20).
- `max_rotations` (integer, optional, default 4) — Maximum fresh exits to try before giving up.

**Returns:** stores[]{store_id (use in other actions; null when the store has no drive/pickup), selectable, store_code, name, banner, format, services[{store_id, name, drive_type, status}], address, postal_code, city, latitude, longitude, distance_km, is_open_today, today_opening[{opens, closes}], url}, count, page, per_page, origin{postal_code, commune, latitude, longitude}, mode

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