E.Leclerc Scraper at a glance
E.Leclerc Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes title, change type (incremental mode), brand, price and was, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.20 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
- $2.00 per 1,000 results (Free plan), from $1.20 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 25 options
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.
What E.Leclerc Scraper can do
- Two ways to find products. Search by keyword and/or category, then filter and sort the results, or paste product, category and search-result links, or bare EAN barcodes (an EAN lookup, one barcode per line, no link needed), mixed freely in one list.
- One flat record, one batched call. Title, description, images, price, promotion and stock all come from a single price call per product, always included, never gated behind an extra fetch. Unit price and brand come from search and category result pages, so a pasted product link or bare EAN does not carry them.
- Genuine promotions only. A "Ticket E.Leclerc" loyalty cashback, paid in full now and credited back later on the loyalty card, is reported separately and never disguised as a discounted price.
- Reproducible store attribution. Choose a store by postal code or an exact store sign code, and every record is stamped with it, so a run's results stay attributable and repeatable. Price and stock do not change by store, see the FAQ for how that was measured.
- Built for schedules. Incremental mode returns only new and changed products on recurring runs, and a run fails loudly instead of silently returning nothing when a store cannot be resolved.
- Resume and checkpoint protection. Continue one interrupted crawl with a pasted run id, and a long run picks up after the last completed keyword, category or link on a platform migration.
Choose what to collect
These inputs let you configure E.Leclerc Scraper - Local Prices, Stock & Promotions. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Choose 'search' for keywords and/or category links with filters, or 'url' to scrape pasted E.Leclerc links -- product links, category links, search-result links and bare product barcodes (EAN) are all accepted. |
postalCodestring | A French postal code (e.g. 75014). The run picks the nearest Hyper/Super/Express E.Leclerc store to this postal code and stamps it onto every result. Note: price, promotion and stock are the storefront's national values and do NOT change with the store (measured live 2026-09-04). Ignored if Store sign code is also set. |
storeSignCodestring | Optional. Pin an exact E.Leclerc store by its 4-digit sign code instead of resolving one from a postal code -- useful to reproduce a previous run exactly (every result carries its store's sign code as storeSignCode, so you can copy it from there). It changes the stamp and the incremental baseline, not the price/stock values. Overrides Postal code when set. |
queriesarray | One or more keywords to search, for example 'lait' (milk) or 'lessive' (laundry detergent). Each keyword is searched separately. A keyword that matches one of the storefront's own categories is served that category's full listing automatically (e.g. 'lessive' resolves to the Laundry detergents category). |
categoriesarray | One or more E.Leclerc category page links, each walked separately across its result pages. To get one: open e.leclerc, browse to the category you want, and copy the address -- a category address looks like https://www.e.leclerc/cat/lessives-marque-repere . |
urlsarray | Only used when mode = url -- ignored in search mode. Mix freely: product pages under /fp/-, category pages under /cat/, search-result pages under /recherche?q=..., or bare EAN barcodes such as 3518646124167 (EAN lookup: one barcode per entry, no link needed). Multiple entries supported. |
sortBystring | How to order the collected products. Applied over the products gathered in the run before they are returned. |
Show 18 more inputs
| Input | What it controls |
|---|---|
minRatingstring | Optional. Only keep products whose average rating is at least this many stars. Products with no rating are excluded when this is set. |
onPromotionOnlyboolean | Optional. Keep only products with a genuine reduced price versus a real prior price. A "Ticket E.Leclerc" loyalty cashback (paid back later on your card, not a price cut) never counts as a promotion here. |
inStockOnlyboolean | Optional. Keep only products the storefront reports as currently in stock. |
minPriceinteger | Optional. Only keep products priced at or above this amount. |
maxPriceinteger | Optional. Only keep products priced at or below this amount. |
fetchDetailsboolean | Fetch each product's detail page for a human-readable category breadcrumb. Title, description, images, price, unit price, promotion, stock and rating are always included regardless of this toggle -- they come from the same call as price, at no extra cost. Turn on for the friendlier breadcrumb; turn off for a faster run when you don't need it. |
maxReviewsPerProductinteger | Customer reviews to collect for each product that has reviews (reviewer, rating, date, title, text, shop replies, helpful votes), 10 per page. 0 turns reviews off. Capped at 1000 per product to bound run time. |
maxItemsinteger | Maximum number of products to return across the whole run. This is the run's cap. Use 0 for unlimited. Capped at 100000. |
maxPagesinteger | Maximum result pages walked per keyword / category / link. 0 = unlimited (walk all pages) -- the run then stops only at Max products or when a page repeats no new products. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large crawl of products without returning or charging for products already collected there. Use this after an interrupted run, or when continuing a product catalogue pull in another run. For recurring daily 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 normally return only NEW, UPDATED, and REAPPEARED products. A product is UPDATED when any returned field changed (price, was-price, promotion, stock, title, brand, images, description and so on); the Changed fields column names which. These fields are returned but never compared: the scrape timestamp (scrapedAt), the catalogue metadata lastUpdateDate, logisticClassCode, color, creationDate and publicationDate, the seller-offer count offersTotal, and promotionStartDate (a promotion change still shows through promotionEndDate, price and was-price); also any field names you list in "Ignore fields when detecting changes" below. Turn on "Emit unchanged" or "Emit expired" only when you also want those products returned (and billed). State is kept separately per store, search/category/URL and detail-mode setup -- use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
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 store/search/category/URL and detail settings -- different stores or searches 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 found, marked EXPIRED. Only produced once a run has fully scanned the tracked search -- not when Max products capped it or when Resume was used. This returns -- and bills -- extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Field names to leave out of change detection, so a field that moves without the product really changing does not mark it UPDATED. Always ignored: the scrape timestamp (scrapedAt), the catalogue metadata lastUpdateDate, logisticClassCode, color, creationDate and publicationDate, the seller-offer count offersTotal, and promotionStartDate (a promotion change still shows through promotionEndDate, price and was-price). Use a top-level name such as reviewCount or rating, or a dotted path (name.key) for a key nested inside an object or list. Ignored fields are still returned in the output; they just never trigger UPDATED or appear in Changed fields. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output. 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.
titleTitlechangeTypeChange type (incremental mode) (text)brandBrandpricePricewasPriceWasunitPriceDisplayUnit priceonPromotionOn promotion (boolean)inStockIn stock (boolean)eanEANratingRatingreviewCountReviewsstoreNameStoreShow 27 more fields
storeSignCodeStore sign codeproductIdProduct ID (EAN)canonicalUrlURL (link)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)discountAmountdiscountAmountdiscountPercentdiscountPercentcurrencycurrencyunitPriceunitPriceunitPriceUnitunitPriceUnitpromotionLabelPromotionpromotionStartDatePromotion starts (date)promotionEndDatePromotion ends (date)loyaltyCashbackPercentCashback %loyaltyCashbackLabelCashbackavailabilityStatusavailabilityStatusdescriptionDescriptionimagesImages (array)categoryPathCategory pathreviewIdreviewIdreviewerReviewerreviewRatingRatingreviewDateDatereviewTitleReview titlereviewTextReviewreviewVerifiedBuyerVerified buyer (boolean)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"productId": "3661112223334",
"ean": "3661112223334",
"title": "Lessive liquide 40 lavages",
"brand": "Marque Repere",
"description": "Lessive liquide concentree pour un lavage efficace au quotidien.",
"descriptionHtml": "<p>Lessive liquide concentree pour un lavage efficace au quotidien.</p>",
"images": [
"https://media.e.leclerc/3661112223334_1"
],
"categoryPath": "Entretien > Lessives > Lessives liquides",
"price": 8.49,
"currency": "EUR",
"unitPrice": 0.21,
"unitPriceUnit": "lavage",
"unitPriceDisplay": "0.21 EUR / lavage",
"wasPrice": 9.99,
"discountAmount": 1.5,
"discountPercent": 15,
"onPromotion": true,
"availabilityStatus": "in-stock",
"inStock": true,
"stock": 214,
"rating": 4.3,
"reviewCount": 112,
"reviews": [],
"storeSignCode": "1375",
"storeName": "Montparnasse",
"storePostalCode": "75014",
"canonicalUrl": "https://www.e.leclerc/fp/lessive-liquide-40-lavages-3661112223334",
"searchMode": "search",
"source": "listing",
"scrapedAt": "2026-09-15T08:00:00Z"
}Ways to use this data
- Grocery price monitoring: track price, promotion and stock changes for a shopping list of products on a recurring schedule.
- Category and catalogue research: pull a full category listing, for example laundry detergents, with ratings and unit prices for assortment analysis.
- Promotion tracking: filter for products currently on a genuine promotion, kept separate from loyalty cashback offers.
- Competitive and market intelligence: compare E.Leclerc's national price and promotion for a list of EANs against other retailers.
- Product catalogue enrichment: pull title, description, images and a category breadcrumb for a list of EANs to enrich an existing catalogue.
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 E.Leclerc Scraper return?
The documented output for E.Leclerc Scraper includes title, change type (incremental mode), brand, price, was, unit price, on promotion and in stock. Availability of each field depends on the source page and the selected mode.
How much does E.Leclerc Scraper cost?
It costs $2.00 per 1,000 results on the Apify Free plan and from $1.20 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 get only new or changed products on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental changes for scheduled runs. Each run then returns only new and updated products, and unchanged ones are not billed. A product only comes back as REAPPEARED if an earlier run had Emit expired products on and had already marked it EXPIRED; turning emitExpired on for the first time will not retroactively produce REAPPEARED rows.
Why did my run fail instead of returning an empty dataset?
If the postal code or store sign code you provided cannot be resolved to a real E.Leclerc store, the run stops with a clear message instead of silently returning nothing. Check the code and try again. If the store resolves but no products match your keywords, links or filters, the run finishes normally with an empty dataset 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 connector field to push results into Notion, Linear or Airtable.
