REWE.de Scraper at a glance
REWE.de Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes product id, product, change type (incremental mode), brand and category, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Ecommerce, Developer Tools, Automation
- Region
- Europe
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 31 options
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.
What REWE.de Scraper can do
- Postal-code matched pricing and assortment. A German postal code (PLZ) resolves your local REWE market before anything else runs. It changes which products even show up, not just their prices, the same way the site itself works.
- Was-price and discount, gated on the site's own signal. 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. Brand and REWE's own dietary/sourcing quick filter (Bio, Vegan, Regional, New, Gekühlt, Tiefgefroren) apply in search mode and to a pasted listing link, because a pasted listing link is rebuilt through the same filters, not just replayed; category applies in search mode only, since a pasted link already carries its own category.
- Two ways in. Keyword and/or category search, or paste any product, category, search or listing link. Category and brand accept plain names.
- Optional detail enrichment. Turn on Fetch product detail to add the description and ingredient statement from the product page, on top of the price, brand, category and images already included by default.
- Optional export to your apps. Send results into Notion, Linear, Airtable or any Apify MCP connector alongside the dataset.
Choose what to collect
These inputs let you configure REWE.de Scraper - Prices, Offers & Postal-Code Matching. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | 'search' finds products by keyword and/or REWE's own category, brand, and attribute filters. 'url' scrapes any product or listing page URL you paste. |
zipCodestring · required | German postal code REWE uses to match your local market. Prices, offers and availability are scoped to it, in every mode - and it also decides which products the market stocks, so it changes the result set, not just the prices. Five digits, e.g. 50667 for Cologne. A code with no REWE market stops the run rather than returning products with no prices. |
searchTermstring | Free-text keyword, e.g. 'milch' or 'kaffee'. Leave empty to browse a whole category with the field below. |
categorySlugstring | Category name or REWE's own token, e.g. 'Milch' or 'milch'. Names are matched against REWE's live category list; a name that matches nothing stops the run with a clear error and suggestions. Combine with a keyword to search within a category, or leave the keyword empty to browse the whole category. Search mode only: URL mode reads this from the link you paste. |
urlsarray | Paste REWE product pages (.../p//), category pages (.../shop/c//), search pages (.../suche/produkte?search=) or listing links (a URL with search= or categorySlug=, optionally page, objectsPerPage (1-100), brand, attribute and sorting = RELEVANCE_DESC, TOPSELLER_DESC, PRICE_ASC, PRICE_DESC or NAME_ASC). Left untouched, URL mode scrapes one example of each shape. Search-mode fields are ignored here. The fields in the Filters section still apply; a link's own brand= or attribute= wins over them. |
brandstring | Only return products from this brand, e.g. 'Lindt' (matched against REWE's live brand list, case-insensitive; a brand that matches nothing stops the run with a clear error). Leave empty for all brands. Applies in BOTH search mode and URL mode: the filter is also sent with a pasted category or search link. |
attributestring | REWE's own quick filter -- narrows to products carrying that tag. Applies in BOTH search mode and URL mode: the listing request is rebuilt for a pasted category or search URL, so the filter is sent with it. |
Show 24 more inputs
| Input | What it controls |
|---|---|
minPricenumber | Only return products priced at or above this amount, in euros. Applies in BOTH search mode and URL mode: the listing request is rebuilt for a pasted category or search URL, so the filter is sent with it. |
maxPricenumber | Only return products priced at or below this amount, in euros. Applies in BOTH search mode and URL mode: the listing request is rebuilt for a pasted category or search URL, so the filter is sent with it. |
sortBystring | Order of the results. Relevance is the default. Price and name sorts are done by REWE itself, so they stay correct across pages. In URL mode a pasted link's own sorting wins. |
campaignsOnlyboolean | Only return products currently on offer. REWE has no server-side filter for this, so the run reads the normal result pages and drops the rest (bounded by Max pages and the empty-page guard); combine it with a keyword or category. |
inStockOnlyboolean | Only return products that are orderable at your market. REWE has no server-side filter for this, so the run reads the normal result pages and drops the rest (bounded by Max pages and the empty-page guard). |
marketIdstring | Exact REWE market id. When set it overrides the postal code for prices and availability. |
searchTermsarray | Optional extra keywords searched one after another, in addition to the Search keyword. Search mode only. |
productIdsarray | Optional. REWE product ids (the number at the end of a product link) to price directly. When set, search fields are ignored in search mode. Rows get quantity and lineTotal. |
quantitiesarray | Quantities parallel to the product ids (1 each if omitted). Adds lineTotal = price x quantity. |
fetchDetailsboolean | Adds the product description and ingredient statement from the product page, when REWE's own page carries them. Billed once per product only when the page delivers a description or ingredient statement; products where REWE's page has neither are not charged. Current price, was-price/discount, brand, category and images are already included without this toggle. |
compactboolean | Only the core fields (id, name, brand, url, prices, availability). |
excludeEmptyFieldsboolean | Drop fields that are empty (null, empty text or empty list) from each row. |
descriptionMaxLengthinteger | Truncate the description (Fetch product detail) to this many characters. 0 = no truncation. |
maxPagesinteger | Stop after this many result pages per search/URL entry. Leave empty for the built-in ceiling of 500 pages per search/URL entry -- the run also stops at Max products total. |
maxItemsinteger | Hard cap on total products returned across every search/URL entry. 0 = unlimited (still bounded by Max pages per search). Values above 1,000,000 are clamped to 1,000,000. |
resumeFromRunIdstring | Optional. ID of a previous run of this actor (or a dataset ID). Products already in that dataset are skipped, so this run returns only NEW products (a delta). Combine both runs' datasets for the full set. For recurring monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring of the same search/URLs. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED products. A product counts as UPDATED when its price, was-price, unit price, availability, name, brand, tags or category path change (reported in changedFields); image links, the scrapedAt timestamp and anything listed under "Ignore fields" below never count as a change. Turn on "Emit unchanged" or "Emit expired" only when you also want those products returned (and billed). State is kept separately per distinct search/filter/postal-code setup (or by State key below). |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from your mode/postal code/search/filter/detail settings -- different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns -- and bills -- extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search -- not when Max products/Max pages capped it, a connection problem stopped it early, or Resume was used. This returns -- and bills -- extra synthetic rows. |
ignoreFieldsForChangesarray | Optional. Field names (for example tags) whose changes should NOT turn a product into UPDATED. Image links and scrapedAt are always ignored. Ignored fields stay in the output; they are only left out of change detection and changedFields. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify -> Settings -> Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
productIdProduct id (text)nameProduct (text)changeTypeChange type (incremental mode) (text)brandBrand (text)categoryCategory (text)pricePrice (number)currencyCurrency (text)originalPriceOriginal price (number)discountPercentDiscount % (number)isOnSpecialOn offer (boolean)pricePerUnitPrice per unit (text)availableAvailable (boolean)Show 10 more fields
urlURL (link)imageImage (image)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)scrapedAtScraped at (text)descriptionDescription (text)ingredientsIngredients (text)quantityQuantity (number)lineTotalLine total (number)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"productId": "677067",
"name": "Sample Fresh Whole Milk 3.5% 1l",
"brand": "Sample Dairy",
"tags": [
"Gekühlt",
"Regional"
],
"url": "https://www.rewe.de/shop/p/sample-fresh-whole-milk-3-5-1l/677067",
"hasVariants": false,
"freeShipping": false,
"categoryId": "175",
"category": "Frischmilch",
"categoryPath": [
"Kühlregal",
"Milchprodukte",
"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 EUR / l",
"grammage": "1l",
"available": true,
"offerValidTo": "2026-10-05T23:59:59Z",
"merchant": "REWE",
"gtin": "4008400205746"
}Ways to use this data
- Grocery price monitoring: track price and promotion changes for specific products or categories in one or more postal-code markets over time.
- Competitive and market intelligence: compare REWE's assortment, pricing and current offers against other supermarkets for a given region.
- Market research and analytics: build a structured dataset of product names, brands, categories and pricing for a German market.
- Brand and MAP monitoring: brands and agencies checking how their products are listed and priced on REWE in specific markets.
- Grocery comparison and content sites: aggregate real product details and current specials into a comparison tool or feed.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does REWE.de Scraper return?
The documented output for REWE.de Scraper includes product id, product, change type (incremental mode), brand, category, price, currency and original price. Availability of each field depends on the source page and the selected mode.
How much does REWE.de Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed products on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. By default a scheduled run then returns only NEW and UPDATED products; unchanged ones are suppressed and not billed. EXPIRED rows appear only on a run that has emitExpired on and fully scans the search; REAPPEARED only appears on a later run, after such a run has already marked a product expired; see "Resume and recurring updates" above.
Why did my run return fewer products than I expected?
Two independent reasons: Max products or Max pages capped the run intentionally, or a tight price band ran into the 5-consecutive-barren-page rule described above (REWE has no price filter of its own, so this actor's own narrowing can stop early rather than paging the whole catalog). Either way, more matches may exist; raise the caps or widen the price band to see more.
Why did my run fail instead of returning an empty dataset?
The most common cause is a postal code with no matching REWE market: the site's own postal-code service is checked up front, before anything is scraped or billed, and the run stops with a clear message rather than returning a dataset full of null prices. A genuinely empty search (no products match your keyword, category or filters) still succeeds, it just returns nothing to charge for.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
