# Screwfix Product Scraper (`sian.agency/screwfix-product-scraper`) Actor

Scrape Screwfix products — prices (inc & ex VAT in GBP), ratings, images, specs & stock status. Keyword or category search, full detail enrichment, clean JSON/CSV, no code.

- **URL**: https://apify.com/sian.agency/screwfix-product-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** E-commerce, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.75 / 1,000 overview products

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 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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

## Screwfix Product Scraper — Prices, VAT, Ratings, Specs & Stock 🔩

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Home Depot Product Scraper](https://img.shields.io/badge/Store-Home%20Depot%20Product%20Scraper-F96302)](https://apify.com/sian.agency/home-depot-product-scraper?fpr=sian) [![IKEA Product Scraper](https://img.shields.io/badge/Store-IKEA%20Product%20Scraper-0058A3)](https://apify.com/sian.agency/ikea-product-scraper?fpr=sian) [![Lowe's Product Scraper](https://img.shields.io/badge/Store-Lowe's%20Product%20Scraper-004990)](https://apify.com/sian.agency/lowes-product-scraper?fpr=sian)

#### 🎉 Extract the entire Screwfix catalogue — both consumer (inc-VAT) and trade (ex-VAT) prices in GBP, in one clean dataset
##### Built for UK price-monitoring teams, trade buyers, marketplaces and product-data analysts

---

### 📋 Overview

**Turn any Screwfix search or category into a structured product feed** — prices, VAT breakdown, ratings, images, full specifications and stock status, exported as clean JSON, CSV or Excel.

**Why professionals choose this scraper:**
- ✅ **Dual pricing**: every product carries both the inc-VAT consumer price and the ex-VAT trade price, in GBP
- ⚡ **Two speeds**: a fast Overview mode (20 products per search page) and a deep Detail mode (full spec sheet)
- 🎯 **Native search & filters**: keyword search, category browsing, sorting and Screwfix's own facet filters (brand, voltage, and more)
- 💰 **Pay-per-result**: you're charged only for the products you actually receive — no wasted spend
- 💎 **45+ fields per product**: brand, model bullets, ratings, reviews, badges, promotions, gallery images, technical specs, kit contents and manual downloads
- ✨ **No code, no account, no API key** — paste a keyword and run

---

### ✨ Features

- 🔍 **Keyword search** — anything you'd type into the Screwfix search bar (`cordless drill`, `kitchen tap`, `led light bulb`)
- 🧭 **Category browsing** — sweep a whole category by its path (advanced)
- 💷 **VAT-aware pricing** — inc-VAT and ex-VAT prices, was-price, savings amount and savings %
- ⭐ **Ratings & reviews** — average star rating and review counts
- 📷 **Image galleries** — hero image in Overview, full gallery in Detail
- 📐 **Full specifications** — the complete technical specs table per product (Detail mode)
- 📦 **Stock & fulfilment** — delivery / collection eligibility, trade-counter stock, availability status
- 🎉 **Promotions & badges** — live deal badges and bundle promotions
- 📄 **Manuals & datasheets** — direct download links where available (Detail mode)
- 🔃 **Native sorting & filters** — top sellers, price, rating, brand + facet filters

---

### 🎬 Quick Start

Provide a keyword (or several), pick a mode, and run. Results stream straight into the Apify dataset.

```bash
curl -X POST https://api.apify.com/v2/acts/sian.agency~screwfix-product-scraper/runs?token=YOUR_TOKEN \
-H 'Content-Type: application/json' \
-d '{"keywords": ["cordless drill"], "scrapeMode": "overview"}'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Enter keywords

Add one or more search keywords (e.g. `dewalt impact driver`) — one per line.

#### Step 2: Choose a mode

Pick **Overview** for fast results or **Detail** for the full specification sheet.

#### Step 3: Run

Click Start. Watch products land in the dataset in real time.

**That's it! In under a minute, you'll have:**

- A clean table of Screwfix products with inc/ex-VAT prices in GBP
- Ratings, images and stock status for every result
- One-click export to JSON, CSV or Excel

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| keywords | array | No | Free-text Screwfix searches (e.g. `cordless drill`) |
| categoryPaths | array | No | Category paths to sweep, e.g. `tools/drills/cat830704` (advanced) |
| scrapeMode | string | No | `overview` (fast) or `detail` (full specs) |
| sort | string | No | `top_sellers`, `price_low`, `price_high`, `top_rated`, `brand_az`, `brand_za` |
| facets | object | No | Filter facets, e.g. `{ "brand": "dewalt" }` (advanced) |
| maxResults | integer | No | Cap on total products (FREE: 25, PAID: unlimited) |

**Example — keyword search:**

```json
{
  "keywords": ["cordless drill", "kitchen tap"],
  "scrapeMode": "overview",
  "maxResults": 100
}
```

**Example — category + filter + sort:**

```json
{
  "categoryPaths": ["tools/drills/cat830704"],
  "facets": { "brand": "dewalt" },
  "sort": "price_low",
  "scrapeMode": "detail"
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **45+ fields**, including:

| Field | Type | Description |
|-------|------|-------------|
| productTitle | string | Full product name |
| brand | string | Manufacturer / brand |
| price | number | Current price inc VAT (GBP) |
| price\_ex\_vat | number | Current price ex VAT (GBP) |
| original\_price | number | Was price inc VAT, when reduced |
| savings\_percent | number | Fractional saving (0.4 = 40% off) |
| rating | number | Average star rating (0–5) |
| review\_count | integer | Number of reviews |
| images | array | Product image URLs |
| availability\_status | string | Stock / availability status |
| specs | object | Full technical specifications (Detail mode) |
| url | string | Product page link |

**Example:**

```json
{
  "item_id": "906KV",
  "productTitle": "DEWALT DCD778P2T-SFGB 18V 2 x 5.0Ah Li-Ion XR Brushless Cordless Combi Drill",
  "brand": "DEWALT",
  "product_type": "Combi Drills",
  "price": 149.99,
  "price_ex_vat": 124.99,
  "original_price": 249.99,
  "savings_percent": 0.4,
  "currency": "GBP",
  "rating": 4.9,
  "review_count": 544,
  "images": ["https://media.screwfix.com/is/image/ae235/906KV_P"],
  "availability_status": "MISSING_SELECTED_STORE",
  "url": "https://www.screwfix.com/p/dewalt-dcd778p2t-sfgb-.../906kv"
}
```

***

### 💼 Use Cases & Examples

#### 1. Trade vs Retail Price Intelligence

**Procurement teams comparing trade (ex-VAT) and consumer (inc-VAT) pricing across suppliers.**

**Input:** Your category keywords
**Output:** Both price points per product, plus savings %
**Use:** Build a live UK trade-pricing benchmark.

#### 2. Competitor & Promo Monitoring

**Retail analysts tracking Screwfix prices, was-prices and deal badges over time.**

**Input:** Keywords or category paths
**Output:** Current price, was-price, savings, badges and promotions
**Use:** Detect price drops and bundle deals as they go live.

#### 3. Product Feed Enrichment

**Marketplaces and resellers populating listings with rich specs.**

**Input:** Detail mode on your SKUs' keywords
**Output:** Full technical specifications, bullets, gallery images, manuals
**Use:** Auto-fill product pages with structured spec sheets.

#### 4. Assortment & Catalogue Research

**Category managers mapping Screwfix's range by brand and category.**

**Input:** Category paths with brand facets
**Output:** Every product in scope, brand-filtered
**Use:** Understand range depth and brand coverage.

#### 5. Market & Demand Research

**Analysts studying ratings and review volumes to gauge demand.**

**Input:** Top-rated sort on a category
**Output:** Ratings and review counts per product
**Use:** Surface the best-reviewed products in any segment.

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/screwfix-product-scraper').call({
  keywords: ['cordless drill'],
  scrapeMode: 'overview',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/screwfix-product-scraper').call(
    run_input={'keywords': ['cordless drill'], 'scrapeMode': 'overview'}
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~screwfix-product-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"keywords": ["cordless drill"], "scrapeMode": "overview"}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule or webhook
2. **HTTP Request**: Call the actor API
3. **Process**: Handle the JSON results
4. **Action**: Save, notify, or transform

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 products** per run — full feature access, same quality
- No credit card required
- Perfect for testing and small projects

#### PAID Tier (Production Ready)

- **Unlimited** products per run
- Faster processing, no delays
- Pay-per-result: only charged for the products you receive

💰 **Transparent pricing** — a low overview rate for high-volume harvesting and a richer rate for full-detail enrichment.

🔗 [View current pricing](https://apify.com/sian.agency/screwfix-product-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: How many products can I scrape?**
A: FREE tier: 25 per run. PAID tier: unlimited.

**Q: Do I get both VAT-inclusive and VAT-exclusive prices?**
A: Yes — every product carries both the consumer inc-VAT price and the trade ex-VAT price, in GBP.

**Q: What's the difference between Overview and Detail mode?**
A: Overview returns search/category results fast (price, rating, image, bullets). Detail also fetches each product page for the full specifications table, long overview, full gallery, kit contents and manual downloads.

**Q: Can I filter by brand or sort results?**
A: Yes — use the sort option and facet filters (e.g. `{ "brand": "dewalt" }`). Sorting and the full facet set apply best to category-path browsing.

**Q: What output formats are available?**
A: JSON, CSV and Excel — export directly from the Apify dataset.

**Q: Is this legal?**
A: Yes — we only extract publicly available data. See the legal section below.

***

### 🐛 Troubleshooting

**No products returned**

- Check the keyword spelling, or try a broader term
- For category mode, confirm the path matches the `/c/...` segment from a Screwfix category URL

**Fewer products than expected**

- FREE tier caps at 25 products per run — upgrade for unlimited
- Some searches simply have fewer matching products

**Filters not applying**

- Facet filters and sorting apply best to category-path browsing; keyword searches use Screwfix's default relevance order

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what has been published publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### ™️ Trademark & Affiliation Disclaimer

This actor is an independent tool and is **not** affiliated with, endorsed by, sponsored by, or in any way officially connected to Screwfix Direct Ltd. **"Screwfix"** and the Screwfix logo are trademarks of their respective owner. All product names, brand names and trademarks referenced in the output belong to their respective owners and are used for identification purposes only. This tool extracts only publicly available information.

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `keywords` (type: `array`):

🔍 **KEYWORD SEARCH:** Free-text Screwfix searches — exactly what you'd type into the site's search bar.

📝 **EXAMPLES:** `cordless drill` · `dewalt impact driver` · `kitchen tap` · `led light bulb`

💡 **TIP:** Add one keyword per line — each runs as its own search and all results land in the same dataset.

🖊️ **BULK EDIT:** Click "Bulk edit" to paste many keywords at once (one per line).

✅ **IMPORTANT:** Provide either keywords OR category paths (at least one is needed to have something to scrape).

## `categoryPaths` (type: `array`):

🧭 **CATEGORY BROWSING (Advanced):** Scrape a whole Screwfix category instead of a keyword search.

🔧 **HOW TO GET IT:** Open any Screwfix category page and copy the path after `/c/` from the URL (e.g. from `screwfix.com/c/tools/drills/cat830704` copy `tools/drills/cat830704`). Paste that here.

💡 **TIP:** Leave this empty if you're only using keywords — it's purely an advanced alternative for category-level harvesting.

🖊️ **BULK EDIT:** Add one category path per line to sweep multiple categories in a single run.

## `scrapeMode` (type: `string`):

⚙️ **SCRAPE DEPTH:** Choose how much data to pull per product.

⚡ **Overview (fast):** Search results only — price (inc & ex VAT), ratings, image, brand, key bullets, category and stock status. Fastest and cheapest path.

🔬 **Detail (enriched specs):** Everything in Overview PLUS the full technical specifications table, the long product overview, the full image gallery, kit contents and manual/datasheet download links scraped from each product page.

💡 **TIP:** Start with Overview to scope your catalog, then switch to Detail when you need the complete spec sheet for feeds or comparisons.

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

🔃 **RESULT ORDERING:** Order results using Screwfix's own native sort options — so you get the same ranking real shoppers see.

🏆 **Top sellers** surfaces the most popular products first · 💲 **Price** sorts ascending or descending · ⭐ **Top rated** leads with the highest-reviewed items · 🅰️ **Brand** sorts A→Z or Z→A.

ℹ️ Note: sorting applies to category-path browsing; keyword searches use Screwfix's default relevance order.

## `facets` (type: `object`):

🎛️ **FACET FILTERS (Advanced):** Narrow a category by Screwfix's own filter facets, passed through as key/value pairs.

📝 **EXAMPLES:** `{ "brand": "dewalt" }` · `{ "brand": "makita", "voltage": "18v" }`

🔧 **HOW TO FIND FACETS:** Each run prints the available filters for the first page in the log; use those facet names as keys.

💡 **TIP:** Filters apply best to category-path browsing where the full facet set is available.

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

🔢 **RESULT CAP:** Maximum number of products to return across all keywords and categories combined.

🎁 **TIER-BASED LIMITS:**

- **FREE users:** Up to 25 products per run
- **PAID users:** Unlimited — scrape entire catalogs in a single run

💡 **TIP:** Keep this low while you dial in your keywords, then raise it once the output looks right.

## Actor input object example

```json
{
  "keywords": [
    "cordless drill"
  ],
  "scrapeMode": "overview",
  "sort": "top_sellers",
  "facets": {},
  "maxResults": 100
}
```

# Actor output Schema

## `screwfixProducts` (type: `string`):

Scraped Screwfix products with prices, promotions, ratings, images, specs and stock status.

# 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 = {
    "keywords": [
        "cordless drill"
    ],
    "facets": {}
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/screwfix-product-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 = {
    "keywords": ["cordless drill"],
    "facets": {},
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/screwfix-product-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 '{
  "keywords": [
    "cordless drill"
  ],
  "facets": {}
}' |
apify call sian.agency/screwfix-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=sian.agency/screwfix-product-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Screwfix Product Scraper",
        "description": "Scrape Screwfix products — prices (inc & ex VAT in GBP), ratings, images, specs & stock status. Keyword or category search, full detail enrichment, clean JSON/CSV, no code.",
        "version": "1.0",
        "x-build-id": "uNFzoehBNNNpkloTO"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~screwfix-product-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-screwfix-product-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/sian.agency~screwfix-product-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-screwfix-product-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/sian.agency~screwfix-product-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-screwfix-product-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": {
                    "keywords": {
                        "title": "🔍 Search Keywords",
                        "type": "array",
                        "description": "🔍 **KEYWORD SEARCH:** Free-text Screwfix searches — exactly what you'd type into the site's search bar.\n\n📝 **EXAMPLES:** `cordless drill` · `dewalt impact driver` · `kitchen tap` · `led light bulb`\n\n💡 **TIP:** Add one keyword per line — each runs as its own search and all results land in the same dataset.\n\n🖊️ **BULK EDIT:** Click \"Bulk edit\" to paste many keywords at once (one per line).\n\n✅ **IMPORTANT:** Provide either keywords OR category paths (at least one is needed to have something to scrape).",
                        "default": [
                            "cordless drill"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "categoryPaths": {
                        "title": "🧭 Category Paths (Advanced)",
                        "type": "array",
                        "description": "🧭 **CATEGORY BROWSING (Advanced):** Scrape a whole Screwfix category instead of a keyword search.\n\n🔧 **HOW TO GET IT:** Open any Screwfix category page and copy the path after `/c/` from the URL (e.g. from `screwfix.com/c/tools/drills/cat830704` copy `tools/drills/cat830704`). Paste that here.\n\n💡 **TIP:** Leave this empty if you're only using keywords — it's purely an advanced alternative for category-level harvesting.\n\n🖊️ **BULK EDIT:** Add one category path per line to sweep multiple categories in a single run.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "scrapeMode": {
                        "title": "⚙️ Scrape Mode",
                        "enum": [
                            "overview",
                            "detail"
                        ],
                        "type": "string",
                        "description": "⚙️ **SCRAPE DEPTH:** Choose how much data to pull per product.\n\n⚡ **Overview (fast):** Search results only — price (inc & ex VAT), ratings, image, brand, key bullets, category and stock status. Fastest and cheapest path.\n\n🔬 **Detail (enriched specs):** Everything in Overview PLUS the full technical specifications table, the long product overview, the full image gallery, kit contents and manual/datasheet download links scraped from each product page.\n\n💡 **TIP:** Start with Overview to scope your catalog, then switch to Detail when you need the complete spec sheet for feeds or comparisons.",
                        "default": "overview"
                    },
                    "sort": {
                        "title": "🔃 Sort Order",
                        "enum": [
                            "top_sellers",
                            "price_low",
                            "price_high",
                            "top_rated",
                            "brand_az",
                            "brand_za"
                        ],
                        "type": "string",
                        "description": "🔃 **RESULT ORDERING:** Order results using Screwfix's own native sort options — so you get the same ranking real shoppers see.\n\n🏆 **Top sellers** surfaces the most popular products first · 💲 **Price** sorts ascending or descending · ⭐ **Top rated** leads with the highest-reviewed items · 🅰️ **Brand** sorts A→Z or Z→A.\n\nℹ️ Note: sorting applies to category-path browsing; keyword searches use Screwfix's default relevance order.",
                        "default": "top_sellers"
                    },
                    "facets": {
                        "title": "🎛️ Filters (Advanced)",
                        "type": "object",
                        "description": "🎛️ **FACET FILTERS (Advanced):** Narrow a category by Screwfix's own filter facets, passed through as key/value pairs.\n\n📝 **EXAMPLES:** `{ \"brand\": \"dewalt\" }` · `{ \"brand\": \"makita\", \"voltage\": \"18v\" }`\n\n🔧 **HOW TO FIND FACETS:** Each run prints the available filters for the first page in the log; use those facet names as keys.\n\n💡 **TIP:** Filters apply best to category-path browsing where the full facet set is available.",
                        "default": {}
                    },
                    "maxResults": {
                        "title": "🔢 Max Results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "🔢 **RESULT CAP:** Maximum number of products to return across all keywords and categories combined.\n\n🎁 **TIER-BASED LIMITS:**\n- **FREE users:** Up to 25 products per run\n- **PAID users:** Unlimited — scrape entire catalogs in a single run\n\n💡 **TIP:** Keep this low while you dial in your keywords, then raise it once the output looks right.",
                        "default": 100
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
