Halfords Scraper — Bikes, Car Parts & Prices avatar

Halfords Scraper — Bikes, Car Parts & Prices

Pricing

from $5.00 / 1,000 result scrapeds

Go to Apify Store
Halfords Scraper — Bikes, Car Parts & Prices

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

Studio Amba

Maintained by Community

Actor 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

FieldTypeDescription
categoryFilterstringPath prefix to filter products from Halfords' sitemap, e.g. "/bikes/mountain-bikes/" or "/motoring/car-parts/". Defaults to "/bikes/mountain-bikes/" if left empty.
maxResultsintegerMaximum number of products to scrape (default: 100, hard-capped at 2000)
maxSitemapFilesintegerSafety cap on how many sitemap files (each ~5,000 URLs) to scan looking for matches (default: 13, the full sitemap)
brightDataApiKeystringYour own Bright Data API key, if you want to use your own Web Unlocker zone instead of the actor's built-in one
proxyConfigurationobjectNot 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

FieldTypeExample
namestring"Boardman MHT 8.9 Mountain Bike - S, M, L Frames"
brandstring | 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)
pricenumber | null800 — current selling price in GBP
originalPricenumber | nullPre-discount list price, only present when the source marks a markdown
currencystring"GBP" — halfords.com's UK storefront is priced in GBP
skustring | null"189326" — Halfords manufacturer SKU or internal product ID
eanstring | nullEuropean Article Number / barcode, when the source provides one
urlstringFull product page URL
inStockboolean | nullLive stock availability from Halfords' inventory API. Null when the source doesn't confirm stock status — never coerced to false.
stockLevelinteger | null27 — live unit count in Halfords' inventory system
categorystring | null"Cycling/Bikes/Mountain Bikes" — full breadcrumb
ratingnumber | null4.24 — average customer rating out of 5
reviewCountinteger | null49
imageUrlstring | nullPrimary product image
imageUrlsarrayUp to 8 product image URLs
scrapedAtstringISO 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 trackinginStock and stockLevel come 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 /search endpoint is disallowed by robots.txt, so this actor works from the site's public product sitemap instead.
  • originalPrice is 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.
  • brand comes 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.
  • rating and reviewCount are absent on products with no customer reviews yet, rather than showing as 0.
  • 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-data React 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.