# Checkatrade Scraper \[$3/1k💰] | Reviews | UK Trades Leads (`ahmed_jasarevic/checkatrade-scraper`) Actor

Scrape Checkatrade, the UK's vetted tradespeople directory: company name, trade, location, rating out of 10, review count, phone and latest review text. Build UK trades lead lists, run review intelligence and research the home-services market — a real Checkatrade API alternative.

- **URL**: https://apify.com/ahmed\_jasarevic/checkatrade-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 80.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

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/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

## Checkatrade Scraper — UK Tradespeople Data, Reviews & Leads

Extract Checkatrade's UK tradespeople directory — company name, trade, location, rating out of 10, total reviews, phone and the latest review text — straight from live search results. Build UK trades lead lists, run review intelligence and research the home-services market without the official API (which doesn't expose directory data at all).

### Main Use Cases

- **UK trades lead generation** — collect vetted tradespeople (plumbers, electricians, builders, roofers) across UK postcodes and counties into clean lead lists with phone numbers
- **Build UK contractor databases** — assemble your own directory of tradespeople, complete with profile URLs and 1,500+ trade categories
- **Checkatrade review intelligence** — track ratings (out of 10), review counts and recent review text per company for reputation and competitor research
- **Home services market research** — analyse how many vetted tradespeople serve each area and trade, and how they are rated
- **CRM lead enrichment** — append Checkatrade ratings, review counts and contact data to existing B2B lead pipelines
- **Checkatrade API alternative** — the official Checkatrade API only creates jobs for affiliates; it never exposes listing, review or phone data. This actor fills that gap from publicly visible search pages.

### How It Works

The actor walks Checkatrade's public search pages in the form `https://www.checkatrade.com/Search/{trade}/in/{location}` — one row per tradesperson per searched trade × location combination. It reads the structured data embedded in each search page (schema.org `ld+json` ItemList, with a Next.js flight-data fallback), so nothing is parsed from messy HTML fragments.

Checkatrade is protected by Cloudflare, so the actor speaks plain HTTP with a Chrome-impersonating TLS/HTTP2 fingerprint (via Crawlee's Impit client) — no browser instance is needed, which keeps runs fast and the per-result price low. Pagination is followed automatically until `maxItems` is reached.

### Amazon-Style Headline: What You Get

One dataset row per tradesperson with: company name, profile URL, trade, searched location, locality, country, rating (0–10), total reviews, phone, and the most recent review text/author/rating shown on the search page.

### Input Parameters

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `startUrls` | Array\<string> | No | – | Direct Checkatrade search URLs (e.g. `https://www.checkatrade.com/Search/Plumber/in/Greater-London`). **Overrides `trades` + `locations`.** |
| `trades` | Array\<string> | No | `["Plumber"]` | Trades to search (e.g. Plumber, Electrician, Builder, Roofer). Each trade is combined with every location. |
| `locations` | Array\<string> | No | `["IG11 8BB"]` | UK postcodes or location names (e.g. IG11 8BB, Greater-London, Kent). Each location is combined with every trade. |
| `maxItems` | Integer | No | `100` | Maximum tradespeople to return. `0` = unlimited (bounded only by pagination) — prefer setting a number to control cost. |
| `maxConcurrency` | Integer | No | `10` | Pages fetched in parallel (1–50). Increase for speed, lower if blocked. |
| `pageDelayMs` | Integer | No | `250` | Delay between HTML requests to avoid rate limiting. |
| `proxyConfiguration` | Object | No | Apify proxy, RESIDENTIAL group | Search pages may block datacenter IPs behind Cloudflare — the RESIDENTIAL group gives the highest success rate. |

### Output Fields

| Field | Type | Description |
|---|---|---|
| `companyName` | string | Tradesperson/company name as shown in the directory |
| `uniqueName` | string | Unique part of the profile URL (slug) |
| `profileUrl` | string | Full Checkatrade profile URL |
| `trade` | string | Trade searched |
| `searchLocation` | string | Location searched |
| `locality` | string | Nearest locality/named area shown by Checkatrade |
| `addressCountry` | string | `GB` |
| `rating` | number | Checkatrade rating out of **10** (typically 8–10) |
| `totalReviews` | number | Total number of Checkatrade reviews on the profile |
| `phone` | string | Phone number shown in the listing (may be null if Checkatrade hides it) |
| `reviewBody` | string | Latest review text visible on the search page (null if no review shown) |
| `reviewAuthor` | string | Name of the latest review author (null if none) |
| `reviewRating` | number | Rating of the latest review (out of 10, null if none) |

### Integrations & Automation

- **Apify API** — trigger runs and fetch datasets programmatically from any app
- **Webhooks** — post run results to your own endpoint when a run finishes
- **Zapier / Make** — connect the dataset to Google Sheets, CRMs and email tools
- **Scheduling** — run weekly or monthly to refresh lead lists and track rating changes over time

Recommended pattern for lead gen: schedule the actor weekly per trade × region, keep `pageDelayMs` around 250–500, and export the dataset to your CRM.

### Related Actors

Links above are the most-used actors in the Checkatrade/UK-trades cluster on Apify, useful for comparison or for pulling richer per-profile data when needed:

- [vulnv/checkatrade](https://apify.com/vulnv/checkatrade) — most-used Checkatrade actor, profile-level crawling, 5.0 rating
- [trev0n/checkatrade-scraper](https://apify.com/trev0n/checkatrade-scraper) — discovery + direct URL modes with review extraction options
- [memo23/checkatrade-scraper](https://apify.com/memo23/checkatrade-scraper) — 36-field rows with skills, badges, member-since, opt-in full review history
- [parsebird/checkatrade-scraper](https://apify.com/parsebird/checkatrade-scraper) — per-profile with VAT and trust badges
- [lead.gen.labs Checkatrade UK trades leads with website enrichment](https://apify.com/lead.gen.labs/checkatrade-uk-trades-leads-with-website-enrichment) — adds website enrichment to leads

### FAQ

#### Why use this actor instead of the official Checkatrade API?

Checkatrade's official developer API is **affiliate-only**: its single purpose is to submit jobs (`POST /jobs`) to the Checkatrade network. It does **not** expose tradespeople listings, ratings, reviews, or contact data. The public web directory is the only accessible source of that data, which is exactly what this actor extracts.

#### What are the alternatives to this actor / to Checkatrade data?

On Apify: vulnv/checkatrade, trev0n/checkatrade-scraper, memo23/checkatrade-scraper (see Related Actors). Off-platform UK trades lead sources: MyBuilder, Rated People, TrustATrader, Checkatrade itself via the affiliated directory. This actor's edge: the lowest per-result price ($3 per 1,000 rows) with review text included by default and native trade × location expansion in one run.

#### How can I scrape Checkatrade without getting blocked?

The actor already handles TLS fingerprinting via Chrome impersonation. For large runs, use the RESIDENTIAL proxy group — Checkatrade's Cloudflare setup frequently rejects datacenter IPs.

#### What is the Checkatrade rating scale?

Out of **10** — ratings such as 9.8 or 7.6 are common. `reviewRating` is also on a 10-point scale.

#### How much does a run cost?

Pay-per-result: **$0.003 per tradesperson row** plus a $0.0005 run start. A 500-tradesperson run costs about **$1.50**; 1,000 rows cost ~$3.00.

### SEO Keywords

checkatrade scraper, checkatrade api alternative, how to scrape checkatrade, uk tradespeople data, uk trades lead generation, uk contractor database, uk trades directory scraper, trades directory data, checkatrade reviews data, checkatrade review intelligence, plumber lead lists, electrician leads, roofer leads, builder data, gas boiler servicing contractors, home services lead lists, tradesman data uk, uk business contact data, checkatrade phone numbers, crm lead enrichment, london tradespeople directory, manchester trades data, uk home services market research, vetted tradespeople directory, trades lead export

### For AI Agents & LLM Apps

**Purpose.** Given UK trades and locations (or direct Checkatrade search URLs), returns structured rows of vetted tradespeople: `companyName`, `profileUrl`, `trade`, `searchLocation`, `locality`, `rating` (out of 10), `totalReviews`, `phone`, and the latest `reviewBody`/`reviewAuthor`/`reviewRating` from the search page.

**Minimal working input:**

```json
{
  "trades": ["Plumber"],
  "locations": ["IG11 8BB"]
}
```

**Variant — direct URLs (overrides trades/locations):**

```json
{
  "startUrls": ["https://www.checkatrade.com/Search/Electrician/in/Greater-London"],
  "maxItems": 50
}
```

**Variant — multi-trade, multi-location sweep (cross-product):**

```json
{
  "trades": ["Plumber", "Electrician", "Builder"],
  "locations": ["London", "Manchester", "Birmingham"],
  "maxItems": 300
}
```

**Output fields (13):** `companyName`, `uniqueName`, `profileUrl`, `trade`, `searchLocation`, `locality`, `addressCountry`, `rating`, `totalReviews`, `phone`, `reviewBody`, `reviewAuthor`, `reviewRating`.

**Behaviors an agent should know.**

- `startUrls` takes priority: if provided, `trades` and `locations` are ignored.
- Otherwise each trade is combined with every location (cartesian product) — be deliberate or you can sweep very wide at once.
- `maxItems` defaults to 100 in the form, but the code treats **0 as unlimited** — always set an explicit cap for cost control.
- `rating` and `reviewRating` are out of **10**, not 5.
- `phone`, `reviewBody`, `reviewAuthor`, `reviewRating` are `null` when Checkatrade doesn't show them on the search page. Full review history and extra profile fields (skills, badges, member-since) are not exposed by this actor — for those, see memo23/checkatrade-scraper.
- Datacenter IPs are often blocked; instruct the caller to expect `RESIDENTIAL` proxies to be the reliable configuration for large runs.

**Billing:** Pay-per-result: $0.0005 per run (Actor Start) + $0.003 per returned tradesperson row.

### Legal & Compliance Disclaimer

This actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by Checkatrade**. It accesses only publicly visible Checkatrade search pages that require no login; it does not bypass authentication, solve CAPTCHAs, or crawl members-only areas.

You are responsible for complying with Checkatrade's Terms of Service and applicable data-protection law when using extracted data. Output may include publicly listed business contact details and the names of review authors — treat review-author names and phone numbers as personal data (UK GDPR applies). Do not use extracted data for unsolicited commercial outreach in violation of applicable law (e.g. CAN-SPAM, UK PECR). This section is a compliance note, not legal advice.

# Actor input Schema

## `startUrls` (type: `array`):

Direct Checkatrade search URLs to start from (e.g. https://www.checkatrade.com/Search/Plumber/in/Greater-London). Overrides trades + locations.

## `trades` (type: `array`):

List of trades to search for (e.g. Plumber, Electrician, Builder). Each is combined with every location.

## `locations` (type: `array`):

UK postcodes or location names to search near (e.g. IG11 8BB, Greater-London, Kent). Each is combined with every trade.

## `maxItems` (type: `integer`):

Maximum number of tradespeople to return (0 = unlimited).

## `maxConcurrency` (type: `integer`):

Maximum number of pages fetched in parallel. Increase for faster runs, decrease if Checkatrade starts blocking.

## `pageDelayMs` (type: `integer`):

Delay in milliseconds between HTML page requests to avoid rate limiting.

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

Checkatrade's HTML pages may block datacenter IPs behind Cloudflare. Use the Apify RESIDENTIAL proxy group (paid) for the highest success rate. The Actor uses browser TLS impersonation (Impit) to bypass fingerprinting.

## Actor input object example

```json
{
  "trades": [
    "Plumber"
  ],
  "locations": [
    "IG11 8BB"
  ],
  "maxItems": 100,
  "maxConcurrency": 10,
  "pageDelayMs": 250,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Open the dataset of scraped Checkatrade tradespeople

# 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 = {
    "trades": [
        "Plumber"
    ],
    "locations": [
        "IG11 8BB"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/checkatrade-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 = {
    "trades": ["Plumber"],
    "locations": ["IG11 8BB"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/checkatrade-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 '{
  "trades": [
    "Plumber"
  ],
  "locations": [
    "IG11 8BB"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call ahmed_jasarevic/checkatrade-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/checkatrade-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/4sUmUyJrd07L3EbK9/builds/0bkz1H7WHhYShyAvO/openapi.json
