# Continente API — Portuguese supermarket prices: shelf price, discount and was price, PVPR, multi-buy deals, price per kg/litre, EANs, ingredients and nutrition from continente.pt

> Search Continente's online shop: shelf price, was price of an immediate discount, recommended retail price (PVPR), discount badge, multi-buy deal, price per kg/l, pack size, brand, availability. `query` required; filters: category, brand, diet, min_price, max_price; sort; paging; optional post code for the store's assortment.
> ReefAPI engine `continente` · 6 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/continente/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/continente/v1/search — 3 credits
Search Continente's online shop: shelf price, was price of an immediate discount, recommended retail price (PVPR), discount badge, multi-buy deal, price per kg/l, pack size, brand, availability. `query` required; filters: category, brand, diet, min_price, max_price; sort; paging; optional post code for the store's assortment.

**Parameters:**
- `query` (string, required) — Search words as typed in the Continente shop (Portuguese works best).
- `category` (string, optional) — Continente category id (cgid) as the `categories` action or a product's `category_id` returns it (e.g. laticinios, laticinios-leite, laticinios-leite-meio-gordo). An id the site does not know is rejected (the site itself would silently show the whole catalogue).
- `brand` (string, optional) — Exact brand name as Continente prints it (e.g. Mimosa, Continente, Gresso).
- `diet` (enum, optional) — One dietary attribute filter (the site's own facets). [one of: organic, vegan, vegetarian, gluten_free, lactose_free, no_added_sugar]
- `min_price` (number, optional) — Minimum shelf price in EUR (the price in `price`, per its `price_unit`).
- `max_price` (number, optional) — Maximum shelf price in EUR.
- `sort` (enum, optional, default "relevance") — relevance · price_asc · price_desc · unit_price_asc (price per kg/l) · name_asc · name_desc. [one of: relevance, price_asc, price_desc, unit_price_asc, name_asc, name_desc]
- `page` (integer, optional, default 1) — Result page, 1-based.
- `per_page` (integer, optional, default 35) — Products per page, 1-35 (Continente's own ceiling is 35).
- `postal_code` (string, optional) — Portuguese post code (NNNN-NNN). Continente's assortment depends on the delivery store that serves it (measured: 'fruta' 3,214 rows in Lisboa, 1,802 in Funchal). Prices were the same across 4 stores (335 product×store pairs). Omit for the site's default anonymous store; the response says which store the rows are for.

**Returns:** store{postal_code, store_name, store_id, resolved_from}, query, category, filters, sort, total, page, per_page, has_more, returned, results[]{rank, product_id (-> product.product_id), name, brand, price, price_unit (un|kg|lt…: what `price` is per), regular_price (struck-through price of an immediate discount), recommended_retail_price (manufacturer PVPR, not a former Continente price), currency, discount{kind, text, value, unit}, on_offer, multibuy{text, buy, pay}, promo_messages[], unit_price, unit_price_unit, unit_price_text, pack_size, available, max_order_quantity, labels[], category_path, impression_price, image, url}

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

### POST https://api.reefapi.com/continente/v1/category — 3 credits
List one Continente category (id from `categories`) with the same row fields and filters as `search`.

**Parameters:**
- `category` (string, optional) — Continente category id (cgid) as the `categories` action or a product's `category_id` returns it (e.g. laticinios, laticinios-leite, laticinios-leite-meio-gordo). An id the site does not know is rejected (the site itself would silently show the whole catalogue).
- `brand` (string, optional) — Exact brand name as Continente prints it (e.g. Mimosa, Continente, Gresso).
- `diet` (enum, optional) — One dietary attribute filter (the site's own facets). [one of: organic, vegan, vegetarian, gluten_free, lactose_free, no_added_sugar]
- `min_price` (number, optional) — Minimum shelf price in EUR (the price in `price`, per its `price_unit`).
- `max_price` (number, optional) — Maximum shelf price in EUR.
- `sort` (enum, optional, default "relevance") — relevance · price_asc · price_desc · unit_price_asc (price per kg/l) · name_asc · name_desc. [one of: relevance, price_asc, price_desc, unit_price_asc, name_asc, name_desc]
- `page` (integer, optional, default 1) — Result page, 1-based.
- `per_page` (integer, optional, default 35) — Products per page, 1-35 (Continente's own ceiling is 35).
- `postal_code` (string, optional) — Portuguese post code (NNNN-NNN). Continente's assortment depends on the delivery store that serves it (measured: 'fruta' 3,214 rows in Lisboa, 1,802 in Funchal). Prices were the same across 4 stores (335 product×store pairs). Omit for the site's default anonymous store; the response says which store the rows are for.

**Returns:** store{postal_code, store_name, store_id, resolved_from}, query, category, filters, sort, total, page, per_page, has_more, returned, results[]{rank, product_id (-> product.product_id), name, brand, price, price_unit (un|kg|lt…: what `price` is per), regular_price (struck-through price of an immediate discount), recommended_retail_price (manufacturer PVPR, not a former Continente price), currency, discount{kind, text, value, unit}, on_offer, multibuy{text, buy, pay}, promo_messages[], unit_price, unit_price_unit, unit_price_text, pack_size, available, max_order_quantity, labels[], category_path, impression_price, image, url}

**Example request body:**
```json
{
  "category": "laticinios-leite"
}
```

### POST https://api.reefapi.com/continente/v1/promotions — 3 credits
Continente products on discount right now (the site's 'Com Desconto' facet): offer price, was price, discount % or €, multi-buy deals. Narrow with `query`, `category`, `brand`, `diet`.

**Parameters:**
- `query` (string, optional) — Optional search words inside the discounted products.
- `category` (string, optional) — Continente category id (cgid) as the `categories` action or a product's `category_id` returns it (e.g. laticinios, laticinios-leite, laticinios-leite-meio-gordo). An id the site does not know is rejected (the site itself would silently show the whole catalogue).
- `brand` (string, optional) — Exact brand name as Continente prints it (e.g. Mimosa, Continente, Gresso).
- `diet` (enum, optional) — One dietary attribute filter (the site's own facets). [one of: organic, vegan, vegetarian, gluten_free, lactose_free, no_added_sugar]
- `min_price` (number, optional) — Minimum shelf price in EUR (the price in `price`, per its `price_unit`).
- `max_price` (number, optional) — Maximum shelf price in EUR.
- `sort` (enum, optional, default "relevance") — relevance · price_asc · price_desc · unit_price_asc (price per kg/l) · name_asc · name_desc. [one of: relevance, price_asc, price_desc, unit_price_asc, name_asc, name_desc]
- `page` (integer, optional, default 1) — Result page, 1-based.
- `per_page` (integer, optional, default 35) — Products per page, 1-35 (Continente's own ceiling is 35).
- `postal_code` (string, optional) — Portuguese post code (NNNN-NNN). Continente's assortment depends on the delivery store that serves it (measured: 'fruta' 3,214 rows in Lisboa, 1,802 in Funchal). Prices were the same across 4 stores (335 product×store pairs). Omit for the site's default anonymous store; the response says which store the rows are for.

**Returns:** store{postal_code, store_name, store_id, resolved_from}, query, category, filters, sort, total, page, per_page, has_more, returned, results[]{rank, product_id (-> product.product_id), name, brand, price, price_unit (un|kg|lt…: what `price` is per), regular_price (struck-through price of an immediate discount), recommended_retail_price (manufacturer PVPR, not a former Continente price), currency, discount{kind, text, value, unit}, on_offer, multibuy{text, buy, pay}, promo_messages[], unit_price, unit_price_unit, unit_price_text, pack_size, available, max_order_quantity, labels[], category_path, impression_price, image, url}

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

### POST https://api.reefapi.com/continente/v1/product — 3 credits
One Continente product by the `product_id` a search row returns: price, was price or PVPR, discount with its validity window, multi-buy deal with the site's conditions, price per kg/l, EANs, availability and order limits, category, images, and the label: regulated name, producer, ingredients, allergens, storage, origin, net content, nutrition table.

**Parameters:**
- `product_id` (string, required) — The numeric product id a search row returns, or its https://www.continente.pt/produto/<slug>-<id>.html URL.

**Returns:** product{product_id, name, brand, eans[], price, price_unit, regular_price, recommended_retail_price, price_valid_to, currency, discount{kind, text, value, unit, valid_text, valid_from, valid_to}, promotion_window, multibuy{text, buy, pay, conditions}, promotions[]{id, message, conditions, class}, on_offer, unit_price, unit_price_unit, unit_price_text, pack_size, available, online, availability_messages[], min_order_quantity, max_order_quantity, rating, deposit, category_id, category_name, top_category_id, top_category_name, category_path, labels[], images[], url}, label{regulated_name, producer, producer_address, ingredients, net_content, net_content_unit, net_weight, drained_weight, storage, allergens, origin, preparation, serving_size, serving_unit, marketing_message, nutrition[]{nutrient, amount, amount_text, unit, unit_code}, other[]{label, value}}

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

### POST https://api.reefapi.com/continente/v1/categories — 3 credits
Continente's category tree from the shop menu: id, name, URL, children. Ids feed `category` and the `category` filter.

**Parameters:**
- `category` (string, optional) — Return only this category's subtree; omit for the whole tree.

**Returns:** parent, total_categories, categories[]{category_id, name, url, path, depth, children[]}

**Example request body:**
```json
{
  "category": "supermercado"
}
```

### POST https://api.reefapi.com/continente/v1/store — 1 credit
Which Continente delivery store serves a Portuguese post code (the store whose assortment `search`/`category`/`promotions` show when you pass the same `postal_code`).

**Parameters:**
- `postal_code` (string, required) — Portuguese post code (NNNN-NNN).

**Returns:** postal_code, covered, store_name, store_id, physical_store_id, area_id, channel_id

**Example request body:**
```json
{
  "postal_code": "4000-322"
}
```

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