REWE API & Scraper
REWE prices belong to one market.
🤖 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.
The same product can cost differently in a pickup market and in the delivery market of the same post code, and each market sells its own range, so every call answers for one market and says which. Pass a German post code (zip_code) and a service (pickup or delivery) and the API picks the market REWE itself would pick, or pass a market_id from the markets call. `search` returns the products that market sells for a search term: price, regular price, discount percent and offer end date, base price per kg or litre with REWE's printed base price text, Pfand as its own number, pack size, GTIN, brand, tags such as Bio, regional or vegan, category, order limit and a sponsored flag. `category` lists a category, `categories` gives the category tree with product counts, and `offers` lists every discounted product of the market. `product` returns the full product page for that market: price, Pfand, base price, legal product name, description, ingredients, allergens and label attributes, the nutrition table, manufacturer, breadcrumb and images. `markets` turns a post code into its delivery market and its pickup markets, nearest first.
What a REWE field actually contains
Fields that read differently from how they look. Every row was measured against live REWE responses on 2026-10-15.
| Field | What it holds |
|---|---|
| market | The market and service the prices are for. In post code 50667 (Köln) "milch" matched 598 products in the nearest pickup market and 704 in the delivery market; in 10115 (Berlin) 747. Alpro Not Mlk oat drink cost 1,49 € for pickup and 2,49 € for delivery in the same post code. |
| price, regular_price, on_offer, discount_percent, offer_valid_to | The price the market charges now and the price without the offer, in euros. On offer rows regular_price is higher and offer_valid_to is REWE's end date, for example a 50 % offer ending 17 October. |
| deposit | Pfand in euros, NOT included in price. REWE prints "2,19 € zzgl. 0,15 € Pfand"; price is 2.19 and deposit 0.15. |
| base_price, base_unit, base_price_text | The Grundpreis: 11.0 per "1 kg" for a 90 g bar, with REWE's own text "1 kg = 11 €". A pack of exactly 1 l or 1 kg carries no separate base price from REWE, so the field stays empty instead of being calculated. |
| sponsored, duplicate_of_rank | REWE adds sponsored products on top of the page size you ask for (10 asked, 16 returned). REWE can show one product twice on a page, once as a sponsored placement; duplicate_of_rank on the second copy points to the first. |
| served_market_matches_request | On product pages: false when the chosen market does not sell the product. REWE still shows the page, priced for another market, and the answer names that market. |
| available_in_market, order_limit | REWE publishes no stock count. A row exists only when the market sells the product, and order_limit is the most units one order may contain (99 on most products). |
Without a market REWE's own listing shows no prices at all; when no post code or market is passed the API uses Köln 50667 for pickup and says so in a warning.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/rewe/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "milch",
"zip_code": "50667"
}
}{
"ok": true,
"meta": {
"api": "rewe",
"endpoint": "search",
"mode": "live",
"latency_ms": 16515.7,
"record_count": 46,
"bytes": 96214,
"cache_hit": false,
"total": 557,
"market_id": "3200008",
"upstream_requests": 2,
"charged_credits": 2,
"version": "0.1.0",
"request_id": "94195d97047c4090",
"queue_ms": 2.2,
"fetched_at": "2026-10-18T11:42:18.284Z"
},
"data": {
"market": {
"market_id": "3200008",
"service": "pickup",
"zip_code": "50667",
"resolved_from": "zip_code"
},
"query": "milch",
"filters": {
"category": null,
"attribute": null,
"brand": null
},
"sort": "relevance",
"total": 557,
"total_pages": 14,
"page": 1,
"has_more": true,
"returned": 46,
"sponsored_returned": 6,
"results": [
{
"rank": 1,
"product_id": "2235048",
"name": "Schwarzwaldmilch Bio Frische Vollmilch 3,8% 1l",
"brand": "Schwarzwaldmilch",
"gtin": "4046700500965",
"listing_id": "13-4046700500965-17f00388-6f34-338d-b828-7be00ddfab14",
"available_in_market": true,
"price": 2.19,
"regular_price": 2.19,
"on_offer": false,
"discount_percent": null,
"offer_valid_to": null,
"currency": "EUR",
"deposit": 0.15,
"pack_size": "1l",
"grammage_text": "1l",
"base_price": null,
"base_unit": null,
"base_price_text": null,
"base_price_text_matches": null,
"order_limit": 99,
"tags": [
"Bio",
"Gekühlt"
],
"category_path": "Käse, Eier & Molkerei/Milch/Frischmilch/",
"category_id": "175",
"has_variants": false,
"merchant": "REWE",
"merchant_type": "REWE",
"sponsored": false,
"image": "https://img.rewe-static.de/2235048/18946320_digital-image.png",
"url": "https://www.rewe.de/shop/p/schwarzwaldmilch-bio-frische-vollmilch-3-8-1l/2235048",
"duplicate_of_rank": null
},
{
"rank": 2,
"product_id": "9891941",
"name": "Milka Schokolade Alpenmilch 90g",
"brand": "Milka",
"gtin": "7622202257124",
"listing_id": "8-MR5NCSHZ-17f00388-6f34-338d-b828-7be00ddfab14",
"available_in_market": true,
"price": 1.99,
"regular_price": 1.99,
"on_offer": false,
"discount_percent": null,
"offer_valid_to": null,
"currency": "EUR",
"deposit": null,
"pack_size": "90g",
"grammage_text": "90g (1 kg = 22,11 €)",
"base_price": 22.11,
"base_unit": "1 kg",
"base_price_text": "1 kg = 22,11 €",
"base_price_text_matches": true,
"order_limit": 99,
"tags": [
"Tiefpreis"
],
"category_path": "Süßes & Salziges/Schokolade/Tafelschokolade/Vollmilch-Schokolade/",
"category_id": "2485",
"has_variants": false,
"merchant": "REWE",
"merchant_type": "REWE",
"sponsored": true,
"image": "https://img.rewe-static.de/9891941/48587612_digital-image.png",
"url": "https://www.rewe.de/shop/p/milka-schokolade-alpenmilch-90g/9891941",
"duplicate_of_rank": null
},
{
"rank": 3,
"product_id": "7317466",
"name": "Milka Biscoff 90g",
"brand": "Milka",
"gtin": "7622202295133",
"listing_id": "8-GSQLSAZV-17f00388-6f34-338d-b828-7be00ddfab14",
"available_in_market": true,
"price": 1.99,
"regular_price": 1.99,
"on_offer": false,
"discount_percent": null,
"offer_valid_to": null,
"currency": "EUR",
"deposit": null,
"pack_size": "90g",
"grammage_text": "90g (1 kg = 22,11 €)",
"base_price": 22.11,
"base_unit": "1 kg",
"base_price_text": "1 kg = 22,11 €",
"base_price_text_matches": true,
"order_limit": 99,
"tags": [
"Tiefpreis"
],
"category_path": "Süßes & Salziges/Schokolade/Tafelschokolade/Vollmilch-Schokolade/",
"category_id": "2485",
"has_variants": false,
"merchant": "REWE",
"merchant_type": "REWE",
"sponsored": true,
"image": "https://img.rewe-static.de/7317466/53775614_digital-image.png",
"url": "https://www.rewe.de/shop/p/milka-biscoff-90g/7317466",
"duplicate_of_rank": null
}
]
}
}What the REWE API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search REWE's online shop AS ONE MARKET SELLS IT: price, regular price and discount, offer end date, base price per kg/l, Pfand, pack size, GTIN, brand, tags, category, sponsored flag. `query` is required; filters: category, attribute, brand; sort; paging. | Pricing teams call search to search REWE's online shop AS ONE MARKET SELLS IT. | query, zip_code, market_id, service, category, ... |
| category | List one REWE category (slug from `categories`) in one market, with the same row fields and filters as `search`. | Marketplace operators call category to list one REWE category (slug from `categories`) in one market, with the same row fields and f…. | category, zip_code, market_id, service, attribute, ... |
| offers | REWE online-shop offers (Angebote) of one market: every discounted product with offer price, regular price, discount % and offer end date. Narrow with `query`, `category` or `brand`. | Catalog enrichment teams call offers to get rEWE online-shop offers (Angebote) of one market. | zip_code, market_id, service, query, category, ... |
| categories | The category tree of one market with product counts: top level, or the children of `category`. Slugs feed `category` / `search`. | Retail analysts call categories to get the category tree of one market with product counts. | zip_code, market_id, service, category |
| product | One REWE product in one market by the `product_id` a search row returns: price, regular price, discount, Pfand, base price, buyable flag and order limit, GTIN, brand, legal product name, description, ingredients, allergens and every label attribute, nutrition table, manufacturer, breadcrumb, images — and which market the page actually priced it for. | Pricing teams call product to get one REWE product in one market by the `product_id` a search row returns. | product_id, zip_code, market_id, service |
| markets | REWE markets for a German post code: whether home delivery is offered and by which market, and the pickup markets nearest first with address, distance and coordinates. The market ids feed every other action. | Marketplace operators call markets to get rEWE markets for a German post code. | zip_code |
Call search from your stack
curl -X POST https://api.reefapi.com/rewe/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"milch","zip_code":"50667"}'import requests
r = requests.post(
"https://api.reefapi.com/rewe/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "milch",
"zip_code": "50667"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/rewe/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "milch",
"zip_code": "50667"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.rewe.search with {"query":"milch","zip_code":"50667"}.Who uses this API and why
- Track REWE shelf prices and weekly offers for a list of German post codes.
- Compare delivery and pickup prices, and markets against each other.
- Build a German grocery database with GTIN, brand, base price, Pfand, ingredients and nutrition.
- Monitor which products a REWE market lists and which go on offer, with end dates.
- Find the REWE delivery market and nearest pickup markets for any post code.
Questions developers ask before integrating
Do I need a REWE account?
No. Everything is read logged out: the prices, offers and product pages any visitor sees after choosing a market.
Why do prices depend on the post code?
REWE runs its delivery service and its pickup service from individual markets, each with its own range and prices. Pass zip_code with service=delivery for home-delivery prices, or service=pickup for the nearest market's pickup prices. The answer always names the market.
Is Pfand included in the price?
No. REWE shows Pfand separately and so does the API, in deposit. Add it yourself if you need the amount paid at checkout.
How do I get the price per kilogram or litre?
base_price with base_unit, plus REWE's printed text in base_price_text. On search rows the number and the printed text agreed on every row that had both.
Which filters work?
category, brand and one attribute (discounted, organic, regional, vegan, new, cool, frozen, glutenfree, lactosefree, loyalty_bonus), plus sort by relevance, price up or down, name or top sellers. Each filter was checked against the unfiltered count in the same minute: milch in one Köln market went from 598 to 46 Bio, 50 discounted, 52 ja! and 19 fresh-milk products.
How deep can I page?
Up to row 10,000 of a result list (page × per_page). REWE lists at most 100 products per page plus its sponsored rows.
Does the offers call cover the weekly paper flyer?
No. It lists the online shop's discounted products of the chosen market. The printed weekly flyer of a high-street market is a separate REWE page and is not covered.
How fresh is the data?
Every call reads REWE live; nothing is cached. Offer prices change weekly.
What is the REWE API?
REWE API is a ReefAPI endpoint group for german supermarket prices per rewe market: shelf price, offers, base price per kg or litre, pfand, gtin and full product labels. It returns live JSON through POST requests under /rewe/v1.
Is the REWE API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. REWE calls use the same shared credit balance as every other ReefAPI engine.
Do I need a REWE login or account?
No login to REWE 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 REWE 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 REWE API use?
REWE 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 REWE from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call rewe actions with the same key, credit pool and JSON envelope used by normal REST requests.