E.Leclerc Scraper: Local Prices, Stock & Promotions
Pricing
from $1.20 / 1,000 product results
E.Leclerc Scraper: Local Prices, Stock & Promotions
Scrape E.Leclerc France (e.leclerc) grocery and retail products. Search by keyword or category, or paste product and category links. Pick a store by postal code so prices and stock are the real ones for that store. Returns price, unit price, stock, promotions, rating and images.
Pricing
from $1.20 / 1,000 product results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
an hour ago
Last modified
Categories
Share
E.Leclerc Product Scraper
Scrape products from E.Leclerc France (e.leclerc) — the grocery / general
retail catalogue. Search by keyword/category, or paste product / category /
search links. Every product comes back as one flat record with title,
description, images, store-scoped price, unit price, a genuine promotion (never
a loyalty cashback disguised as one), stock and — where the storefront has one
— an aggregate rating.
⚠️ E.Leclerc is store-scoped — read this first
Every E.Leclerc store prices, promotes and stocks its own catalogue
independently. This actor requires you to choose one store — by postal
code or by an exact store sign code — and every result in a run reflects
that one store. There is no "national price": two different stores can
(and often do) show a different price, promotion, or stock level for the
exact same product. Every record also carries storeSignCode, storeName
and storePostalCode so results are always traceable to a specific store.
What you can do
- Search by keyword or category — e.g.
lait(milk),lessive(laundry detergent) — with price, promotion, stock and rating filters, plus sorting. A keyword that matches one of the storefront's own categories is served that category's full listing automatically. You can also paste one or more category links directly. - Paste links or EANs — mix product links, bare EAN barcodes, category links and search-result links in one list and let the actor route each entry.
- Resume & recurring updates — turn on Incremental mode to get only NEW,
UPDATED, and REAPPEARED products on every scheduled run, or resume one
specific interrupted crawl with
resumeFromRunId.
Input
| Field | Description |
|---|---|
| Postal code | A French postal code. The run picks the nearest Hyper/Super/Express E.Leclerc store to it. |
| Store sign code | Optional exact-store override (e.g. copy storeSignCode from a previous run's output to reproduce it exactly). Wins over Postal code when both are set. |
| Mode | search or url. |
| Search keywords | Keywords to search (search mode). |
| Category links | E.Leclerc category page links to browse, e.g. https://www.e.leclerc/cat/lessives-marque-repere (search mode). |
| E.Leclerc links or EANs | Product links, bare EAN barcodes, category links, and search-result links to scrape directly, mixed freely (url mode). |
| Sort by | Relevance, price ↑/↓, unit price ↑/↓, or name. Applied over the collected products. |
| Minimum average rating | Keep only products rated at least N stars. |
| Only on promotion | Keep only products with a genuine reduced price at your store (never a loyalty cashback). |
| Only in stock | Keep only products currently in stock at your store. |
| Min / Max price (EUR) | Keep only products within a price range, at your store. |
| Fetch product details | Fetch each product's page for a human-readable category breadcrumb. Title, description, images, price, unit price, promotion, stock and rating are always included regardless of this toggle. On by default. |
| Max products | The run's cap on how many products to return. Default 20; 0 = unlimited. |
| Max pages per keyword / category / link | Result pages walked per keyword / category / link. Default 0 = unlimited — walks every page until Max products is hit or a page repeats no new products. |
| Resume from a previous run | Continue one specific previous run/dataset: products already collected there are skipped. For recurring daily monitoring, use Incremental mode instead — see "Resume & recurring updates" below. |
| Incremental changes for scheduled runs | Daily/recurring monitoring of this same store + search. First run returns everything as NEW; later runs return only NEW/UPDATED/REAPPEARED by default. See "Resume & recurring updates" below. |
| State key | Optional name for a monitoring campaign. Auto-derived from your store/search/detail settings when left empty. |
| Emit unchanged products | Incremental mode only. Also return products unchanged since the last run, marked UNCHANGED. Adds and bills extra rows. |
| Emit expired products | Incremental mode only. Also return products from a previous run no longer found, marked EXPIRED, once a run has fully scanned the search. Adds and bills extra synthetic rows. |
| Proxy | Apify Proxy — a datacenter exit by default, which is the cheaper tier. |
mcpConnectors | Optional MCP connectors to export results into (Notion, Linear, Airtable, Apify). |
notionParentPageUrl | Notion connector only: page under which item pages are created. |
maxNotifyListings | Cap on items exported to each connector per run. Does not affect the dataset. |
Output
One record per product, scoped to your chosen store. Example (illustrative values):
{"productId": "3700281702286","ean": "3700281702286","title": "ULTRA-HYDRATANT Lait Corps 500 ml","brand": "Topicrem","description": "L'Ultra-Hydratant lait corps Topicrem est une émulsion onctueuse...","images": ["https://media.e.leclerc/3700281702286_1"],"categoryPath": "Crèmes hydratantes/nourrissantes > Topicrem > Les Essentiels","price": 11.04,"currency": "EUR","unitPrice": null,"wasPrice": null,"onPromotion": false,"loyaltyCashbackPercent": 30.0,"loyaltyCashbackLabel": "Ticket E.Leclerc avec la carte","inStock": true,"stock": 537,"rating": 4.8,"reviewCount": 28,"reviews": [],"storeSignCode": "1375","storeName": "Montparnasse","storePostalCode": "75014","canonicalUrl": "https://www.e.leclerc/fp/ultra-hydratant-lait-corps-500-ml-3700281702286","searchMode": "search","scrapedAt": "2026-08-03T00:00:00Z"}
Was-price, discounts and loyalty cashback. wasPrice/discountAmount/
discountPercent are populated only when the storefront itself carries a
genuine prior price for that exact item — they are never derived from a
"Ticket E.Leclerc avec la Carte" style loyalty cashback (paid in full
now, a percentage credited back later on your loyalty card, not a price
cut) or from the storefront's own original-price field, which was
observed to be an unreliable reference value (not a genuine prior price on
the products checked). A genuine loyalty cashback still surfaces —
separately, as loyaltyCashbackPercent / loyaltyCashbackLabel — but never
sets onPromotion or a was-price. On the products sampled while building
this actor, no genuine was-price/markdown was found live; this is reported
honestly (wasPrice: null) rather than fabricated.
Nutrition / ingredients / specifications. E.Leclerc's product data does
not expose a dedicated nutrition table, ingredients list, or specifications
block anywhere in the routes this actor uses (verified across multiple
product categories). Composition text, when a product's description
mentions it, is part of the free-text description field.
Ratings & reviews. Products carry a genuine aggregate rating (rating,
reviewCount) where the storefront has one. Individual customer review
text is served by a client-side widget this actor does not drive, so the
reviews array is present but empty on rated products, and rating fields
are simply absent on products with no rating (never fabricated zeros).
Incremental mode only. When incrementalMode is on, every returned
record also carries:
| Field | Description |
|---|---|
changeType | NEW | UPDATED | UNCHANGED | REAPPEARED | EXPIRED |
changedFields | Top-level fields that changed since last seen; non-empty only for UPDATED |
firstSeenAt | When this product was first observed by this monitoring campaign |
lastSeenAt | When this product was last observed |
Resume & recurring updates
There are two different things here — pick the one that matches what you're doing:
| Need | Use |
|---|---|
| A crawl stopped and should continue | resumeFromRunId / automatic checkpoint recovery |
| Run the same store + search every day and receive only changes | incrementalMode |
| Keep separate daily campaigns for similar searches | distinct stateKey values |
| Run a normal full snapshot | leave both off |
Resume (resumeFromRunId) continues one specific interrupted or previous large crawl: paste a run ID or dataset ID and this run skips products already collected there, returning only the remaining new products. An automatic same-run checkpoint also protects against platform migrations/Resurrects without any input needed.
Incremental mode (incrementalMode) is for a schedule (for example, daily): the actor remembers the previous run of the same store + search by itself, so you never paste a run ID. The first run returns everything as NEW. Later runs return only NEW, UPDATED, and REAPPEARED products by default — duplicates and unchanged products are suppressed (and not charged). A different store, even with the identical search, always gets its own state — prices/stock at one store never look like a "change" at another. Set stateKey to name or deliberately share a monitoring campaign.
Scheduled-run example — same store + search, run daily:
Day 1 (first run ever for this search):
{ "postalCode": "75014", "mode": "search", "queries": ["lait"], "incrementalMode": true }
→ every product comes back with "changeType": "NEW".
Day 2 (the schedule fires again, identical input):
{ "postalCode": "75014", "mode": "search", "queries": ["lait"], "incrementalMode": true }
→ products whose price/promotion/stock/etc. changed at that store come back as "changeType": "UPDATED" with changedFields listing what changed, brand-new products come back as "changeType": "NEW", products that vanished and came back come back as "changeType": "REAPPEARED" — and products that are still there, unchanged, are not returned at all (suppressed, not charged) unless emitUnchanged is on.
Proxy & connection
Apify Proxy is optional. A datacenter connection is the default because it is the cheaper tier and is sufficient here — you do not need to enable residential for this actor.
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. Supported connectors: Notion, Linear, Airtable, and Apify. Leave the field empty to skip; it never changes the dataset output.
Notes
- Search and category result pages are walked forward one page at a time until Max products is reached, the storefront runs out of pages, or (with the default unlimited Max pages) a page repeats no new products.
- A search keyword that the storefront recognizes as a category is followed to
that category's own listing automatically (the storefront's own behavior);
the returned
searchModestill reports how you asked for it. - Long runs survive an Apify server migration or a manual Resurrect: progress is checkpointed, so a resumed run continues without re-scraping or double-charging products already collected.
searchModeon each record reports how it was found:search,category, orproductwhen it came from a pasted product link or EAN.- Prices are in EUR. Duplicate products (same EAN) are returned once per run.