Castorama.fr - Products, Prices & Reviews avatar

Castorama.fr - Products, Prices & Reviews

Pricing

from $1.00 / 1,000 product results

Go to Apify Store
Castorama.fr - Products, Prices & Reviews

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

Abot API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

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),
    peinture blanche mate
    (matte white paint) — with brand, price, promotion, seller and rating filters, plus sorting. A keyword that matches a real Castorama category (like perceuse) 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

FieldDescription
Modesearch or url.
Search keywords or category linksKeywords or Castorama category links to search/browse (search mode only). Each is walked separately.
BrandOnly 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 CastoramaExclude 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 ratingKeep only products rated at least N stars. Same scope as Brand above.
Only products on promotionKeep only products flagged with a real promotion. Applies to every result in either mode, including a single pasted product link.
Only purchasable productsKeep only products the site currently marks purchasable (client-side; see Notes). Same scope as "Only products on promotion" above.
Sort byRelevance, price ↑/↓, rating ↓, newest, or best sellers — Castorama's own sort options. Same scope as "Only products on promotion" above.
Castorama France linksProduct links, category links and search-result links to scrape directly, mixed freely (url mode). Product links return full detail.
Fetch product detailsAdd description, technical specifications and customer reviews. On by default.
Max productsThe run's cap on how many products to return. Default 20; 0 = unlimited.
Max pages per keyword / category / linkResult 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 runContinue one specific previous run/dataset: products already collected there are skipped. For recurring daily monitoring, use Incremental mode instead.
Incremental changes for scheduled runsDaily/recurring monitoring. First run returns everything as NEW; later runs return only NEW/UPDATED/REAPPEARED by default. See "Resume & recurring updates" below.
State keyOptional name for a monitoring campaign. Auto-derived from your search/filter/detail settings when left empty.
Emit unchanged productsIncremental mode only. Also return products unchanged since the last run, marked UNCHANGED. Adds and bills extra rows.
Emit expired productsIncremental 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.
ProxyApify Proxy — datacenter by default (see Proxy & connection below).
mcpConnectorsOptional MCP connectors to export results into (Notion, Linear, Airtable, Apify).
notionParentPageUrlNotion connector only: page under which item pages are created.
maxNotifyListingsCap 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:

FieldDescription
changeTypeNEW | UPDATED | UNCHANGED | REAPPEARED | EXPIRED
changedFieldsTop-level fields that changed since last seen; non-empty only for UPDATED
firstSeenAtWhen this product was first observed by this monitoring campaign
lastSeenAtWhen 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:

NeedUse
A crawl stopped and should continueresumeFromRunId
Run the same search every day and receive only changesincrementalMode
Keep separate daily campaigns for similar searchesdistinct stateKey values
Run a normal full snapshotleave 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.
  • searchMode on each record reports how it was found: search, category, or product when it came from a pasted product link.
  • Prices are in EUR.
  • Duplicate products (same EAN) are returned once per run.
  • soldByCastorama distinguishes a first-party Castorama offer from a marketplace (third-party) seller — sellerName/sellerId carry 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.