# KuantoKusta API — Portugal price comparison: search, every store's offer with shipping and total, marketplace offers, lowest price, price history

> Keyword search on KuantoKusta (Portugal, EUR). Each row is a product with its lowest offer price, number of offers, brand, category and whether it can be bought through KuantoKusta's checkout. Filter by price range, brand, marketplace or good-deal; sort by popularity, price, name or newest. The site's total stops at 1000 (`total_capped`); `matching_total` is its own full count. Some words are a category to the site (e.g. `berbequim`): it sends the visitor to that category listing, and so does this API (`redirected_to_category`).
> ReefAPI engine `kuantokusta` · 6 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/kuantokusta/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/kuantokusta/v1/search — 2 credits
Keyword search on KuantoKusta (Portugal, EUR). Each row is a product with its lowest offer price, number of offers, brand, category and whether it can be bought through KuantoKusta's checkout. Filter by price range, brand, marketplace or good-deal; sort by popularity, price, name or newest. The site's total stops at 1000 (`total_capped`); `matching_total` is its own full count. Some words are a category to the site (e.g. `berbequim`): it sends the visitor to that category listing, and so does this API (`redirected_to_category`).

**Parameters:**
- `query` (string, required) — Search words, e.g. `iphone 17`, `frigorifico combinado`, `tv 55`.
- `sort` (enum, optional, default "relevance") — Result order. [one of: relevance, price_asc, price_desc, name, newest]
- `page` (integer, optional, default 1) — Result page (48 rows per page).
- `price_min` (number, optional) — Lowest price in EUR. The site compares the product's lowest offer price (`price_min` of the row).
- `price_max` (number, optional) — Highest price in EUR (same comparison).
- `marketplace_only` (boolean, optional, default false) — Only products that can be bought through KuantoKusta's own checkout ("Comprar no KuantoKusta").
- `good_deal_only` (boolean, optional, default false) — Only products the site marks as a good buy ("Boa compra").
- `brand` (string, optional) — Brand name as in `facets.brand[].value` (e.g. `Apple`, `Samsung`).

**Returns:** results[]{row_type=product, product_id, title, brand, category, url, image, price_min (EUR), currency, offer_count, marketplace_available, split_payment, adult_only, badges[], rating_count, review_count} + count + total + total_capped + matching_total + page + pages + has_more + facets{area[], brand[], price_buckets[], price_range, purchase_options[], attributes[]} + query + sort + redirected_to_category{category_id, name, url} (set when the site treats the words as a category and sends the visitor there)

**Example request body:**
```json
{
  "query": "iphone 17"
}
```

### POST https://api.reefapi.com/kuantokusta/v1/category — 2 credits
One KuantoKusta category listing (e.g. 157 = Smartphones): the same product rows as search, with price range, brand (`brand_id`), feature (`feature_id`), marketplace and good-deal filters, sort and paging. Takes the numeric id or the category URL (/c/<id>/...). Parent sections (/a/<id>/...) are listed by `categories`.

**Parameters:**
- `category_id` (string, required) — Numeric leaf category id (`category.category_id` of a product, a `categories` row with is_leaf true) or a category URL.
- `sort` (enum, optional, default "relevance") — Result order. [one of: relevance, price_asc, price_desc, name, newest]
- `page` (integer, optional, default 1) — Result page (48 rows per page).
- `price_min` (number, optional) — Lowest price in EUR. The site compares the product's lowest offer price (`price_min` of the row).
- `price_max` (number, optional) — Highest price in EUR (same comparison).
- `marketplace_only` (boolean, optional, default false) — Only products that can be bought through KuantoKusta's own checkout ("Comprar no KuantoKusta").
- `good_deal_only` (boolean, optional, default false) — Only products the site marks as a good buy ("Boa compra").
- `brand_id` (string, optional) — Brand id from `facets.brand[].brand_id` (765 = Samsung in Smartphones).
- `feature_id` (string, optional) — Feature value id from `facets.attributes[].values[].feature_id` (12939 = 5G in Smartphones).

**Returns:** results[]{same row shape as search} + count + total + page + pages + has_more + facets{brand[]{brand_id}, price_buckets[], price_range, purchase_options[], attributes[]{values[]{feature_id}}} + category{category_id, name, url, category_path[]} + sort

**Example request body:**
```json
{
  "category_id": "157"
}
```

### POST https://api.reefapi.com/kuantokusta/v1/categories — 1 credit
KuantoKusta's category tree: without `area_id` the top-level sections; with an `area_id` its children. A child with `is_leaf: true` is a category for `category`; otherwise pass its id here again.

**Parameters:**
- `area_id` (string, optional) — Section id (/a/<id>/...) from a previous call or a product's `category_path`.

**Returns:** area{area_id, name} + categories[]{category_id, name, url, is_leaf, has_children, image, popularity_position} + popular_products[]{same row shape as search} + count

**Example request body:**
```json
{
  "area_id": "155"
}
```

### POST https://api.reefapi.com/kuantokusta/v1/product — 2 credits
One product on KuantoKusta: title, brand, EAN and SKU codes, category path, images, description, the full spec sheet, lowest and highest price, number of offers, stores and marketplace offers, the cheapest offer, the cheapest offer with shipping, the highlighted buy-box offer, the site's 30-day average price, colour / storage variations and refurbished alternatives (each its own product id).

**Parameters:**
- `product_id` (string, required) — Product id: `product_id` of a search / category row, of a variation or refurbished option, or a kuantokusta.pt product URL (/p/<id>/...).

**Returns:** product{row_type, product_id, title, brand, url, category{category_id, name}, category_path[], ean[], sku[], images[], description, specs[]{group, name, value}, price_min, price_max, currency, offer_count, store_count, marketplace_offer_count, in_stock, marketplace_available, fast_delivery_available, average_price{price, date}, store_discount, cheapest_offer, cheapest_total_offer, buy_box_offer, variations[]{feature, options[]{product_id, value, price_min, available, current, url}}, refurbished[]{grade, product_id, price_min, url}, rating_count, review_count, created_at, updated_at}

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

### POST https://api.reefapi.com/kuantokusta/v1/offers — 2 credits
Every offer for one product: store (id, name, page, logo, rating count), the store's own offer title, price, previous price, shipping cost, total (price + shipping, as the site prints it), delivery window, fast / next-day delivery, islands, split payment, loyalty points, and the row type: `store` (bought on the shop's own site) or `marketplace` (bought through KuantoKusta). Featured rows and the buy box are flagged; the cheapest offer and cheapest total are computed.

**Parameters:**
- `product_id` (string, required) — Product id: `product_id` of a search / category row, of a variation or refurbished option, or a kuantokusta.pt product URL (/p/<id>/...).
- `sort` (enum, optional, default "site") — Offer order. [one of: site, price_asc, total_asc]
- `offer_type` (enum, optional, default "all") — Which offers. [one of: all, store, marketplace]

**Returns:** product_id + title + offers[]{position, offer_type (store|marketplace), product_id, seller_id, store_name, store_slug, store_url, store_logo, store_rating_count, store_review_count, offer_title, price, old_price, currency, shipping_cost, total_price, free_shipping, free_shipping_programme, delivery_from, delivery_to, next_day_delivery, fast_delivery, ships_to_islands, split_payment, is_featured, is_buy_box, badges[], loyalty_points, clickout_available, last_checked_at} + count + store_count + marketplace_count + cheapest_offer + cheapest_total_offer + buy_box_offer + price_min (site) + sort

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

### POST https://api.reefapi.com/kuantokusta/v1/price_history — 3 credits
The site's own price history for one product: the lowest and the average offer price on every day of the last 30 or 90 days, with the period's lowest point. Every call checks the series against the product's own page (its published average price on its date) and refuses a series that does not match. The site states its history does not include Amazon.es prices.

**Parameters:**
- `product_id` (string, required) — Product id: `product_id` of a search / category row, of a variation or refurbished option, or a kuantokusta.pt product URL (/p/<id>/...).
- `period` (enum, optional, default "30d") — How far back (the site offers 30 and 90 days only). [one of: 30d, 90d]

**Returns:** product_id + title + period + currency + points[]{date, min_price, avg_price} + count + first_date + last_date + lowest{date, min_price} + highest_daily_min{date, min_price} + last_min_price + current_price_min + identity{product_id, witness, verified, page_average_price, page_average_date, series_average_that_day, last_min_equals_page_price_min}

**Example request body:**
```json
{
  "product_id": "11928772",
  "period": "90d"
}
```

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