# Currys Scraper — UK & Ireland Electronics Prices & Stock (`studio-amba/currys-scraper`) Actor

Scrape product data from currys.co.uk and currys.ie, the UK and Ireland's electronics retailer. Get names, brands, EANs, current and was-prices, stock, ratings and images for any category page, one record shape across both sites.

- **URL**: https://apify.com/studio-amba/currys-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/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

## Currys Scraper

Pull product data from currys.co.uk and currys.ie, the electronics retailer of the United Kingdom and Ireland. The actor returns names, brands, EANs, current prices, was-prices, stock, ratings and images for any Currys category page.

Both sites use the same record shape, so a product from currys.co.uk and the same product from currys.ie can be compared field by field. Prices come back in GBP for the UK site and EUR for the Irish site.

### How to scrape Currys data

Paste one or more Currys category page URLs into `categoryUrls`, for example `https://www.currys.co.uk/computing/laptops/laptops` or `https://www.currys.ie/computing/laptops/laptops`. The actor pages through each category until it reaches `maxResults` or the end of the listing.

Currys blocks plain requests with a Cloudflare page. This actor sends every request through Bright Data Web Unlocker, so you do not need your own proxy or browser setup.

Each category page carries the product data inside the page itself. The actor reads the tile data for every product on the page, which is why a single request returns up to 100 products.

If you leave `categoryUrls` empty, the actor scrapes the laptops category of the country selected in `country`.

### Input

| Field | Type | Description |
|---|---|---|
| `categoryUrls` | list of URLs | Category pages from currys.co.uk or currys.ie, without filters |
| `country` | `uk` or `ie` | Site used for the default category when `categoryUrls` is empty |
| `maxResults` | number | Maximum number of products across all categories (default 100) |
| `brightDataApiKey` | text | Optional. Falls back to the actor's own key when empty |

Search URLs are not supported. The Currys robots.txt disallows `/search` and the filter parameters (`prefn`, `pmin`, `pmax`, `srule`), so the actor only reads category pages.

### What you get back

| Field | Description |
|---|---|
| `name` | Full product name |
| `brand` | Brand name |
| `price` | Current selling price |
| `originalPrice` | Was-price, only present when the price is reduced |
| `discount` | Markdown percentage, for example `-43%` |
| `currency` | `GBP` for currys.co.uk, `EUR` for currys.ie |
| `ean` | EAN barcode |
| `sku` | Currys SKU |
| `productId` | Currys product id |
| `inStock` | True when delivery or click and collect is offered |
| `deliveryInfo` | Availability types shown on the tile |
| `rating` | Average customer rating from 0 to 5 |
| `reviewCount` | Number of reviews |
| `imageUrl`, `imageUrls` | Product images |
| `category`, `categories` | Category path |
| `offers` | Promotions attached to the product |
| `country` | `uk` or `ie` |
| `url` | Product page URL |
| `scrapedAt` | ISO 8601 timestamp |

`originalPrice` and `discount` are absent on products that are not reduced. `rating` and `reviewCount` are absent on products without reviews. Both are correct and not missing data.

### Sample output

```json
{
  "name": "ASUS Vivobook 14 X1404MA 14\" Laptop - Intel Core 5, 256 GB SSD, Blue",
  "brand": "ASUS",
  "price": 399,
  "originalPrice": 699,
  "discount": "-43%",
  "currency": "GBP",
  "ean": "4711636670913",
  "sku": "796539",
  "productId": "10305861",
  "inStock": true,
  "deliveryInfo": "shipping, collect in store",
  "category": "Laptops",
  "country": "uk",
  "url": "https://www.currys.co.uk/products/asus-vivobook-14-x1404ma-14-laptop-intel-core-5-256-gb-ssd-blue-10305861.html",
  "scrapedAt": "2026-10-22T09:05:46.835Z"
}
```

### Use cases

- Price monitoring of electronics against other UK and Irish retailers.
- Matching Currys products to other shops by EAN.
- Tracking markdowns through `originalPrice` and `discount`.
- Comparing UK and Irish prices for the same product.
- Building a product catalogue with images, categories and ratings.

### Coverage

The actor works on any category page of currys.co.uk and currys.ie. It does not walk the category tree, so list each category you want. A category with 389 products takes four requests at 100 products per page.

### Performance and cost

Each request returns up to 100 products, so the Bright Data cost per result is a small fraction of a cent (measured: 120 products for $0.0027 total usage). A run of 100 products finishes in about a minute. The usage cost of a run only settles after the run reports SUCCEEDED, so a cost checked during the run is too low.

### Limitations

- Only category pages are supported. Search pages and filtered URLs are not.
- Prices are the online prices shown on the listing page. Store-specific prices are not included.
- Stock is a yes or no based on delivery and collection options. Stock counts per store are not included.
- If Currys changes its listing markup, the actor needs an update. The run logs a warning when fewer than 80% of the tiles on a page can be read.
- A category URL that does not exist ends the run as SUCCEEDED with zero items and a message in the status line.

### Related scrapers

- [Coolblue Scraper](https://apify.com/studio-amba/coolblue-scraper) for electronics in the Netherlands and Belgium
- [MediaMarkt Germany Scraper](https://apify.com/studio-amba/mediamarkt-de-scraper) for electronics in Germany
- [Boulanger Scraper](https://apify.com/studio-amba/boulanger-scraper) for electronics in France
- [John Lewis Scraper](https://apify.com/studio-amba/johnlewis-scraper) for UK department store products

### Support

If a category does not resolve or a field is empty, open an issue on this actor's Apify Store page.

# Actor input Schema

## `categoryUrls` (type: `array`):

Currys category pages to scrape, from currys.co.uk or currys.ie, e.g. "https://www.currys.co.uk/computing/laptops/laptops" or "https://www.currys.ie/tv-and-home-entertainment/televisions/televisions". Paste the URL from your browser without filters. Search pages and filter parameters are not supported. Leave empty to scrape the default category (laptops) of the selected country.

## `country` (type: `string`):

Which Currys site to use for the default category when Category URLs is empty.

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

Maximum number of products to scrape across all category URLs.

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

Not used. This actor reaches Currys through Bright Data Web Unlocker, which handles unblocking on its own. Kept for input-shape compatibility.

## `brightDataZone` (type: `string`):

Name of the Web Unlocker zone in your Bright Data account. Only needed together with your own Bright Data API key. Leave empty to use the actor's own zone.

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

Bright Data API key (Web Unlocker zone) used to reach Currys behind its Cloudflare protection. Falls back to the actor's own BRIGHT_DATA_API_KEY environment variable if left empty.

## Actor input object example

```json
{
  "categoryUrls": [
    "https://www.currys.co.uk/computing/laptops/laptops"
  ],
  "country": "uk",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "brightDataZone": "web_unlocker1"
}
```

# 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 = {
    "categoryUrls": [
        "https://www.currys.co.uk/computing/laptops/laptops"
    ],
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/currys-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 = {
    "categoryUrls": ["https://www.currys.co.uk/computing/laptops/laptops"],
    "maxResults": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/currys-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 '{
  "categoryUrls": [
    "https://www.currys.co.uk/computing/laptops/laptops"
  ],
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/currys-scraper --silent --output-dataset

```

## MCP server setup

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