# Intermarché Scraper — French Grocery Prices (`studio-amba/intermarche-fr-scraper`) Actor

Scrape products, prices, unit prices, EAN barcodes, and images from intermarche.com, a major French supermarket chain. Search common French grocery keywords or a category URL and export clean structured data.

- **URL**: https://apify.com/studio-amba/intermarche-fr-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Stats:** 6 total users, 2 monthly users, 71.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 result scrapeds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Intermarché Scraper — French Grocery Prices

Scrape grocery products, prices, unit prices, and EAN barcodes from **intermarche.com**, one of France's largest supermarket chains. Search common French grocery keywords or a category URL and export clean, structured grocery data.

### Why use this actor?

Intermarché runs thousands of stores across France and prices are store-specific, so this actor picks a store for you (by postal code or address) before reading prices, the same way a real shopper would. That makes the data directly useful for price monitoring, competitor analysis, and product matching — every product carries its EAN barcode, extracted straight from the product URL, so it's easy to line up against other retailers or your own catalogue.

### How to scrape Intermarché data

1. Enter a **search query** in French (for example `lait`, `pain`, `cafe`, or `fromage`), or provide a full **category URL** (`intermarche.com/rayons/...`) if you know exactly which category you want.
2. Set a **store address / postal code** (default: `69001 Lyon`). Intermarché will not show any product without a selected store, so the actor drives the address-picker automatically.
3. Set **Max Results** to how many products you want.
4. Provide a **Bright Data Scraping Browser** endpoint (see "Anti-bot" below).
5. Run the actor. Results stream into the dataset and can be exported as JSON, CSV, Excel, or via the API.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | French grocery keyword (default: `lait`) |
| `categoryUrl` | String | No | Full `intermarche.com/rayons/...` category URL; overrides `searchQuery` |
| `postalCode` | String | No | Store address / postal code (default: `69001 Lyon`) |
| `maxResults` | Integer | No | Maximum products to return (default: 100) |
| `sbrWsCdp` | String | Yes | Bright Data Scraping Browser CDP endpoint (or set `SBR_WS_CDP` env var) |
| `proxyConfiguration` | Object | No | Kept for compatibility; rendering is handled by Bright Data Scraping Browser |

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `name` | String | `"Lait demi-écrémé stérilisé UHT BIO issu de l'agriculture biologique"` |
| `brand` | String | `"Pâturages, une marque Intermarché"` |
| `price` | Number | `6.49` |
| `currency` | String | `"EUR"` |
| `pricePerUnit` | String | `"1,08 €/L"` |
| `packaging` | String | `"les 6 bouteilles de 1l - 6l"` |
| `ean` | String | `"3250390207467"` |
| `imageUrl` | String | Primary product image URL |
| `url` | String | Full product page URL |
| `scrapedAt` | String | ISO 8601 timestamp |

### Example output

```json
{
    "name": "Lait demi-écrémé stérilisé UHT BIO issu de l'agriculture biologique",
    "brand": "Pâturages, une marque Intermarché",
    "price": 6.49,
    "currency": "EUR",
    "pricePerUnit": "1,08 €/L",
    "packaging": "les 6 bouteilles de 1l - 6l",
    "ean": "3250390207467",
    "imageUrl": "https://cdn.intermarche.com/fr/Content/images/boitmal/produit/zoom/9F4ECB1B0A4C5525ADDCA5BC02CF6602.jpg",
    "url": "https://www.intermarche.com/produit/lait-demi-ecreme-sterilise-uht-bio-issu-de-l'agriculture-biologique/3250390207467",
    "scrapedAt": "2026-07-14T21:00:00.000Z"
}
```

### Anti-bot: Bright Data Scraping Browser required

Intermarché is protected by DataDome on every path — plain HTTP requests and standard proxies get a hard 403. Unlike a simpler DataDome-protected site, Intermarché's category and product pages are also pure client-rendered JavaScript: the raw HTML carries no price data at all until the browser executes JS **and** a shopper has picked a nearby store. There is no URL-only shortcut for this — a plain HTTP fetch, even through an unblocking proxy, returns an empty page.

This actor uses the [Bright Data Scraping Browser](https://brightdata.com) — a real remote Chromium session — to render the site past DataDome and drive the store-selection flow (type an address, pick the matching suggestion, confirm the store) exactly like a shopper would, once per run. You need a Bright Data account with a Scraping Browser zone. Provide the CDP endpoint either:

- in the input field **Bright Data Scraping Browser endpoint**, or
- as the environment variable `SBR_WS_CDP`.

The actor blocks image, font, and media requests during the browser session (it only needs the page's text and image *URLs*, not the image bytes), which keeps Scraping Browser bandwidth — and cost — down on an image-heavy grocery grid.

### Cost estimate

Scraping Browser is billed per GB of traffic rather than per request. With image/font/media blocking enabled, a full category page (with cookie consent, store selection, and product grid) typically transfers well under 1 MB of text/JS payload, keeping per-run cost low even though the underlying browser session is heavier than a simple HTTP fetch.

### How search resolution works

There is no working free-text search URL on intermarche.com — the `/recherche` route returns a 404 even with a store selected, so this actor resolves `searchQuery` through a small keyword-to-category dictionary (`lait`, `pain`, `cafe`/`café`, `fromage`, and a few more). If a keyword isn't mapped, or a category URL turns out to be stale, the actor automatically falls back to the verified default category (`lait`) rather than failing the run. For guaranteed control over exactly which products you get, pass a `categoryUrl` directly.

### Limitations

- Prices are specific to the store selected via `postalCode` and may differ from other Intermarché stores or the national average.
- Free-text search is approximated through a keyword dictionary, not the site's own search — pass `categoryUrl` for precise category targeting.
- A Bright Data Scraping Browser endpoint is required; without it the actor cannot render the store-selection flow or fetch any product data.
- Data is scraped from the public website and may change without notice.
- Respect the website's terms of service and use responsibly.

### Related Scrapers

- [Carrefour Scraper](https://apify.com/store) — French grocery prices with EAN barcodes
- [Monoprix France Scraper](https://apify.com/store) — French grocery prices and promotions
- [Auchan Scraper](https://apify.com/store) — French grocery prices and products
- [Leclerc Scraper](https://apify.com/store) — French grocery prices and products

### Need this data on a schedule, or a custom version?

We run this scraper as a managed service for businesses: scheduled runs,
deduplication, delta detection, and delivery to your inbox, Google Sheets,
or API — maintenance included. We can also build a custom version with your
exact fields and filters, or combine multiple sources into one feed.

See [studioamba.dev/services](https://studioamba.dev/services/) or email
<hello@studioamba.dev> for a free data sample.
We maintain 300+ European web scrapers and answer within one business day.

# Actor input Schema

## `searchQuery` (type: `string`):

A French grocery keyword (e.g. 'lait', 'pain', 'cafe', 'fromage'). Resolved to the matching Intermarché category ('rayon'). Unmapped keywords fall back to the default 'lait' category so the run still returns data.

## `categoryUrl` (type: `string`):

Full intermarche.com/rayons/... category URL to scrape instead of a keyword. Takes priority over searchQuery if both are set.

## `postalCode` (type: `string`):

French address or postal code used to select the nearest Intermarché store. Prices are store-specific — Intermarché will not show any product without a selected store.

## `maxResults` (type: `integer`):

Maximum number of products to return.

## `sbrWsCdp` (type: `string`):

CDP WebSocket endpoint for a Bright Data Scraping Browser zone. Required to bypass Intermarché's DataDome protection and render the store-selection flow. Can also be provided via the SBR\_WS\_CDP environment variable.

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

Proxy settings. Kept for compatibility — page rendering is handled by Bright Data Scraping Browser, so this does not affect scraping.

## Actor input object example

```json
{
  "searchQuery": "lait",
  "postalCode": "69001 Lyon",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchQuery": "lait",
    "postalCode": "69001 Lyon",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/intermarche-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 = {
    "searchQuery": "lait",
    "postalCode": "69001 Lyon",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/intermarche-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 '{
  "searchQuery": "lait",
  "postalCode": "69001 Lyon",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/intermarche-fr-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/intermarche-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/Mk7l3ijZPdltXagRT/builds/YRmdifdv3ZJKzx1Pw/openapi.json
