REWE APIrewe.de ↗
Access REWE's German supermarket catalog via API. Search products, browse by postal code, get local pricing, discount flags, and check delivery availability.
What is the REWE API?
The REWE.de API provides 3 endpoints to search and browse Germany's largest supermarket chain online catalog, returning local pricing, discount status, and delivery availability per German postal code. The search_products endpoint accepts a keyword and a 5-digit postal code, returning matched product objects with current_price_eur, is_discounted, categories, and pagination metadata. All pricing reflects what is actually charged in the delivery area for the postal code supplied.
curl -X POST 'https://api.parse.bot/scraper/09862ee5-f18c-4c22-91e0-2962ed88cdb0/search_products' \
-H 'X-API-Key: $PARSE_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"page": "1",
"query": "milch",
"per_page": "5",
"postal_code": "10115"
}'Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace rewe-de-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
from parse_apis.rewe_online_shop_api import Rewe, Product, ServiceArea
rewe = Rewe()
# Check delivery availability for a Berlin postal code
area = rewe.serviceareas.get(postal_code="10115")
print(area.postal_code, area.has_delivery, area.delivery_market_id)
# Search for milk products in that area
for product in rewe.servicearea("10115").search(query="milch", per_page=5, limit=10):
print(product.title, product.current_price_eur, product.is_discounted)
# Browse the full catalog
for product in area.browse(per_page=5, limit=5):
print(product.product_id, product.title, product.quantity_type)
Full-text search over REWE's product catalog scoped to a delivery area. query matches product titles; results include current local pricing for the specified postal code. Paginates via integer page counter. Each product exposes discount status, bulk pricing tiers, and category tags. Products flagged is_sponsored appear due to paid placement.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (1-based) |
| queryrequired | string | Search keyword (e.g. milch, brot, bio) |
| per_page | integer | Results per page (1-80) |
| postal_code | string | 5-digit German postal code for local pricing (e.g. 10115, 80331) |
{
"type": "object",
"fields": {
"query": "string - the search term used",
"per_page": "integer - results per page",
"products": "array of Product objects",
"market_id": "string - REWE market identifier for delivery area",
"has_pickup": "boolean - whether pickup is available",
"postal_code": "string - postal code used for pricing",
"total_pages": "integer - total number of pages",
"current_page": "integer - current page number",
"has_delivery": "boolean - whether delivery is available",
"service_type": "string - always DELIVERY",
"total_results": "integer - total matching products"
},
"sample": {
"data": {
"query": "milch",
"per_page": 5,
"products": [
{
"gtin": "4260055880033",
"tags": [
"regional",
"cool"
],
"title": "Hemme Milch Frische Vollmilch 3,7% 1l",
"image_url": "https://img.rewe-static.de/1042422/8646730_digital-image.png",
"article_id": "4260055880033",
"categories": [
"3684",
"3844",
"3776",
"3732",
"3886",
"3781",
"175",
"4005"
],
"detail_url": "https://www.rewe.de/p/hemme-milch-frische-vollmilch-3-7-1l/1042422",
"price_info": "1l",
"product_id": "1042422",
"order_limit": 99,
"is_sponsored": false,
"service_type": "DELIVERY",
"base_quantity": 1,
"is_discounted": false,
"quantity_type": "L",
"current_price_eur": 1.59
}
],
"market_id": "240557",
"has_pickup": true,
"postal_code": "10115",
"total_pages": 77,
"current_page": 1,
"has_delivery": true,
"service_type": "DELIVERY",
"total_results": 385
},
"status": "success"
}
}About the REWE API
Endpoints and What They Return
The API exposes three endpoints. search_products accepts a query string (e.g. 'milch', 'bio') and an optional postal_code to return matching products with per-item fields including product_id, title, current_price_eur, is_discounted, image_url, detail_url, tags, and categories. Pagination is controlled via page and per_page (1–80 results per page), and the response includes total_pages and current_page. Products currently on promotion carry is_discounted: true; products with quantity discounts include a bulk_discounts field.
get_products returns the full delivery catalog for a given postal code area without a keyword filter, using the same pagination parameters and the same product object shape. It adds a total_products integer so you can gauge catalog size before paginating. Both catalog endpoints return market_id, has_delivery, has_pickup, and service_type alongside the product list, giving you service context in the same response.
Availability Checking
check_availability takes a single required input — a 5-digit postal_code — and returns has_delivery, has_pickup, and delivery_market_id. This is useful as a preflight check before pulling pricing data for an area, since delivery coverage varies by region. delivery_market_id is null when delivery is not available for the queried postal code.
Pricing and Coverage Notes
Prices returned by search_products and get_products are local to the delivery area resolved from the supplied postal code. If no postal code is provided, the API falls back to a default market. REWE's online delivery catalog does not always match the full in-store assortment, so some products available in physical stores may not appear in API results. Category and tag data is attached per product and can be used for client-side grouping or filtering.
The REWE API is a managed, monitored endpoint for rewe.de — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when rewe.de changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official rewe.de API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track weekly price changes on specific grocery items across different German postal codes using
current_price_eur - Build a discount monitor that alerts when
is_discountedis true for a watched product category - Pre-check REWE delivery and pickup availability before onboarding users in a new region with
check_availability - Aggregate the full delivery catalog via
get_productsandtotal_productsto index REWE's assortment for price comparison tools - Filter organic and health-food assortments by querying
'bio'viasearch_productsand inspecting thetagsandcategoriesfields - Map REWE delivery coverage across Germany by iterating postal codes through
check_availabilityand collectingdelivery_market_idvalues
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does REWE have an official public developer API?+
How does postal code affect the prices returned?+
postal_code to search_products or get_products routes the request to the REWE market that serves that delivery area, and current_price_eur reflects that market's current price. The market_id field in the response identifies which market was resolved. Omitting postal_code falls back to a default market.Does the API return individual product detail pages with nutritional or ingredient information?+
title, current_price_eur, is_discounted, tags, categories, and a detail_url pointing to the product page, but does not return nutritional data or ingredient lists. You can fork the API on Parse and revise it to add an endpoint that fetches that data from the detail_url.What does `is_discounted` distinguish from `bulk_discounts`?+
is_discounted: true means the product is currently on a special offer (a reduced single-unit price). bulk_discounts is a separate field that appears on products where buying multiple units triggers a price break. A product can carry both flags simultaneously if it has a base-level promotion and an additional quantity discount.Is the API limited to delivery, or does it also cover in-store assortment and prices?+
has_pickup in the response indicates whether click-and-collect is available for the area, but pickup-specific pricing or assortment differences are not broken out separately. You can fork the API on Parse and revise it to target in-store catalog data if that surface becomes accessible.