Skip to main content

DealerOn Source

DealerOn builds dealer websites for several OEMs' franchise networks. A DealerOn search page holds no vehicles of its own: the browser requests them from a JSON endpoint, and that endpoint is public. DealerOnInventoryRawComponent reads it for any OEM whose dealers run the platform.

assetdealers
stellantis/us/raw/dealer_on_dealer_listings64

One component, one JSON file per OEM. The component is ai_public.components.dealer_on.DealerOnInventoryRawComponent; the file is named by the dealers_json attribute in that OEM's defs.yaml and sits beside it.

Credentials

None. No API key, no token, no session. A plain User-Agent is served. DealerOn does not fingerprint the TLS handshake, which is what Dealer Inspire and Dealer eProcess use to refuse a request whose headers look like a browser's.

Adding an OEM or a dealer

The JSON is keyed by that OEM's own dealer code, so the raw rows join back to its dealer table without a crosswalk:

{
"27359": {
"dealer_id": 24210,
"domain": "https://www.gunncdjr.com"
}
}

Adding a dealer means adding an entry. Adding an OEM means a defs.yaml pointing at a new JSON file — no component change.

Dealer identifiers

Two identifiers address the endpoint: a DealerId and a PageId. Only DealerId is stable enough to check in; PageId names the dealer's new-vehicle search page and is resolved at fetch time.

Both are in the search page itself, in a dlron-srp-model script element carrying the page's JSON model:

curl -s --http2 -L --compressed -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" https://www.gunncdjr.com/searchnew.aspx \
| grep -o "<script id='dlron-srp-model'.*</script>" | head -c 400

The model also carries SearchResultsListModel.ResultsCount, the dealer's stocked count, which the fetch uses to drop dealers holding no new vehicles before requesting anything.

DealerId is the same value the dealer website platform classification records as platform_params.dealer_id, so the values in this file come from that asset. It is recorded there as a string and belongs here as a number.

When a search page reports a DealerId the file does not hold for that dealer, the dealer has moved to a different DealerOn account. The fetch logs the mismatch and skips the dealer, so its vehicles are never written under the wrong dealer code.

The endpoint

GET /api/vhcliaa/vehicle-pages/cosmos/srp/vehicles/{DealerId}/{PageId}?pt={page}&pn={size}

pt is the 1-indexed page number and pn the page size. Every response repeats the dealer's full result count at Paging.PaginationDataModel.TotalCount, which sizes the remaining pages.

Vehicles are in DisplayCards, one entry per card. A card is either an ad slot (IsAdCard) or a VehicleCard.

Page size

pn accepts 12, 24, 48 and 96. The endpoint serves any other value as 12, and reports PageSize: 12 in the response. It returns no error, so a mistyped pn costs eight times the requests and nothing raises. 96 is the largest accepted size, and the one the component sends.

Empty results

A dealer stocking no new vehicles responds with a zero-length body rather than JSON holding an empty array. A page requested past the end of a result set responds the same way. Neither body carries the TotalCount that pagination needs, so the component takes the stocked count from the search page and drops those dealers before it starts paging.

Volume

Two phases: one search-page fetch per dealer, then one endpoint call per 96 vehicles. One raw row per page.

Across the 64 Stellantis dealers the search pages reported 11,790 new vehicles, so one daily partition costs roughly 222 requests, about 3.5 per dealer. Sixty-three of the 64 dealers responded; the remaining one stocks no new vehicles.

Vehicle fields

A card carries the whole vehicle, so there is no per-VIN detail fetch. Beyond VIN, year, make, model, trim, stock number, MSRP, mileage and both colors, the fields worth naming:

  • StellantisCode — the OEM's own configuration code, present on roughly 94% of cards. It is absent on most in-transit vehicles.
  • VehicleModelCode — the model code, present on every card, including the cards that carry no StellantisCode.
  • VehicleTaggingInventoryDate — the date the vehicle entered inventory.
  • VehicleInStock, VehicleInTransit, VehicleInProduction — disjoint status flags, restated as text in VehicleStatusModel.StatusText.
  • VehiclePriceLibrary — a base64 string holding the price breakdown: MSRP, internet price, selling price and the itemized incentives.
  • ChromeStyleId — the Chrome Data style, for joining to a catalog.

The rendered page is a poorer source

The search page also carries an ItemList in ld+json, and each vehicle detail page carries a Vehicle. Both hold fewer fields than the endpoint:

  • The ItemList has VIN, name and image only, at 12 entries per page with no page-size control.
  • The Vehicle adds a price and an equipment description, and has no stock number, colors, model code or dates.

Reading one dealer's 238 vehicles through those two took 21 requests. The endpoint returns the same 238 vehicles, with more fields on each, in 3.