Vander Haag's Parts Scraper — Heavy Truck Parts Prices & Stock
Pricing
from $1.00 / 1,000 part listings
Vander Haag's Parts Scraper — Heavy Truck Parts Prices & Stock
Scrape Vander Haag's heavy-truck parts and whole trucks: price, stock, yard, OEM part number, fitment, and donor VIN. Search, part-number lists, SKUs, monitoring, and a catalog export of the full inventory.
Pricing
from $1.00 / 1,000 part listings
Rating
0.0
(0)
Developer
Andrej Kiva
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Security
Limited permissionsShare
Vander Haag's Parts Scraper
Disclaimer: Unofficial tool — not affiliated with, sponsored by, or endorsed by Vander Haag's, Inc. or its affiliates. Data is read from publicly accessible search, part, and truck pages only. No login. You are responsible for complying with applicable law and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.
Scrape one US heavy-truck salvage dealer: used, new, rebuilt, and aftermarket parts, plus whole trucks. Rows include price, call-for-price, yard and quantity, OEM part number, fitment, donor VIN, and stock. The inventory is hundreds of thousands of items across about 600 part types and 12 yards. Catalog mode can export the whole inventory. Use it as a Vander Haag's scraper and API alternative from Python, Node.js, or MCP, and export the dataset as JSON.
The site serves US visitors, so the default proxy is Apify in the United States. If the site blocks a run, it fails with a clear BLOCKED message instead of returning an empty dataset.
Set memory to 2048 MB for search. SKU-only runs still launch on the same build.
Pricing
Pay per event. A tiny start fee applies to every run.
| Event | Price | What you get |
|---|---|---|
part-listing | $1.00 per 1,000 rows | Part or truck rows from search or catalog |
part-details | $3.00 per 1,000 rows | Full details: stock by store, fitment, part number, donor VIN, warranty, and all images |
monitor-change | $3.00 per 1,000 rows | Monitor changes |
Examples: 10,000 catalog rows are about $10. 1,000 detail rows are about $3.
When to use
- Price and stock for a list of OEM or cross-reference numbers.
- A filtered search (category, make, model, condition, yard) with up to 500 cards per page.
- Whole trucks, with optional parts from the donor unit.
- A scheduled watch for new rows, price changes, stock or quantity changes, and removals.
- A full catalogue export. By default it searches every homepage inventory type (500 cards per page, deduped by SKU).
catalogSource: sitemapwalks sitemap files instead. SetmaxItems.
Input
maxItems: 0 means no limit. Example bodies for each mode are INPUT.json (search), INPUT.details.json, INPUT.partNumbers.json, INPUT.urls.json, INPUT.trucks.json, INPUT.catalog.json, INPUT.monitor-query.json, and INPUT.monitor-skus.json.
| Field | Role |
|---|---|
mode | search (default), details, partNumbers, urls, trucks, catalog |
catalogSource | search (default) or sitemap. Catalog search walks inventory types; sitemap fetches detail URLs |
catalogCategories | Optional inventory-type slugs. Empty means every type in the homepage nav |
keywords | Part number, cross-reference, or free text |
partNumbers | One search each |
category, subcategory, inventoryType, manufacturer, model, itemCategory | Search filters |
conditions | NEW, USED, REBUILT, FOR PARTS |
stores | Yard codes CB, DA, DM, IN, KC, CO, LV, SF, SP, SL, SV, WM |
sort | match, lowest-price, highest-price |
startUrls | Search, detail, or trucks URLs |
skus | Detail pages for those inventory ids |
includeDetails | Open the detail page after a card search |
includeStoreAvailability | Yard and quantity on detail rows |
includeUnitParts | Also list parts for the donor vehicleId |
maxItems | 0 = no limit |
monitorMode, monitorStoreName, resetMonitorState | Named key-value watch, one key per SKU |
proxyConfiguration | Apify proxy, country US |
concurrency | Parallel detail fetches, 1–10 |
{"mode": "partNumbers","partNumbers": ["Q43-6080-1-2-031C", "P4272"],"includeDetails": true,"maxItems": 20,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyCountry": "US" }}
Output
Missing values are null. recordType is part or truck. $0.00 becomes price: null and callForPrice: true. A page titled Product Not Available is a removed row, not a parse failure.
| Field | Meaning |
|---|---|
sku, url, canonicalUrl | Inventory id, SKU URL, and the filter canonical |
recordType, title | part or truck, and the H1 |
partNumber, stockTag | OEM / cross-reference, and the internal tag when it differs from the SKU |
condition, partSource | NEW / USED / REBUILT / FOR PARTS, and used / new / aftermarket / rebuilt |
price, currency, callForPrice, inStock | USD price, call-for-price flag, availability |
storeAvailability | {store, city, state, qty} |
itemLocation, category, subcategory, inventoryType, manufacturer, model | Yard line and taxonomy |
specs, fitment | Spec table and Reference Info lines |
donorVin, donorVehicle, vehicleId | Donor unit |
engine, transmission, gvw, mileage, hours | Parsed from the spec table or the description |
description, warranty, images, similarItems | Copy, warranty text, pix URLs, similar {sku, title, price} |
scrapedAt, monitorChange | UTC time, and new / price_changed / stock_changed / removed |
{"sku": "26068481","url": "https://www.vanderhaags.com/detailview.php?part=26068481","recordType": "part","title": "1999-2010 Sterling L9513 1 Piece Steel Bumper - Used","partNumber": null,"condition": "USED","partSource": "used","price": 725,"currency": "USD","callForPrice": false,"inStock": true,"storeAvailability": [{ "store": "DM", "city": "Des Moines", "state": "IA", "qty": 1 }],"itemLocation": "Des Moines, IA","manufacturer": "Sterling","model": "L9513","donorVin": "2FZHAZCV75AN80258","vehicleId": "168804","monitorChange": null}
Monitor
Use one named store per watch (monitorStoreName). Each SKU is its own key. Keep sort and the filters identical between runs.
Query watch. Leave skus empty and schedule the same search. The first run emits every row as new and stores the window. Later runs emit only new, price_changed, stock_changed, and removed (a SKU that left the window).
SKU watch. Pass skus and turn monitorMode on. Each run re-reads those detail pages and emits price, stock, or quantity changes, plus removed when the title is Product Not Available.
resetMonitorState clears that store’s window before the run.
Modes
search — filters, 500 cards per page, card fields only.
details — the same search, then one detail page per SKU. includeDetails does this from the other search modes.
partNumbers — keywordsearch once per number.
urls — startUrls are detected (search, detailview.php by part or filter URL, trucks.php). skus go straight to detail pages.
trucks — inventorytype=truck, optional itemCategory. includeUnitParts follows vehicleId into that donor’s parts.
catalog — export the whole inventory (hundreds of thousands of items, about 600 part types, 12 yards). catalogSource: search (the default) loads inventory-type slugs from the homepage nav and pages each type at 500 cards. Rows are search cards unless includeDetails is on. catalogCategories limits the types. catalogSource: sitemap walks sitemap files, fetches detail pages at concurrency, and pushes each new SKU as soon as that page returns. Set maxItems.
Use cases
- A broker checks a spreadsheet of OEM numbers and keeps the rows whose price or yard quantity changed.
- A yard compares Sterling bumper stock and fitment before calling a store.
- A reseller schedules a lowest-price Cummins watch and reads only
monitorChangerows.
Integration examples
Node.js
import { ApifyClient } from "apify-client";const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor("crawloop/vanderhaags-parts-scraper").call({mode: "partNumbers",partNumbers: ["Q43-6080-1-2-031C"],includeDetails: true,maxItems: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("crawloop/vanderhaags-parts-scraper").call(run_input={"mode": "search","keywords": "cummins","conditions": ["USED"],"sort": "lowest-price","maxItems": 20,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["sku"], item["price"], item["itemLocation"])
cURL
curl -X POST "https://api.apify.com/v2/acts/crawloop~vanderhaags-parts-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"mode":"urls","skus":["26068481"],"maxItems":1}'
MCP and AI assistants
Use this Actor from AI tools via Apify MCP. Connect your Apify account, then call this Actor by its name.
Example prompts:
- "Run vanderhaags-parts-scraper in partNumbers mode for these OEM numbers and return price, yard, and quantity as JSON."
- "Run vanderhaags-parts-scraper in trucks mode for tandem axle day cabs and summarize engine, transmission, mileage, and price."
- "Using the SKU monitor input, list only rows whose monitorChange is price_changed or removed."
Related Actors
| Actor | Role |
|---|---|
| Vander Haag's Parts Scraper ◄── you are here | US heavy-truck parts and trucks: price, yard stock, fitment, donor VIN |
| TruckPaper Scraper | US commercial trucks and trailers for sale |
| Truck1 Scraper | European trucks and trailers |
| Car-Part Scraper | Used auto parts and recycler stock |
| PartsHotlines Scraper | Used auto parts on the Hotlines yard network |
| LKQ Online Scraper | Used OEM price, interchange, and yard |
| Row52 Scraper | Junkyard donor cars: VIN, yard, row |
| Pick-n-Pull Scraper | Self-service yard inventory: VIN, row |
| RockAuto Scraper | US catalog price, core, and fitment |
| CarParts.com Scraper | US aftermarket price and catalog status |
FAQ
Why did the run fail instead of returning zero rows?
The site serves US visitors, so the default proxy is Apify in the United States. If the site blocks a run, it fails with a clear BLOCKED message instead of returning an empty dataset.
Why is the price null?
The page showed $0.00. callForPrice is true.
Does the sitemap list 643,748 products?
No. Those are filter URLs. Catalogue search walks inventory types instead, and dedupes by SKU. catalogSource: sitemap is still available when you want those detail URLs.