Skip to main content

TVM Source (Team Velocity)

Team Velocity builds dealer websites for several OEMs' franchise networks, and the inventory API behind those sites is public. TVMInventoryRawComponent reads it for any OEM whose dealers run the platform.

assetdealers
stellantis/us/raw/tvm_dealer_listings177
mercedes/mbusa/raw/tvm_dealer_listings10

One component, one JSON file per OEM. The component is ai_public.components.tvm.TVMInventoryRawComponent; 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.

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:

{
"05103": {
"account_id": 41460,
"campaign_id": 2599,
"domain": "https://www.mbofmodesto.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

AccountId is what scopes a request to a dealer: two accounts return disjoint VIN sets, and an account returns its own vehicles regardless of the campaign paired with it.

Both ids are inlined in the page source of the dealer's own site, so a plain fetch of the homepage yields them:

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.mbofmodesto.com/ | grep -oiE '(accountid|campaignid)\D{0,8}[0-9]{3,7}' | sort -u

This returned both ids for 8 of the 10 MBUSA dealers on one run. The other two answered 403 that day, having served the same ids from their homepage during an earlier sweep. A 403 means retry, not that the ids live elsewhere.

Origin is not enforced

The API returns identical results for a request whose Origin is:

  • the dealer's real domain
  • an OEM vanity domain
  • a different dealer's domain
  • a dealer of a different OEM
  • example.com
  • absent entirely

This was measured on both the VIN listing and the per-VIN detail endpoint, with the detail responses byte-identical.

domain therefore only populates the Origin and Referer headers, which the API ignores. It reaches no URL, query parameter, or auth path. Populate it with the dealer's real site anyway, so the file stays readable and stays correct if that changes.

CampaignId must be present but its value is ignored

Pairing an AccountId with another dealer's CampaignId returned that account's own vehicle list unchanged across all 20 mismatched pairs tested. Omitting the parameter is a different matter: three accounts whose correct pair returns 182, 582, and 561 vehicles each returned 1 vehicle with CampaignId absent. The component always sends it, so this is a constraint on hand-rolled probes rather than on the asset.

Volume

Two phases: one listing call per dealer, then one detail call per new VIN. One raw row per VIN per day.

Across the 10 MBUSA dealers the listing endpoint reported 1,944 new vehicles, so roughly 1,900 detail calls per daily partition. The Stellantis fan-out has not been measured.

OEM notes

MBUSA. Four of the 10 dealers — 05103, 05643, 05745, 28106 — are listed in the MBUSA dealer API under an MBUSA *.mercedesdealer.com vanity host rather than their real domain. The domain values in the JSON are the real sites those vanity hosts lead to. Which MBUSA dealers run Team Velocity, and how that was determined, is recorded in MBUSA Dealer Website Providers.