Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the billiger.de API page →
E-commerce & Marketplaces

billiger.de API & Scraper

billiger.de is one of Germany's big price comparison sites.

6 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 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.

Reference

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.

FieldWhat it holds
row_typeproduct, 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_ratingbilliger.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_ratingThe 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_displayThe 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_voucherprice 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_pricePrice 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_shopThe 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_lowbilliger.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).

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/billiger/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "query": "kaffeevollautomat delonghi"
  }
}
Captured response
{
  "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
  }
}
Actions

What the billiger.de API does

ActionDescriptionConcrete use caseKey params
searchKeyword 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, ...
categoryOne 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, ...
productOne 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
offersEvery 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, ...
offerOne 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_historybilliger.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
Code samples

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"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.billiger.search with {"query":"kaffeevollautomat delonghi"}.
Use cases

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.
FAQ

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.

docs / billiger

billiger.de

German price comparison: every shop's price with shipping and delivery time, the daily price history, specs, EANs and test grades.

base /billiger/v16 endpoints
post/billiger/v1/category3 credits

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.

ParameterAllowed / rangeDescription
category_idrequired—Numeric billiger.de category id: from `category_path[].category_id` of `product`, from a facet, or from /show/kategorie/<id>.htm.
sort = relevanceoptionalrelevance · popularity · price_asc · price_descResult order.
page = 1optional1–50Result page. A page past the last returns no rows (`page_beyond_last: true`).
page_size = 48optional48–96Rows per page: 48, 72 or 96 (the site's own choices).
brand_idoptional—Brand id from `facets.brand[].id` of an earlier call (2451932 = De'Longhi).
shop_idoptional—Shop id from `facets.shop[].id`: only items this shop sells.
price_minoptional0–Lowest price in EUR (the source's own price index).
price_maxoptional0–Highest price in EUR.
in_stock_only = falseoptional—Only items marked immediately deliverable (sofort lieferbar).
Try in playground →
post/billiger/v1/product3 credits

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.

ParameterAllowed / rangeDescription
product_idoptional—billiger.de product id: `product_id` of a search / category row (row_type product), or the number in a product URL (/products/<id>-…). Give this OR `baseproduct_id`.
baseproduct_idoptional—billiger.de product-family id: `baseproduct_id` of a row with row_type baseproduct, or the number in /baseproducts/<id>-…. A family groups the variants (colour, storage); its offers and history span all of them. Give this OR `product_id`.
Try in playground →
post/billiger/v1/offers3 credits

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.

ParameterAllowed / rangeDescription
product_idoptional—billiger.de product id: `product_id` of a search / category row (row_type product), or the number in a product URL (/products/<id>-…). Give this OR `baseproduct_id`.
baseproduct_idoptional—billiger.de product-family id: `baseproduct_id` of a row with row_type baseproduct, or the number in /baseproducts/<id>-…. A family groups the variants (colour, storage); its offers and history span all of them. Give this OR `product_id`.
sort = priceoptionalprice · total_priceOffer order.
in_stock_only = falseoptional—Only offers marked immediately deliverable.
condition = newoptionalnew · usedNew offers, or used / refurbished ones.
max_offers = 20optional1–100How many shop rows to return; billiger.de serves 20 per request, more rows cost more requests.
Try in playground →
post/billiger/v1/offer2 credits

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.

ParameterAllowed / rangeDescription
offer_idrequired—`offer_id` of a search / category row with row_type offer, or the number in /offers/<id>.
Try in playground →
post/billiger/v1/price_history3 credits

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`.

ParameterAllowed / rangeDescription
product_idoptional—billiger.de product id: `product_id` of a search / category row (row_type product), or the number in a product URL (/products/<id>-…). Give this OR `baseproduct_id`.
time_range = 6moptional1m · 3m · 6m · allHow far back. 1m / 3m / 6m come with the product page; `all` is one more request and adds the per-marketplace lines.
Try in playground →
Built for volume
5M+ requests a day

Measured at 60 requests a second across the fleet, with no central bottleneck. Volume pricing is on request, and per-key limits are raised for high-volume accounts.

Missing a source?
We build it

Tell us a site we do not cover yet and it becomes an engine. A customer asked for bestprice.gr on a Sunday and it was in the catalog the next day.

Support
2 minute median reply

Median time from a question in the live chat to the first answer, measured across every answered conversation. Setup help included, no support tier to buy.

One key, one balance
Every API included

No per-site plans and no separate subscriptions. One key and one credit pool across the whole catalog, so adding a source costs nothing up front.

Planning something large? Tell us the volume and the sources and we will come back with what it costs and what we would have to build.