# 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
- **Features:** Limited permissions
- **Stats:** 10 total users, 1 monthly users, 85.1% 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?

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

## 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

### Tips and tricks

- **Start small**: test with `maxResults: 5` before running large scrapes.
- **Use proxies**: residential proxies give the best success rates for Intermarche Fr.
- **Schedule runs**: set up recurring runs to keep your data fresh automatically.
- **Integrate via API**: use the [Apify API](https://docs.apify.com/api) or [client libraries](https://docs.apify.com/api/client) to fetch results programmatically.
- **No login required**: this actor scrapes publicly available data without needing an account.

### Features

- **No login required** — scrapes publicly available data from Intermarche Fr without needing credentials or cookies.
- **Structured output** — results are returned as clean JSON objects, ready for processing.
- **Pagination handling** — automatically follows multiple pages of results.
- **Proxy support** — configurable proxy settings for reliable, large-scale scraping.
- **Flexible input** — search by keyword, provide specific URLs, or crawl categories.
- **Scheduled runs** — run on a schedule to keep your dataset up to date automatically.
- **API access** — integrate results into your workflow using the Apify API or webhooks.

### FAQ

**Is it legal to scrape Intermarche Fr?**
Web scraping of publicly available data is generally permitted. This actor only accesses information that is publicly visible to any website visitor. Always review the website's terms of service before scraping.

**How often should I run this scraper?**
For price monitoring or competitive intelligence, daily or weekly runs are common. Set up a [schedule](https://docs.apify.com/schedules) in Apify Console to automate this.

**Can I export the data to Google Sheets or Excel?**
Yes. After each run, you can download results in CSV, JSON, or Excel format directly from Apify Console. You can also connect results to Google Sheets using Apify integrations.

**What if the scraper stops working?**
Websites change their structure occasionally. If you notice issues, please open an issue on the actor's page. We actively maintain this scraper and fix issues promptly.

# 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/YqrDYLQJ8N8dlAF2F/openapi.json
