KuantoKusta API & Scraper
KuantoKusta (kuantokusta.pt) is Portugal's largest price comparison site and also a marketplace: some offers are bought on the shop's own site, others through KuantoKusta's checkout.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
This API reads it as JSON, in euros, logged out. `search` takes product words and returns products with their lowest price, number of offers, brand and whether they can be bought on KuantoKusta; price range, brand, marketplace and good-deal filters and five sorts are available, with facet counts in the same response. `category` lists one category with the same filters plus brand and feature ids, and `categories` walks the category tree. `offers` returns every offer for one product: the store, the store's own offer title, the price, the shipping cost and the total the site prints (price plus shipping), the delivery window, and whether the row is a store offer or a KuantoKusta marketplace offer. The cheapest offer and the cheapest total are computed from the rows; the highlighted buy box and featured rows are flagged, because neither is the cheapest by rule. `price_history` is the site's own daily lowest and average price for the last 30 or 90 days, checked against the product's page on every call. `product` adds EAN and SKU codes, the spec sheet, the description, colour and storage variations and refurbished alternatives.
What a KuantoKusta field actually contains
Fields that read differently from how they look. Every row was measured against the live site on 2026-10-15.
| Field | What it holds |
|---|---|
| price_min (search, category, product) | The lowest offer price for the product, in euros. It equalled the cheapest row of the offer list on 10 of 10 products, and the price on the product page on 10 of 10 search rows and 5 of 5 category rows. |
| offers[].offer_type | store: bought on the shop's own website. marketplace: bought through KuantoKusta's checkout ("Comprar no KuantoKusta"), with a delivery window and loyalty points. 8 of 10 sampled products had both kinds. |
| offers[].total_price | price + shipping_cost, the same Total the product page prints ("1.649,00 € Envio + 3,90 € Total 1.652,90 €"). Every Total printed on 6 product pages (up to 15 per page) was found among the API's totals: 0 mismatches. |
| offers[].shipping_cost, free_shipping | The shipping the store publishes (its minimum). free_shipping is true when that is 0 €, which is what the page prints as "Envio Grátis!". free_shipping_programme is the site's separate free-shipping badge: Fnac Portugal charged 0 € without it. |
| buy_box_offer, is_featured | The highlighted "Comprar no KuantoKusta" box and the featured rows the page shows first. Neither is the cheapest by rule: on an iPhone 18 Pro Max the buy box was 1,799 € while the cheapest store sold at 1,596 €. Use cheapest_offer and cheapest_total_offer. |
| total, total_capped, matching_total | The site's search total stops at 1,000 (21 pages of 48). "iphone 17" printed 1,000 while the site's own section counts add up to 42,203; total_capped marks it and matching_total carries the full count. Category totals are not capped (Smartphones 1,979). |
| price_history.points[] | One point per day: min_price (the day's lowest offer) and avg_price (the day's average offer). The site states that Amazon.es prices are not included. Each call is checked against the product page's own published average price; colour variants of one phone share 0 of 31 points, so the series is per product, not per product family. |
| variations, refurbished | Colour and storage siblings and the refurbished grade of the same model, each with its own product_id that works in product, offers and price_history (3 of 3 checked in each of two runs). |
Prices are in euros as the site prints them for Portugal.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/kuantokusta/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "iphone 17"
}
}{
"ok": true,
"meta": {
"api": "kuantokusta",
"endpoint": "search",
"mode": "live",
"latency_ms": 1449.9,
"record_count": 48,
"bytes": 108113,
"cache_hit": false,
"total": 1000,
"upstream_requests": 1,
"charged_credits": 2,
"version": "0.1.0",
"request_id": "32e9a8827303410d",
"queue_ms": 1.7,
"fetched_at": "2026-10-15T17:02:55.387Z"
},
"data": {
"results": [
{
"row_type": "product",
"product_id": "11928783",
"title": "Apple iPhone 17 Pro Max 6.9\" 256GB Silver",
"brand": "Apple",
"category": "Smartphones",
"url": "https://www.kuantokusta.pt/p/11928783/apple-iphone-17-pro-max-69-256gb-silver",
"image": "https://s1.kuantokusta.pt/img_upload/produtos_comunicacoes/1540131_2_apple-iphone-17-pro-max-6-9-256gb-silver.jpg",
"price_min": 1187.49,
"currency": "EUR",
"offer_count": 25,
"marketplace_available": true,
"split_payment": false,
"adult_only": false,
"badges": [
"isBestSeller"
],
"rating_count": 5,
"review_count": 6
},
{
"row_type": "product",
"product_id": "11928759",
"title": "Apple iPhone 17 6.3\" 256GB White",
"brand": "Apple",
"category": "Smartphones",
"url": "https://www.kuantokusta.pt/p/11928759/apple-iphone-17-63-256gb-white",
"image": "https://s1.kuantokusta.pt/img_upload/produtos_comunicacoes/1540107_2_apple-iphone-17-6-3-256gb-white.jpg",
"price_min": 910,
"currency": "EUR",
"offer_count": 30,
"marketplace_available": true,
"split_payment": false,
"adult_only": false,
"badges": [],
"rating_count": 0,
"review_count": 0
},
{
"row_type": "product",
"product_id": "11928769",
"title": "Apple iPhone 17 Pro 6.3\" 256GB Silver",
"brand": "Apple",
"category": "Smartphones",
"url": "https://www.kuantokusta.pt/p/11928769/apple-iphone-17-pro-63-256gb-silver",
"image": "https://s1.kuantokusta.pt/img_upload/produtos_comunicacoes/1540117_2_apple-iphone-17-pro-6-3-256gb-silver.jpg",
"price_min": 1106,
"currency": "EUR",
"offer_count": 24,
"marketplace_available": true,
"split_payment": false,
"adult_only": false,
"badges": [],
"rating_count": 5,
"review_count": 2
}
],
"count": 48,
"total": 1000,
"total_capped": true,
"matching_total": 42312,
"page": 1,
"pages": 21,
"has_more": true,
"facets": {
"attributes": [
{
"name": "Tamanho de Ecrã",
"field": "tamanho_de_ecra_s",
"values": [
"[trimmed-depth]",
"[trimmed-depth]"
]
},
{
"name": "Cor",
"field": "cor_s",
"values": [
"[trimmed-depth]",
"[trimmed-depth]",
"[trimmed-depth]"
]
},
{
"name": "Conetividade",
"field": "conectividade_s",
"values": [
"[trimmed-depth]",
"[trimmed-depth]"
]
}
],
"purchase_options": [
{
"label": "Comprar no KuantoKusta",
"value": "isMarketplace",
"count": 34146,
"active": false
},
{
"label": "Boa compra",
"value": "isHotDeal",
"count": 2271,
"active": false
},
{
"label": "Pagamento em 3 ou 4x",
"value": "hasSplitPayment",
"count": 367,
"active": false
}
],
"area": [
{
"label": "Smartphones e Acessórios",
"value": "Smartphones e Acessórios",
"count": 42209,
"active": false
},
{
"label": "Auto e Moto",
"value": "Auto e Moto",
"count": 64,
"active": false
},
{
"label": "Informática",
"value": "Informática",
"count": 22,
"active": false
}
],
"price_buckets": [
{
"label": "Menos de 9€",
"value": "_9",
"count": 9050,
"active": false
},
{
"label": "9€ a 31€",
"value": "9_31",
"count": 29926,
"active": false
},
{
"label": "Mais de 31€",
"value": "31_",
"count": 2689,
"active": false
}
],
"price_range": {
"min": 0.31,
"max": 3899
},
"brand": [
{
"label": "skyhe",
"value": "skyhe",
"count": 9450,
"active": false
},
{
"label": "OEM",
"value": "OEM",
"count": 8782,
"active": false
},
{
"label": "Accetel",
"value": "Accetel",
"count": 6404,
"active": false
}
]
},
"sort": "relevance",
"query": "iphone 17",
"redirected_to_category": null
}
}What the KuantoKusta API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | 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`). | Pricing teams call search to get keyword search on KuantoKusta (Portugal, EUR). | query, sort, page, price_min, price_max, ... |
| category | 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`. | Marketplace operators call category to get one KuantoKusta category listing (e.g. | category_id, sort, page, price_min, price_max, ... |
| categories | 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. | Catalog enrichment teams call categories to get kuantoKusta's category tree. | area_id |
| product | 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). | Retail analysts call product to get one product on KuantoKusta. | product_id |
| offers | 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. | Pricing teams call offers to get every offer for one product. | product_id, sort, offer_type |
| price_history | 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. | Marketplace operators call price_history to get the site's own price history for one product. | product_id, period |
Call search from your stack
curl -X POST https://api.reefapi.com/kuantokusta/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"iphone 17"}'import requests
r = requests.post(
"https://api.reefapi.com/kuantokusta/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "iphone 17"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/kuantokusta/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "iphone 17"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.kuantokusta.search with {"query":"iphone 17"}.Who uses this API and why
- Track every Portuguese store's price, shipping and total for a list of products by EAN.
- Find the cheapest delivered price, not just the cheapest sticker price.
- See which products can be bought through KuantoKusta's own checkout and at what price.
- Judge today's price against 90 days of daily lows and averages.
- Map a category with lowest prices, offer counts and brands, filtered by price or feature.
Questions developers ask before integrating
Do I need a KuantoKusta account?
No. Everything is read logged out.
Does the total include shipping?
Yes. total_price is price plus shipping_cost, the same Total the product page prints for each offer. Every printed Total on 6 product pages matched an API total.
Which offers can be bought on KuantoKusta itself?
Rows with offer_type marketplace. Rows with offer_type store send the buyer to the shop's own site. Filter with offer_type=marketplace, or use marketplace_only on search and category.
Is the buy box the cheapest offer?
Not necessarily. On an iPhone 18 Pro Max the highlighted buy box was 1,799 € and the cheapest store 1,596 €. cheapest_offer and cheapest_total_offer are computed from all rows.
How far back does price_history go?
30 days (31 points) or 90 days (91 points), the two ranges the site offers. Each point is the day's lowest and average offer price. Amazon.es prices are not included, as the site itself states.
Is the price history really the product I asked for?
Every call compares the series with the average price printed on the product's own page and refuses a series that does not match. In the runs on 2026-10-15, 10 of 10 products were verified.
Why does search say total 1000?
The site stops counting search results at 1,000. total_capped is true then, and matching_total carries the site's full count ("capa iphone": 37,755). Category listings are not capped.
Which filters are there?
Price range, brand, marketplace-only and good-deal-only on search; the same plus brand_id and feature_id on category. Checked against the unfiltered count in the same run: "tv 55" 734 → 300 to 600 € 163, Samsung 68, marketplace 441; Smartphones 1,979 → 300 to 600 € 539, Xiaomi 461, black 513.
What is the KuantoKusta API?
KuantoKusta API is a ReefAPI endpoint group for portugal's price comparison site: every store's price, shipping and total for a product, kuantokusta marketplace offers, and 30 or 90 days of price history. It returns live JSON through POST requests under /kuantokusta/v1.
Is the KuantoKusta API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. KuantoKusta calls use the same shared credit balance as every other ReefAPI engine.
Do I need a KuantoKusta login or account?
No login to KuantoKusta is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the KuantoKusta data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the KuantoKusta API use?
KuantoKusta actions currently cost 1-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call KuantoKusta from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call kuantokusta actions with the same key, credit pool and JSON envelope used by normal REST requests.