Lidl.es Products, Weekly Offers, Prices & Reviews Scraper
Pricing
from $1.00 / 1,000 product results
Lidl.es Products, Weekly Offers, Prices & Reviews Scraper
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.
Pricing
from $1.00 / 1,000 product results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
Lidl.es Scraper: Prices, Weekly Offers & Shopper Reviews
Lidl.es Scraper turns Lidl Spain's storefront into structured product data, spanning both the grocery/supermarket weekly-offer range and the "bazaar" (non-food) catalogue: tools, home & garden, kitchen, fashion, baby & kids, and sport & leisure. Search by keyword and department with brand, price, rating and weekly-offer filters, or paste product, search, or department links directly. Every record carries the current price, a genuine strike-through was-price and discount % only when a product is genuinely on offer, the package format, images, and the site's own shopper rating; turn on review fetching for up to 20 shopper reviews (highest-rated first) plus the full rating summary and histogram. Export to JSON, CSV or Excel, or pull results through the API.
Why This Scraper?
- 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, up to 20 highest-rated reviews 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.
Use Cases
- 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.
Data You Get
Sample shape: values are illustrative placeholders, not from a live product.
| Field | Example |
|---|---|
productId / title | "900000001", "Taladro percutor inalambrico 20V (ejemplo)" |
brand | "SAMPLEBRAND" |
categoryPath / category | ["Bricolaje y jardin", "Herramientas", "Herramientas electricas"], "Herramientas electricas" |
productUrl | "https://www.lidl.es/p/producto-ejemplo/p900000001" |
price / currency | 39.99, "EUR" |
wasPrice / discountAmount / discountPercent | 49.99, 10.0, 20.0 (only when genuinely on offer) |
isOnSpecial / promoLabel | true, "Megadescuento" |
packageFormat | "1 ud." (the site's own package/format text) |
unitPrice / unitOfMeasure | null, null (only set for an unambiguous single weight/volume like "750g") |
hasVat | true |
onlineAvailable / inStoreOnly | true, false |
stockAvailability | "En stock" |
images | full-resolution image URL list |
internalArticleNumbers | ["555123"] |
description | short plain-text product description, as shown on the site |
badges | ["Top rated"] |
averageRating / reviewCount | 4.6, 823 |
recommendedYes / recommendedNo | 780, 15 |
reviews | empty shape by default; full feed only with fetchDetails, or automatically for a pasted product URL |
reviews always carries the same six keys: averageRating, totalReviewCount, recommendedYes, recommendedNo, starHistogram and items (each with stars, title, text, author, recommended, votesUp, votesDown). Without enrichment it is averageRating: null, totalReviewCount: 0, items: []. Package price (price) comes straight from Lidl's own product data; unitPrice/unitOfMeasure are never derived for a loose/bulk item ("A granel") or a multi-pack, where dividing by the printed pack size would misstate the true per-unit price.
How to Use
- Pick a mode:
search(keyword + department browse with filters) orurl(paste product, search/specials, or department links). - In search mode, set your keyword and/or department, then narrow with brand, price, rating or weekly-offer filters and pick a sort order.
- Turn on Fetch shopper reviews if you want up to 20 shopper reviews plus the rating summary on every returned product, and set Max products total / Max search pages to control run size and cost.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
Keyword + department search (default mode):
{"mode": "search","searchTerm": "taladro","category": "bricolaje-jardin","maxItems": 20}
Weekly offers only, biggest discount first:
{"mode": "search","specialsOnly": true,"sortBy": "BIGGEST_DISCOUNT","maxItems": 50}
One brand within a department, with the full shopper review feed:
{"mode": "search","category": "bricolaje-jardin","brand": "PARKSIDE","fetchDetails": true,"maxItems": 20}
Paste product, search/specials, or department links directly:
{"mode": "url","urls": ["https://www.lidl.es/p/producto-ejemplo/p900000001","https://www.lidl.es/c/bricolaje-y-jardin/s99999999","https://www.lidl.es/q/query/bateria"],"maxItems": 50}
A pasted product URL always gets up to 20 shopper reviews plus the rating summary, and is billed for it, regardless of the Fetch shopper reviews toggle; the user explicitly asked for that one product.
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/lidl-es-scraper").call(run_input={"mode": "search", "searchTerm": "taladro", "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/lidl-es-scraper').call({ mode: 'search', searchTerm: 'taladro', 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 maxItems and maxPages interact
Search mode pages through results in batches, stopping once either Max products total or Max search pages is reached, whichever comes first. Leave Max search pages empty for no page limit (bounded only by Max products total). URL mode splits Max products total evenly across your pasted URLs, so a mix of a product link and a department link each gets its own share of the cap.
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 (title 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.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search browses by keyword/department filters; url scrapes pasted product, search/specials, or department links. |
searchTerm | string | no default (prefill: bateria) | Free-text keyword against Lidl's own search index (search mode only). Leave empty with a department set to browse the whole department. |
category | string | "" (Any department) | One of Lidl's real top-level departments, spanning both the bazaar/non-food and grocery ranges (search mode only). |
brand | string | no default | Exact brand name to keep, as Lidl shows it, e.g. PARKSIDE (search mode only). |
specialsOnly | boolean | false | Keep only products on a genuine current weekly offer (search mode only). |
minPrice | number | no default | Minimum price in EUR to keep (search mode only). |
maxPrice | number | no default | Maximum price in EUR to keep (search mode only). |
minRating | number | no default | Minimum shopper rating (1-5) to keep (search mode only). |
sortBy | string | RELEVANCE | RELEVANCE, PRICE_ASC, PRICE_DESC, NEWEST, TOP_RATED, BESTSELLERS, or BIGGEST_DISCOUNT (search mode only). |
urls | array | no default (prefill: a sample Lidl product URL) | Product, search/specials, or department listing URLs to scrape (url mode only); filter fields above are ignored in this mode. |
fetchDetails | boolean | false | Fetch up to 20 shopper reviews plus the rating summary and star histogram for each product. Always on, regardless of this toggle, for a pasted product URL. |
maxPages | integer | no default (empty = unlimited) | Stop after fetching this many search result pages. |
maxItems | integer | 20 | Hard cap on total products returned across the run; 0 = unlimited. |
proxy | object | {"useApifyProxy": true} | Apify Proxy configuration used to route requests. The default works out of the box. |
mcpConnectors | array | no default | Optional MCP connectors to export results into (Notion, Linear, Airtable, Apify). |
notionParentPageUrl | string | no default | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items exported to each connector per run. Does not affect the dataset. |
Output Example
Sample shape: values are illustrative placeholders, not from a live product.
{"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.0,"discountPercent": 20.0,"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,"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 }]}}
Plan Requirement
The default Apify Proxy setting works out of the box: this actor reaches Lidl's own public catalogue endpoints directly. For large or very frequent runs, selecting the residential proxy group under Connection gives more headroom. The Pricing tab shows the current per-product and enrichment rates for your plan.
FAQ
How much does it cost?
You pay per product returned, plus a smaller per-product charge only when the full shopper review feed is actually fetched (via Fetch shopper reviews, or automatically for a pasted product URL) and successfully retrieved; a failed review fetch is not billed. There is also a one-time charge when the run starts. The Pricing tab shows the current rates. Use Max products total to cap the cost of any run.
Is it legal to scrape Lidl.es?
This actor collects only publicly available product data (prices, offers, descriptions, ratings and reviews) as shown on Lidl.es. You are responsible for how you use it: follow Lidl's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product images and review text may be subject to third-party rights.
Can I schedule it to catch new weekly offers?
Yes, schedule the actor from the Schedules tab, e.g. with specialsOnly: true and a department set. Each run reads the site's current weekly-offer feed fresh; this actor has no persisted incremental state, so every scheduled run returns the current matching products in full rather than only what changed since the last run.
Why are wasPrice and unitPrice sometimes null?
Both are reported only when genuinely applicable. wasPrice/discountAmount/discountPercent/isOnSpecial are set only when Lidl's own strike-through price field is genuinely populated and higher than the current price; most full-price items simply carry no was-price. unitPrice/unitOfMeasure are derived only when the package format is an unambiguous single weight or volume (e.g. "750g"); a loose/bulk item or a multi-pack always gets null rather than a guessed figure.
Why did my run return an empty dataset instead of failing?
If Lidl's site refuses requests for part or all of a run, this actor does not hard-fail: it logs warnings, stops early if failures persist, and keeps whatever products it already collected. A run that could read nothing therefore still completes normally, with an empty or partial dataset and a generic "No products matched" status message, rather than an error. Check the run log for the actual cause, and re-run it, ideally with the residential proxy group, if this happens.
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.
🔗 Want more grocery data?
Pair this actor with these related scrapers from the same team:
| 🥦 Mercadona Scraper Scrape Mercadona products by delivery-area postal code. Search by keyword or category, or... | 🥦 El Corte Inglés Scraper Scrape El Corte Inglés elcorteingles.es products across fashion, electronics, home... |
| 🥦 Carrefour Spain Scraper Scrape Carrefour Spain (carrefour.es) products. Search by keyword, browse a category, or... | 🥦 Auchan France Scraper Scrape Auchan.fr products: grocery, drinks, household and general merchandise. Real price... |
| 🥦 Kaufland.de Scraper Scrape Kaufland.de, Germany's hypermarket and online marketplace: keyword/category/brand... | 🥦 ResQ Club Scraper Scrape ResQ Club surplus food offers in Finland, Sweden and Estonia: name, price, current... |
💬 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.