# Castorama France Scraper — Prix, EAN, Stock & Avis (`cyrilfaia/castorama-fr-scraper`) Actor

Extrait les produits de castorama.fr par mot-clé, catégorie ou URL produit : nom, EAN (GTIN-13), prix TTC, note, avis, disponibilité, images, caractéristiques.

- **URL**: https://apify.com/cyrilfaia/castorama-fr-scraper.md
- **Developed by:** [Cyril Faia](https://apify.com/cyrilfaia) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 product listeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Castorama France Scraper — Prix, EAN, Stock & Avis

Extract product data from **castorama.fr**, France's second-largest DIY and building-materials retailer (Kingfisher group). Search by keyword, crawl a category, or enrich specific product pages. Output is clean JSON/CSV/Excel with **EAN (GTIN-13)**, **price in EUR**, **ratings**, **availability**, **click & collect / home delivery flags**, **brand**, **full technical specifications** and **customer reviews**.

Built for price monitoring, catalogue matching by EAN, construction cost estimation, market research on the French DIY market, and AI agents that need reliable building-materials pricing.

### What you get

**Listing mode** (default, fast, cheapest): one row per product found in search results or category pages.

```json
{
  "name": "Parquet contrecollé clipsable Bishorn XXL en chêne verni aspect naturel",
  "ean": "3663602537038",
  "price": 56.64,
  "priceCurrency": "EUR",
  "rating": 3.77,
  "reviewCount": 99,
  "description": "Le parquet contrecollé constitue un revêtement de sol très stable…",
  "image": "https://media.castorama.fr/is/image/Castorama/parquet-contrecolle-…_01i",
  "url": "https://www.castorama.fr/parquet-contrecolle-clipsable-bishorn-xxl-…/3663602537038_CAFR.prd",
  "position": 1,
  "source": "kw:parquet chêne",
  "scrapedAt": "2026-09-17T09:12:44.318Z"
}
```

**Detail mode** (`fetchDetails: true`): every product page is visited and enriched.

```json
{
  "name": "Perceuse visseuse à percussion sans fil Mac Allister 18V MCI1258COM 50Nm",
  "ean": "5063022700407",
  "brand": "Mac Allister",
  "price": 49.9,
  "priceCurrency": "EUR",
  "availability": "in_stock",
  "clickAndCollect": true,
  "homeDelivery": true,
  "handlingDays": 4,
  "category": "Perceuse visseuse",
  "categoryPath": ["Outillage", "Outillage électroportatif", "Perceuse", "Perceuse visseuse"],
  "rating": 4.46,
  "reviewCount": 15,
  "specs": {
    "Marque": "Mac Allister",
    "Nom/numéro de modèle": "MCI1258COM",
    "Couple maximal en démarrage rapide (en Nm)": "50Nm",
    "Capacité maximale du mandrin (en mm)": "13mm",
    "Nombre de vitesses": "2",
    "…": "20 to 40 attributes per product"
  },
  "images": ["https://media.castorama.fr/is/image/Castorama/…_01c", "…"],
  "reviews": [{ "author": "…", "rating": 5, "date": "2026-08-30", "title": "…", "text": "…" }],
  "url": "https://www.castorama.fr/…/5063022700407_CAFR.prd"
}
```

### Input

| Field | Type | Description |
|---|---|---|
| `keywords` | string\[] | Search terms, e.g. `parquet chêne`, `visseuse 18V`, `vis torx 4x40`. Castorama redirects exact category matches to the category page; both are handled. |
| `startUrls` | url\[] | Category URLs (`…/cat_id_3144.cat`), search URLs (`/search?term=…`) or product URLs (`…_CAFR.prd`). |
| `maxItems` | integer | Stop after this many products (0 = unlimited). Default 100. |
| `maxPagesPerSource` | integer | Pages to crawl per keyword/category, 48 products per page. Default 3. |
| `fetchDetails` | boolean | Visit every product page for brand, availability, specs, images, reviews. Default false. |
| `proxyConfiguration` | object | Apify Proxy (datacenter is sufficient). |

Minimal example:

```json
{ "keywords": ["parquet chêne", "carrelage 60x60"], "maxItems": 200 }
```

Price-monitoring example (fixed list of EANs you already know):

```json
{
  "startUrls": [
    { "url": "https://www.castorama.fr/parquet-contrecolle-clipsable-bishorn-xxl-en-chene-verni-aspect-naturel/3663602537038_CAFR.prd" }
  ],
  "fetchDetails": true
}
```

### Pricing

Pay per event, no subscription:

- **Product listed** — charged per product returned in listing mode.
- **Product detail** — charged per enriched product page (`fetchDetails: true`).
- **Actor start** — a small fixed fee per run.

A 500-product price check costs well under a dollar. Runs stop automatically when your maximum spend is reached.

### Use cases

- **Price monitoring** for your own catalogue: feed EANs, schedule daily, diff prices.
- **Construction quotes**: get current material prices for a bill of quantities.
- **Marketplace sellers**: benchmark against Castorama's price on identical EANs.
- **Market research**: brand share, price bands and rating distribution per category.
- **AI agents**: this Actor is available through Apify's MCP server and agentic payments, so an agent can call it directly with a keyword and receive structured prices.

### Integrations

Export to JSON, CSV, Excel, XML or RSS; push to Google Sheets, Slack, Make, Zapier, n8n or any webhook via Apify integrations. Schedule runs from the Apify console. Access results through the Apify API or the MCP server.

### Notes and limits

- Prices are the national web price in EUR including VAT. Store-specific stock is not included in this version.
- Castorama pages are public; the Actor reads the structured data (schema.org) the site publishes for search engines, and never logs in.
- Reviews are limited to the ones embedded on the product page (up to 20 per product).
- If Castorama changes its markup, the Actor is monitored and updated; open an issue on the Actor page if you spot missing fields.

### Legal

Scrape responsibly. Product names, prices and availability are factual public data; respect Castorama's terms and applicable law (RGPD does not apply to product data, but do not use this Actor to collect personal data such as reviewer identities for other purposes). You are responsible for how you use the output.

# Actor input Schema

## `keywords` (type: `array`):

Termes de recherche, un par ligne (ex. « parquet chêne », « perceuse visseuse 18V », « vis torx 4x40 »).

## `startUrls` (type: `array`):

URL castorama.fr de catégorie (…/cat\_id\_XXXX.cat), de recherche (/search?term=…) ou de fiche produit (…\_CAFR.prd).

## `maxItems` (type: `integer`):

Arrêt une fois ce nombre de produits extraits (toutes sources confondues). 0 = illimité.

## `maxPagesPerSource` (type: `integer`):

Nombre de pages de résultats à parcourir pour chaque mot-clé ou catégorie (48 produits par page).

## `fetchDetails` (type: `boolean`):

Visite chaque fiche produit pour obtenir la disponibilité, la catégorie, les images, la description complète et les avis. Plus lent et facturé par fiche.

## `proxyConfiguration` (type: `object`):

Proxy Apify recommandé (datacenter suffit en général).

## Actor input object example

```json
{
  "keywords": [
    "parquet chêne"
  ],
  "startUrls": [],
  "maxItems": 100,
  "maxPagesPerSource": 3,
  "fetchDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `products` (type: `string`):

Default dataset: name, ean, price, priceCurrency, rating, reviewCount, image, url; in detail mode also brand, availability, clickAndCollect, homeDelivery, category, categoryPath, specs, images, reviews.

## `productsCsv` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "parquet chêne"
    ],
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cyrilfaia/castorama-fr-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": ["parquet chêne"],
    "startUrls": [],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("cyrilfaia/castorama-fr-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "parquet chêne"
  ],
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cyrilfaia/castorama-fr-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cyrilfaia/castorama-fr-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/0xyCk3Nd3sFqaxJSE/builds/12manLc1Od9Da98a2/openapi.json
