Halfords Scraper — Bikes, Car Parts & Prices
Pricing
from $5.00 / 1,000 result scrapeds
Halfords Scraper — Bikes, Car Parts & Prices
Scrape product data from halfords.com, the UK's largest automotive parts and cycling retailer. Extract names, brands, prices, stock levels and images for any product category, unblocked with Bright Data Web Unlocker.
Pricing
from $5.00 / 1,000 result scrapeds
Rating
0.0
(0)
Developer
Studio Amba
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Halfords Scraper
Pull product data from halfords.com, the UK's largest automotive parts and cycling retailer. This scraper reads directly from Halfords' own server-rendered product pages, so it returns clean, structured data — name, brand, price, live stock level, images — for real catalogue listings, not a scraped screenshot of a page.
How to scrape Halfords data
Give the actor a category path prefix (categoryFilter, e.g. "/bikes/mountain-bikes/" or "/motoring/car-parts/") and it enumerates matching product URLs from Halfords' own public sitemap, then fetches each product page for full data.
This is a category-based actor, not a free-text search box. Halfords' /search endpoint and its category-page pagination parameter (?start=) are both disallowed in robots.txt — confirmed live — so this actor works entirely from Halfords' public sitemap (sitemap_index.xml, ~65,000 product URLs across 13 files) instead, filtered to whichever category you're after. Every URL this actor visits is a clean, robots-allowed product detail path.
Halfords sits behind Akamai's bot-management layer: a plain request to any halfords.com path — including /robots.txt itself — gets rejected outright with a 403 "Access Denied" edge page. This actor routes every request through Bright Data's Web Unlocker, which clears the block, so you don't need your own proxy or browser-automation setup.
Under the hood, Halfords runs on Salesforce Commerce Cloud via a React/PWA-Kit storefront. Every server-rendered page embeds a <script id="mobify-data"> blob holding React Query's client-side cache, and on a product page one of those cached entries is the full Salesforce Shopper Products API object for that SKU — name, brand, price, currency, EAN, live inventory, rating, category breadcrumb and complete image galleries. There's no separate hidden API call to reverse-engineer; the same Bright Data-fetched HTML page the actor already downloads for you IS the data source.
If you don't provide any input, it defaults to scraping Halfords' "Mountain Bikes" category as a demo — a real, live category with dozens of matching products.
Input
| Field | Type | Description |
|---|---|---|
categoryFilter | string | Path prefix to filter products from Halfords' sitemap, e.g. "/bikes/mountain-bikes/" or "/motoring/car-parts/". Defaults to "/bikes/mountain-bikes/" if left empty. |
maxResults | integer | Maximum number of products to scrape (default: 100, hard-capped at 2000) |
maxSitemapFiles | integer | Safety cap on how many sitemap files (each ~5,000 URLs) to scan looking for matches (default: 13, the full sitemap) |
brightDataApiKey | string | Your own Bright Data API key, if you want to use your own Web Unlocker zone instead of the actor's built-in one |
proxyConfiguration | object | Not used — this actor reaches halfords.com exclusively through Bright Data, which handles unblocking on its own. Kept for input-shape compatibility. |
What you get back
| Field | Type | Example |
|---|---|---|
name | string | "Boardman MHT 8.9 Mountain Bike - S, M, L Frames" |
brand | string | null | "Boardman" — falls back to the first word of the product name when Halfords doesn't expose a dedicated brand field (e.g. motoring/car-parts) |
price | number | null | 800 — current selling price in GBP |
originalPrice | number | null | Pre-discount list price, only present when the source marks a markdown |
currency | string | "GBP" — halfords.com's UK storefront is priced in GBP |
sku | string | null | "189326" — Halfords manufacturer SKU or internal product ID |
ean | string | null | European Article Number / barcode, when the source provides one |
url | string | Full product page URL |
inStock | boolean | null | Live stock availability from Halfords' inventory API. Null when the source doesn't confirm stock status — never coerced to false. |
stockLevel | integer | null | 27 — live unit count in Halfords' inventory system |
category | string | null | "Cycling/Bikes/Mountain Bikes" — full breadcrumb |
rating | number | null | 4.24 — average customer rating out of 5 |
reviewCount | integer | null | 49 |
imageUrl | string | null | Primary product image |
imageUrls | array | Up to 8 product image URLs |
scrapedAt | string | ISO timestamp |
Sample output
{"name": "Boardman MHT 8.9 Mountain Bike - S, M, L Frames","brand": "Boardman","price": 800,"originalPrice": 1050,"currency": "GBP","sku": "189326","url": "https://www.halfords.com/bikes/mountain-bikes/boardman-mht-8.9-mountain-bike-189326.html","inStock": true,"stockLevel": 27,"category": "Cycling/Bikes/Mountain Bikes","rating": 4.24,"reviewCount": 49,"imageUrl": "https://cdn.media.halfords.com/i/washford/189358/Boardman-MHT-8.9-Mountain-Bike---S-M-L-Frames","imageUrls": ["https://cdn.media.halfords.com/i/washford/189358/Boardman-MHT-8.9-Mountain-Bike---S-M-L-Frames","https://cdn.media.halfords.com/i/washford/189358d/Boardman-MHT-8.9-Mountain-Bike---S-M-L-Frames"],"scrapedAt": "2026-09-04T14:45:25.683Z"}
Use cases
- Price monitoring — track Halfords' own price and markdown changes on the bikes, parts or accessories you sell against.
- Stock tracking —
inStockandstockLevelcome straight from Halfords' live inventory API, so you can watch availability change over time, not just price. - Assortment research — see the full product range for a category (car parts, bike parts, tools, camping gear) without clicking through pages by hand.
- Market comparison — Halfords is the reference UK retailer for automotive parts and cycling; useful alongside other UK/EU retail scrapers when benchmarking pricing.
Coverage
halfords.com is Halfords' UK storefront, browsed here through a GB Bright Data exit — pricing and catalogue reflect the UK market (GBP). Halfords also runs a separate Ireland storefront (halfords.ie, EUR) that this actor does not cover.
Performance and cost
Halfords has no crawlable category-listing page — unlike some retailers, its category pages don't embed a product grid, and its own pagination parameter is robots.txt-disallowed. So this actor fetches one Bright Data request per product, sourced from Halfords' public sitemap, at roughly $0.0015 Bright Data cost per result. A 20-product run typically completes in a couple of minutes. Your run's usage cost only settles after the run reports SUCCEEDED — checking cost mid-run will undercount it.
Limitations
- Input is a category path prefix, not free-text search — Halfords' own
/searchendpoint is disallowed byrobots.txt, so this actor works from the site's public product sitemap instead. originalPriceis only populated when Halfords marks an item as discounted against its own list price; full-price items will show it as absent, which is correct, not missing data.brandcomes straight from the source on most categories, but falls back to the first word of the product name on categories (like motoring/car-parts) where Halfords doesn't expose a dedicated brand field at all.ratingandreviewCountare absent on products with no customer reviews yet, rather than showing as0.- Product variants (size, colour) aren't expanded into separate rows — each sitemap URL maps to one product record, generally the master or default variant Halfords itself surfaces at that URL.
- If Halfords restructures its Salesforce PWA-Kit storefront or the embedded
mobify-dataReact Query cache shape, the actor will need updating.
Support
Found an issue or need a category that isn't resolving correctly? Open an issue on this actor's Apify Store page and we'll take a look.
Why Bright Data instead of a standard proxy
Halfords' Akamai layer rejects a plain request outright with a 403 "Access Denied" page — confirmed against /robots.txt itself, which is normally the one path every crawler is allowed to fetch unhindered. Bright Data's Web Unlocker handles the fingerprinting and challenge-solving needed to get a clean response, so this actor can focus on parsing real product data instead of maintaining an anti-bot bypass.