Lidl.es Products, Weekly Offers, Prices & Reviews Scraper at a glance
Lidl.es Products, Weekly Offers, Prices & Reviews Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes product id, product, brand, category and price, 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, Automation, Developer Tools
- Region
- Europe
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 28 options
Scrape Lidl.es grocery and non-food products across weekly offers, tools, home, garden, kitchen, fashion, kids, sport and more. Search by keyword, department or URL. Extract prices, was-prices, discounts, package formats, images, ratings and full shopper reviews.
What Lidl.es Products, Weekly Offers, Prices & Reviews Scraper can do
- Covers both catalogues. Lidl.es sells grocery weekly offers (fresh produce, pantry, drinks) and a much larger bazaar/non-food range (tools, home, garden, fashion, toys, sport) through the same storefront; this scraper reaches both from one input.
- Was-price captured only when it's real. This scraper reads the site's own strike-through price object per item and only ever sets a was-price, discount amount and discount % when the site's own prior price is genuinely populated and higher than the current price. Full-price items get null, never a fabricated markdown.
- Real shopper reviews from the site itself. Ratings and reviews come from Lidl's own on-site review feed (average, histogram, the Max reviews per product highest-rated reviews (default 20, up to 100) with author and votes), included on request or automatically for a pasted product URL.
- Package format plus a derived unit price. The package size/format Lidl itself displays (e.g. "750g", or a loose/bulk format) is included whenever Lidl shows it; a EUR/kg or EUR/L unit price is derived only when the package is an unambiguous single weight or volume, never guessed for a bulk or multi-pack item.
- Two ways in. Keyword and department browsing with brand, price, rating and weekly-offer filters and sort, or paste any product, search/specials, or department link.
- 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 Lidl.es Products, Weekly Offers, Prices & Reviews Scraper. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | 'search' browses the Lidl.es catalogue (grocery weekly offers + the bazaar/non-food range) by keyword, department, brand and filters. 'url' scrapes any product, search/specials, or category link you paste. |
searchTermstring | Free-text keyword against Lidl's own search index, e.g. 'bateria' or 'sandia'. Leave empty (with a Department set) to browse a whole department. |
categorystring | Narrow to one of Lidl.es's real top-level departments, spanning both the bazaar/non-food weekly range and grocery. Leave as 'Any' to search across the whole catalogue. |
brandstring | Only return products from this brand, exactly as Lidl shows it (e.g. 'PARKSIDE', 'SILVERCREST', 'CRIVIT'). Leave empty for all brands. |
specialsOnlyboolean | Narrows to Lidl's own genuine weekly-offer markdowns (real strike-through was-price + discount %) -- the same set as the site's own 'Descuentos' page. |
inStockOnlyboolean | Drop products that are not currently orderable online (sold out or in-store only). Applied to the rows returned, so Max products counts only in-stock rows. |
strictMatchboolean | Search mode only: keep a product only when every word of the search keyword appears in its title, brand or category, dropping loose relevance matches from Lidl's own search. |
Show 21 more inputs
| Input | What it controls |
|---|---|
minPricenumber | Only return products priced at or above this amount, in euros. |
maxPricenumber | Only return products priced at or below this amount, in euros. |
minRatingnumber | Only return products with a shopper rating at or above this value. |
sortBystring | Sort order for the results, using Lidl's own real sort options. |
urlsarray | Paste one or more Lidl.es links. Supported: product pages (lidl.es/p//p, also the short or slug-less lidl.es/p/p form and the bare lidl.es host), search and specials pages (lidl.es/q/query/ or lidl.es/q/search?q=, with category, brand, discountFlag, sort, price, ratingAverage and offset taken from the link), department pages (lidl.es/h//h, optionally ?offset=48), department hubs (lidl.es/c//s) and campaign pages (lidl.es/c//a). Leaving this field untouched scrapes one example of each distinct link target (the alternate search form returns the same products as the search link, so it is listed in the examples but not in the default). Filter fields above are ignored in this mode. |
maxPagesinteger | Stop after fetching this many result pages. Leave empty for no limit -- the run stops at Max products total. |
maxItemsinteger | Hard cap on total products returned across the run (maximum 1,000,000; 0 is read as that maximum). Also bounded by Max search pages. |
fetchDetailsboolean | Adds the site's own full review feed (rating breakdown, star histogram, per-review text/author/votes) for each product. Current price, was-price, unit price, images, description and the rating summary are already included without this toggle. Always on for a pasted product URL. |
maxReviewsPerProductinteger | How many shopper reviews to return per product when reviews are fetched (highest-rated first). Between 1 and 100. |
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); skipped products are not charged. Combine both runs' datasets for the full set. Max products then counts only the new products. A resumed run never marks products as expired. For recurring monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs compare every product against the last run (price, was price and discount, offer flag, online availability and stock status, title, brand, category, package format, description, badges and product link) and return only NEW, UPDATED and REAPPEARED products, with an UPDATED row's changedFields naming exactly what moved. Shopper ratings, review counts, the review feed and the image list are never compared, since those change on their own with no real product change; they stay in the rows you receive. Turn on "Emit unchanged" or "Emit expired" only when you also want those products returned (and billed). Max products counts returned rows only, so a recurring run walks the whole search to find changes. State is kept separately for each search/URL/filter setup; use State key to name or deliberately share a campaign. |
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 the search/URL and filter settings; different setups 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 listed, marked EXPIRED. Only produced after a complete scan of the tracked search or URLs: never when Max products or Max search pages stopped it early, for a pasted department listing page, or when the state key was last used with different filters. EXPIRED means the product dropped out of the listing; without a detail check a listing drop and a delisting look the same, so read stock status from onlineAvailable and stockAvailability. This returns and bills extra rows, so leave it off unless you need expiry tracking. |
changeScopestring | All fields (default): any change to the product record, except the always-ignored rating, review and image fields, returns an UPDATED row. Price and availability only: only a change to price, was price, discount, offer flag, online availability or stock status returns an UPDATED row; descriptions, titles, badges and other details never do. Changing this on a search with no State key starts a new automatic baseline (first run returns every product as NEW), so set a State key to keep your baseline. |
compactUpdatesboolean | Off by default. When on, UPDATED (and EXPIRED) rows are short: product id, title, link, current price and availability, plus priceChanges showing the old and new value of each moved price or availability field. NEW rows always carry the complete product record. Shopper reviews are not included in compact rows and are not billed for them. |
expireAfterMissedScansinteger | Only used with Emit expired products. A product is marked EXPIRED only after it has been missing from this many complete scans in a row (default 1). Raise it (e.g. 3) so a product that briefly drops out of the listing is not reported as gone. A product that comes back resets the count. |
ignoreFieldsForChangesarray | Optional. Field names to exclude from UPDATED change detection, in addition to the built-in handling (ratings, review counts, the review feed and the image list never trigger an UPDATED). Use this if another field in your setup turns out to be noisy, e.g. promoLabel or badges. Changing this on a search with no State key starts a new automatic baseline. |
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)titleProduct (text)brandBrand (text)categoryCategory (text)pricePrice (number)currencyCurrency (text)unitPriceUnit price (€/kg, €/L) (number)unitOfMeasureUnit (text)wasPriceWas price (number)discountPercentDiscount % (number)isOnSpecialOn offer (boolean)packageFormatPackage (text)Show 30 more fields
averageRatingRating (number)reviewCountReviews (number)onlineAvailableOnline (boolean)productUrlURL (link)imagesImage (array)reviewsReviews (object)changeTypeChange (text)changedFieldsChanged fields (text)previousPricePrevious price (number)priceChangesPrice changes (text)inStockinStock (text)firstSeenAtFirst seen (text)lastSeenAtLast seen (text)expiredAtExpired at (text)categoryPathCategory path (text)descriptiondescription (text)badgesbadges (text)hasVathasVat (text)inStoreOnlyinStoreOnly (text)stockAvailabilitystockAvailability (text)availableFromavailableFrom (text)availableUntilavailableUntil (text)itemNumberitemNumber (text)erpNumbererpNumber (text)packagingpackaging (text)unitSizeunitSize (number)compareUnitcompareUnit (text)comparePricecomparePrice (number)priceNormalpriceNormal (number)labelslabels (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"productId": "900000001",
"title": "Taladro percutor inalambrico 20V (ejemplo)",
"brand": "SAMPLEBRAND",
"categoryPath": [
"Bricolaje y jardin",
"Herramientas",
"Herramientas electricas"
],
"category": "Herramientas electricas",
"productUrl": "https://www.lidl.es/p/producto-ejemplo/p900000001",
"price": 39.99,
"currency": "EUR",
"wasPrice": 49.99,
"discountAmount": 10,
"discountPercent": 20,
"isOnSpecial": true,
"promoLabel": "Megadescuento",
"packageFormat": "1 ud.",
"hasVat": true,
"unitPrice": null,
"unitOfMeasure": null,
"onlineAvailable": true,
"inStoreOnly": false,
"stockAvailability": "En stock",
"images": [
"https://www.lidl.es/assets/sample-image.jpg"
],
"internalArticleNumbers": [
"555123"
],
"description": "Descripcion corta de ejemplo del producto, tal como aparece en el sitio.",
"badges": [
"Top rated"
],
"averageRating": 4.6,
"reviewCount": 823,
"recommendedYes": 780,
"recommendedNo": 15,
"name": "Taladro percutor inalambrico 20V (ejemplo)",
"erpNumber": "900000001",
"itemNumber": "555123",
"productKey": "ES:900000001",
"country": "ES",
"categoryLvl0": "Bricolaje y jardin",
"priceEur": 39.99,
"priceNormal": 49.99,
"packaging": "1 ud.",
"isOnOffer": true,
"discountText": "Megadescuento",
"inStock": true,
"source": "lidl.es",
"scrapedAt": "2026-01-01T00:00:00Z",
"reviews": {
"averageRating": 4.6,
"totalReviewCount": 823,
"recommendedYes": 780,
"recommendedNo": 15,
"starHistogram": {
"1": 8,
"2": 10,
"3": 30,
"4": 150,
"5": 625
},
"items": [
{
"stars": 5,
"title": "Buena relacion calidad-precio",
"text": "Texto de resena de ejemplo.",
"author": "Comprador de ejemplo",
"recommended": true,
"votesUp": 4,
"votesDown": 0
}
]
}
}Ways to use this data
- Price and discount tracking: monitor Lidl's weekly-offer feed for genuine markdowns (was-price, discount %) across any department, on a recurring schedule.
- Bazaar and non-food sourcing: pull the tools, home & garden, kitchen, fashion or baby & kids ranges by department for comparison shopping or catalog building.
- Grocery price monitoring: track the Alimentacion (grocery) department's current prices and weekly specials for a price-comparison tool.
- Brand and assortment research: collect every product under one brand across the whole catalogue to track SKU count, pricing and availability.
- Shopper sentiment analysis: pull the site's rating summary, histogram and top reviews for specific products to track shopper sentiment over time.
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 Lidl.es Products, Weekly Offers, Prices & Reviews Scraper return?
The documented output for Lidl.es Products, Weekly Offers, Prices & Reviews Scraper includes product id, product, brand, category, price, currency, unit price (€/kg, €/l) and unit. Availability of each field depends on the source page and the selected mode.
How much does Lidl.es Products, Weekly Offers, Prices & Reviews 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 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.
