Castorama.fr - Products, Prices & Reviews
Pricing
from $1.00 / 1,000 product results
Castorama.fr - Products, Prices & Reviews
Scrape Castorama.fr DIY and home-improvement products by keyword, category, or URL. Extract prices, original prices, promotions, seller details, categories, specifications, ratings, and customer reviews. Incremental mode tracks product and price changes over time.
Pricing
from $1.00 / 1,000 product results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Castorama France Product Scraper
Scrape products from Castorama France (castorama.fr) — the French DIY /
home-improvement retailer. Search by keyword or category, or paste product /
category / search links. Every product comes back as one flat record with
price, was-price, promotion, seller (Castorama or a marketplace partner),
breadcrumb category and rating; enable details to add the full description,
technical specifications, and customer reviews.
What you can do
- Search by keyword or category — e.g.
perceuse(drill),(matte white paint) — with brand, price, promotion, seller and rating filters, plus sorting. A keyword that matches a real Castorama category (likepeinture blanche mateperceuse) resolves straight to that category's full facet set, exactly like typing into the site's own search box. - Paste links — mix product links, category links and search-result links in one list and let the actor route each entry. Product links return full detail. Promotion/in-stock/sort still apply to every link; brand/price/rating also narrow a pasted category or search-result link, just not a single pasted product link.
- 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 |
|---|---|
| Mode | search or url. |
| Search keywords or category links | Keywords or Castorama category links to search/browse (search mode only). Each is walked separately. |
| Brand | Only keep products of this brand. Narrows a search, or a pasted category/search-result link in url mode; has no effect on a pasted product link. |
| Only sold directly by Castorama | Exclude marketplace (third-party seller) offers. Same scope as Brand above. |
| Min / Max price (EUR) | Keep only products within a price range. Same scope as Brand above. |
| Minimum average rating | Keep only products rated at least N stars. Same scope as Brand above. |
| Only products on promotion | Keep only products flagged with a real promotion. Applies to every result in either mode, including a single pasted product link. |
| Only purchasable products | Keep only products the site currently marks purchasable (client-side; see Notes). Same scope as "Only products on promotion" above. |
| Sort by | Relevance, price ↑/↓, rating ↓, newest, or best sellers — Castorama's own sort options. Same scope as "Only products on promotion" above. |
| Castorama France links | Product links, category links and search-result links to scrape directly, mixed freely (url mode). Product links return full detail. |
| Fetch product details | Add description, technical specifications and customer reviews. 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 entry. 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. |
| Incremental changes for scheduled runs | Daily/recurring monitoring. 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 search/filter/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 no longer found, marked EXPIRED, once a run has fully scanned the tracked search. Adds and bills extra synthetic rows. |
| Proxy | Apify Proxy — datacenter by default (see Proxy & connection below). |
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. With details off you get the listing‑level fields; with details on you also get description, specifications and reviews. Example (illustrative values):
{"productId": "3666294006226","ean": "3666294006226","title": "Perceuse Visseuse 20V Exemple + 2 Batteries 1,5 Ah + Chargeur rapide + Malette","brand": "MarqueExemple","price": 79.99,"currency": "EUR","originalPrice": 139.99,"discountAmount": 60.0,"discountPercentage": 43,"isOnSpecial": true,"promotionLabel": "Promotion","sellerId": "2131","sellerName": "Vendeur Partenaire Exemple","soldByCastorama": false,"category": "Visseuse dévisseuse","categoryPath": [{ "name": "Visseuse dévisseuse", "path": "/visseuse-devisseuse/cat_id_0003519.cat" },{ "name": "Perceuse visseuse", "path": "/perceuse-visseuse/cat_id_0003518.cat" }],"availability": { "status": "Available", "purchasable": true, "homeDelivery": "Available" },"images": ["https://media.castorama.fr/is/image/Castorama/example.jpg"],"image": "https://media.castorama.fr/is/image/Castorama/example.jpg","url": "https://www.castorama.fr/mkp/example/3666294006226_CAFR.prd","specifications": [{ "name": "Marque", "value": "MarqueExemple" }, { "name": "Tension (en V)", "value": "20V" }],"rating": 4.75,"reviewCount": 4,"reviews": [{ "author": "Exemple", "title": "Efficace", "body": "Facile à utiliser.", "rating": 5, "date": "2026-07-08T15:18:22.000+00:00" }],"searchMode": "search","scrapedAt": "2026-01-01T00:00:00Z"}
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 |
Was-price and promotions — verified live, not assumed
Fetched real listing and product-detail pages via https://www.castorama.fr/search?term=perceuse
(redirects to the "Perceuse" category, cat_id_3796) and its individual products,
e.g. https://www.castorama.fr/mkp/perceuse-visseuse-20v-nemura-2-batteries-1-5-ah-chargeur-rapide-malette-avec-54-accessoires/3666294006226_CAFR.prd,
2026-08-03. The site's own catalog payload carries a genuine prior price for
the same item: pricing.wasPrice (was €139.99) alongside pricing.currentPrice
(now €79.99) and pricing.saving (the €60.00 amount saved), and every such
item is explicitly flagged merchandisingTag: {"text": "Promotion"}. The
product-detail offer additionally carries discountStartDate/discountEndDate
(a real promo window, e.g. 2026‑08‑01 → 2026‑09‑01) and matching
originPrice/wasPrice, confirming this is a real markdown rather than a
competitor-price or unit-price artifact. Castorama also exposes a real facet
for this in its own navigation — "Type d'offre = Promotion" —
returned by the same payload's filtering.filters[], which this actor maps
to onPromotionOnly. isOnSpecial/originalPrice/discountAmount/
discountPercentage are only ever populated when this genuine was-price is
present; a cheaper marketplace offer or a unit-price spread never sets them.
Reviews — verified live, not assumed
The product detail route (.../3666294006226_CAFR.prd) embeds a reviews[]
array directly in its own server-rendered payload — real customer rows with
UserNickname/Title/ReviewText/Rating/SubmissionTime (mapped here to
author/title/body/rating/date). The product's averageRating.count
matched the number of reviews actually returned on every product checked
live. No third-party review host is ever called directly by this actor — the
review data ships first-party in Castorama's own page payload (same pattern
independently confirmed on a sibling French retailer). When a product has no
reviews, reviews is [] and rating/reviewCount are null/0 — never
fabricated. Not yet observed live: a product whose true review count
exceeds what ships inline (all products checked had ≤4 reviews, all
returned); if Castorama caps the inline array at a higher count than that on
some products, this actor currently returns only what the payload includes.
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 |
| Run the same 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.
Incremental mode (incrementalMode) is for a schedule (for example, daily): the actor remembers the previous run of the same 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). Turn on emitUnchanged or emitExpired only when you also want those rows returned (and billed for). State is isolated per search/URL and filter/detail-mode setup automatically; set stateKey to name or deliberately share a monitoring campaign.
Scheduled-run example — same search, run daily:
Day 1 (first run ever for this search):
{ "mode": "search", "queries": ["perceuse"], "incrementalMode": true }
→ every product comes back with "changeType": "NEW".
Day 2 (the schedule fires again, identical input):
{ "mode": "search", "queries": ["perceuse"], "incrementalMode": true }
→ products whose price/promotion/stock/etc. changed 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 strongly recommended but not geography-gated. Verified live 2026-08-03: the storefront's edge randomly serves a static "Site en maintenance" placeholder (HTTP 503) to a share of connections — observed on Apify datacenter exits, Apify residential exits (both French and US), and real requests with no relation to exit country. This is a rate/reputation gate on the edge, not a geo-block: no country pin is required, and the same tier that fails one request succeeds the next. The actor retries a blocked fetch on a fresh sticky proxy session, capped at 5 attempts. Datacenter is the default (cheaper); switch to Residential in the Proxy field only if a run sees persistent failures.
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.
searchModeon each record reports how it was found:search,category, orproductwhen it came from a pasted product link.- Prices are in EUR.
- Duplicate products (same EAN) are returned once per run.
soldByCastoramadistinguishes a first-party Castorama offer from a marketplace (third-party) seller —sellerName/sellerIdcarry the marketplace seller's identity when it's not Castorama.- "Only purchasable products" is a client-side filter on each product's own status; Castorama's in-store stock facet needs a shopper's postal code and is not covered by this actor.