CarListAPI Documentation
v1.x API docs for Automotive + Powersports. Includes auth, quick examples, responses, rate limits, caching, and demo endpoints.
Base URL + auth header for every request.
Introduction
CarListAPI provides normalized automotive and powersports data: year, make, model, trim, engines, and full details.
- An API token from your CarListAPI dashboard
- The public IP address of the server making requests (must be added to the token’s allowlist)
- URL-encode values with spaces (make/model/trim/engine)
Get started
CarListAPI is optimized for fast pickers: year → make → model → trim → details. Automotive includes engines; powersports may include sub-models and types.
Generate a token in your dashboard. If IP restrictions are enabled, requests must come from an allowed IP.
All v1 endpoints:
https://carlistapi.com/api/v1
Send your token on every request:
Authorization: Bearer YOUR_API_TOKEN
Automotive: years → makes → models → trims → engines → vehicle id → details
Powersports: years → makes → models → sub-models (optional) → vehicle id → details
Quick examples
Common requests (not every endpoint). For full reference + schemas, open the Postman docs.
This page is a quick start. For the complete endpoint list + schemas, use your Postman docs.
Response format
Most picker endpoints return simple arrays. Details endpoints return a structured object.
[2026, 2025, 2024, 2023]
["Toyota", "Honda", "Ford"]
Field names can vary by dataset (automotive vs powersports). Treat this as a representative example.
{
"id": "9f55fd34-a206-4507-b1ee-6eb2eb9fab35",
"type": "Automotive",
"year": "2026",
"make": "Chevrolet",
"model": "Trailblazer",
"subModel": "LT",
"trim": "LT Sport Utility 4-Door",
"engineLiter": "1.3L",
"engine": "1.3L 1349CC 83Cu. In. l3 GAS DOHC Turbocharged",
"bodyStyle": "Sport Utility",
"engine_cylinders": "3",
"cylinder_type": "DOHC",
"engine_cc": "1349",
"drive_type": "AWD",
"fuel_type": "GAS",
"number_doors": "4",
"diaplay_name": "Chevrolet Trailblazer 2026 LT",
"aspiration": "Turbocharged",
"makeLogoUrl": "https://carlistapi.com/assets/img/car-logos/chevrolet.png"
}
Rate limits
If you exceed limits, the API returns 429. Your integration should back off and retry.
Cache picker endpoints and only request details once the user selects a final vehicle.
{ "message": "Too many requests." }
Status codes
Quick meanings for common responses:
Caching
For best performance, cache picker endpoints. Years/makes/models change infrequently compared to details.
- Years: 24h
- Makes: 24h
- Models: 6–24h
- Trims/Engines: 6–24h
- Details by UUID: 7d
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;
$years = Cache::remember('carlistapi:years', 86400, function () {
return Http::withToken(config('services.carlistapi.token'))
->acceptJson()
->get('https://carlistapi.com/api/v1/car-data/get-years/asc')
->throw()
->json();
});
Demo endpoints
Use demo routes to prototype without touching production datasets. These endpoints do not require authentication.
GET https://carlistapi.com/api/v1/car-data-demo/get-years-demo/asc
GET https://carlistapi.com/api/v1/car-data-demo/get-makes-demo/asc
GET https://carlistapi.com/api/v1/powersports-data-demo/get-years-demo/asc
GET https://carlistapi.com/api/v1/powersports-data-demo/get-makes-demo/asc
- Building UI pickers
- Testing URL encoding and caching
- Confirming request flow before going live
Authentication
Send your API token using the Authorization header.
curl -X GET "https://carlistapi.com/api/v1/car-data/get-years/asc" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json"
const res = await fetch("https://carlistapi.com/api/v1/car-data/get-years/asc", {
headers: {
Authorization: "Bearer YOUR_API_TOKEN",
Accept: "application/json",
},
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
console.log(data);
Base URL
All v1.x endpoints are under:
https://carlistapi.com/api/v1
Automotive
Typical picker flow: years → makes → models → trims → engines → vehicle id → details
GET https://carlistapi.com/api/v1/car-data/get-years/asc
GET https://carlistapi.com/api/v1/car-data/get-makes/{year}/asc
GET https://carlistapi.com/api/v1/car-data/get-models/{year}/{make}/asc
GET https://carlistapi.com/api/v1/car-data/get-trims/{year}/{make}/{model}/asc
GET https://carlistapi.com/api/v1/car-data/get-engines/{year}/{make}/{model}/{trim}/asc
GET https://carlistapi.com/api/v1/car-data/get-vehicle-id/{year}/{make}/{model}/{trim}/{engine}
GET https://carlistapi.com/api/v1/car-data/get-details/{uuid}
Powersports
Typical picker flow: years → makes → models → sub-models → vehicle id → details
GET https://carlistapi.com/api/v1/powersports-data/get-years/asc
GET https://carlistapi.com/api/v1/powersports-data/get-makes/{year}/asc
GET https://carlistapi.com/api/v1/powersports-data/get-models/{year}/{make}/asc
GET https://carlistapi.com/api/v1/powersports-data/get-sub-models/{year}/{make}/{model}/asc
GET https://carlistapi.com/api/v1/powersports-data/get-vehicle-id/{year}/{make}/{model}/{trim}
GET https://carlistapi.com/api/v1/powersports-data/get-details/{uuid}
Common mistakes
If make/model/trim/engine include spaces or slashes, URL-encode them.
Grand%20Vitara
Automotive get-vehicle-id includes {engine}. Powersports uses a different signature.
Use caching + call details only when the user finalizes a selection (keeps your app fast and avoids 429s).
Filtering
Typical picker filters include:
Error format
Errors return JSON with an HTTP status code (401, 403, 422, 429, 500, etc.).
{ "message": "Unauthenticated." }
Try / Catch
Wrap requests so your app can gracefully handle invalid tokens, rate limits, or network failures.
use Illuminate\Support\Facades\Http;
try {
$response = Http::withToken(config('services.carlistapi.token'))
->acceptJson()
->get('https://carlistapi.com/api/v1/car-data/get-years/asc');
if ($response->unauthorized()) {
abort(401, 'CarListAPI token is invalid.');
}
if ($response->status() === 403) {
abort(403, 'Request blocked (check IP restrictions).');
}
if ($response->tooManyRequests()) {
abort(429, 'Rate limit hit. Please retry shortly.');
}
$response->throw();
$data = $response->json();
} catch (\Throwable $e) {
report($e);
abort(502, 'CarListAPI request failed.');
}
try {
const res = await fetch("https://carlistapi.com/api/v1/car-data/get-years/asc", {
headers: {
Authorization: "Bearer YOUR_API_TOKEN",
Accept: "application/json",
},
});
if (res.status === 401) throw new Error("Invalid token");
if (res.status === 403) throw new Error("Blocked (check IP restrictions)");
if (res.status === 429) throw new Error("Rate limit hit");
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
console.log(data);
} catch (err) {
console.error("CarListAPI error:", err);
}