Kaufland.de Scraper - Marketplace Price, Deals & Reviews avatar

Kaufland.de Scraper - Marketplace Price, Deals & Reviews

Pricing

from $1.50 / 1,000 product results

Go to Apify Store
Kaufland.de Scraper - Marketplace Price, Deals & Reviews

Kaufland.de Scraper - Marketplace Price, Deals & Reviews

Scrape Kaufland.de, Germany's hypermarket and online marketplace: keyword/category/brand search or paste links. Current price, UVP was-price and discount on Angebote deals, grocery unit price, brand, breadcrumb path, EAN, marketplace seller, variant matrix, per-category specs, and native reviews.

Pricing

from $1.50 / 1,000 product results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

23

Total users

8

Monthly active users

3 days ago

Last modified

Share

Kaufland.de Scraper: Prices, Deals, Sellers & Reviews

Kaufland.de Scraper turns Kaufland.de, Germany's hypermarket and online marketplace, into structured product data. Search by keyword, category, brand and price with the site's own filters, browse Kaufland's Angebote (deals) facet, or paste product, category and search links directly. Every record carries the current price, the strike-through UVP original price with a computed discount when an item is genuinely reduced, grocery unit price (EUR per kg/l), and, on request, full product detail and native customer reviews, then export to JSON, CSV or Excel, read it through the API, or pipe it into the apps you already use.

Why This Scraper?

  • UVP was-price and discount, never fabricated. When a product is reduced against its manufacturer's recommended price (UVP), the current price, the strike-through original price, and the computed discount amount and percentage come back structured. A full-price item simply returns null for these fields.
  • A dedicated deals mode. specialsOnly scrapes Kaufland's own Angebote facet directly, store-wide or scoped to a keyword and/or category.
  • Grocery unit pricing. EUR per kg, litre or other unit comes back as a structured value, not buried inside a price string.
  • Marketplace-aware. Kaufland.de is a multi-seller marketplace: every listing carries the selling partner's name, and full detail adds the seller's id, return period and the number of competing offers on the same listing.
  • Rich product identity on demand. Brand and manufacturer, full breadcrumb category path, EAN/GTIN, manufacturer part number, and flattened per-category technical specifications, which vary by product type and are never hardcoded to one vertical.
  • Complete native review history. Overall rating, review count, and every individual review with author, date, rating, title and body text, straight from Kaufland's own review system.
  • Two ways in. Search by keyword and/or category, or paste any product, category or search link and let pagination continue automatically. Brand, price range, deals and sort filters apply in both modes. Optionally export results into Notion, Linear, Airtable or any Apify MCP connector alongside the dataset.

Use Cases

  • Price monitoring and repricing: track current price, UVP discount and unit price across a category or a list of competitors' listings.
  • Deal and promotion tracking: watch Kaufland's Angebote facet, store-wide or for a specific department, for new and ending discounts.
  • Marketplace research: compare sellers, return periods and the number of competing offers on the same product.
  • Catalog and PIM enrichment: pull brand, breadcrumb category path, EAN/GTIN, part number and structured specifications for product matching.
  • Reputation and review analysis: aggregate a product's full native review history, ratings and verified-purchase flags.
  • Grocery price-per-unit comparisons: collect structured EUR per kg/l unit pricing for basket comparisons.

Data You Get

Sample shape: values below are illustrative placeholders, not from a live product.

FieldExample
productId500000001
title"Sample Coffee Machine, 1200W, Black"
url"https://www.kaufland.de/product/500000001/"
image"https://media.cdn.kaufland.de/product-images/400x400/sample.webp"
price / currency54.95 / "EUR"
originalPrice79.90 (UVP was-price, null off deal)
discountAmount / discountPercent24.95 / 31.2
isOnSpecialtrue
unitPrice{"value": 54.95, "unit": "1kg"}
promoLabel"Hammer-Preis" (voucher or best-price badge)
seller"Sample-Handel" (name only in listing, full object with fetchDetails)
rating / reviewCount4.7 / 331
brand (fetchDetails)"Sample Brand"
breadcrumb (fetchDetails)["Startseite", "Küche & Haushalt", "Haushaltsgeräte", "Kaffeevollautomaten"]
ean / gtin / mpn (fetchDetails)"4000000000001" / "4000000000001" / "SC-1200-BK"
specifications (fetchDetails){"Gewicht": "3.5 kg", "Lautstärke": "65 dB", "Fernbedienung": "Ja"}
variants (fetchDetails)[{"title": "Schwarz", "url": "https://..."}, {"title": "Weiß", "url": "https://..."}]
otherOffersInfo (fetchDetails){"totalNewOffers": 5, "totalUsedOffers": 3, "lowestPrice": 49.99}
voucher (fetchDetails){"discountAmount": 5, "discountType": "fixed", "endsAt": "2026-10-05"}
energyLabel (fetchDetails){"class": "A", "imageUrl": "https://..."}
reviews.averageRating / reviews.totalReviewCount (fetchReviews)4.7 / 331
reviews.items[] (fetchReviews)[{"reviewId": 7000001, "author": "hm-1234567890", "rating": 5, "date": "23.06.2026", "title": "Sample review title", "body": "Sample review text.", "text": "Sample review text.", "productId": "100000001", "productUrl": "https://www.kaufland.de/product/100000001/", "isVerifiedPurchase": true, "score": 5.9339, "translation": null}]

Search and category results already carry price, UVP was-price and discount, unit price, promo badge and rating without any toggle. Turning on Fetch full product detail adds brand, breadcrumb, EAN/GTIN, part number, flattened specifications, energy label, media gallery, the per-variant matrix and the full seller object; turning on Fetch reviews adds the native review history. Pasting a single product link always returns the full-detail fields, since there is no search result to fall back on, whether or not fetchDetails is switched on.

How to Use

  1. Pick a mode: search (keyword and/or category, with Kaufland's own filters) or url (paste product, category or search links).
  2. In search mode, set a search keyword and/or category, then narrow with brand, price range, deals and sort. These filters also apply when you paste a category or search link in url mode.
  3. Turn on Fetch full product detail and/or Fetch reviews if you need the enrichment fields, and set Max products total and Max pages per search to control run size and cost.
  4. Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.

Basic keyword search:

{
"mode": "search",
"searchTerm": "kaffee",
"maxItems": 20
}

Search narrowed by category, brand and price, with deals:

{
"mode": "search",
"searchTerm": "kaffee",
"category": "5921",
"brand": "Melitta",
"minPrice": 5,
"maxPrice": 40,
"specialsOnly": true,
"sortBy": "price-asc",
"maxItems": 30
}

Category browse with full detail and review enrichment:

{
"mode": "search",
"category": "5801",
"fetchDetails": true,
"fetchReviews": true,
"maxReviewsPerProduct": 0,
"maxItems": 50
}

Paste product, category or search links:

{
"mode": "url",
"urls": [
"https://www.kaufland.de/product/496448760/",
"https://www.kaufland.de/c/kaffeebohnen/~5801/",
"https://www.kaufland.de/s/?search_value=kaffee&all_deals=true"
],
"maxItems": 40
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/kaufland-de-scraper").call(run_input={"mode": "search", "searchTerm": "kaffee", "maxItems": 20})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
print(product["title"], product["price"], product["currency"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/kaufland-de-scraper').call({ mode: 'search', searchTerm: 'kaffee', maxItems: 20 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

How Max pages and Max products total interact

Max products total (maxItems, default 20) is a hard cap on products returned across every search, category or URL entry; values above 100000 are capped at 100000, and 0 means unlimited. Max pages per search (maxPages) has no default cap: leave it empty and the actor walks as many pages as it needs for one search, category or URL entry, still bounded by Max products total. If a storefront ever re-serves the same page of results, the actor detects the repeat and stops that search rather than paging forever, so already-collected items are always kept.

In url mode you can paste three kinds of links: a product link (/product/<id>/), a category link (/c/<slug>/~<id>/) and a search link (/s/?search_value=...). If you leave the links field untouched, the three sample links (one search, one product, one category) are scraped, capped by Max products total. The dataset has a default products view, a details view with the full-detail fields, and a reviews view that lists each product with its nested reviews object (the dataset views cannot split a nested list into one row per review; the reviews are one list inside each product row).

Review history is capped at 500 reviews per product. When detail or reviews are requested, each product is enriched one at a time and the enrichment surcharge is charged right after that product is delivered, so you only pay for products you received.

Reviews-only usage and keyword filter

Set fetchReviews with product URLs in urls (url mode) to get reviews. Each review carries text (same as body), productId and productUrl. keywordReviews keeps only reviews whose title or text contains the keyword (case-insensitive), applied before maxReviewsPerProduct. Migrating from other Kaufland review tools: a startUrlsReviews list of product URLs is accepted as an alias for url mode with fetchReviews on. When only startUrlsReviews is sent, the shipped sample links in urls are ignored so only your links are scraped. Each review also carries the site's ranking score and, when the site provides one, a translation (null otherwise).

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (keyword/category with filters) or url (paste links).
searchTermstringnone (prefill: kaffee)Free-text keyword. Read only in search mode; ignored in url mode.
categorystringnoneA Kaufland category id, e.g. 5801 (Kaffeebohnen). Read only in search mode; ignored in url mode.
brandstringnoneOnly this brand/manufacturer, matched against Kaufland's own brand filter (exact match preferred, falls back to a partial match; ignored if it has no matches for this search). Applies in both search and url mode.
specialsOnlybooleanfalseOnly Angebote (deals) items. Applies in both modes; for a pasted search-result url it's OR'd with the url's own all_deals=true, and for a pasted category url only this input's value is used.
minPriceintegernoneMinimum price in EUR. Applies in both search and url mode.
maxPriceintegernoneMaximum price in EUR. Applies in both search and url mode.
sortBystringnaturalnatural, price-asc, price-desc, customer-reviews, newest-arrivals, or bestsellers. Applies in both modes; a pasted url's own sort is not preserved.
urlsarrayone sample search, product and category linkProduct, category or search links for url mode. If you switch to url mode and leave this field untouched, those three sample links are scraped (capped by maxItems); clear the field or paste your own to change that.
fetchDetailsbooleanfalseAdds brand, breadcrumb, EAN/GTIN, part number, specifications, energy label, media gallery, variant matrix and marketplace seller detail.
fetchReviewsbooleanfalseFetches each product's full native review history.
maxReviewsPerProductinteger20Cap on reviews kept per product; 0 = all available, up to a ceiling of 500 per product; values above 500 are capped at 500.
keywordReviewsstringnoneKeeps only reviews whose title or text contains this keyword (case-insensitive), applied before the review cap.
maxPagesintegernone (unlimited)Cap on result pages per search/category/url entry; empty means as many pages as needed, bounded by Max products total.
maxItemsinteger20Hard cap on total products returned; 0 = unlimited.
proxyobjectResidential (Germany), presetConnection settings. A residential connection is required to reach this site.
mcpConnectorsarraynoneOptional MCP connectors to also receive a summary of results.
notionParentPageUrlstringnoneRequired only when a Notion connector is selected.
maxNotifyListingsinteger50Cap on items sent to each connector per run.
resumeFromRunIdstringnoneRun or dataset ID of an earlier run; products it already collected are skipped.
incrementalModebooleanfalseReturn only NEW, UPDATED and REAPPEARED products compared with the last run of the same search.
stateKeystringautoNames the incremental baseline; empty derives it from the search, filters and detail settings.
emitUnchangedbooleanfalseAlso return UNCHANGED products (incremental mode only).
emitExpiredbooleantrueReturn products no longer found after a complete scan (incremental mode only).
ignoreFieldsForChangesarraynoneFields that must not count as a change (dotted paths allowed). delivery.cutOffTime, reviews.items.score and reviews.items.translation are always ignored.

Output Example

Sample shape: values below are illustrative placeholders, not from a live product.

{
"productId": "500000001",
"title": "Sample Coffee Machine, 1200W, Black",
"url": "https://www.kaufland.de/product/500000001/",
"image": "https://media.cdn.kaufland.de/product-images/400x400/sample.webp",
"price": 54.95,
"currency": "EUR",
"originalPrice": 79.90,
"discountAmount": 24.95,
"discountPercent": 31.2,
"isOnSpecial": true,
"unitPrice": { "value": 54.95, "unit": "1kg" },
"brand": "Sample Brand",
"breadcrumb": ["Startseite", "Küche & Haushalt", "Haushaltsgeräte", "Kaffeevollautomaten"],
"ean": "4000000000001",
"gtin": "4000000000001",
"specifications": {
"Gewicht": "3.5 kg",
"Lautstärke": "65 dB",
"Fernbedienung": "Ja"
},
"seller": {
"name": "Sample-Handel",
"id": "90000001",
"returnPeriod": "P14D"
},
"rating": 4.7,
"reviewCount": 331,
"reviews": {
"averageRating": 4.7,
"totalReviewCount": 331,
"items": [
{
"reviewId": 7000001,
"author": "hm-1234567890",
"rating": 5,
"date": "23.06.2026",
"title": "Sample review title",
"body": "Sample review text describing the purchase experience.",
"text": "Sample review text describing the purchase experience.",
"isVerifiedPurchase": true
}
]
}
}

Plan Requirement

Kaufland.de blocks datacenter connections, so a residential connection is needed, which this actor selects by default (Germany). Residential access is a paid Apify feature, so a paid Apify plan is required. Without one the actor tries a backup connection and logs a notice that some pages may still be unavailable; if no page can be read the run finishes as FAILED with a message that explains why, either that the proxy connection was refused for this account (a paid plan is required), that residential proxies are unavailable on this run, or that no results page could be loaded (a connection problem, not an empty search). Check the run log for the exact message.

FAQ

How much does it cost?

You pay per product returned, plus a separate surcharge, charged at most once per product, when full detail and/or review history is successfully fetched for it. This surcharge also applies to every pasted single product link, which always fetches full detail. The Pricing tab shows the current rates. The surcharge is charged per product right after that product is delivered (event detail-enrichment), so it is never charged for a product you did not receive. Use Max products total and Max pages per search to cap the cost of any run.

This actor collects only publicly available product data. You are responsible for how you use it: follow Kaufland's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product images, brand names and review text may be subject to third-party rights.

Can I get only new or changed products on a schedule?

Yes. Turn on Incremental changes for scheduled runs (incrementalMode) and schedule the same search. The first run returns every product as NEW; later runs return only NEW, UPDATED (with changedFields, for example price) and REAPPEARED products. Unchanged products are suppressed and are neither returned nor charged unless you turn on emitUnchanged. Products that vanished from a fully scanned search come back as EXPIRED (emitExpired, on by default); this never happens when Max products or Max pages cut the scan short, or when Resume was used. Every returned row carries changeType, changedFields, firstSeenAt and lastSeenAt, and the dataset has a Changes view. Rows (including UNCHANGED and EXPIRED ones) are returned and charged like any other product row; the detail-enrichment surcharge still fires only for a delivered row that was successfully enriched. ignoreFieldsForChanges excludes fields (dotted paths allowed) from change detection; the per-fetch delivery cut-off countdown (delivery.cutOffTime) and the review ranking score and translation are always ignored. State is kept per search, filter and detail setup, or under your own stateKey. resumeFromRunId instead continues one specific interrupted run without re-returning products it already collected.

Why didn't my price or brand filter apply to a pasted URL?

It did, for a category or search-result link: brand, price range, deals and sort are applied server-side to every rebuilt request in both modes. Only searchTerm and category are different: those two input fields are read solely in search mode, and in url mode the equivalent values come from the pasted link itself, not from the input fields. A pasted single product link ignores all filters, since there is nothing to narrow.

Why did my run fail instead of returning an empty dataset?

No. If no page can be read, for example because your plan has no residential access or the connection setting was changed away from residential, the run ends as FAILED with a clear message in the log, so an empty dataset is never reported as a successful run. If the connection is lost partway through, the actor stops retrying for the rest of that run and keeps whatever was already collected; check the run log for a note about this. If the message does not explain the failure, write to contact@abotapi.com.

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 a summary of results into Notion, Linear or Airtable.

🔗 Want more grocery data?

Pair this actor with these related scrapers from the same team:

🥦 REWE.de Scraper
Scrape REWE Germany (rewe.de) grocery products: current price, was-price and discount...
🥦 Auchan France Scraper
Scrape Auchan.fr products: grocery, drinks, household and general merchandise. Real price...
🛒 ROSSMANN.de Scraper
Scrape ROSSMANN (rossmann.de) drugstore products: current + original strike-through price...
🥦 Coles AU Scraper
Scrape Coles.com.au grocery products and customer reviews. Search by keyword, browse...
🛒 OBI.de Scraper
Scrape OBI (obi.de) DIY/home-improvement products: current + strike-through original...
🥦 FoodHero Scraper
Scrape FoodHero surplus grocery deals across Canada by area, store or offer ID. Extract...

👉 Browse all abotapi scrapers

💬 Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.