LeroyMerlin.es Scraper: Products, Prices, Sellers & Reviews
Pricing
from $1.00 / 1,000 product results
LeroyMerlin.es Scraper: Products, Prices, Sellers & Reviews
Scrape Leroy Merlin Spain (leroymerlin.es) DIY and home-improvement products: price, strike-through original price and discount, seller identity (Leroy Merlin vs marketplace) with every competing offer, stock, rating and individual reviews. Search by keyword/category 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
8
Total users
2
Monthly active users
13 days ago
Last modified
Categories
Share
Leroy Merlin Spain Scraper: Prices, Discounts, Seller Offers & Reviews
Leroy Merlin Spain Scraper turns leroymerlin.es into a clean product data feed. Get the current price, the strike-through original price and discount when a product is genuinely on promotion, marketplace seller identity with every competing offer, stock and delivery time, rating, and individual customer reviews for tools, appliances and home-improvement products. Search by keyword, a real site category, or paste any product or listing link directly, then export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- Was-price and discount, structured, not scraped from a badge. When a product is marked down, both the current and original price come back plus the discount amount and percentage. Full-price products carry
null, never a fabricated discount. - Marketplace transparency. Leroy Merlin sells both directly and through third-party sellers on the same product page. Every record identifies the seller (Leroy Merlin vs marketplace) and, with detail on, lists every competing offer for that product, price, stock and delivery time per seller.
- Reviews straight from the product page. Overall rating, review count, and individual customer reviews (author, date, rating, body) come from the page itself, not a third-party review vendor.
- Two ways in. Keyword or category search with the site's own price, rating, promotion and seller filters and sort, or paste any product or listing link and let pagination continue automatically.
- Filters that actually narrow, not just trim afterward. Price, rating, promotion and seller filters are checked while pages are walked, so a small item cap still finds enough matching products instead of stopping on an unlucky first page.
- A sort you can trust. Price sort is re-applied after detail enrichment on the exact price that ships, so within each search or pasted listing link, row order and price values never disagree.
- Optional export to your apps. Send results into Notion, Linear, Airtable, or any Apify MCP connector alongside the dataset.
Use Cases
- Price and promotion tracking: watch was-price, discount percentage and stock across a keyword or category to catch sales as they go live.
- Competitive repricing: compare Leroy Merlin's own price against every third-party marketplace offer on the same product page.
- Marketplace share research: track seller composition and total offer count to see how many sellers compete for a given product line.
- Reputation research: pull rating history and individual review text for products you are sourcing, reviewing or comparing.
- Catalog audits: walk a full category to check assortment, stock status and delivery promises.
- Deal-alert bots: filter to on-promotion products only and feed the results into your own alerting tool.
Data You Get
Sample shape: values below are illustrative placeholders, not from a live product.
| Field | Example |
|---|---|
productId / sku | "123456" |
name | "Sample Cordless Drill 18V" |
brand | "SAMPLE BRAND" |
category / categoryPath | "Cordless drills" / ["Tools", "Power tools", "Drilling & screwing", "Drills", "Cordless drills"] |
url | "https://www.leroymerlin.es/productos/sample-cordless-drill-18v-123456.html" |
price / priceExclTax / currency | 99.99 / 82.64 / "EUR" |
originalPrice / discountAmount / discountPercent | 129.99 / 30.0 / 23.1 |
isOnSpecial | true |
rating | 4.7 |
sellerId / sellerName / sellerType | "002" / "Sample Retailer" / "1P" |
totalOfferCount / sellersComposition | 12 / "1P_3P" |
offerType | "NEW" |
sponsored | false |
ean | "4000000000000" |
description | full product description text |
image / numberOfImages | "https://media.example.com/sample.jpg" / 5 |
stock / stockStatus / deliveryTime | 19 / "ONSITE" / "1 OPENING_DAY" |
otherOffers[] | [{"sellerName": "Sample Marketplace Seller", "sellerType": "3P", "price": 105.40, "stock": 3, "deliveryTime": "3 OPENING_DAY"}] |
numberOfReviews | 275 |
reviews.averageRating / reviews.totalReviewCount | 4.7 / 275 |
reviews.items[] | [{"rating": 5, "body": "Sample review text.", "author": "Sample Customer", "date": "2026-07-15"}] |
searchMode | "search" (also "category" or "url") |
otherOffers lists every competing marketplace offer visible on the product page at fetch time, price, stock and delivery per seller; a product sold exclusively by Leroy Merlin with no marketplace competition simply omits the field rather than returning an empty placeholder. reviews.items[] holds the product page's own most recent reviews (the page itself only ever surfaces a handful), while reviews.averageRating and reviews.totalReviewCount reflect the product's full review history, not just the reviews included in items[].
How to Use
- Pick a mode:
search(keyword and/or category, with filters and sort) orurl(paste product or listing links). - For search mode, fill in a keyword and/or a category path, and set any price, rating, promotion or seller filters plus a sort order. For url mode, paste one or more product or listing links.
- Leave Fetch product detail and Fetch reviews on for full records, or turn them off for a lighter listing-only run. Set Max products and Max pages to control run size and cost.
- Click Start. Download the dataset as JSON, CSV or Excel, or read it through the API.
Keyword search, first page, with detail and reviews (default):
{"mode": "search","searchTerm": "taladro","maxItems": 20}
Category browse, only products on promotion, sorted by price:
{"mode": "search","category": "herramientas/herramientas-electricas-portatiles/herramientas-electricas-para-taladrar-atornillar/taladros/taladros-de-bateria","onPromotionOnly": true,"sortBy": "price_asc","maxItems": 50,"maxPages": 5}
Only Leroy Merlin's own offers, minimum 4-star rating:
{"mode": "search","searchTerm": "grifo cocina","sellerFilter": "leroymerlin","minRating": 4,"maxItems": 30}
Full detail and reviews for a pasted product link:
{"mode": "url","urls": ["https://www.leroymerlin.es/productos/sample-cordless-drill-18v-123456.html"],"fetchDetails": true,"fetchReviews": true}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/leroymerlin-es-scraper").call(run_input={"mode": "search", "searchTerm": "taladro", "maxItems": 20})for product in client.dataset(run["defaultDatasetId"]).iterate_items():print(product["name"], product["price"], product["currency"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/leroymerlin-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 filters narrow the page walk
Price, rating, promotion and seller filters are checked as each result page is read, not only after the whole batch is collected. That means Max products means "N products that actually pass your filters", so a run with onPromotionOnly on and a small maxItems keeps walking pages (up to Max pages) until enough promoted products are found, instead of stopping early on a page where none happened to qualify.
Price sort after enrichment
With Fetch product detail on (the default), each product's price can refresh to the detail page's own value after the listing page was already sorted. The run re-applies your chosen sort on that final price immediately before the dataset is written, so sortBy always matches the price values you actually see in the output.
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 product, 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.
- Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. If the picker is empty, you haven't authorized a connector yet.
- For Notion, also set
notionParentPageUrlto the page where item pages should be created.
Leave the field empty to skip. A connector error never fails the run or changes the dataset; it is logged as a warning and the run continues.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search or url. |
searchTerm | string | none (prefill: taladro) | Free-text keyword (search mode). Leave empty and use Category only to browse without a keyword. |
category | string | none | A real leroymerlin.es catalog category path (search mode only). Ignored when searchTerm is set. |
sortBy | string | relevance | relevance, price_asc, or price_desc. Applies to keyword/category search and pasted listing URLs alike. |
minPrice | number | none | Only return products priced at or above this amount, in EUR. |
maxPrice | number | none | Only return products priced at or below this amount, in EUR. |
minRating | number | none | Only return products whose average rating is at least this many stars (0-5). |
onPromotionOnly | boolean | false | Keep only products currently showing the site's own strike-through original price and discount. |
sellerFilter | string | any | any, leroymerlin, or marketplace. |
urls | array | none (prefill: ["https://www.leroymerlin.es/search?q=taladro"]) | Product or listing links to scrape (url mode only). Pagination continues forward automatically from any ?p= already present. |
fetchDetails | boolean | true | Fetch EAN, description, image, breadcrumb category path, stock/delivery, and every competing marketplace offer. |
fetchReviews | boolean | true | Fetch the product's own reviews. Shares the same page fetch as fetchDetails. |
maxReviewsPerProduct | integer | 8 | Cap on reviews returned per product, up to the site's own page limit. |
maxPages | integer | none (an empty or zero value behaves as an internal cap of 100 pages per search, category, or URL entry) | Stop after this many result pages per search, category, or pasted listing URL. |
maxItems | integer | 20 | Hard cap on total products returned across the whole run. 0 = unlimited (still bounded by Max pages). |
proxy | object | Apify Proxy, residential, country ES | Connection settings. leroymerlin.es answers only on a Spanish residential connection. |
mcpConnectors | array | none | Optional: send a summary of each product to apps you authorized under Integrations. |
notionParentPageUrl | string | none | 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 below are illustrative placeholders, not from a live product.
{"productId": "123456","sku": "123456","name": "Sample Cordless Drill 18V","brand": "SAMPLE BRAND","url": "https://www.leroymerlin.es/productos/sample-cordless-drill-18v-123456.html","price": 99.99,"priceExclTax": 82.64,"currency": "EUR","originalPrice": 129.99,"discountAmount": 30.0,"discountPercent": 23.1,"isOnSpecial": true,"rating": 4.7,"sellerId": "002","sellerName": "Sample Retailer","sellerType": "1P","totalOfferCount": 12,"sellersComposition": "1P_3P","offerType": "NEW","sponsored": false,"ean": "4000000000000","description": "Sample product description as shown on the site.","image": "https://media.example.com/sample.jpg","numberOfImages": 5,"categoryPath": ["Tools", "Power tools", "Drilling & screwing", "Drills", "Cordless drills"],"category": "Cordless drills","stock": 19,"stockStatus": "ONSITE","deliveryTime": "1 OPENING_DAY","otherOffers": [{ "sellerName": "Sample Marketplace Seller", "sellerType": "3P", "price": 105.40, "stock": 3, "deliveryTime": "3 OPENING_DAY" }],"numberOfReviews": 275,"reviews": {"averageRating": 4.7,"totalReviewCount": 275,"items": [{ "rating": 5, "body": "Sample review text.", "author": "Sample Customer", "date": "2026-07-15" }]},"searchMode": "search"}
Plan Requirement
The default connection works out of the box: Apify Proxy with residential access in Spain, already selected for you. leroymerlin.es answers only on that kind of connection, a datacenter connection or a residential exit outside Spain is refused before any page content loads, and this actor does not fall back to a different connection tier. If the account running this actor is not entitled to a residential connection, the run fails immediately with a clear message instead of returning an empty dataset.
FAQ
How much does it cost?
This actor uses Apify's pay-per-event pricing. You are charged for each product returned in the dataset, plus a separate, smaller charge only for products where detail and/or review enrichment actually ran, plus the standard per-run actor-start charge. The Pricing tab on the actor page shows the current rates. Use Max products and Max pages to cap the size, and cost, of any run.
Is it legal to scrape Leroy Merlin?
This actor collects only publicly available product data, prices, offers, ratings and reviews, shown on leroymerlin.es. You are responsible for how you use it: follow Leroy Merlin's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product names, descriptions and images may carry third-party rights.
Can I schedule it, or get only new or changed products?
Yes, schedule the actor from the Schedules tab for recurring runs. Each run returns the current, full snapshot of whatever matches your search, category or links; the actor does not keep state between runs, so there is no built-in mode that emits only new or changed products since the last run. Narrow the search or category, and use Max products, to keep repeated runs small.
Why does a product's price sometimes differ from what I saw on the search results page?
When Fetch product detail is on (the default), the product's own detail page is the final source for its price, was-price and discount, and it can legitimately disagree with the listing card's price shown a moment earlier (VAT-inclusive versus exclusive display, or a real price change between the two page loads). The dataset always reflects the detail page's value once detail is fetched, and the run's price sort is re-applied after that refresh within each search or pasted listing link, so sort order and the price you see never disagree there.
Why did my run fail instead of returning an empty dataset?
Three different situations can look similar but are not the same. A page that genuinely does not exist, a bad category path, a mistyped product slug, a delisted listing, comes back as a normal "not found" response and is accepted right away: it is not treated as a block, and the run does not retry it. A listing page or pasted link that instead gets a temporary check page instead of real content is retried automatically with a fresh session, up to 3 attempts; if a product's detail page still can't be read after that, the product is kept with its listing-card data only and is not charged for enrichment, and the run itself does not fail. Separately, a run that produces zero products because the proxy refused this account's residential access, so not a single page could be read, fails loudly with a clear connection-related message instead of silently succeeding with an empty dataset; other connection problems that are not an outright access refusal instead end the run successfully with zero items and a status message. A run that genuinely found nothing, every request succeeded but no product matched your keyword, category or filters, also ends normally with zero items and a status message explaining why.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the Pipe results into your apps field to push a summary of each product into Notion, Linear, Airtable or another Apify MCP connector, alongside the full dataset.
π Want more e-commerce data?
Pair this actor with these related scrapers from the same team:
| π MediaMarkt.es Scraper Scrape MediaMarkt Spain (mediamarkt.es) products: current price, strike-through original... | π Decathlon.es Scrape Decathlon Spain (decathlon.es) sporting goods: current price plus strike-through... |
| π OBI.de Scraper Scrape OBI (obi.de) DIY/home-improvement products: current + strike-through original... | π druni.es Scrape Druni beauty, cosmetics and perfume products. Search by keyword, category, Ofertas... |
| π₯¦ Mercadona Scraper Scrape Mercadona products by delivery-area postal code. Search by keyword or category, or... | π Castorama.fr Scrape Castorama.fr DIY and home-improvement products by keyword, category, or URL... |
π Browse all abotapi scrapers
π¬ Support & custom scrapers
- π 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 or message Telegram @abotapi.
- β Enjoying it? A quick review on the actor page helps other users find it.