CarStat.dev
Connect key
Core concepts

Cars, listings and IDs

A car is one physical vehicle. When the same vehicle is advertised on several sites, we merge those ads into one car with several listings. Price, mileage, photos and location belong to the listing; make, model and specs belong to the car.

Four kinds of ID appear in every response. They live in separate namespaces, so never pass one where another is expected.

Car IDl_eCJb-8zB_XcJ-z6Y7oZWjwOpaque string at data.id. Use with /cars/{car_id}. Store it as text.
Listing ID42802955The source's own ad ID at listings[].external.id. Only unique together with its domain.
Domain ID55613The source site at external.domain.id. Enabled IDs come from /domains.
Brand and model IDs88 · 573Catalogue IDs at brand.id and model.id. Come from /brands and /models.
  • A car's listings is limited to your enabled sources, but can include several listings from the same site. Never assume the first listing is the one you asked for; match on domain.id and external.id.
  • Missing or null means "not provided by the source", never zero or false.
  • The contract is additive. New fields can appear at any time; ignore what you don't use and don't fail on unknown keys.
  • hash is a SHA-256 of the car without timestamps. If it hasn't changed since your last sync, you can skip the update.
GET /cars/{car_id} · excerpt Live
{
  "data": {
    "id": "l_eCJb-8zB_XcJ-z6Y7oZWjw",
    "vin": "wddhf0cb3ea952710",
    "brand": { "id": 88, "name": "Mercedes-Benz" },
    "model": { "id": 573, "name": "E-klasse" },
    "listings": [
      {
        "external": {
          "id": "42802955",
          "domain": { "id": 55613, "name": "fem.encar.com" },
          "url": "https://fem.encar.com/cars/detail/42802955"
        },
        "archived": false,
        "price": { "price": 6390000, "currency": { "id": 81, "name": "krw" } },
        …
      },
      { …second listing of the same car… }
    ]
  }
}