Dealer Website Inventory Scraper avatar

Dealer Website Inventory Scraper

Pricing

from $3.99 / 1,000 results

Go to Apify Store
Dealer Website Inventory Scraper

Dealer Website Inventory Scraper

Extract bounded public dealer vehicle inventory with minimal source diagnostics. Direct public requests only; access boundaries are reported without bypass attempts.

Pricing

from $3.99 / 1,000 results

Rating

0.0

(0)

Developer

Coding Frontned

Coding Frontned

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

What does this Actor do?

This Actor reads bounded public dealer inventory pages and extracts vehicle identity, VIN or stock number, pricing, mileage, colors, fuel, descriptions, and public listing/image URLs when those fields are exposed. It supports common DealerOn, Dealer.com, Dealer Inspire, and CDK-style public pages without authentication, private endpoints, proxy use, CAPTCHA solving, or access-control bypass.

Why use it?

Use it to build a point-in-time snapshot of public dealer inventory for local inventory research, catalog comparison, and parser validation. The source is caller-supplied and may be any public dealer HTTPS page; an access boundary or page without trustworthy vehicle evidence becomes a typed diagnostic rather than a placeholder vehicle.

How it works

The Actor requests only public HTTPS dealer pages and permits bounded redirects within the original dealer host or its subdomains. It follows only clearly marked approved next-page links, processes pages sequentially within maxPages, deduplicates records by VIN, stock number, or public listing identity, and never follows vehicle detail links automatically. Response size, timeout, retries, URLs, pages, and emitted vehicles are bounded. A repository-relative fixturePath is for deterministic local checks only.

Input

{
"dealerUrls": [{"url": "https://www.danvilletoyota.com/searchnew.aspx"}],
"maxPages": 1,
"maxVehicles": 50,
"maxDetailPages": 0,
"timeoutSecs": 20,
"maxRetries": 1,
"maxResponseBytes": 5000000,
"userAgent": "",
"acceptLanguage": "en-US,en;q=0.8",
"fixturePath": ""
}

inventoryUrls and startUrls are aliases for dealerUrls; url is an alias for one URL; maxProducts is an alias for maxVehicles. proxyConfiguration is accepted for compatibility, but the implementation always uses direct public requests and reports proxyConfigured: false.

FieldTypeDefaultDescription
dealerUrlsarray of URL objectsDanville Toyota examplePublic dealer inventory/search/detail pages; up to 25 URLs.
inventoryUrlsarray of URL objects—Compatibility alias for dealerUrls.
startUrlsarray of URL objects—Compatibility alias for dealerUrls.
urlstring—Compatibility alias for one public dealer page.
maxPagesinteger3Maximum public pages requested sequentially, including starts and approved next links; 1–25.
maxVehiclesinteger50Maximum normalized vehicle rows for the complete run; 1–500.
maxProductsinteger—Compatibility alias for maxVehicles.
maxDetailPagesinteger0Retained compatibility field; unrequested vehicle detail pages are not automatically called; 0–25.
timeoutSecsinteger20Per-request timeout in seconds; 5–120.
maxRetriesinteger1Retries for transient failures; 0–3. Access challenges are never retried as a bypass.
maxResponseBytesinteger5000000Maximum streamed response size per page; 100,000–10,000,000 bytes.
userAgentstringdefaultOptional transparent user-agent string, capped at 300 characters.
acceptLanguagestringen-US,en;q=0.8Optional language preference, capped at 120 characters.
proxyConfigurationobject—Compatibility input only; direct public transport remains in use.
fixturePathstringemptyOptional repository-relative .html, .htm, or .json fixture for deterministic local checks.

Output

Normal dataset rows contain only public inventory fields, for example:

{
"recordType": "data",
"vin": "1NXBR32E73Z000001",
"stockNumber": "FIX-001",
"name": "2023 Toyota Camry SE",
"year": 2023,
"make": "Toyota",
"model": "Camry",
"trim": "SE",
"mileage": 1200,
"price": 28995,
"currency": "USD",
"dealerHost": "www.danvilletoyota.com",
"productUrl": "https://www.danvilletoyota.com/vehicle-1",
"sourceUrl": "https://www.danvilletoyota.com/searchnew.aspx",
"sourceDomain": "www.danvilletoyota.com",
"searchUrl": "https://www.danvilletoyota.com/searchnew.aspx",
"pageNum": 1,
"scrapedAt": "2026-09-16T00:00:00.000Z"
}

Access challenges, upstream failures, invalid inputs, empty pages, and pages without usable vehicle data are emitted as minimal typed diagnostic rows with recordType: "diagnostic", errorCode, url, sourceUrl, and scrapedAt. The run summary is stored in OUTPUT_SUMMARY; operational counters and remoteGates: "NOT_RUN_LOCAL_ONLY" are stored in RUN_HEALTH.

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Data fields

Field groupFields
Identity and dealervin, stockNumber, dealerHost, dealerId, name
Vehicleyear, make, model, trim, vehicleType, bodyStyle, salesClass, transmission, location
Commercial and operationmileage, price, advertisedPrice, msrp, currency, fuelType, engine
Appearance and textexteriorColor, interiorColor, description
Dealer and enrichmentdealerName, dealerPhone, dealerEmail, dealerUrl, features, options
Links and provenanceproductUrl, imageUrls, sourceUrl, sourceDomain, searchUrl, pageNum, scrapedAt

Fields are omitted when the public page does not expose a trustworthy value. A row is a point-in-time observation, not a guarantee that the vehicle remains in stock or that its price, VIN, or dealer details remain current.

Cost and limits

The Actor uses ordinary public HTTPS requests and does not call a paid vehicle-data API. Apify compute, storage, and any platform charges depend on the plan running the Actor. Input limits bound pages, retries, response bytes, source URLs, and normal vehicle rows.

Tips

  • Start with one dealer inventory page and a small maxVehicles value.
  • Supply the dealer’s public inventory/search page, not an authenticated dashboard.
  • Use maxPages only when the page publishes an explicit next link.
  • Keep maxRetries low and respect each dealer site’s terms and request rate.
  • Use fixturePath while changing parsers or schemas so local checks stay deterministic.
  • Treat diagnostic rows as source-health evidence, not vehicle inventory.

FAQ

Does the Actor log in or access dealer systems?

No. It reads only public dealer pages and public structured data in ordinary HTTPS responses.

Why did I receive a diagnostic instead of vehicles?

The source may have returned human verification, an upstream error, unsupported content, invalid input, an empty page, or no trustworthy vehicle record. Inspect errorCode, OUTPUT_SUMMARY, and RUN_HEALTH.

Does maxDetailPages make the Actor visit every vehicle page?

No. It is retained for input compatibility; this direct-only implementation follows explicit pagination but does not automatically call unrequested vehicle detail pages.

Can I use a proxy configuration?

The field is retained for compatibility, but the Actor intentionally uses direct public requests and does not bypass source access controls.

Responsible use and support

Respect each dealer site’s terms, robots guidance, applicable law, and reasonable request rates. Do not use this Actor to bypass access controls, collect restricted personal data, or represent a diagnostic as a vehicle row. For support, include the input shape, OUTPUT_SUMMARY, RUN_HEALTH, and relevant diagnostic code after removing credentials or sensitive data.

Local validation

npm run check
node --test test/public-contract.test.js
apify validate-schema
apify run --purge --input-file test/inputs/fixture.json
node validate-datasets.js

The fixture input is local-only and uses a repository-relative HTML fixture. Normal runs use direct public dealer-page requests; local validation does not claim Cloud qualification.