# Screwfix UK Product, Price & Store Scraper (`dromb/screwfix-uk-wave3`) Actor

Extract Screwfix UK products, prices, discounts, VAT values, stock, technical specifications, categories, stores, coordinates, and opening hours for retail research and price monitoring.

- **URL**: https://apify.com/dromb/screwfix-uk-wave3.md
- **Developed by:** [Dmitriy Gyrbu](https://apify.com/dromb) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

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

## Screwfix UK Product & Store Scraper (Unofficial)

Scrape Screwfix UK products, categories, filters, and stores with normalized output for price monitoring, product research, market research, availability, offers, and retail workflows.

This is an unofficial actor and is not affiliated with Screwfix.

### Proxy behavior

Screwfix currently works with direct HTTP, so normal runs do not require paid proxy traffic or a browser. Add a UK proxy only if cloud access starts getting blocked.

### Ready-to-use tasks

- **Power tools category** — monitor products, promotions, discounts, availability, and review signals in one live category.
- **Rich product details** — return descriptions, technical specifications, videos, sustainability claims, stock, pricing, and reviews for a known SKU.
- **Store directory** — collect branch codes and URLs for store discovery workflows.
- **Store details** — enrich a branch with address, coordinates, opening hours, and collection availability.

### Supported operations

- `probe`
- `categories`
- `stores`
- `store`
- `search_filters`
- `search`
- `category`
- `item`

### Operation guide

The Apify Console form shows the union of all supported fields, so the visible
inputs do not change when you switch `operation`. Use the guide below to know
which fields are required.

- `probe`
  Required: none
  Optional: `includeRaw`

- `categories`
  Required: none
  Optional: `includeRaw`

- `stores`
  Required: none
  Optional: `storeQuery`, `page`, `limit`, `includeRaw`

- `store`
  Required: `storeCode` or `storeSlug` or `storeUrl`
  Optional: `includeRaw`

- `search_filters`
  Required: none
  Optional: `query`, `categoryId`, `categorySlug`, `categoryUrl`, `includeRaw`

- `search`
  Required: `query`
  Optional: `page`, `limit`, `sort`, `includeRaw`

- `category`
  Required: `categoryId` or `categorySlug` or `categoryUrl`
  Optional: `page`, `limit`, `sort`, `includeRaw`

- `item`
  Required: `productId` or `productSlug` or `productUrl`
  Optional: `includeRaw`

### Example inputs

Empty input is supported and runs the Power Tools starter category `cat830704`. The examples below show explicit operation-specific calls.

```json
{
  "operation": "categories",
  "includeRaw": false
}
```

```json
{
  "operation": "search",
  "query": "spanner",
  "page": 1,
  "limit": 10,
  "sort": "relevance_desc",
  "includeRaw": false
}
```

```json
{
  "operation": "category",
  "categoryId": "cat830704",
  "page": 1,
  "limit": 10,
  "sort": "top_sellers_desc",
  "includeRaw": false
}
```

```json
{
  "operation": "item",
  "productId": "979HF",
  "includeRaw": false
}
```

```json
{
  "operation": "stores",
  "storeQuery": "London",
  "page": 1,
  "limit": 24,
  "includeRaw": false
}
```

```json
{
  "operation": "store",
  "storeCode": "TA4",
  "includeRaw": false
}
```

```json
{
  "operation": "search_filters",
  "query": "spanner",
  "categoryId": "cat830704",
  "categorySlug": "c/tools/cat830704",
  "categoryUrl": "https://www.screwfix.com/c/tools/cat830704",
  "includeRaw": false
}
```

```json
{
  "operation": "probe",
  "includeRaw": false
}
```

### Output

- **Dataset**: normalized products, categories, stores, or structured filter rows depending on the operation
- **Key-value store `OUTPUT`**: run summary with `source`, `operation`, `success`, `total`, `errors`, `proxy`, and `monetization`

### Limitations

- Search depends on the live Screwfix listing component. Category browsing is the stable alternate workflow if the search surface changes upstream.
- Store search is directory-based text matching (no geospatial nearest-store ranking)
- Review summary available on product detail, but individual review rows not extracted
- Category taxonomy is top-level from header navigation plus discovered filters (no full deep browse tree export)

### AI / MCP / API contract

- Empty input runs a buyer-useful Power Tools category starter (`cat830704`).
- Dataset contains semantic result rows only: products, categories, stores, or structured filter rows.
- A true no-match search returns an exact empty Dataset (`[]`).
- `search_filters` can run without context; it uses the Power Tools starter category only when no query/category context is provided.
- `OUTPUT` contains status, counts, supported operations, errors, and an `agent` provenance envelope.
- Product rows expose stable IDs, names, brand/category context, GBP pricing, stock state, source URL, and rich technical fields where available.

# Actor input Schema

## `operation` (type: `string`):

Actor operation to execute. If omitted, a buyer-useful Power Tools category starter is used.

## `query` (type: `string`):

Required for search. Optional for search\_filters when you want live filters from a search page.

## `page` (type: `integer`):

Optional for search, category, stores. One-based page index.

## `limit` (type: `integer`):

Optional for search, category, stores. Requested page size (max 120).

## `sort` (type: `string`):

Optional for search, category. Supported values: relevance\_desc, price\_desc, price\_asc, brand\_asc, brand\_desc, rating\_desc, top\_sellers\_desc.

## `categoryId` (type: `string`):

Optional for category or search\_filters. Screwfix category id from categories or previous output. If category/search\_filters has no explicit context, the runtime uses starter category cat830704.

## `categorySlug` (type: `string`):

Optional for category or search\_filters. Relative Screwfix category path. Example: c/tools/cat830704

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

Optional for category or search\_filters. Full category URL alternative to categoryId and categorySlug.

## `productId` (type: `string`):

Optional for item. Screwfix SKU / product code. Example: 979HF

## `productSlug` (type: `string`):

Optional for item. Relative product path. Example: p/dewalt-drill/979hf

## `productUrl` (type: `string`):

Optional for item. Full Screwfix product URL.

## `storeCode` (type: `string`):

Optional for store. Screwfix branch code. Example: TA4

## `storeSlug` (type: `string`):

Optional for store. Relative store path. Example: stores/TA4/aberdare

## `storeUrl` (type: `string`):

Optional for store. Full Screwfix store URL.

## `storeQuery` (type: `string`):

Optional for stores. Search text for store code, name, or slug.

## `includeRaw` (type: `boolean`):

Optional for any operation. Include the unnormalized source payload in the OUTPUT summary.

## Actor input object example

```json
{
  "operation": "category",
  "page": 1,
  "limit": 10
}
```

# Actor output Schema

## `results` (type: `string`):

Primary machine-readable Dataset: products, categories, stores, or structured filter rows.

## `summary` (type: `string`):

Run status, counts, errors, supported operations, monetization metadata, and AI provenance under OUTPUT.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("dromb/screwfix-uk-wave3").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("dromb/screwfix-uk-wave3").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 '{}' |
apify call dromb/screwfix-uk-wave3 --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dromb/screwfix-uk-wave3"
        }
    }
}

```

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/ogSwAfv0nRbqPiZEV/builds/xifJRJevYUvPMx735/openapi.json
