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.
| asset | dealers |
|---|---|
stellantis/us/raw/dealer_on_dealer_listings | 64 |
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 noStellantisCode.VehicleTaggingInventoryDate— the date the vehicle entered inventory.VehicleInStock,VehicleInTransit,VehicleInProduction— disjoint status flags, restated as text inVehicleStatusModel.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
ItemListhas VIN, name and image only, at 12 entries per page with no page-size control. - The
Vehicleadds 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.