LocalWheels

Cars & private transfers from verified locals

Public Cars API

Live endpoint: https://www.local-wheels.com/api/public/cars

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
MethodPathDescription
GET/api/public/carsPaginated list of published cars
GET/api/public/cars/{id}Single published car (404 if missing/unpublished)
OPTIONSsame pathsCORS 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

ParamTypeDefaultDescription
limitinteger24Page size (1–50)
cursorstringOpaque cursor from the previous page’s nextCursor
locationstringLocation slug (e.g. tirana). Returns cars with that primary location or nationwide delivery
localestringenLocale 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

  1. Call without cursor.
  2. If nextCursor is non-null, request the next page with ?cursor={nextCursor} (same limit / filters).
  3. Or follow nextPageUrl as returned.
  4. 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

FieldMeaning
urlAbsolute link to the car view on LocalWheels (use this to redirect users)
imageUrlFirst image (absolute), or null
imagesAll images (absolute URLs), sorted
dailyRateEur / depositEur / …Money fields as numbers in EUR (or null)
featuresAmenity flags (ac, wifi, navigator, …)
pricingPeriodsSeasonal rate windows (startMmdd / endMmdd)
locationDeliveryFeesNationwide 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

EndpointPurpose
GET /api/public/statsPublished vehicle / host counts
GET /api/public/ai/car-recommendationsFiltered recommendations with trip totals
GET /api/locationsLocation slugs for the location filter
GET /api/cars/{id}Website UI car detail JSON (same inventory; different shape)

Changelog

  • 2026-07-12 — Initial public catalog (/api/public/cars, /api/public/cars/{id}).