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

REWE API & Scraper

REWE prices belong to one market.

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.

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.

Reference

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.

FieldWhat it holds
marketThe 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_toThe 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.
depositPfand 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_textThe 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_rankREWE 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_requestOn 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_limitREWE 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.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "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"
  }
}
Captured response
{
  "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
      }
    ]
  }
}
Actions

What the REWE API does

ActionDescriptionConcrete use caseKey params
searchSearch 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, ...
categoryList 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, ...
offersREWE 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, ...
categoriesThe 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
productOne 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
marketsREWE 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
Code samples

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"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.rewe.search with {"query":"milch","zip_code":"50667"}.
Use cases

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

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.

docs / rewe

REWE

German supermarket prices per REWE market: shelf price, offers, base price per kg or litre, Pfand, GTIN and full product labels.

base /rewe/v16 endpoints
post/rewe/v1/category2 credits

List one REWE category (slug from `categories`) in one market, with the same row fields and filters as `search`.

ParameterAllowed / rangeDescription
zip_codeoptional—German post code (PLZ, 5 digits). REWE prices and assortment belong to ONE market: with `service=delivery` the delivery market of this PLZ, with `service=pickup` the nearest pickup market. Give `zip_code` OR `market_id`; with neither, Köln 50667 is used and a warning says so.
market_idoptional—A REWE market id (wwIdent) exactly as the `markets` action returns it (pickup[].market_id or delivery.market_id). Use with the matching `service`.
service = pickupoptionalpickup · deliveryWhich REWE service the prices are for. The same product can cost differently (measured: Alpro oat drink 1,49 € pickup vs 2,49 € delivery, same PLZ).
categoryoptional—Category slug as the `categories` action or a row's facets return it (e.g. kaese-eier-molkerei, milch, frischmilch).
attributeoptionaldiscounted · organic · regional · vegan · new · cool · frozen · glutenfree · lactosefree · loyalty_bonusOne product attribute filter: discounted (on offer), organic (Bio), regional, vegan, new, cool (chilled), frozen, glutenfree, lactosefree, loyalty_bonus (PAYBACK bonus).
brandoptional—Exact brand name as REWE prints it (e.g. ja!, REWE Bio, Alpro).
sort = relevanceoptionalrelevance · price_asc · price_desc · name_asc · topsellerrelevance · price_asc · price_desc · name_asc · topseller.
page = 1optional1–10000Result page (1-based). REWE serves rows up to number 10,000: page × per_page ≤ 10000.
per_page = 40optional1–100Products per page, 1-100. REWE adds its sponsored rows ON TOP of this number (10 → 16 rows measured); they come flagged `sponsored`.
Try in playground →
post/rewe/v1/offers2 credits

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

ParameterAllowed / rangeDescription
queryoptional—Optional search words inside the offers.
zip_codeoptional—German post code (PLZ, 5 digits). REWE prices and assortment belong to ONE market: with `service=delivery` the delivery market of this PLZ, with `service=pickup` the nearest pickup market. Give `zip_code` OR `market_id`; with neither, Köln 50667 is used and a warning says so.
market_idoptional—A REWE market id (wwIdent) exactly as the `markets` action returns it (pickup[].market_id or delivery.market_id). Use with the matching `service`.
service = pickupoptionalpickup · deliveryWhich REWE service the prices are for. The same product can cost differently (measured: Alpro oat drink 1,49 € pickup vs 2,49 € delivery, same PLZ).
categoryoptional—Category slug as the `categories` action or a row's facets return it (e.g. kaese-eier-molkerei, milch, frischmilch).
brandoptional—Exact brand name as REWE prints it (e.g. ja!, REWE Bio, Alpro).
sort = relevanceoptionalrelevance · price_asc · price_desc · name_asc · topsellerrelevance · price_asc · price_desc · name_asc · topseller.
page = 1optional1–10000Result page (1-based). REWE serves rows up to number 10,000: page × per_page ≤ 10000.
per_page = 40optional1–100Products per page, 1-100. REWE adds its sponsored rows ON TOP of this number (10 → 16 rows measured); they come flagged `sponsored`.
Try in playground →
post/rewe/v1/categories2 credits

The category tree of one market with product counts: top level, or the children of `category`. Slugs feed `category` / `search`.

ParameterAllowed / rangeDescription
zip_codeoptional—German post code (PLZ, 5 digits). REWE prices and assortment belong to ONE market: with `service=delivery` the delivery market of this PLZ, with `service=pickup` the nearest pickup market. Give `zip_code` OR `market_id`; with neither, Köln 50667 is used and a warning says so.
market_idoptional—A REWE market id (wwIdent) exactly as the `markets` action returns it (pickup[].market_id or delivery.market_id). Use with the matching `service`.
service = pickupoptionalpickup · deliveryWhich REWE service the prices are for. The same product can cost differently (measured: Alpro oat drink 1,49 € pickup vs 2,49 € delivery, same PLZ).
categoryoptional—Parent category slug; omit for the top level.
Try in playground →
post/rewe/v1/product3 credits

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.

ParameterAllowed / rangeDescription
product_idrequired—The numeric product id a search row returns, or its https://www.rewe.de/shop/p/<slug>/<id> URL.
zip_codeoptional—German post code (PLZ, 5 digits). REWE prices and assortment belong to ONE market: with `service=delivery` the delivery market of this PLZ, with `service=pickup` the nearest pickup market. Give `zip_code` OR `market_id`; with neither, Köln 50667 is used and a warning says so.
market_idoptional—A REWE market id (wwIdent) exactly as the `markets` action returns it (pickup[].market_id or delivery.market_id). Use with the matching `service`.
service = pickupoptionalpickup · deliveryWhich REWE service the prices are for. The same product can cost differently (measured: Alpro oat drink 1,49 € pickup vs 2,49 € delivery, same PLZ).
Try in playground →
post/rewe/v1/markets1 credit

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.

ParameterAllowed / rangeDescription
zip_coderequired—German post code (PLZ, 5 digits).
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.