Which? Trusted Traders Scraper — Vetted UK Trade Leads avatar

Which? Trusted Traders Scraper — Vetted UK Trade Leads

Pricing

$4.00 / 1,000 per trader returneds

Go to Apify Store
Which? Trusted Traders Scraper — Vetted UK Trade Leads

Which? Trusted Traders Scraper — Vetted UK Trade Leads

Scrape Which?-endorsed UK tradespeople from Which? Trusted Traders: business name, trades and services, areas covered, phone, email, website, postcode, geo, rating, review count, endorsement date and award badges. 100% phone and email fill measured on 198 live rows. No login.

Pricing

$4.00 / 1,000 per trader returneds

Rating

0.0

(0)

Developer

Scrapers Delight

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Turn Which? Trusted Traders into a clean UK tradesperson lead list. One row per endorsed business: businessName, trades, services, areasCovered, phone, email, website, streetAddress, postcode, addressRegion, latitude, longitude, rating, reviewCount, endorsedSince, yearsEndorsed and accreditations. Filter by trade, town, county, rating, review count, years endorsed, or paste listing and profile URLs. 100% of rows carry a phone number and 100% carry a contact email address — measured on 198 live profiles, not estimated. No login. No cookies. No CAPTCHA solving.

Scope: 3,674 endorsed businesses in the entire UK — counted live off Which?'s own gzipped sitemap on 2026-08-12, not quoted from a marketing page. This Actor can deliver every one of them for $14.70, which is a complete-directory offer no other UK trades scraper can make.

{
"trades": ["plumbers"],
"locations": ["london"],
"maxItems": 100,
"maxPagesPerSearch": 10
}

Click Try for free and hit Start — that block is literally the input the Actor ships with. A run on those shipped defaults returned 100 rows in 1 minute 58 seconds, with phone 100%, email 100%, website 88.0%, rating 95.0% and award badges 15.0%.


The wedge: an email address on every row

Which? Trusted Traders is the trade directory run by Which?, the UK consumer association. A business only appears on it after Which? has run a credit check, an on-site assessment and a customer-reference check — and it is re-assessed every year. That makes these rows pre-qualified in a way a Google Maps pull never is, and it makes the directory deliberately small and high-value: 3,674 businesses, not the hundreds of thousands a self-serve directory carries.

The buying reason is the contact data. Measured on the full 198-profile walk of plumbers-in-london: phone 100%, email 100%. A real mailbox, on the page, no contact form in between. For comparison, inside our own UK trades family (all links at the bottom of this page): MyBuilder publishes no phone and no email at all, and FreeIndex publishes no email, so both need a separate email-finder step before you can send anything. Here the email is just a column.

Two more things only this source has:

  • endorsedSince / yearsEndorsed — the month Which? first endorsed the firm. 64% of the 198-row sample had been endorsed 5+ years. Recency here is a real buying signal in both directions: a firm endorsed last quarter is buying tools and software now; a firm endorsed 9 years ago is an established business that renews.
  • areasCovered — the towns and postcodes a trader actually travels to, averaging 11.4 per business. That is a service radius, not a head-office pin.

As of 2026-08-12, Apify Store searches for "which trusted traders", "trusted traders", "trustedtraders" and "vetted uk traders" return no other Actor targeting trustedtraders.which.co.uk. That will not stay true forever, so judge this page on the measurements below rather than on the absence of a rival.


Read this before you buy rows

Five things that would otherwise turn into a refund request.

  1. "Years trading" does not exist on this site. Which? publishes no company founding year. yearsEndorsed is years endorsed by Which?, not years in business. It is the only tenure signal the source has.
  2. The endorsement date lives on the listing card, not the profile page. Scrape via Search or Listing URLs and you get the exact endorsement month. Paste Profile URLs and the Actor falls back to the profile's creation date, which runs a month or two earlier. Every row tells you which one you got in endorsedSinceSource.
  3. The directory is small, and a single trade in a single town runs out fast. plumbers-in-london is 198 traders and that is the whole of it. If you ask for 1,000 rows from one listing you will get 198 and a warning in the log, not an error. Add trades, add towns, or switch to sitemap mode.
  4. primaryTrade is the firm's own first trade, not the one you searched. A firm found under "Plumbers" may lead with "Boiler, central heating and gas engineers". The trade you searched is kept separately in searchTrade.
  5. rating is null for the ~5% with no reviews yet, and reviewCount is 0 for them — a real zero, not a missing value. Any minRating above 0 removes those traders.

What you get

One row per unique Which?-endorsed business. All dates are ISO-8601 (endorsedSince is YYYY-MM, profileCreatedAt / profileUpdatedAt are YYYY-MM-DD, scrapedAt is a full UTC timestamp). rating is a number out of 5. Phones are E.164.

GroupFieldsExample
IdentitybusinessName, profileUrl, businessSlug, whichId, status, whichEndorsedAZ Plumbing Contractors Limited · 03bc54d0fffa01343b5346f4283aad24
TradeprimaryTrade, trades[], services[]Boiler, central heating and gas engineers · 5 trades · 8 services
Contactphone, phoneDisplay, phones[], email, emails[], website+447712507601 · 07712507601 · info@azplumbingcontractors.co.uk
AddressstreetAddress, addressLocality, addressRegion, postcode, latitude, longitudeFlat B, 1 Grantbridge Street · London · Greater London · N1 8JL · 51.5344, -0.100203
CoverageareasCovered[], milesFromSearchCentre["London, England", "Islington", "Hackney", … , "N1"]
Reputationrating, reviewCount, ratingBreakdown{}, accreditations[]4.9 · 118 · {Customer Service: 4.9, Quality: 4.9, Value: 4.8}
TenureendorsedSince, endorsedSinceLabel, yearsEndorsed, endorsedSinceSource2017-05 · May 2017 · 9 · listing-card
Profiledescription, logo, openingHours[], galleryImageCount, profileCreatedAt, profileUpdatedAt, profileCompleteness2026-07-23 · 100
ProvenancesearchTrade, searchLocation, listingUrl, scrapedAtPlumbers · london

The dataset ships with three saved table views, so you do not have to configure columns: Which?-endorsed UK traders (the overview), Lead generation — contact columns only (name, trade, phone, email, website, address) and Vetting — ratings, tenure and awards.


Field fill — measured on 198 traders

The full walk of plumbers-in-london to exhaustion — 17 listing pages, 198 profiles, 15 distinct primary trades, 2026-08-12. Sorted by fill, so the sparse fields are impossible to miss.

FieldFillNotes
businessName100%
phone / phoneDisplay / phones100%E.164 (+4420…) and the printed form; 45% list a second number
email / emails100%a real mailbox, not a contact form
primaryTrade / trades100%the full endorsed trade list; 4.6 per business on average
postcode100%full UK postcode
streetAddress / addressLocality100%street line and town
latitude / longitude100%
areasCovered100%towns/postcodes they actually travel to — 11.4 per business
reviewCount100%0 is a real 0, not a null
endorsedSince / endorsedSinceLabel / yearsEndorsed100%2017-05 · May 2017 · 9
whichId100%the stable Which? business id
profileCreatedAt / profileUpdatedAt100%how fresh the profile is
profileCompleteness100%Which?'s own 0–100 score for the profile
description100%the trader's own copy
services97.5%individual jobs under each trade — 16.2 per business
logo96.5%
rating / ratingBreakdown94.9%out of 5, plus customer-service / quality / value sub-scores
website89.4%about one in nine publishes none
openingHours82.8%
addressRegion80.3%county; only printed when Which? holds one
accreditations14.6%award badges, e.g. "Certificate of Distinction (Jun 2020)"

Contact-only mode (fetchProfileDetails: false), measured on 117 Manchester rows: phone 100% · email 99.1% · rating 94.9% · postcode 100% · geo 100%. Every other column is still present and null, so the schema never changes between modes.

The headline that could mislead you: yearsEndorsed is not company age. It is years since Which? endorsed the firm, and it is 100% filled precisely because it is a Which? field rather than a company-registry one. If you need incorporation dates, that is a Companies House job, not this one.

Plan against the 198-row table, and remember it is one trade in one city. Every run prints its own measured fill in the log — the shipped-default 100-row run printed phone 100%, email 100%, website 88.0%, rating 95.0%, services 97.0%, areas covered 100%, endorsed-since 100%, award badges 15.0%, which is that same London listing sampled at 100 rows instead of 198.


How to run it

1. Search — trade + location (the usual choice)

{
"source": "search",
"trades": ["plumbers", "electricians"],
"locations": ["london", "manchester"],
"maxPagesPerSearch": 10,
"maxItems": 200
}

Walks https://trustedtraders.which.co.uk/{trade}-in-{location}/ — 12 businesses per page — and stops on its own when a listing runs out. Every trade is crossed with every location, so 2 × 2 = 4 listings here. Free text is slugified: "Painters & Decorators" becomes painters-and-decorators.

Listing aliases are followed on any page. Which? runs many slugs as aliases of a canonical one, and the redirect can land on page 1 or deeper: electricians-in-leeds serves a normal page 1 and then redirects page 2 to electricians-in-leeds-west-yorkshire. Read naively that looks like the end of the listing and quietly loses 14 of its 26 traders. This Actor tells the two redirects apart — a different slug is an alias to keep walking, the same slug with a page number is the end — and every listing's take is checked against the "1-12 of N" count the page advertises, with a warning if it comes up short.

2. Sitemap — the whole UK directory

{ "source": "sitemap", "maxItems": 4000 }

Reads Which?'s own gzipped sitemap and queues all 3,674 endorsed businesses. That sitemap held 5,772 URLs on 2026-08-12, of which 3,674 are /businesses/ profiles — this is the complete directory, there is nothing else to get. Combine with skip to page through it across several runs.

3. Profile URLs — specific businesses

{
"source": "profileUrls",
"profileUrls": ["https://trustedtraders.which.co.uk/businesses/az-plumbing-contractors/"]
}

Re-check a list of traders you already hold. Remember gotcha 2 above: this route sets endorsedSinceSource: "profile-created".

4. Listing URLs — paste a page from the site

{ "startUrls": ["https://trustedtraders.which.co.uk/tilers-in-london/"] }

The escape hatch for any trade or town not in the slug lists below: find the page on Which?, paste it, and the Actor adds the page numbers itself. Works alongside trades + locations.

Contact-only mode — 12× fewer requests, same price

Set "fetchProfileDetails": false and the Actor returns only what the listing card publishes — name, phone, email, postcode, geo, rating, review count and endorsement date — without opening a single profile page. Fill in this mode over 117 Manchester rows: phone 100%, email 99.1%, rating 94.9%, postcode 100%, geo 100%. The price per trader is identical either way — this buys time, not money. What you give up: website, street address, county, the full trade and service lists, areas covered, award badges, opening hours and the description.

Filters

onlyWithPhone · onlyWithEmail · onlyWithWebsite · minRating · minReviewCount · minYearsEndorsed. Everything except onlyWithWebsite is applied from the listing card, before a profile page is ever fetched, so filtered-out traders cost you nothing and the run is faster. onlyWithWebsite is the exception — the website only exists on the profile page, so that filter forces profile fetching and makes the Actor queue ~3× the candidates. Rows removed by any filter are never billed.

Resuming across runs

{ "source": "sitemap", "maxItems": 500, "skip": 500 }

Run 1 takes traders 1–500, run 2 with skip: 500 takes 501–1,000. You never re-buy a row you already have.

Scheduling and integrations

Save the input as a Task (Console → the Actor → Save as Task), then attach an Apify Schedule0 6 * * 1 for a Monday-morning refresh of your target towns. The dataset is available over the REST API, and through the standard Apify integrations (Zapier, Make, n8n, webhooks, MCP) like any other Actor. Starting a run from the API:

curl -X POST "https://api.apify.com/v2/acts/scrapersdelight~which-trusted-traders-scraper/runs?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"trades":["electricians"],"locations":["bristol"],"maxItems":50}'

Sample row

A real row from an actual run, captured 2026-08-13 01:47 UTC (the description is truncated here for length; the field is full-length in the dataset).

{
"businessName": "AZ Plumbing Contractors Limited",
"profileUrl": "https://trustedtraders.which.co.uk/businesses/az-plumbing-contractors/",
"businessSlug": "az-plumbing-contractors",
"whichId": "03bc54d0fffa01343b5346f4283aad24",
"status": "endorsed",
"whichEndorsed": true,
"primaryTrade": "Boiler, central heating and gas engineers",
"trades": ["Boiler, central heating and gas engineers", "Heating contractors", "Plumbers", "Gas installers", "Renewable energy"],
"services": ["Gas cooker installation", "Gas emergencies", "Gas safety testing and inspection", "Radiators and central heating", "Underfloor heating", "Central heating systems (installation and servicing)", "Emergency plumbing services", "Unvented cylinder installation and maintenance"],
"phone": "+447712507601",
"phoneDisplay": "07712507601",
"phones": ["+447712507601", "+442073540460"],
"email": "info@azplumbingcontractors.co.uk",
"emails": ["info@azplumbingcontractors.co.uk"],
"website": "http://www.azplumbingcontractors.co.uk",
"streetAddress": "Flat B, 1 Grantbridge Street",
"addressLocality": "London",
"addressRegion": "Greater London",
"postcode": "N1 8JL",
"latitude": 51.5344,
"longitude": -0.100203,
"areasCovered": ["London, England", "Islington", "Hackney", "Kensington And Chelsea, West London", "Holloway, Islington", "Camden, North West London", "Muswell Hill, Haringey", "Richmond Upon Thames, South West London", "Barbican, London", "Kings Cross, Islington", "N1"],
"rating": 4.9,
"reviewCount": 118,
"ratingBreakdown": { "Customer Service": 4.9, "Quality": 4.9, "Value": 4.8 },
"accreditations": ["Certificate of Distinction (Jun 2020)", "Islington County Council"],
"endorsedSince": "2017-05",
"endorsedSinceLabel": "May 2017",
"endorsedSinceSource": "listing-card",
"yearsEndorsed": 9,
"profileCreatedAt": "2017-04-10",
"profileUpdatedAt": "2026-07-23",
"profileCompleteness": 100,
"openingHours": ["Mo-Su: 24 hours"],
"galleryImageCount": 12,
"description": "AZ Plumbing Contractors Limited are a local family run plumbing and heating company based in Islington, North London. All our engineers and plumbers are qualified with over 10 years experience…",
"logo": "https://production-which-local.s3.eu-west-1.amazonaws.com/uploads/image/file/52054/gallery_large_logo_2.png",
"searchTrade": "Plumbers",
"searchLocation": "london",
"listingUrl": "https://trustedtraders.which.co.uk/plumbers-in-london/",
"milesFromSearchCentre": 3,
"scrapedAt": "2026-08-13T01:47:05.107Z"
}

Fields people misread:

  • rating is out of 5, and ratingBreakdown uses the same 0–5 scale. profileCompleteness is a 0–100 score. Do not put them in one column.
  • reviewCount: 0 means "reviewed by nobody"; rating: null means Which? published no rating (which is the same ~5% of traders).
  • phone is the first number, E.164-normalised. phones is every number on the page — 45% of traders publish a second one.
  • milesFromSearchCentre only exists on rows found through a search; it is the distance Which? printed on the card, relative to the town you searched.

Input

Fields in the order the Console shows them.

FieldTypeDefaultWhat it does
🎯 What to scrape
sourceselectsearchsearch = trade × location listings · sitemap = the whole 3,674-business directory · profileUrls = only what you paste.
tradesstring list["plumbers"]Trades to search. Free text is slugified. Vocabulary below.
locationsstring list["london"]Towns, cities, counties or regions. Crossed with every trade: 2 × 3 = 6 listings.
startUrlslisting URLs[]Paste Which? listing pages. Page numbers are added for you.
profileUrlsstring list[]Paste business profile pages. Scraped whatever source says.
🎚️ Lead-quality filters
onlyWithPhonebooleanfalseFill is 100% on 198 rows, so this normally removes nothing.
onlyWithEmailbooleanfalseFill is 100% on 198 rows, so this normally removes nothing.
onlyWithWebsitebooleanfalseDrops ~1 in 9. The only filter that needs the profile page, so it forces profile fetching.
minRatingselect0Out of 5. Anything above 0 also drops the ~5% with no reviews.
minReviewCountinteger0Social-proof floor.
minYearsEndorsedinteger0Years since Which? endorsed them — not years in business. 64% are 5+.
📦 Output shape
fetchProfileDetailsbooleantrueOff = listing card only, 12× fewer requests, same price per trader.
includeDescriptionbooleantrueThe "About" text. Off for a slim CSV.
includeServicesbooleantrue16.2 services per trader on average.
includeOpeningHoursbooleantruePresent on 82.8% of rows.
💷 Limits & cost
maxItemsinteger100Your hard cost cap. 100 = $0.40, 1,000 = $4.00, all 3,674 = $14.70.
maxPagesPerSearchinteger1012 traders per page, so 10 pages ≈ 120 per trade × town.
skipinteger0Resume across runs without re-buying rows.
⚙️ Advanced
maxConcurrencyinteger3Max 5. Measured 215/215 = 100% at concurrency 4.
requestDelayMsinteger500≈2 requests/second at concurrency 3.
proxyConfigurationproxyApify proxy (datacenter)Which? is not walled — the cheap rung is the default on purpose.

Trade slugs

The 23 trades Which? itself lists as popular, with the site's own names:

plumbers · electricians · builders · roofers · gardeners · carpenters · plasterers · glaziers · painters-and-decorators · boiler-installation · central-heating-installation-and-servicing- (the trailing hyphen is Which?'s, not a typo) · bathroom-fitters-and-designers · kitchen-installation · heat-pump-installers · burglar-alarms · carpet-cleaners · computer-repairs · damp-proofing-and-timber-preservation · drain-and-sewer-services · home-removals · aerial-and-satellite-installers · motor-vehicle-mechanics · tyre-fitters

Which?'s sitemap runs listing pages for 29 trade slugs, adding interior-designers, landscape-designers, renewable-energy, garages, painters and removals. The site serves plenty more besides — these all returned trade-specific results in London on 2026-08-12: locksmiths, tilers, fencing, driveways, flooring, pest-control, tree-surgeons, scaffolding, solar-panel-installers, window-cleaners, gas-installers, heating-contractors. Anything else: find the page on Which? and paste it into startUrls.

Location slugs

Which?'s sitemap publishes 67 area slugs — mostly counties and regions (hertfordshire, west-sussex, leicestershire, buckinghamshire, warwickshire, northamptonshire, nottinghamshire, worcestershire, berkshire, bedfordshire, herefordshire, surrey, east-sussex, greater-manchester, west-midlands, west-yorkshire, south-yorkshire, merseyside, carmarthenshire, ceredigion, pembrokeshire, monmouthshire, denbighshire, conwy, isle-of-anglesey, fife, stirling, angus, orkney, morayshire, inverclyde, north-ayrshire, south-ayrshire, east-ayrshire, south-lanarkshire, edinburgh-and-lothian, south-eastern-ni, peak-district, yorkshire-dales, south-downs, dartmoor, exmoor, brecon, ribble-valley, norfolk-broads, huntingdonshire, lairg, cowal, bristol-and-surrounding-areas) — plus cities (london, bristol, leeds, nottingham, glasgow, birmingham, edinburgh, manchester, sheffield, liverpool, cardiff, brighton, leicester, oxford, plymouth, southampton, reading, northampton).

Towns outside that list often work too — york, norwich, coventry, luton and milton-keynes each returned a full page when checked live on 2026-08-12, and some towns (croydon) are aliases Which? redirects, which the Actor follows rather than treating as the end of a listing. A slug Which? does not run returns an empty page rather than a 404, and the Actor stops with a list of live slugs instead of handing you nothing.


Pricing

$0.004 per trader returned — $4 per 1,000. Charged on the trader-scraped event. No monthly platform fee from this Actor.

RunTradersCost
The shipped default (London plumbers)100$0.40
One trade across four cities500$2.00
A full outbound list1,000$4.00
The entire UK directory3,674$14.70
  • You are charged for rows delivered. A trader fetched and then removed by your filters is never charged. A trader that appears in three different trade listings is charged once — duplicates are dropped before billing.
  • Rows are charged as they are pushed (Actor.pushData(items, 'trader-scraped')), so if you hit a budget cap you get whole rows and stop, never a half-billed dataset.
  • maxItems is your hard cost cap (default 100). It counts unique, delivered traders.
  • Contact-only mode costs the same per trader as the full profile mode. It saves time and our proxy budget, not your money.

Honest limits

  • No company founding year, anywhere. Which? does not publish one, so nothing here can tell you a firm's age. yearsEndorsed (100% filled) is years since Which? endorsed them, which is a different thing. If you need incorporation dates, join on Companies House.
  • Award badges are rare — 14.6% on 198 rows. Absence of a badge says nothing bad about a trader: every business in this dataset is Which?-endorsed by definition. Do not build a quality filter on accreditations.
  • 10.6% publish no website and ~5% have no rating at all (rating fill 94.9%). Those are Which? data gaps, not scraping failures. The upside: the 10.6% with no website, and the low-profileCompleteness rows, are a ready-made target list if you sell websites.
  • addressRegion is 80.3% — Which? only prints a county when it holds one. Postcode (100%) and lat/lon (100%) are the reliable geography.
  • The whole directory is 3,674 businesses. That is the ceiling, and no input can raise it. Which? is a vetted scheme, not a mass directory — if you need tens of thousands of UK trade rows, this is the wrong source, and our Checkatrade and FreeIndex Actors (below) read open directories instead.
  • Profile-URL runs lose the exact endorsement month and fall back to profile creation date, a month or two earlier. endorsedSinceSource tells you which you got.
  • No login, no cookies, no CAPTCHA solving service. Everything here is public directory data, and nothing behind Which?'s member login is touched.
  • UK only. Which? Trusted Traders is a UK scheme; there are no non-UK rows to get.

How it works, and what it cost to make reliable

Three enumeration routes (search listings, the gzipped sitemap, pasted URLs), then one fetch per business profile, where three sources are read at once — the schema.org JSON-LD, the in-page window.universal_variable state blob, and the rendered HTML. No single one of them carries the whole record, which is why the parser reads all three. No login, no API key, no browser automation.

Transport ladder, measured 2026-08-12 through Apify:

RungResult
Direct, no proxy (reported and then ignored — no Apify container has a home IP)200, 12/12 cards
Apify proxy, auto / datacenter200, 12/12 cards
Apify RESIDENTIAL200, 12/12 cards
Apify RESIDENTIAL + country GB200, 12/12 cards

Which? is not walled, so the default is the cheap datacenter rung and you are not billed for residential IPs you do not need. Sustained load, all measured through the Apify proxy:

TestResult
30 profile pages spread across the whole sitemap, concurrency 4, datacenter29 / 30 = 96.7%, 2.22 req/s
Same test through RESIDENTIAL + GB29 / 30 = 96.7%, 1.63 req/s
Full plumbers-in-london run: 17 listing pages + 198 profiles, concurrency 4215 / 215 = 100%
Parse success on those 198 profiles198 / 198 = 100%

The single non-200 in the sitemap sample was an HTTP 302 to /missing_business/ — a business Which? has de-endorsed — not a block. The Actor counts those separately and never reports them as failures.

robots.txt declares no crawl-delay. It disallows /users/, /signin/, /forgot, /iframe/, /feedbacks/new and the ?sort_type= / ?distance= / ?relevance= / ?endorsed_only= filter parameters — none of which this Actor touches. Pagination uses the bare /{trade}-in-{location}/{page}/ path, verified to return the same 12 businesses in the same order as the parameterised link the site itself renders. Defaults stay gentle: concurrency 3 with a 500 ms delay per worker, about 2 requests/second.


Duplicates — measured in both directions

Measured on a contiguous walk of plumbers-in-london (2026-08-12):

WalkBusiness links returnedUnique businessesDuplicates
Pages 1–12, contiguous1441440.0%
Full walk to exhaustion (17 pages)1981980.0%

There are no promoted or sponsored slots on a Which? listing page at all, so a single listing walk repeats nothing. (Our sibling TrustATrader Actor exists partly to strip 3 promoted adverts pinned to every listing page — a 23.1% per-page duplicate rate. Which? does not do that.)

Duplicates do arise from a second source, and this Actor drops them: a Which? trader is endorsed for an average of 4.6 trades, so searching several trades in the same town returns the same firm repeatedly. Measured on plumbers + electricians + builders in Manchester: 126 links → 117 unique businesses = 7.1% duplicates dropped. The Actor keeps a run-wide set keyed on the canonical profile URL, deduplicates before anything is fetched or billed, and then asserts uniqueness across everything it pushed before the run is allowed to succeed. If that assertion ever fails, the run errors instead of handing you a dirty dataset. Every run logs the exact duplicate count it dropped.

Across runs, use skip — dedupe is per-run by design.


When a run fails

This Actor fails loudly rather than handing back a quiet empty dataset:

  • 0 rows → it throws, and the message names the scope and the HTTP counts (profiles fetched, network failures, de-endorsed, unparseable, removed by your filters, removed on card data) so you can tell a filter problem from a site problem.
  • Bad trade or town slug → Which? does not 404; it serves an empty results page (verified: zzqqfoobar-in-london and plumbers-in-zzqqfoobar both return HTTP 200 with zero cards). The Actor catches that on page 1 and errors with a list of live slugs to use instead, pulled from the sitemap.
  • Markup change → if more than 20% of HTTP 200 pages carry neither schema.org JSON-LD nor the profile state blob, the run errors instead of shipping a degraded extraction.
  • Shrunken sitemap → whole-directory mode refuses to run if the sitemap holds fewer than 2,000 businesses, rather than passing off a partial directory as the whole one.
  • Short listing → if a listing yields less than 90% of the result count it advertises, and neither your page limit nor your item limit explains the gap, the run warns rather than quietly handing you a truncated town.
  • Duplicate leak → the uniqueness assertion fails the run.

A run that returns fewer rows than you asked for because the directory ran out is a warning, not an error — the log tells you how many were left.


Who buys this

  • Trade suppliers, tool brands and merchants building a UK installer list segmented by trade, service and town — services averages 16.2 rows of "what they actually do".
  • Trade software and SaaS (job management, quoting, payments — Tradify, Powered Now, Commusoft and the like) — a Which?-endorsed firm is an established business that already pays for things, and 100% of them have an email you can write to.
  • Trade insurance and finance brokers targeting vetted, annually re-assessed businesses; yearsEndorsed sorts renewal-cycle prospects from new entrants.
  • Agencies selling websites and marketing to trades — the 10.6% with no website and the low-profileCompleteness rows are the target list, and the email is already there.
  • Franchise and trade-association recruitersareasCovered (11.4 areas per firm) shows who already covers a territory you are trying to fill.
  • UK home-services market researchers — real service radii and endorsement cohorts, not a head-office pin.

Our other UK trades Actors

ActorWhat it isWhy you would use it instead
Checkatrade ScraperUK tradespeople by trade + town, rating out of 10, review counts, sample reviews, servicesAn open directory rather than an endorsement scheme. Watch the scale — its rating is out of 10, ours is out of 5
MyBuilder ScraperRanked tradespeople per trade + city, badges, verification status, review snippets, position in listFor job-marketplace ranking signals — but MyBuilder publishes no phone and no email
Rated People ScraperUK traders with ratings out of 5, full reviews and a service-area polygon (lat/lng)When you need the actual mapped service area; its phone field is often absent
FreeIndex UK ScraperGeneral UK business directory: phone, website, full postal address, geo, ratingAny FreeIndex category, not just trades — but no email is published, so pair it with an email-finder

Which? is the one you buy when you want vetted firms with a phone and an email on every row. If 3,674 businesses is not enough volume, the others cover open directories that are not limited to an endorsement scheme.


FAQ

Does this need an account, a login or cookies? No. Everything read here is a public directory page. There is no login, no cookie jar, no CAPTCHA solving service and no browser automation.

Do I really get email addresses? Yes — 100% of the 198-profile plumbers-in-london walk carried one, and 100% of the default 100-row run on 2026-08-12. They are real mailboxes printed on the profile, not contact-form links. In contact-only mode it measured 99.1% over 117 Manchester rows.

Which trades and towns work? Any trade × location page Which? runs. 23 popular trades and 67 area slugs are listed above, more are verified working, and a slug that does not exist stops the run with a list of live ones instead of returning nothing.

Can I get the whole directory in one run? Yes — {"source": "sitemap", "maxItems": 4000} queues all 3,674 endorsed businesses for $14.70. That is the complete UK directory; there is no bigger number to get.

What is "endorsed since" versus years trading? Which? publishes no founding year. endorsedSince is the month Which? first endorsed the firm, and yearsEndorsed is that in whole years. 64% of the London sample were 5+ years endorsed.

What does contact-only mode change? fetchProfileDetails: false skips every profile page: 12× fewer requests, and you keep name, phone, email, postcode, geo, rating, review count and endorsement date. You lose website, street address, county, full trades/services, areas covered, badges, opening hours and the description. Same price per trader.

Do I need a residential proxy? No. Direct, datacenter and residential all returned HTTP 200 in testing, so the default is the cheap datacenter rung — 215/215 = 100% on a sustained load. RESIDENTIAL + GB is the documented fallback if you ever see failures.

Two runs — will I get duplicates? Within a run, never: dedupe is on the canonical profile URL and is asserted before the run can succeed. Across runs, use skip to resume where you stopped.

Do I get charged for rows a filter removed? No. Filters other than onlyWithWebsite are applied from the listing card before any profile is fetched, and nothing filtered out is ever pushed or billed.

Will a run ever succeed with zero rows? No. Zero rows throws, with the scope and the HTTP counts in the message. A run that returns fewer rows than you asked for because the directory ran out logs a warning and succeeds.

Something looks wrong — how do I debug it? Read the run log. Every run prints its own enumeration counts, duplicate count, measured field fill and the uniqueness verification. That is usually enough to tell a filter problem from a Which?-side change.

Is this legal under UK GDPR? The data is public, but rows can contain personal data — see below. Lawful scraping and lawful marketing are two separate questions, and the second one is yours.


This Actor reads public pages on trustedtraders.which.co.uk and the sitemap Which? publishes in its own robots.txt. It does not log in, does not touch any path Which? Disallows (/users/, /signin/, /forgot, /iframe/, /feedbacks/new, and the ?sort_type= / ?distance= / ?relevance= / ?endorsed_only= filter parameters), and collects nothing behind any authentication.

Records can contain personal data — sole-trader names, mobile numbers and personal email addresses. You are responsible for complying with Which?'s terms of service and with how you use the data, including UK GDPR, PECR and the rules on unsolicited B2B email and telephone marketing.

Which?® and Which? Trusted Traders® are trademarks of their owner. This Actor is not affiliated with, endorsed by, or connected to Which? Limited.


Feedback

Found a missing field or want a new filter? Open an issue on the Issues tab, and if the Actor earns it, a review on the Reviews tab helps other buyers find it.