billiger.de API & Scraper
billiger.de is one of Germany's big price comparison sites.
🤖 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 three kinds of rows: catalogue products (lowest price, number of prices compared, overall rating), product families with several variants, and single shop offers billiger.de has not matched to a product, each with its own id. Brand, category, shop, price range and in-stock filters take the ids returned in the same response's facets. `offers` returns every shop for one product in one call: the shop and its star rating, the marketplace seller where there is one, the item price, a voucher price with its code where the price needs one, shipping cost, total price including shipping, delivery time and free-return days; sort by price or by total price, and switch to used and refurbished offers. `price_history` is billiger.de's own daily lowest-price chart, up to 551 days back, with the site's verdict on whether today's price is high. `product` adds the EAN, the full spec sheet, the billiger.de overall grade, user and test-report ratings, the popularity rank and every professional test report.
What a billiger.de field actually contains
Fields that read differently from how they look. Every row was measured against live billiger.de pages on 2026-10-15.
| Field | What it holds |
|---|---|
| row_type | product, baseproduct or offer. A product row has product_id, a product family (several colours or sizes) has baseproduct_id, a single shop item has offer_id; each id goes into the action of the same name (product, offers, offer). 16 of 16 ids measured came back as the same record. |
| price (search row) | The "ab" price billiger.de prints on the card, in euros. It matched the card's own machine-readable cent value on 367 of 367 rows and the product page's lowest price on 8 of 8 products. |
| overall_grade, overall_rating | billiger.de's own Gesamtnote, a German school grade where 1 is best (1.6 = gut), and the same verdict as stars out of 5 (4.35). It weighs user reviews and test reports equally. |
| user_rating, test_report_rating | The user-review average (4.6 from 147 reviews) and the test-report average (4.0 from 3 reports) as separate numbers. The card's rating_count adds both (150). |
| test_reports[].grade_display | The test's own grade as printed: "2,3" is a German school grade, "80%" a percentage. grade_scale says which, so the two are never compared as one number. |
| offers[].price, price_without_voucher | price is what billiger.de prints, which can be a price that needs a voucher; then price_without_voucher and voucher_code are filled (364.71 with PREISOPTIMAL3, 375.99 without). |
| offers[].total_price | Price including the shop's cheapest shipping. Where billiger.de prints the total it is taken as printed; it equalled price plus shipping on 110 of 110 offer rows. |
| more_offers_from_shop | The list shows one row per shop. A shop with several listings for the same product says how many more it has (eBay: 15), which is why offer_count on the product can be larger than the rows. |
| price_history.points[].suspect_low | billiger.de's chart keeps the occasional one-day price far below the rest (26.90 EUR on a 364 EUR coffee machine). Such points are returned as published and flagged; lowest_in_range_excluding_suspect leaves them out. |
Prices are in euros, VAT included, as billiger.de prints them for Germany. The same offer list came back identical from four different network locations (80 of 80 rows).
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/billiger/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "kaffeevollautomat delonghi"
}
}{
"ok": true,
"meta": {
"api": "billiger",
"endpoint": "search",
"mode": "live",
"latency_ms": 613.4,
"record_count": 48,
"bytes": 401820,
"cache_hit": false,
"total": 996,
"upstream_requests": 1,
"charged_credits": 3,
"version": "0.1.0",
"request_id": "53dd7c1b50fd4c07",
"queue_ms": 18.8,
"fetched_at": "2026-10-15T17:02:51.068Z"
},
"data": {
"results": [
{
"row_type": "product",
"product_id": "3443116743",
"baseproduct_id": null,
"offer_id": null,
"title": "De'Longhi Magnifica Evo ECAM290.61 SB Silver Black",
"url": "https://www.billiger.de/products/3443116743-de-longhi-magnifica-evo-ecam290-61-sb-silver-black",
"image": "https://cdn.billiger.com/dynimg/1xeV6OOFWACof0p75-xL_RsAId4qxUNfahE8nUhH7Pc88MgR1b3VHcWvS03VxtgwA9y0ixaTwmbQJ1kK1e1OUAWnMrV4e2aUm5Hsr8TVoS2/De-Longhi-Magnifica-Evo-ECAM290-61-SB-Silver-Black.webp",
"price": 364.31,
"price_is_from": true,
"price_mismatch": false,
"currency": "EUR",
"offer_count": 44,
"overall_rating": 4.35,
"rating_count": 150,
"has_variants": false,
"energy_class": null,
"shop": null,
"seller": null,
"shipping_cost": null
},
{
"row_type": "product",
"product_id": "3417052007",
"baseproduct_id": null,
"offer_id": null,
"title": "De'Longhi Magnifica Evo ECAM290.81.TB Titan Black",
"url": "https://www.billiger.de/products/3417052007-de-longhi-magnifica-evo-ecam290-81-tb-titan-black",
"image": "https://cdn.billiger.com/dynimg/0ZeYO918c5hof0p75-xL_RKSbtZk8LBj6hE8nUhH7Pc88MgR1b3VHcWvS03VxtgwMY47vxFMvwNFwzxX12SqlbGUjLHNRBmVj3A2NRRTfk5/De-Longhi-Magnifica-Evo-ECAM290-81-TB-Titan-Black.webp",
"price": 381.9,
"price_is_from": true,
"price_mismatch": false,
"currency": "EUR",
"offer_count": 29,
"overall_rating": 4.4,
"rating_count": 150,
"has_variants": false,
"energy_class": null,
"shop": null,
"seller": null,
"shipping_cost": null
},
{
"row_type": "product",
"product_id": "4449577944",
"baseproduct_id": null,
"offer_id": null,
"title": "De'Longhi Magnifica Evo ECAM290.51B Black",
"url": "https://www.billiger.de/products/4449577944-de-longhi-magnifica-evo-ecam290-51b-black",
"image": "https://cdn.billiger.com/dynimg/AfnfE_A8XYwof0p75-xL_S10TWyHpbJp6hE8nUhH7Pc88MgR1b3VHcWvS03VxtgwF-DyP_LVIxl-qfru5ikLujEkFDR_wQc-RNcXNyIQN3l/De-Longhi-Magnifica-Evo-ECAM290-51B-Black.webp",
"price": 318,
"price_is_from": true,
"price_mismatch": false,
"currency": "EUR",
"offer_count": 25,
"overall_rating": 4,
"rating_count": 2,
"has_variants": false,
"energy_class": null,
"shop": null,
"seller": null,
"shipping_cost": null
}
],
"count": 48,
"total": 996,
"shop_count": 69,
"page": 1,
"page_size": 48,
"has_more": true,
"page_beyond_last": false,
"facets": {
"isdeal": [
{
"id": "1",
"name": "Deals & Schnäppchen",
"count": 2
}
],
"category": [
{
"id": "3551",
"name": "Kaffeevollautomaten",
"count": 146
},
{
"id": "3549",
"name": "Kaffeemaschinen",
"count": 6
},
{
"id": "3582",
"name": "Wasserfilter",
"count": 220
}
],
"brand": [
{
"id": "2451932",
"name": "De'Longhi",
"count": 350
},
{
"id": "17427",
"name": "OEM",
"count": 1
},
{
"id": "5317347",
"name": "Piebert",
"count": 103
}
],
"paymentmethod": [
{
"id": "24",
"name": "Amazon Pay",
"count": 706
},
{
"id": "2",
"name": "American Express",
"count": 864
},
{
"id": "12",
"name": "Andere",
"count": 970
}
],
"shop": [
{
"id": "15170",
"name": "Amazon Marketplace Health & Personal Care",
"count": 115
},
{
"id": "19760",
"name": "Amazon Marketplace Home",
"count": 103
},
{
"id": "9998",
"name": "Amazon Marketplace Kitchen",
"count": 400
}
],
"availability": [
{
"id": "1",
"name": "sofort",
"count": 897
}
],
"price_range": [
{
"min": 2,
"max": 2499
}
]
},
"category_path": [
{
"name": "Suche nach \"kaffeevollautomat delonghi\"",
"url": "https://www.billiger.de/search",
"category_id": null
}
],
"sort_applied": "s_relevance",
"heading": "996 Ergebnisse aus 69 Shops für kaffeevollautomat delonghi",
"query": "kaffeevollautomat delonghi",
"sort": "relevance",
"row_types": "all",
"redirected_to": null,
"site_applied_filter": null
}
}What the billiger.de API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Keyword search on billiger.de (Germany, EUR). Rows are catalogue products (lowest price, number of prices compared, overall rating), product families (`row_type: baseproduct`, several variants) and single shop offers (`row_type: offer`, with shop, marketplace seller and shipping). Filter by brand, category, shop, price range and in-stock (ids come from `facets` of an earlier call). Some queries are turned into a category page by the site itself (`redirected_to`); a category page lists catalogue products only. | Pricing teams call search to get keyword search on billiger.de (Germany, EUR). | query, sort, page, page_size, brand_id, ... |
| category | One billiger.de category listing (e.g. 3551 = Kaffeevollautomaten): the same rows as `search`, with the same filters, sort and paging. A top-level category (e.g. 100165 Kaffeegeräte) is a landing page with no total. | Marketplace operators call category to get one billiger.de category listing (e.g. | category_id, sort, page, page_size, brand_id, ... |
| product | One product (or product family) on billiger.de: title, brand, EAN, colour, category path, image, description, lowest and highest price and number of offers, the billiger.de overall grade (German school grade, 1 best) and its star equivalent, the user rating and the test-report rating with their counts, the popularity rank in its category, editorial pros and cons, the full spec sheet, every professional test report (publisher, grade, pros, cons) and, for a family, every variant with its own id, EAN and price range. | Catalog enrichment teams call product to get one product (or product family) on billiger.de. | product_id, baseproduct_id |
| offers | Every shop's offer for one product (or family) on billiger.de, one row per shop in billiger.de's order: shop (name, id, star rating and rating count, marketplace, Trusted Shops), marketplace seller, condition, price, price without voucher and the voucher code where the price needs one, crossed-out price, shipping cost, total price including shipping, delivery time, free-return days, and how many more offers the same shop has. Sort by price or by total price incl. shipping, only in-stock, new or used / refurbished. | Retail analysts call offers to get every shop's offer for one product (or family) on billiger.de, one row per shop in billiger.d…. | product_id, baseproduct_id, sort, in_stock_only, condition, ... |
| offer | One single shop offer billiger.de lists without a product page (`row_type: offer` rows of search / category): title, shop, marketplace seller, price, shipping, total incl. shipping, delivery time, image, category path. | Pricing teams call offer to get one single shop offer billiger.de lists without a product page (`row_type. | offer_id |
| price_history | billiger.de's own price history for one product: the lowest price on every day, the lowest / highest / median in the range, the site's own verdict on the current price per period (e.g. 'Aktuell hoher Preis' with its typical band), and with `time_range: all` the separate daily lines it draws for the big marketplaces (eBay, Kaufland, Otto, …). Single-day drops far below the band are kept as published and flagged `suspect_low`. | Marketplace operators call price_history to get billiger.de's own price history for one product. | product_id, time_range |
Call search from your stack
curl -X POST https://api.reefapi.com/billiger/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"kaffeevollautomat delonghi"}'import requests
r = requests.post(
"https://api.reefapi.com/billiger/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "kaffeevollautomat delonghi"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/billiger/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "kaffeevollautomat delonghi"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.billiger.search with {"query":"kaffeevollautomat delonghi"}.Who uses this API and why
- Track every German shop's price, shipping and delivery time for a product list.
- Pull billiger.de's daily price history to see whether today's price is a good one.
- Watch marketplace sellers and voucher prices on eBay, Kaufland and Otto against regular shops.
- Map a category with prices, ratings, EAN codes and popularity rank.
- Collect professional test grades and user ratings per product.
Questions developers ask before integrating
Do I need a billiger.de account?
No. Everything is read logged out.
How many shops does offers return?
20 per request in billiger.de's order, one row per shop; max_offers up to 100 fetches the next pages. A De'Longhi Magnifica Evo had 21 shop rows on 2026-10-15.
Is shipping included?
Every offer row carries the shipping cost and the total including shipping. Sort with sort=total_price to rank by what the buyer actually pays.
How far back does price_history go?
1m, 3m and 6m come with the product page (181 daily points for 6m); all returned 551 daily points from 13 April 2025, plus separate daily lines for eBay, Kaufland, Otto, Metro and voelkner where billiger.de draws them.
Can I get the price history of a product family?
No: billiger.de draws a family's chart for one of its variants, so price_history takes a variant's product_id. product returns every variant's product_id for a family.
Which search filters are there?
Brand, category, shop, price range and in-stock, checked against the unfiltered count in the same run: "kaffeevollautomat delonghi" 998 results → one brand 352, one shop 115, one category 148, in stock 898, 300 to 500 EUR 51. The ids come back in the facets of the same response.
Why does my search come back as a category?
billiger.de turns some words into a category page or a category filter by itself ("waschmaschine" opens the washing machine category). redirected_to tells you where it went; the rows are what billiger.de shows there.
Are used offers included?
offers returns new offers by default; condition=used returns the used and refurbished ones, each marked.
What is the billiger.de API?
billiger.de API is a ReefAPI endpoint group for german price comparison: every shop's price with shipping and delivery time, the daily price history, specs, eans and test grades. It returns live JSON through POST requests under /billiger/v1.
Is the billiger.de API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. billiger.de calls use the same shared credit balance as every other ReefAPI engine.
Do I need a billiger.de login or account?
No login to billiger.de 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 billiger.de 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 billiger.de API use?
billiger.de 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 billiger.de from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call billiger actions with the same key, credit pool and JSON envelope used by normal REST requests.