REWE.de Scraper - Prices, Offers & Postal-Code Matching
Pricing
from $1.00 / 1,000 product results
REWE.de Scraper - Prices, Offers & Postal-Code Matching
Scrape REWE Germany (rewe.de) grocery products: current price, was-price and discount when genuinely on offer, brand, category, price per unit, images and tags. Prices match a real postal code you choose. Search keywords or paste product/listing links.
Pricing
from $1.00 / 1,000 product results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
a day ago
Last modified
Categories
Share
REWE.de Grocery Scraper
Pull grocery product data from REWE Germany (rewe.de). Search by keyword and/or REWE's own category, brand, and dietary/sourcing filters, or paste product and listing links directly. Prices and offers are matched to a real German postal code you choose, the same way the site itself scopes pricing to your local market.
Why This Scraper?
- Postal-code matched pricing. Give it a German postal code (PLZ) and it resolves your local market before pulling prices, the same step the site itself requires before showing you real numbers.
- Was-price and discount, gated on the site's own signal, never guessed. When a product genuinely carries a reduced price, the original price plus the discount amount and percentage are captured. A full-price product simply carries
originalPrice: null-- nothing is fabricated. - Real site filters. Category, brand, and REWE's own dietary/sourcing quick filters (Bio, Vegan, Regional, New, Gekühlt, Tiefgefroren) -- all verified live against the site's own controls, not guessed.
- Two ways in. Keyword and/or category search, or paste any product or listing link.
- Optional export to your apps. Send results into Notion, Linear, Airtable, or any Apify MCP connector alongside the dataset.
- Resume & recurring updates (optional) -- turn on Incremental mode to get only NEW, UPDATED and REAPPEARED products on every scheduled run, or resume one specific interrupted crawl with
resumeFromRunId.
Data You Get
| Field | Example value |
|---|---|
| productId | 1042422 |
| name | Sample Fresh Whole Milk 3.7% 1l |
| brand | Sample Dairy |
| category / categoryPath | Frischmilch, ["Cheese, Eggs & Dairy", "Milk", "Frischmilch"] |
| tags | ["Gekühlt", "Regional"] |
| url | https://www.rewe.de/p/sample-fresh-whole-milk-1042422/1042422 |
| price / currency | 1.29, EUR |
| originalPrice / discountAmount / discountPercent | 1.59, 0.30, 19 |
| isOnSpecial | true |
| pricePerUnit / grammage | 1,29 € / 1l, 1l |
| available | true |
| image / images | ["https://img.rewe-static.de/sample/digital-image.png"] |
| description / ingredients | (when Fetch product detail is on) |
Sample shape: values above are illustrative placeholders, not from a live product.
How to Use
1. Keyword search, first page (default):
{"mode": "search","searchTerm": "milch","zipCode": "50667","maxItems": 20}
2. Category browse, filtered to a brand and dietary tag:
{"mode": "search","categorySlug": "milch","brand": "Alpro","attribute": "VEGAN","zipCode": "50667","maxItems": 50,"maxPages": 5}
3. Paste product or listing links and set your postal code:
{"mode": "url","urls": ["https://www.rewe.de/p/sample-fresh-whole-milk-1042422/1042422"],"zipCode": "50667","fetchDetails": true}
Input Parameters
| Parameter | Type | Description |
|---|---|---|
mode | string | search or url. |
searchTerm | string | Free-text keyword (search mode only). |
categorySlug | string | REWE's own category token, e.g. milch (search mode only). |
brand | string | Exact brand name to keep (search mode only). |
attribute | string | ORGANIC, VEGAN, REGIONAL, NEW, CHILLED, or FROZEN -- REWE's own dietary/sourcing quick filter (search mode only). |
minPrice / maxPrice | number | EUR price band to keep (search mode only). |
urls | array | Product or listing URLs to scrape (url mode only). |
fetchDetails | boolean | Fetch description and ingredient statement from the product detail page. |
maxPages | integer | Cap on result pages per search/URL entry; empty = unlimited. |
maxItems | integer | Cap on total products returned; 0 = unlimited. |
zipCode | string | German postal code REWE uses to match your local market and its prices. |
resumeFromRunId | string | Continue one interrupted crawl -- ID of a previous run/dataset; already-collected products are skipped. See Resume & recurring updates below. |
incrementalMode | boolean | Recurring/scheduled monitoring of the same search -- only NEW/UPDATED/REAPPEARED products are returned by default. Default false. |
stateKey | string | Optional name for an incremental-mode monitoring campaign. Leave empty to derive one automatically from mode/postal code/search/filter settings. |
emitUnchanged | boolean | Incremental mode only. Also return (and bill) products unchanged since the last run. Default false. |
emitExpired | boolean | Incremental mode only. Also return (and bill) products no longer found, once a run fully scans the tracked search. Default false. |
proxy | object | Apify proxy configuration. A residential connection is required for a reliable run (see below). |
mcpConnectors | array | Optional MCP connectors to export results into (Notion, Linear, Airtable, Apify). |
notionParentPageUrl | string | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | Cap on items exported to each connector per run. Does not affect the dataset. |
Resume & recurring updates
Two different things -- pick the one that matches what you're doing:
| Need | Use |
|---|---|
| A crawl stopped and should continue | resumeFromRunId |
| Run the same search every day and receive only changes | incrementalMode |
| Keep separate daily campaigns for similar searches | distinct stateKey values |
| Run a normal full snapshot | leave both off |
Resume (resumeFromRunId) continues one specific interrupted crawl: paste a run ID or dataset ID and this run skips products already collected there, returning only the remaining new products.
Incremental mode (incrementalMode) is for a schedule (e.g. daily): the actor remembers the previous run of the same search by itself, so you never paste a run ID. The first run returns everything as NEW. Later runs return only NEW, UPDATED and REAPPEARED products by default -- unchanged products are suppressed (and not charged). Turn on emitUnchanged or emitExpired only when you also want those rows returned (and billed for). State is isolated automatically per mode/postal code/search term/category/brand/attribute/price filters/URLs/detail setting -- zipCode is included because it selects a different REWE market (different prices, different assortment); set stateKey to name or deliberately share a monitoring campaign. EXPIRED is only synthesized once a run fully scans the tracked search (not capped by Max products/Max pages, not stopped early by a connection problem, not a Resume run).
When incrementalMode is on, every returned record also carries:
| Field | Description |
|---|---|
changeType | NEW | UPDATED | UNCHANGED | REAPPEARED | EXPIRED |
changedFields | Top-level fields that changed since last seen; non-empty only for UPDATED |
firstSeenAt | When this product was first observed by this monitoring campaign |
lastSeenAt | When this product was last observed |
If Fetch product detail is on and a detail-page fetch fails on a later run, the previously-fetched description/ingredients are carried forward from state rather than dropped -- a transient fetch failure never looks like real content disappearing (and never re-bills the detail-enrichment surcharge for it).
Output Example
{"productId": "1042422","name": "Sample Fresh Whole Milk 3.7% 1l","brand": "Sample Dairy","tags": ["Gekühlt", "Regional"],"url": "https://www.rewe.de/p/sample-fresh-whole-milk-1042422/1042422","hasVariants": false,"freeShipping": false,"categoryId": "175","category": "Frischmilch","categoryPath": ["Cheese, Eggs & Dairy", "Milk", "Frischmilch"],"image": "https://img.rewe-static.de/sample/digital-image.png","images": ["https://img.rewe-static.de/sample/digital-image.png"],"price": 1.29,"currency": "EUR","originalPrice": 1.59,"discountAmount": 0.3,"discountPercent": 19,"isOnSpecial": true,"pricePerUnit": "1,29 € / 1l","grammage": "1l","available": true}
Sample shape: values above are illustrative placeholders, not from a live product.
Send results into your apps (MCP connectors)
Optionally pipe results into the apps you already use through Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it in the mcpConnectors field. Each connector receives a condensed, human-readable summary per product (name plus key fields), while the complete record always stays in the Apify dataset. For Notion, set notionParentPageUrl to the page the item pages should be created under, and use maxNotifyListings to cap how many items are exported per connector per run. Supported connectors: Notion, Linear, Airtable, and Apify. Leave the field empty to skip; it never changes the dataset output.
A note on plans
rewe.de requires a residential connection for a reliable run -- a datacenter or free-tier connection will very likely fail. The default proxy configuration already selects a residential connection in Germany; no extra setup is needed on any paid plan with residential proxy access.