Open JSON API for the LocalWheels published car catalog. Each car includes listing details, images, and an absolute url that opens the car page on the website.
Base URL (production): https://www.local-wheels.com
| Method | Path | Description |
|---|
GET | /api/public/cars | Paginated list of published cars |
GET | /api/public/cars/{id} | Single published car (404 if missing/unpublished) |
OPTIONS | same paths | CORS preflight |
CORS: Access-Control-Allow-Origin: * (browser clients allowed).
No API key is required. Only published listings are returned. Host contact phone numbers are not included.
Human-readable docs on the site:
/docs/public-cars-api
List cars
GET /api/public/cars?limit=24&cursor=&location=&locale=en
Query parameters
| Param | Type | Default | Description |
|---|
limit | integer | 24 | Page size (1–50) |
cursor | string | — | Opaque cursor from the previous page’s nextCursor |
location | string | — | Location slug (e.g. tirana). Returns cars with that primary location or nationwide delivery |
locale | string | en | Locale for url (en, sq, de, fr, it, es, pl, nl, he, ar) |
Response shape
{
"generatedAt": "2026-07-12T16:00:00.000Z",
"siteUrl": "https://www.local-wheels.com",
"locale": "en",
"limit": 24,
"totalPublished": 120,
"count": 24,
"nextCursor": "cmxxxxxxxx",
"nextPageUrl": "https://www.local-wheels.com/api/public/cars?limit=24&cursor=cmxxxxxxxx",
"documentationUrl": "https://www.local-wheels.com/docs/public-cars-api",
"usage": {
"hint": "…",
"queryParams": ["limit", "cursor", "location", "locale"]
},
"items": [
{
"id": "cmxxxxxxxx",
"title": "Volkswagen Golf 7",
"url": "https://www.local-wheels.com/cars/cmxxxxxxxx",
"category": "ECONOMY",
"transmission": "manual",
"seats": 5,
"productionYear": 2018,
"dailyRateEur": 35,
"depositEur": 200,
"minRentalDays": 1,
"fullInsuranceAvailable": true,
"fullInsuranceRequired": false,
"imageUrl": "https://…/photo.jpg",
"images": [{ "id": "…", "url": "https://…/photo.jpg", "sortOrder": 0 }],
"primaryLocation": {
"id": "…",
"slug": "tirana",
"nameEn": "Tirana",
"nameSq": "Tiranë"
},
"features": { "ac": true, "wifi": false },
"pricingPeriods": [],
"locationDeliveryFees": [],
"updatedAt": "2026-07-01T12:00:00.000Z"
}
]
}
Pagination
- Call without
cursor.
- If
nextCursor is non-null, request the next page with ?cursor={nextCursor} (same limit / filters).
- Or follow
nextPageUrl as returned.
- Stop when
nextCursor / nextPageUrl is null.
Order: promoted listings first, then most recently updated.
Single car
GET /api/public/cars/{id}?locale=en
Returns one object with the same fields as a list item, plus recentReviews (up to 8).
{
"id": "cmxxxxxxxx",
"url": "https://www.local-wheels.com/cars/cmxxxxxxxx",
"recentReviews": [
{
"rating": 5,
"body": "Great car",
"createdAt": "2026-06-01T10:00:00.000Z",
"rentedVehicleTitle": "Volkswagen Golf 7"
}
]
}
404 with { "error": "Not found" } when the id is unknown or not published.
Notable item fields
| Field | Meaning |
|---|
url | Absolute link to the car view on LocalWheels (use this to redirect users) |
imageUrl | First image (absolute), or null |
images | All images (absolute URLs), sorted |
dailyRateEur / depositEur / … | Money fields as numbers in EUR (or null) |
features | Amenity flags (ac, wifi, navigator, …) |
pricingPeriods | Seasonal rate windows (startMmdd / endMmdd) |
locationDeliveryFees | Nationwide handover fees per city when applicable |
Examples
# First page
curl -sS 'https://www.local-wheels.com/api/public/cars?limit=10' | jq '.count, .nextCursor, .items[0].url'
# Tirana (incl. nationwide), Albanian listing URLs
curl -sS 'https://www.local-wheels.com/api/public/cars?location=tirana&locale=sq&limit=10'
# Next page
curl -sS "https://www.local-wheels.com/api/public/cars?limit=10&cursor=CURSOR_FROM_PREVIOUS"
# One car
curl -sS 'https://www.local-wheels.com/api/public/cars/CAR_ID?locale=en' | jq '{title, url, imageUrl}'
async function fetchAllCars() {
const cars = [];
let cursor = null;
for (;;) {
const sp = new URLSearchParams({ limit: '50' });
if (cursor) sp.set('cursor', cursor);
const res = await fetch(`https://www.local-wheels.com/api/public/cars?${sp}`);
const data = await res.json();
cars.push(...data.items);
if (!data.nextCursor) break;
cursor = data.nextCursor;
}
return cars;
}
Caching
Responses send Cache-Control: public, max-age=60, s-maxage=300. Treat data as eventually consistent (up to a few minutes).
Related endpoints
Changelog
- 2026-07-12 — Initial public catalog (
/api/public/cars, /api/public/cars/{id}).