CarStat.dev
Connect key
GET/searchVehicles

Search vehicles

Filter active vehicles across your enabled sources. Results are lightweight: each car carries report flags, not report bodies.

  • perPage is 2–50 (default 50). perPage=1 returns 422.
  • Keep page × perPage at or below 10,000. To read further, use /cars.
  • data can contain perPage + 1 cars, and meta.total stops at 10,000. Use /search/count for exact totals.
  • Price sorts (cheaper, expensive) compare prices in currency.

Query parameters

41
Query, paging and scope
querystring≤ 200 chars

Full-text vehicle search. Omit unused filters.

vinstring1–19 chars

Case-insensitive partial VIN. For an exact 16–19 character VIN, use /cars/vin/{vin}.

pageinteger≥ 1 · default 1

Page number. For /search, explicitly pass perPage and keep page × perPage ≤ 10000. /search/count ignores pagination and skips this offset check.

perPageinteger2–50 · default 50

Search page size: minimum 2, maximum 50. perPage=1 returns 422; use perPage=2 to fetch a small sample. Omitted or null pagination values use page=1 and perPage=50, including the search result-window check. Invalid values return 422.

sortstring

Sort order. Price sorting requires a resolved currency.

currencystring3 chars · default usd

Case-insensitive currency code for price filtering/sorting. Must exist in the currency dictionary. Does not convert serialized listing prices.

currency_idinteger≥ 1

Optional internal currency ID; overrides currency.

domains[]integer[]≥ 1

Optional source scope. Use IDs returned by GET /domains. Omit to use all enabled domains. Repeat the bracketed parameter: domains[]=33&domains[]=34. Every ID must be enabled for this key.

langstring

Response locale. Option translations are also limited by the account languages. The page selects its current language automatically.

Brand, model and location
brands[0][id]integer

First brand ID from /brands. Additional brands use brands[1][id], etc.

brands[0][models][]integer[]

Optional model IDs for the first brand, returned by /models/{brand_id}. Omit for all models.

countries[0][id]integer

First internal country ID from /countries. Additional countries use countries[1][id], etc.

countries[0][regions][]integer[]

Optional internal region IDs belonging to the first country.

Ranges
seatsinteger1–200

Exact seating capacity.

price_fromint64≥ 0

Minimum listing price in the selected currency. Maximum 9223372036854775807 (signed 64-bit integer); values beyond JavaScript safe integers must be preserved as decimal text by clients.

price_toint64≥ 1

Maximum listing price in the selected currency. Maximum 9223372036854775807 (signed 64-bit integer); values beyond JavaScript safe integers must be preserved as decimal text by clients.

year_frominteger1,800–3,000

Minimum production year.

year_tointeger1,800–3,000

Maximum production year.

odometer_frominteger0–999,999,999

Minimum mileage in kilometres.

odometer_tointeger0–999,999,999

Maximum mileage in kilometres.

engine_volume_frominteger0–999,999,999

Minimum engine displacement.

engine_volume_tointeger0–999,999,999

Maximum engine displacement.

power_hp_frominteger0–100,000

Minimum power in horsepower.

power_hp_tointeger1–100,000

Maximum power in horsepower.

Flags
is_leasingboolean

Optional leasing filter. Send true (or 1) for listings explicitly marked is_leasing=true. Send false (or 0) to exclude true, including stored false, null and missing fields. Omit for no leasing filter; empty or invalid values return 422. A car must have at least one matching active listing in the enabled/selected domain scope. Other listings can remain in the response, so cars with mixed listing types can match both values. For /cars, set this on the first request and follow next_url unchanged; false is preserved. Continuing with only scroll_id retains the filter. Changing or adding the filter mid-scroll returns 422. If cached filter state is lost or the scroll predates this parameter, an explicit value returns 422; start a new scroll.

keys_availableinteger

Listing has keys. Send 1 (true) or 0 (false). Omit for either value; strings "true"/"false" are rejected.

is_manufacturer_certifiedinteger

Listing is certified by the manufacturer or official dealer program. Send 1 (true) or 0 (false). Omit for either value; strings "true"/"false" are rejected.

has_inspectionsinteger

Root car has a public inspection. Send 1 (true) or 0 (false). Omit for either value; strings "true"/"false" are rejected.

has_history_reportsinteger

A listing in the selected domain scope has a public history report. Send 1 (true) or 0 (false). Omit for either value; strings "true"/"false" are rejected.

Categories
body_types[]integer[]

Repeat to match any of the values.

colors[]integer[]

Repeat to match any of the values.

fuels[]integer[]

Repeat to match any of the values.

transmissioninteger

One value.

seller_typeinteger

One value.

steering_wheel_positioninteger

One value.

airbagsinteger

One value.

damages[]integer[]

Repeat to match any of the values.

conditions[]integer[]

Repeat to match any of the values.

availabilities[]integer[]

Repeat to match any of the values.

emissions[]integer[]

Repeat to match any of the values.

drive_wheels[]integer[]

Repeat to match any of the values.

Returns · A page of Car objects in data, with links and meta. The inspections and vehicle_history_reports arrays are omitted.
GET/search
curl -g "https://api.lotarius.com/search?perPage=5&api_key=$CARS_API_KEY" \
  -H "Accept: application/json"
ExamplesRecorded
{3 keys
"data": [1 item
0: {21 keys
"id": "l_eCJb-8zB_XcJ-z6Y7oZWjw"
"has_inspections": true
"has_history_reports": true
"year": 2014
"month": 4
"vin": "wddhf0cb3ea952710"
"brand": {2 keys}
"model": {2 keys}
"engine_volume": 2143
"seats": 5
"body_type": {2 keys}
"transmission": {2 keys}
"transmission_steps": 6
"fuel": {2 keys}
"color": {2 keys}
"power_hp": 170
"market_origin": {2 keys}
"badge": "E220 CDI Avantgarde"
"option_ids": [53 items]
"listings": [1 item]
"hash": "093563801f92d9cfa23a07346b26b69db32df8da05d7c5ee60fa5fd876a7fe0b"
}
]
"links": {4 keys}
"meta": {7 keys}
}