TrustATrader Scraper [$2/1K💰] | UK Trades | Vetted Leads
Pricing
from $1.80 / 1,000 results
TrustATrader Scraper [$2/1K💰] | UK Trades | Vetted Leads
Scrape TrustATrader (trustatrader.com), the UK's vetted tradespeople directory. Trader name, trade category, town/area with lat/lon, phone, website, rating, review breakdown, vetting checks, insurer + verification date, owner name and qualifications. Cheerio-based, no browser.
Pricing
from $1.80 / 1,000 results
Rating
0.0
(0)
Developer
Ahmed Jasarevic
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Trustatrader Scraper
Scrape TrustATrader (trustatrader.com), the UK's directory of vetted tradespeople, into clean structured JSON: trader name, trade category, town/area with lat/lon, phone, website, rating, review count with a per-category breakdown, vetting checks, insurer + verification date, owner name and qualifications. Built for UK home-services lead generation, trade-insurance brokers (renewal calendars) and franchise expansion teams who need tradesperson data without the TrustATrader website's manual search.
Plain HTTP server-rendered HTML parsing (CheerioCrawler, no browser) with schema.org microdata - the cheapest and most reliable surface, since all trader data is present in the served HTML.
Main Use Cases
- UK home-services lead generation - plumbers, electricians, builders and more by trade and location, with phone, rating and review count
- Trade insurance lead targeting - insurer + insurance verification date per trader for renewal calendars
- Tradesperson database building - vetted traders with vetting checks, qualifications, associations and company legal form
- Local market analysis - rating distributions and review volume by trade and UK region
- Franchise and expansion planning - trader density and coverage per town/city
How It Works - Strategy & Bypass
Strategy: CheerioCrawler over server-rendered HTML (no browser). Reconnaissance established that TrustATrader is a classic server-rendered site behind nginx + an AWS ALB. There is no embedded JSON blob (__NEXT_DATA__, __NUXT__, __APOLLO_STATE__, ld+json), no Algolia/Meilisearch/Elasticsearch backend, and no internal JSON/GraphQL API. The only external API referenced by the site JS is a location typeahead (api.geouk.xyz/places/typeahead), which carries no trader data.
Instead, all trader data is present in the served HTML as schema.org microdata (itemtype="http://schema.org/LocalBusiness", AggregateRating, Review, PostalAddress, telephone), so a plain HTTP + HTML parse is the cheapest, most reliable surface - a browser is unnecessary.
The only obstacle is IP-level rate limiting (the origin returns HTTP 429 to datacenter IPs). This is an IP problem, not a JS problem, so it is solved with the standard Apify proxy input rather than a headless browser.
Endpoints Used
| Surface | URL pattern | Data |
|---|---|---|
| Category / listing | https://www.trustatrader.com/{trade}-in-{location} (e.g. /plumbers-in-london) | Trader cards: name, trade, town, postcode, rating, review count, phone(s), profile URL |
| Pagination | https://www.trustatrader.com/search?trade_name=...&search_trade_id=...&location_str=...&page=N (the "View more"/"Next" link) | Next page of trader cards (10 per page) |
| Trader profile | https://www.trustatrader.com/traders/{slug} | Full record: insurance details, vetting checks, qualifications, associations, lat/lon, website, description, reviews + per-category breakdown |
Flow
- Build start URLs from
trade+location(or usestartUrlsdirectly). - On each listing page, parse every trader card (
li.profile-review-cardon category pages with microdata;li.profile-cardon paginated/searchpages, same data, class-based markup) and enqueue each trader's profile URL for enrichment. - Queue all remaining result pages at once - a paginated
/searchpage reports how many pages exist, so the rest are added in a single batch (ahead of profile pages) instead of following "Next" one page at a time. The batch stops oncemaxItemstraders are queued, usesmaxPagesPerStartas the minimum page budget, and skips traders already seen. - On each profile page, parse the full record and push it to the dataset. Stop at
maxItems.
Listing and profile pages are fetched concurrently (maxConcurrency), so a 50-trader scrape is a handful of parallel HTTP requests rather than a sequential walk. Measured on 50 traders: 512 MB at concurrency 20 ~39 s vs 256 MB with default autoscaling ~82 s, at roughly the same cost.
Input Parameters
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
startUrls | array | No | [] | TrustATrader category/search URLs (e.g. https://www.trustatrader.com/plumbers-in-london) or trader profile URLs (/traders/{slug}). If provided, these are used instead of the Trade + Location fields |
trade | string | No | plumbers | Trade category slug as used in URLs, e.g. plumbers, electricians, builders, roofers-roofing, heating-engineers-and-gas-fitters, painters-and-decorators |
location | string | No | london | UK town, city or county, e.g. manchester, birmingham, kent |
maxItems | integer | No | 50 | Maximum number of trader records to return (free users capped at 10) |
fetchProfiles | boolean | No | true | Fetch each trader's profile page for the full record (insurance, vetting, qualifications, lat/lon, website, review breakdown). Disable for a faster listing-only scrape |
maxPagesPerStart | integer | No | 5 | Minimum result pages (10 traders each) per start URL; pagination continues past this when more pages are needed to reach maxItems |
maxConcurrency | integer | No | 20 | Parallel page fetches (1-50). Listing and profile pages crawl together; used as both floor and ceiling so the run starts at full speed. 5-20 is the sensible range - the site rate-limits aggressive crawling |
proxy | object | No | off | Standard Apify proxy picker. Recommended - the origin returns HTTP 429 to datacenter IPs |
Output Fields
One dataset row per trader (full field list in the dataset schema):
- Identity & location:
name,trade,town,region,postcode,latitude,longitude,profileUrl,sourceUrl - Contact:
phone,phones,website - Reputation:
rating(out of 5),reviewCount,reviewBreakdown(Initial impression, Punctuality, Cleanliness, Quality, Value, Overall opinion),reviews(recent reviews with author, date, rating, body and per-category breakdown) - Vetting & compliance:
vettingChecks,companyType,incorporatedOn,verifiedOn,insurer,insuranceVerifiedOn - Professional profile:
ownerName(best-effort),qualifications(e.g. Gas Safe Registered),associations,description - Provenance:
scrapedAt
Notes & Limitations (verified)
- Proxy recommended: the origin rate-limits datacenter IPs (HTTP 429). Enable Apify Proxy for reliable production runs.
ownerNameis best-effort: TrustATrader does not expose a dedicated owner field; the actor extracts a name when the profile text states one (e.g. "Owner: John Smith"), otherwisenull.postcodeis only exposed on category-page cards (schema.org microdata) and is merged into the profile record during enrichment; traders found on paginated/searchpages have no postcode in the HTML, so it isnullfor them.reviewBreakdownis averaged across the reviews present on the profile page.- Memory matters: Apify scales container CPU with memory, and HTML parsing is CPU work, so the actor runs on 512 MB with concurrency pinned to
maxConcurrency.
Example Input And Output
Example Input
{"trade": "electricians","location": "manchester","maxItems": 100,"fetchProfiles": true,"maxPagesPerStart": 5,"proxy": { "useApifyProxy": true }}
Example Output
{"name": "0800 Homefix Ltd","trade": "Plumbers","town": "Wokingham","region": "Berkshire","latitude": 51.4117,"longitude": -0.8336,"phone": "07360 278675","website": "http://www.0800homefix.com/","rating": 4.82,"reviewCount": 647,"reviewBreakdown": {"Initial impression": 5,"Punctuality": 4.75,"Cleanliness": 4.75,"Quality": 4.75,"Value": 4.25,"Overall opinion": 4.5},"vettingChecks": ["Identification checked","Company address verified","Customer references checked","Agreed to TrustATrader's high standards","Agreed to complaints procedure"],"companyType": "Limited company","incorporatedOn": "Incorporated as from 15th December 2021","verifiedOn": "Verified on 31st January 2022","insurer": "Simply Business Insurance","insuranceVerifiedOn": "21st July 2025","qualifications": ["Gas Safe Registered."],"associations": ["TrustATrader.com", "Gas Safe Register"],"profileUrl": "https://www.trustatrader.com/traders/0800-homefix-ltd-plumbers-wokingham"}
Integrations & Automation
- Apify API - run via
POST https://api.apify.com/v2/acts/{actorId}/runs, export viaGET /v2/datasets/{datasetId}/items?clean=true&format=json - Schedules - Apify Schedules for weekly trader-list refreshes (recommended for lead-gen databases; recurring usage improves Store recommendation signals)
- Webhooks - new or updated trader records into a CRM or lead pipeline
- Zapier / Make - via the Apify integration (e.g. new traders to Airtable/Sheets)
- Pay-per-event - $2.00 per 1,000 traders, no subscription, free 10-item preview
Related Actors
- checkatrade-scraper: the largest UK trades-directory scraper on the Store (Checkatrade), a reference point for the cluster.
- checkatrade-scraper: another Checkatrade scraper, for cross-directory coverage.
- checkatrade-scraper: own UK trades-directory actor in the same cluster.
- hipages-scraper: AU home-services marketplace data as a companion international source.
- taskrabbit-scraper: on-demand services marketplace data to widen the services cluster.
FAQ
Is there a TrustATrader API?
No public API exists. The site is server-rendered HTML behind nginx + an AWS ALB, with all trader data present as schema.org microdata on the pages (confirmed during recon: no embedded JSON blob, no Algolia/Meilisearch/Elasticsearch backend, no internal JSON/GraphQL API). The only external API is a location typeahead with no trader data.
How do I scrape TrustATrader for leads?
Set trade (e.g. plumbers) + location (e.g. london) or paste category/trader URLs into startUrls, set maxItems, and run. Enable the proxy to avoid HTTP 429 rate limits. Turn off fetchProfiles for a fast, light listing-only scrape (name, trade, town, rating, review count, phone).
What are the alternatives for UK tradespeople data?
Store alternatives: trev0n/checkatrade-scraper and memo23/checkatrade-scraper (Checkatrade), plus scrapersdelight UK trades actors. Pair with own actors checkatrade-scraper and hipages-scraper for multi-directory coverage.
Does the actor return insurance and vetting data?
Yes - with fetchProfiles: true (default) each record includes vettingChecks, insurer, insuranceVerifiedOn (insurance verification date), verifiedOn, companyType, incorporatedOn, qualifications and associations, all parsed from the published profile.
Why do I get 429 errors?
The origin rate-limits datacenter IPs. This is an IP-level block, not a JS challenge - enable the Apify proxy (recommended for production runs) and keep maxConcurrency in the 5-20 range.
Which trades and areas are covered?
Any trade slug used in TrustATrader URLs (plumbers, electricians, builders, roofers-roofing, heating-engineers-and-gas-fitters, painters-and-decorators, ...) across any UK town, city or county. startUrls accept any category or profile URL directly.
How much does a run cost?
$2.00 per 1,000 trader records, pay-per-event, with a free 10-item preview. A typical 50-trader run with profiles costs ~$0.14 incl. the start event; fetchProfiles: false halves the request volume for listing-only datasets.
SEO Keywords
trustatrader scraper, uk tradespeople directory, trade leads uk, plumbers leads, electricians leads, tradesman database, checkatrade scraper, vetted trades data, home services lead generation, uk trade insurance leads, gas safe engineers data, roofing leads uk, local business data uk, trader reviews data, plumbing business leads, trustatrader api, contractor data uk, tradespeople email list, building contractor leads, verified trader directory
For AI Agents & LLM Apps
- Purpose: returns one JSON row per UK tradesperson from TrustATrader (name, trade, location + lat/lon, phone, website, rating/reviews, vetting checks, insurance and verification dates, qualifications).
- Minimal working input:
{ "trade": "plumbers", "location": "london", "maxItems": 10, "fetchProfiles": false }
- Variant input (full profiles - only when
fetchProfiles: true):
{ "trade": "electricians", "location": "manchester", "maxItems": 50, "fetchProfiles": true, "proxy": { "useApifyProxy": true } }
- Output field names:
name, trade, town, region, postcode, latitude, longitude, phone, phones, website, rating, reviewCount, reviewBreakdown, vettingChecks, companyType, incorporatedOn, verifiedOn, insurer, insuranceVerifiedOn, ownerName, qualifications, associations, description, reviews, profileUrl, sourceUrl, scrapedAt. - Behaviors an agent should know:
startUrlstake priority overtrade/locationwhen both are set - pass category or profile URLs directly, or let the actor build them from trade + location.fetchProfiles(default true) roughly doubles the request volume (listing + profile pages) and is what unlocksinsurer,vettingChecks,qualifications, lat/lon, website andreviewBreakdown. Turn it off for a fast listing-only run; those fields are thennull.maxConcurrencyis both floor and ceiling - the run starts at full speed; the site rate-limits aggressive crawling (429), so 5-20 is the sensible range and 20 is the default.postcodeisnullfor traders found via paginated/searchpages (the HTML does not publish it);ownerNameis best-effort from profile text.reviewBreakdownis averaged only over reviews present on the profile page at scrape time.
- Billing: pay-per-event - $0.002 per trader row, $0.00005 per run start. Proxy usage billed separately when enabled.
Legal & Compliance Disclaimer
This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by TrustATrader (trading of the UK company behind trustatrader.com). It accesses only publicly available directory pages; it does not bypass login, authentication or paywalls, and does not solve CAPTCHAs.
Users are responsible for complying with TrustATrader's terms of service, robots.txt and applicable data-protection law (UK GDPR and the Privacy and Electronic Communications Regulations apply to trader contact data). The output includes phone numbers intended for legitimate business contact; do not use them for unsolicited commercial outreach in violation of applicable law.