# Coop Switzerland Scraper — Grocery Prices & Promotions (`studio-amba/coop-ch-scraper`) Actor

Scrape products, prices, unit prices, promotions, ratings and images from coop.ch, Switzerland's #2 grocery retailer. Search any keyword and export clean structured grocery data.

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

## Pricing

from $1.20 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## Coop Switzerland Scraper — Grocery Prices & Promotions

Scrape products, prices, unit prices, promotions, ratings, and images from **coop.ch**, Switzerland's #2 grocery retailer. Search any keyword and export clean, structured grocery data.

### Why use this actor?

Coop is one half of the Swiss grocery duopoly (alongside Migros), with national coverage and its own online catalogue, private-label brands, and weekly promotions. Its prices and promo data are useful for price monitoring, competitor benchmarking, product matching, and market research. This actor turns a keyword search into a structured dataset you can drop straight into a spreadsheet, database, or price-comparison pipeline. Every product comes with its Coop product ID, current price, and — when the item is discounted — the original price and the promotion label shown on the site.

### How to scrape Coop Switzerland data

1. Enter a **search query** in German or French (for example `milch`, `kaffee`, `wein`, `lait`, `fromage`).
2. Set **Max Results** to how many products you want. Coop's search endpoint returns every matching product in a single response (no crawling needed), so this simply caps how many rows you get back.
3. Provide a **Bright Data API key** (see "Anti-bot" below).
4. Run the actor. Results land in the dataset and can be exported as JSON, CSV, Excel, or via the API.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | Search keyword in German or French (default: `milch`) |
| `maxResults` | Integer | No | Maximum products to return (default: 100) |
| `brightDataApiKey` | String | Yes | Bright Data Web Unlocker API key (or set `BRIGHT_DATA_API_KEY` env var) |
| `proxyConfiguration` | Object | No | Kept for compatibility; fetching is handled by Bright Data |

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `name` | String | `"Milchdrink UHT 1.5%"` |
| `brand` | String | `"Coop"` |
| `price` | Number | `0.95` |
| `currency` | String | `"CHF"` |
| `originalPrice` | Number | `24.95` (only when on promotion) |
| `pricePerUnit` | String | `"0.19/100ml"` |
| `discount` | String | `"Online 30%"` (only when on promotion) |
| `quantity` | String | `"500ml"` |
| `sku` / `productId` | String | `"6849615"` |
| `inStock` | Boolean | `true` |
| `rating` | Number | `4.5` |
| `reviewCount` | Number | `98` |
| `imageUrl` | String | Primary product image URL (largest size) |
| `imageUrls` | Array | All available image sizes |
| `category` | String | `"Uht Milk"` |
| `categories` | Array | `["Food", "Dairy Products Eggs", "Milk", "Uht Milk"]` |
| `url` | String | Full product page URL |
| `scrapedAt` | String | ISO 8601 timestamp |

### Example output

```json
{
    "name": "Milchdrink UHT 1.5%",
    "brand": "Coop",
    "price": 0.95,
    "currency": "CHF",
    "url": "https://www.coop.ch/en/food/dairy-products-eggs/milk/uht-milk/milchdrink-uht-15/p/6849615",
    "scrapedAt": "2026-08-21T19:58:46.630Z",
    "pricePerUnit": "0.19/100ml",
    "quantity": "500ml",
    "sku": "6849615",
    "productId": "6849615",
    "inStock": true,
    "rating": 4.5,
    "reviewCount": 98,
    "imageUrl": "https://www.coop.ch/img/produkte/310_310/RGB/6849615_001.jpg",
    "category": "Uht Milk",
    "categories": ["Food", "Dairy Products Eggs", "Milk", "Uht Milk"]
}
```

### Anti-bot: Bright Data Web Unlocker required

coop.ch is protected sitewide by DataDome — a plain HTTP request to the homepage or any internal API returns HTTP 403 with a `x-datadome: protected` header, and this holds for the search page and every internal search API endpoint we tested directly. To fetch pages reliably, this actor uses the [Bright Data Web Unlocker](https://brightdata.com) (zone `web_unlocker1`).

You need a Bright Data account with a Web Unlocker zone. Provide the API key either:

- in the input field **Bright Data API Key**, or
- as the environment variable `BRIGHT_DATA_API_KEY`.

### How it works

coop.ch's search results page is mostly a server-rendered shell — the product grid itself starts as skeleton placeholders and is filled in by a client-side request to a JSON search API. This actor calls that same API directly through Bright Data, so it gets the full structured product data (name, brand, price, promo, rating, images, category path) in a single request per search, without needing to parse HTML product tiles or run a browser.

Because that one request returns every matching product for a keyword (Coop's search does not require pagination the way most storefronts do), a typical run — even for hundreds of results — is a single Bright Data call. That keeps both the cost and the run time low.

### Cost estimate

Bright Data Web Unlocker charges per request. Because a single request returns the full result set for a search (from a handful of matches to several hundred for a broad keyword like "bio"), the anti-bot cost per product is negligible — well under a cent per hundred results. Apify platform usage adds a small amount of compute time on top; a typical run completes in a few seconds. The run's usage cost only settles after the run status reports SUCCEEDED — reading the dataset mid-run undercounts the actual cost.

### Limitations

- Prices and availability are national Coop online-catalogue values and may differ from a specific store.
- `inStock` reflects the "orderable online" signal from the search API; a small number of items can be listed but not orderable online even when a physical store carries them.
- A Bright Data Web Unlocker key is required; without it the actor cannot fetch pages.
- Data is scraped from the public website and may change without notice.
- Respect the website's terms of service and use responsibly.

### Related Scrapers

- [Migros Scraper](https://apify.com/store) — Switzerland's #1 grocery retailer, the other half of the duopoly
- [Tutti.ch Scraper](https://apify.com/store) — Swiss classifieds marketplace
- [Lidl Scraper](https://apify.com/store) — European discount grocery prices
- [Local.ch Scraper](https://apify.com/store) — Swiss business directory

### 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`):

Search coop.ch for products by keyword, in German or French (e.g. 'milch', 'kaffee', 'wein', 'lait', 'fromage'). All matching products are returned in a single search, up to Max Results.

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

Maximum number of products to return.

## `brightDataApiKey` (type: `string`):

Your Bright Data API key for the Web Unlocker zone (web\_unlocker1). Required to bypass coop.ch's DataDome anti-bot protection. Get one at https://brightdata.com. Can also be provided via the BRIGHT\_DATA\_API\_KEY environment variable.

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

Proxy settings. Kept for compatibility — page fetching is handled by Bright Data Web Unlocker, so this does not affect scraping.

## Actor input object example

```json
{
  "searchQuery": "milch",
  "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": "milch",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

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

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

```

## MCP server setup

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