toppreise.ch API & Scraper
toppreise.ch is Switzerland's price comparison site.
🤖 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 Swiss francs, logged out. `search` takes product words, a category id or both and returns two kinds of rows: catalogue products (lowest price, lowest price including shipping, number of offers, best availability) and product series, a model line with its variants nested inside, each with its own id. Brand, shop and availability filters take the ids from `filters`, which lists the brands, shops, series and sub-categories toppreise offers for a search with their hit counts. `offers` returns every shop for one product in one call, up to 96: shop and shop id, offer title, item price, shipping, total including shipping, availability, shop rating and number of ratings, payment methods and the cheapest-price badges; used offers come back apart with their condition. `price_history` is toppreise's own daily chart: the lowest item price and the lowest price including shipping per day. `product` adds the GTIN codes, manufacturer part numbers, category path, series and the spec sheet.
What a toppreise.ch field actually contains
Fields that read differently from how they look. Every row was measured against live toppreise.ch pages on 2026-10-15.
| Field | What it holds |
|---|---|
| row_type | product or series. A product row has product_id (the number after -p in its URL), a series row has series_id and a variants list of product rows. product_id goes into product, offers and price_history; series_id into series. 8 of 8 product ids and 3 of 3 series ids came back as the same record. |
| price_min, price_min_incl_shipping | The lowest item price and the lowest price including shipping toppreise prints on the card, in CHF. They equalled the product page's lowest price and the cheapest offer's total on 8 of 8 products (an iPhone case: 31.90 item, 36.80 with shipping). |
| offers[].total_price | toppreise's price including shipping for the shop's cheapest payment method. On 54 of 56 offer rows it was item price plus shipping; on the other 2 a payment discount or fee applies (397.10 + 0.00 shipping, total 385.20 with a 3% prepayment discount). price_difference shows that amount and total_has_adjustment marks the row. |
| used_offers | Second-hand offers toppreise lists on the same product, with condition (for example akzeptabel). They are often cheaper than the cheapest new offer (257.30 against 284.35 for one coffee machine) and are never mixed into offers or price_min. |
| offers[].availability_code | toppreise's delivery class: 1 in stock at the shop's own warehouse, 2 from a supplier or foreign warehouse, 3 within a week, 4 within two weeks, 5 within four weeks, 9 no information. availability carries the site's wording. |
| shop_rating, shop_rating_count | The shop's rating on toppreise.ch and how many ratings it has (5.4 from 2,770). |
| total, total_capped | The number of hits toppreise prints. It stops at 10,000 ("more than 10'000"); total_capped is then true. Sorting by price lists every product separately, so the same search counts 1,245 hits by price and 1,115 by popularity, where series are grouped. |
| price_history.points[] | One point per day: price (lowest item price) and price_incl_shipping. The last point is yesterday's; current is today's price as the chart prints it, so the two can differ after a price change. |
Prices are in Swiss francs as toppreise.ch prints them. The same offer lists came back identical from three different network locations (38 of 38 row comparisons).
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/toppreise/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "kaffeevollautomat"
}
}{
"ok": true,
"meta": {
"api": "toppreise",
"endpoint": "search",
"mode": "live",
"latency_ms": 1864.7,
"record_count": 24,
"bytes": 584158,
"cache_hit": false,
"total": 1247,
"upstream_requests": 1,
"charged_credits": 3,
"version": "0.1.0",
"request_id": "14785d8d1eb440b3",
"queue_ms": 1.8,
"fetched_at": "2026-10-15T17:03:00.989Z"
},
"data": {
"query": "kaffeevollautomat",
"category_id": null,
"sort": "popularity",
"page": 1,
"page_size": 24,
"total": 1247,
"total_capped": false,
"total_is_exact": true,
"last_page": 52,
"has_more": true,
"page_beyond_last": false,
"no_result": false,
"filters_applied": {
"brand_id": null,
"shop_id": null,
"availability": null
},
"filter_echo": null,
"listing_url": "https://www.toppreise.ch/produktsuche?q=kaffeevollautomat",
"rows": [
{
"row_type": "series",
"series_id": "64949",
"title": "DELONGHI Magnifica Start",
"brand": "DELONGHI",
"features": "Vollautomat • Druck: 15 bar, Leistung: 1450 W, Wassertank: 1.8 L, Bohnenbehälter: 250 g, Milchaufschäumer",
"url": "https://www.toppreise.ch/produktserie/Magnifica_Start-pc-s64949",
"variant_count_shown": 2,
"price_min_incl_shipping": 249.95,
"currency": "CHF",
"variants": [
{
"row_type": "[trimmed-depth]",
"product_id": "[trimmed-depth]",
"title": "[trimmed-depth]",
"url": "[trimmed-depth]",
"category_slug": "[trimmed-depth]",
"image": "[trimmed-depth]",
"offer_count": "[trimmed-depth]",
"price_min": "[trimmed-depth]",
"price_min_incl_shipping": "[trimmed-depth]",
"best_availability_code": "[trimmed-depth]",
"best_availability": "[trimmed-depth]",
"currency": "[trimmed-depth]"
},
{
"row_type": "[trimmed-depth]",
"product_id": "[trimmed-depth]",
"title": "[trimmed-depth]",
"url": "[trimmed-depth]",
"category_slug": "[trimmed-depth]",
"image": "[trimmed-depth]",
"offer_count": "[trimmed-depth]",
"price_min": "[trimmed-depth]",
"price_min_incl_shipping": "[trimmed-depth]",
"best_availability_code": "[trimmed-depth]",
"best_availability": "[trimmed-depth]",
"currency": "[trimmed-depth]"
}
]
},
{
"row_type": "series",
"series_id": "41301",
"title": "DELONGHI Dinamica Plus",
"brand": "DELONGHI",
"features": "Vollautomat • Leistung: 1450 W, Wassertank: 1.8 L, Bohnenbehälter: 300 g, Milchaufschäumer, Milchbehälter, Heisswasserfunktion",
"url": "https://www.toppreise.ch/produktserie/Dinamica_Plus-pc-s41301",
"variant_count_shown": 3,
"price_min_incl_shipping": 446.35,
"currency": "CHF",
"variants": [
{
"row_type": "[trimmed-depth]",
"product_id": "[trimmed-depth]",
"title": "[trimmed-depth]",
"url": "[trimmed-depth]",
"category_slug": "[trimmed-depth]",
"image": "[trimmed-depth]",
"offer_count": "[trimmed-depth]",
"price_min": "[trimmed-depth]",
"price_min_incl_shipping": "[trimmed-depth]",
"best_availability_code": "[trimmed-depth]",
"best_availability": "[trimmed-depth]",
"currency": "[trimmed-depth]"
},
{
"row_type": "[trimmed-depth]",
"product_id": "[trimmed-depth]",
"title": "[trimmed-depth]",
"url": "[trimmed-depth]",
"category_slug": "[trimmed-depth]",
"image": "[trimmed-depth]",
"offer_count": "[trimmed-depth]",
"price_min": "[trimmed-depth]",
"price_min_incl_shipping": "[trimmed-depth]",
"best_availability_code": "[trimmed-depth]",
"best_availability": "[trimmed-depth]",
"currency": "[trimmed-depth]"
},
{
"row_type": "[trimmed-depth]",
"product_id": "[trimmed-depth]",
"title": "[trimmed-depth]",
"url": "[trimmed-depth]",
"category_slug": "[trimmed-depth]",
"image": "[trimmed-depth]",
"offer_count": "[trimmed-depth]",
"price_min": "[trimmed-depth]",
"price_min_incl_shipping": "[trimmed-depth]",
"best_availability_code": "[trimmed-depth]",
"best_availability": "[trimmed-depth]",
"currency": "[trimmed-depth]"
}
]
},
{
"row_type": "series",
"series_id": "43271",
"title": "PHILIPS 2200 series",
"brand": "PHILIPS",
"features": "Vollautomat • Druck: 15 bar, Leistung: 1500 W, Wassertank: 1.8 L, Bohnenbehälter: 275 g, Milchaufschäumer, Heisswasserfunktion • Wasserfilter",
"url": "https://www.toppreise.ch/produktserie/2200_series-pc-s43271",
"variant_count_shown": 2,
"price_min_incl_shipping": 207.05,
"currency": "CHF",
"variants": [
{
"row_type": "[trimmed-depth]",
"product_id": "[trimmed-depth]",
"title": "[trimmed-depth]",
"url": "[trimmed-depth]",
"category_slug": "[trimmed-depth]",
"image": "[trimmed-depth]",
"offer_count": "[trimmed-depth]",
"price_min": "[trimmed-depth]",
"price_min_incl_shipping": "[trimmed-depth]",
"best_availability_code": "[trimmed-depth]",
"best_availability": "[trimmed-depth]",
"currency": "[trimmed-depth]"
},
{
"row_type": "[trimmed-depth]",
"product_id": "[trimmed-depth]",
"title": "[trimmed-depth]",
"url": "[trimmed-depth]",
"category_slug": "[trimmed-depth]",
"image": "[trimmed-depth]",
"offer_count": "[trimmed-depth]",
"price_min": "[trimmed-depth]",
"price_min_incl_shipping": "[trimmed-depth]",
"best_availability_code": "[trimmed-depth]",
"best_availability": "[trimmed-depth]",
"currency": "[trimmed-depth]"
}
]
}
]
}
}What the toppreise.ch API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Keyword or category search on toppreise.ch (Switzerland, CHF). Rows are catalogue products (lowest price, lowest price incl. shipping, number of offers, availability) and product series (`row_type: series`, a model line with its variants nested). Filter by brand, shop and availability (ids from the `filters` action), sort by price, name, availability or popularity, 24 rows per page. Give `query`, `category_id` or both. | Pricing teams call search to get keyword or category search on toppreise.ch (Switzerland, CHF). | none |
| filters | The filter facets toppreise offers for a search: brands, shops, product series and sub-categories with their ids and hit counts, the price steps and the exact hit count. Use the ids as `brand_id` / `shop_id` / `category_id` in `search`. | Marketplace operators call filters to get the filter facets toppreise offers for a search. | query |
| product | One toppreise product: title, brand, GTIN/EAN codes, manufacturer part numbers, description, category path and id, series id, lowest and highest offer price (CHF), number of offers, spec sheet, and the first page of shop offers (up to 24, lowest total first) with used offers apart. | Catalog enrichment teams call product to get one toppreise product. | product_id |
| offers | Every shop's offer for one product (up to 96, ordered by toppreise's lowest total first): shop and shop id, offer title, price, shipping, total price incl. shipping for the cheapest payment method, the difference when discounts or fees apply, availability, shop rating and rating count, payment methods, cheapest-price badges. Used ('Occasion') offers are returned apart in `used_offers` with their condition. | Retail analysts call offers to get every shop's offer for one product (up to 96, ordered by toppreise's lowest total first). | product_id |
| price_history | toppreise's own daily price history for one product: the lowest item price and the lowest price incl. shipping per day (measured: since 2023-11 on a 2023 product), with the chart's own current, lowest and highest price. | Pricing teams call price_history to get toppreise's own daily price history for one product. | product_id |
| series | One toppreise product series (model line): its name and every variant product with lowest price, number of offers and availability. | Marketplace operators call series to get one toppreise product series (model line). | series_id |
Call search from your stack
curl -X POST https://api.reefapi.com/toppreise/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"kaffeevollautomat"}'import requests
r = requests.post(
"https://api.reefapi.com/toppreise/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "kaffeevollautomat"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/toppreise/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "kaffeevollautomat"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.toppreise.search with {"query":"kaffeevollautomat"}.Who uses this API and why
- Track every Swiss shop's CHF price, shipping and availability for a product list.
- Read toppreise's daily price history to judge whether today's price is a good one.
- Compare used offers with the cheapest new price for the same product.
- Map a category with lowest prices, offer counts, GTINs and specs.
- Find which shops carry a brand and at what price in Switzerland.
Questions developers ask before integrating
Do I need a toppreise.ch account?
No. Everything is read logged out.
How many shops does offers return?
All of them up to 96 in one call, cheapest total first. A De'Longhi Magnifica Start had 30 shop offers on 2026-10-15, all 30 returned, plus used offers apart.
Is shipping included?
Every offer row has the item price, the shipping cost and the total. Search rows carry both the lowest item price and the lowest price including shipping.
Which search filters are there?
Brand, shop, availability and category, checked against the unfiltered count in the same run: "kaffeevollautomat" 1,115 hits → brand De'Longhi 25, shop digitec 323, in stock 270, deliverable within a week 824, category Vollautomaten 140. A brand or shop id toppreise does not offer for the search is refused, not ignored. There is no price-range filter.
Where do brand and shop ids come from?
From filters, for the same words: it lists every brand, shop, product series and sub-category toppreise offers, with ids and hit counts.
How far back does price_history go?
As far as toppreise keeps the product: a coffee machine listed since November 2023 had 1,072 daily points. time_range takes 1m, 3m, 6m, 1y or all.
What is a series?
toppreise groups variants of one model line (colours, bundles) into a series. Search rows of type series carry their variants; series returns all variants of one series.
How many pages can I read?
24 rows per page, up to page 100. has_more and last_page tell you where a result ends.
What is the toppreise.ch API?
toppreise.ch API is a ReefAPI endpoint group for swiss price comparison in chf: every shop's price with shipping, used offers apart, the daily price history, gtins and specs. It returns live JSON through POST requests under /toppreise/v1.
Is the toppreise.ch API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. toppreise.ch calls use the same shared credit balance as every other ReefAPI engine.
Do I need a toppreise.ch login or account?
No login to toppreise.ch 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 toppreise.ch 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 toppreise.ch API use?
toppreise.ch actions currently cost 2-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call toppreise.ch from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call toppreise actions with the same key, credit pool and JSON envelope used by normal REST requests.