Vander Haag's Parts Scraper — Heavy Truck Parts Prices & Stock avatar

Vander Haag's Parts Scraper — Heavy Truck Parts Prices & Stock

Pricing

from $1.00 / 1,000 part listings

Go to Apify Store
Vander Haag's Parts Scraper — Heavy Truck Parts Prices & Stock

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

Andrej Kiva

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Security

Limited permissions

Share

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.

EventPriceWhat you get
part-listing$1.00 per 1,000 rowsPart or truck rows from search or catalog
part-details$3.00 per 1,000 rowsFull details: stock by store, fitment, part number, donor VIN, warranty, and all images
monitor-change$3.00 per 1,000 rowsMonitor 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: sitemap walks sitemap files instead. Set maxItems.

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.

FieldRole
modesearch (default), details, partNumbers, urls, trucks, catalog
catalogSourcesearch (default) or sitemap. Catalog search walks inventory types; sitemap fetches detail URLs
catalogCategoriesOptional inventory-type slugs. Empty means every type in the homepage nav
keywordsPart number, cross-reference, or free text
partNumbersOne search each
category, subcategory, inventoryType, manufacturer, model, itemCategorySearch filters
conditionsNEW, USED, REBUILT, FOR PARTS
storesYard codes CB, DA, DM, IN, KC, CO, LV, SF, SP, SL, SV, WM
sortmatch, lowest-price, highest-price
startUrlsSearch, detail, or trucks URLs
skusDetail pages for those inventory ids
includeDetailsOpen the detail page after a card search
includeStoreAvailabilityYard and quantity on detail rows
includeUnitPartsAlso list parts for the donor vehicleId
maxItems0 = no limit
monitorMode, monitorStoreName, resetMonitorStateNamed key-value watch, one key per SKU
proxyConfigurationApify proxy, country US
concurrencyParallel 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.

FieldMeaning
sku, url, canonicalUrlInventory id, SKU URL, and the filter canonical
recordType, titlepart or truck, and the H1
partNumber, stockTagOEM / cross-reference, and the internal tag when it differs from the SKU
condition, partSourceNEW / USED / REBUILT / FOR PARTS, and used / new / aftermarket / rebuilt
price, currency, callForPrice, inStockUSD price, call-for-price flag, availability
storeAvailability{store, city, state, qty}
itemLocation, category, subcategory, inventoryType, manufacturer, modelYard line and taxonomy
specs, fitmentSpec table and Reference Info lines
donorVin, donorVehicle, vehicleIdDonor unit
engine, transmission, gvw, mileage, hoursParsed from the spec table or the description
description, warranty, images, similarItemsCopy, warranty text, pix URLs, similar {sku, title, price}
scrapedAt, monitorChangeUTC 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 monitorChange rows.

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 os
from apify_client import ApifyClient
client = 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."
ActorRole
Vander Haag's Parts Scraper ◄── you are hereUS heavy-truck parts and trucks: price, yard stock, fitment, donor VIN
TruckPaper ScraperUS commercial trucks and trailers for sale
Truck1 ScraperEuropean trucks and trailers
Car-Part ScraperUsed auto parts and recycler stock
PartsHotlines ScraperUsed auto parts on the Hotlines yard network
LKQ Online ScraperUsed OEM price, interchange, and yard
Row52 ScraperJunkyard donor cars: VIN, yard, row
Pick-n-Pull ScraperSelf-service yard inventory: VIN, row
RockAuto ScraperUS catalog price, core, and fitment
CarParts.com ScraperUS 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.