# Coop UK Scraper — Groceries Products & Prices (`studio-amba/coop-uk-scraper`) Actor

Scrape UK Co-op (shop.coop.co.uk) groceries: product names, prices, member prices, price per unit, EAN barcodes, brands, images and categories. Postcode-scoped quick-commerce catalogue, not Coop Denmark.

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

## Pricing

from $2.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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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 UK Scraper

Scrape UK Co-op groceries from shop.coop.co.uk: product names, prices, Co-op Membership prices, price per unit, EAN barcodes, brands, images and categories. No login and no delivery slot booking needed on your end.

This actor targets the **UK Co-operative Group's** online grocery shop
(`shop.coop.co.uk`). It is not related to Coop Denmark (Kvickly, SuperBrugsen,
Brugsen, 365discount) — that is a separate company covered by a different
actor in this catalogue.

### Why use this actor?

Co-op is one of the UK's largest convenience-store chains, and its online
shop carries both Co-op own-brand lines and national grocery brands. This
actor gives you a clean, structured feed of that catalogue for price
monitoring, competitor benchmarking, product matching against other UK
grocers, or market research — including the EAN/barcode on nearly every
product, which is what makes cross-retailer product matching possible.

Co-op's online shop is a postcode-scoped quick-commerce app, and both
`coop.co.uk` and `shop.coop.co.uk` sit behind Imperva/Incapsula Bot Manager.
This actor handles the postcode → store → delivery-slot flow and the
anti-bot challenge automatically (via a Bright Data Scraping Browser
session), so you get reliable results run after run without touching a
browser yourself.

### How to scrape Coop UK data

1. Add this actor to your Apify account.
2. A Bright Data Scraping Browser endpoint is required — provide it as
   `sbrWsCdp` in the input, or have it set as the `SBR_WS_CDP` environment
   variable on the actor. `shop.coop.co.uk` cannot be reached without it
   (see Limitations).
3. Choose what to scrape:
   - Set `searchQuery` to scrape a keyword, e.g. `milk`, `bread`, `crisps`.
   - Set `categoryUrl` to browse one category instead, e.g.
     `dairy-eggs-and-chilled-juice-fresh-milk` or a full
     `https://shop.coop.co.uk/category/fresh-milk--dairy-eggs-and-chilled-juice-fresh-milk` URL.
   - Leave both empty and the actor defaults to `searchQuery: "milk"` so a
     run always returns data.
4. Set `maxProducts` to cap the run (prefilled 20 for a quick test).
5. Run the actor. Results stream to the dataset and can be exported as
   JSON, CSV, Excel or fed to an API.

Under the hood, the actor opens one browser session, completes Co-op's
postcode/store/delivery-slot flow once, then queries Co-op's own search API
(a first-party proxy in front of Algolia) directly from that session —
up to 1,000 results per request, so most searches complete in a single
API call rather than a slow page-by-page crawl.

### Input

| Field | Type | Required | Description |
|-------|------|----------|--------------|
| `sbrWsCdp` | String (secret) | Yes* | Bright Data Scraping Browser CDP endpoint (`wss://...`). *Falls back to the `SBR_WS_CDP` environment variable. |
| `searchQuery` | String | No | Search Co-op groceries by keyword (default: `milk`) |
| `categoryUrl` | String | No | A Co-op category URL or bare category ID to browse instead of searching |
| `maxProducts` | Integer | No | Maximum products to return (default 20) |
| `postcode` | String | No | UK postcode used to select a delivery hub/store (default `M1 1AE`). The catalogue itself is nationwide; this only needs to resolve to a valid store. |
| `proxyConfiguration` | Object | No | Proxy settings for auxiliary requests (primary site access goes through the Scraping Browser) |

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `name` | String | `"Co-op Semi-Skimmed Milk 4 Pints/2.272L"` |
| `brand` | String | `"Co-op"` |
| `price` | Number | `1.85` |
| `currency` | String | `"GBP"` |
| `pricePerUnit` | String | `"81.5p per ltr"` |
| `discount` | String | `"Member price £1.65 (72.7p per ltr)"` |
| `ean` | String | `"5000128104524"` |
| `productId` | String | `"5000128104524"` |
| `category` | String | `"Dairy, eggs and chilled juice > Fresh milk"` |
| `categories` | Array | `["Dairy, eggs and chilled juice", "Fresh milk"]` |
| `imageUrl` | String | Primary product image URL |
| `maxQuantity` | Integer | `6` (per-order purchase limit, if any) |
| `url` | String | A working Co-op search URL for this exact product |
| `scrapedAt` | String | ISO 8601 timestamp |

### Example output

```json
{
    "name": "Co-op Semi-Skimmed Milk 4 Pints/2.272L",
    "brand": "Co-op",
    "price": 1.85,
    "currency": "GBP",
    "url": "https://shop.coop.co.uk/search?term=5000128104524",
    "scrapedAt": "2026-07-14T19:46:57.664Z",
    "pricePerUnit": "81.5p per ltr",
    "discount": "Member price £1.65 (72.7p per ltr)",
    "ean": "5000128104524",
    "productId": "5000128104524",
    "category": "Dairy, eggs and chilled juice > Fresh milk",
    "categories": ["Dairy, eggs and chilled juice", "Fresh milk"],
    "imageUrl": "https://cdn.pr.commerce.coop.co.uk/5000128104524_1_512x512_20260429.png",
    "maxQuantity": 6
}
````

### Prices and member pricing

- `price` is always the standard (non-member) shelf price shown in GBP.
- Co-op Membership carries a separate, lower price on many products. When
  present and lower than the standard price, it's captured in `discount` as
  e.g. `"Member price £1.65 (72.7p per ltr)"` — this is not a time-boxed
  promotion, it reflects Co-op's ongoing membership pricing structure.
- `pricePerUnit` gives the comparable unit price (per litre, per kg, etc.)
  at the standard rate.
- Stock/availability can vary by store; this actor scopes to a single
  representative delivery hub (configurable via `postcode`) and returns the
  catalogue-wide search results, which is the right baseline for catalogue
  and price data.

### Cost estimate

The actor opens one Scraping Browser session per run and typically needs
just one or a handful of search API calls (up to 1,000 results per call),
regardless of `maxProducts` up to that ceiling. A single search or category
run is fast and cheap; use `maxProducts` to control the size of larger runs.

### Limitations

- **A Bright Data Scraping Browser endpoint is required.** Both
  `www.coop.co.uk` and `shop.coop.co.uk` sit behind Imperva/Incapsula Bot
  Manager plus a UK-only geo-block; this cannot be bypassed with a plain
  HTTP request or a stateless Bright Data Web Unlocker call — the postcode →
  store → delivery-slot flow needs a real, JS-capable browser session.
- **No individual product-page URL.** Co-op's search results open products
  in an in-page quick-view rather than a unique page. `url` is instead a
  working Co-op search link scoped to that exact EAN, which reliably
  surfaces the same product on the live site.
- EAN is present on nearly every product in this catalogue (own-brand and
  national brands alike); the rare item without one is a genuine gap on
  Co-op's side, not a parsing failure.
- Brand is only as clean as Co-op's own `brandFilter` field — a small
  number of items may carry a generic or missing brand.
- Data is scraped from the public website and may change without notice.
  Respect Co-op's terms of service and use responsibly.

### 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 UK grocery sources (Tesco,
Sainsbury's, Asda, Morrisons, Waitrose, Aldi, Co-op) 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 Co-op groceries by keyword (e.g., 'milk', 'bread', 'crisps').

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

A Co-op category to scrape. Full URL (https://shop.coop.co.uk/category/fresh-milk--dairy-eggs-and-chilled-juice-fresh-milk) or just the category ID (dairy-eggs-and-chilled-juice-fresh-milk). Leave empty to use Search Query instead.

## `maxProducts` (type: `integer`):

Maximum number of products to return.

## `postcode` (type: `string`):

A real UK postcode used to select a Co-op delivery hub/store (catalogue is nationwide regardless of the postcode chosen; this only needs to resolve to a valid store). Default works out of the box.

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

Bright Data Scraping Browser CDP WebSocket endpoint (wss://...). Required — shop.coop.co.uk is behind Imperva/Incapsula Bot Manager and can only be reached with a real browser session that solves the challenge. Falls back to the SBR\_WS\_CDP environment variable.

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

Proxy settings for any auxiliary requests. Primary site access goes through the Bright Data Scraping Browser (Imperva/Incapsula bot protection).

## Actor input object example

```json
{
  "searchQuery": "milk",
  "maxProducts": 20,
  "postcode": "M1 1AE",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}
```

# 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": "milk",
    "maxProducts": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "GB"
    }
};

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

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/coop-uk-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": "milk",
  "maxProducts": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}' |
apify call studio-amba/coop-uk-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=studio-amba/coop-uk-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Coop UK Scraper — Groceries Products & Prices",
        "description": "Scrape UK Co-op (shop.coop.co.uk) groceries: product names, prices, member prices, price per unit, EAN barcodes, brands, images and categories. Postcode-scoped quick-commerce catalogue, not Coop Denmark.",
        "version": "0.1",
        "x-build-id": "Geb0Mcm3uHfChpteR"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/studio-amba~coop-uk-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-studio-amba-coop-uk-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/studio-amba~coop-uk-scraper/runs": {
            "post": {
                "operationId": "runs-sync-studio-amba-coop-uk-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/studio-amba~coop-uk-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-studio-amba-coop-uk-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Search Co-op groceries by keyword (e.g., 'milk', 'bread', 'crisps')."
                    },
                    "categoryUrl": {
                        "title": "Category URL or ID",
                        "type": "string",
                        "description": "A Co-op category to scrape. Full URL (https://shop.coop.co.uk/category/fresh-milk--dairy-eggs-and-chilled-juice-fresh-milk) or just the category ID (dairy-eggs-and-chilled-juice-fresh-milk). Leave empty to use Search Query instead."
                    },
                    "maxProducts": {
                        "title": "Max Products",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of products to return."
                    },
                    "postcode": {
                        "title": "UK Postcode",
                        "type": "string",
                        "description": "A real UK postcode used to select a Co-op delivery hub/store (catalogue is nationwide regardless of the postcode chosen; this only needs to resolve to a valid store). Default works out of the box.",
                        "default": "M1 1AE"
                    },
                    "sbrWsCdp": {
                        "title": "Bright Data Scraping Browser endpoint",
                        "type": "string",
                        "description": "Bright Data Scraping Browser CDP WebSocket endpoint (wss://...). Required — shop.coop.co.uk is behind Imperva/Incapsula Bot Manager and can only be reached with a real browser session that solves the challenge. Falls back to the SBR_WS_CDP environment variable."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings for any auxiliary requests. Primary site access goes through the Bright Data Scraping Browser (Imperva/Incapsula bot protection)."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
