API Documentation

REST API for European vehicle tire-size lookups. JSON responses. Authenticated via API key (Bearer token or query param).

Manufacturers
Models
Engine variants
Fitments
Year coverage
Endpoints
Authentication /v1/coverage (no auth) /v1/makes /v1/models /v1/years /v1/sizes /v1/engines /v1/sizes-by-engine /v1/vehicle Use cases Errors

Authentication #

All endpoints under /v1 require an API key. Pass it either as an Authorization: Bearer … header or as a ?key=… query parameter.

Your API key

Paste your API key to enable the live testers below.

GET /v1/coverage #

GET /v1/coverage no auth

Dataset stats — manufacturer/model/engine/fitment counts and the year range covered. Public, useful for sanity checks before integrating.

cURL

curl https://wheels-easy-api.nicholasmuradov.workers.dev/v1/coverage

Response (200)

{
  "coverage": {
    "makes": 48,
    "models": 989,
    "body_types": 4506,
    "engines": 38976,
    "fitments": 138155,
    "tire_sizes": 491,
    "year_range": [1966, 2026]
  }
}

GET /v1/makes #

GET /v1/makes requires API key

List all manufacturers we cover. Each row has an internal id, the canonical name, and a URL-safe slug.

cURL

curl -H "Authorization: Bearer YOUR_KEY" \
  "https://wheels-easy-api.nicholasmuradov.workers.dev/v1/makes"

Response (200)

{
  "data": [
    { "id": 39, "name": "Aiways",     "slug": "aiways" },
    { "id": 21, "name": "Alfa Romeo", "slug": "alfa-romeo" },
    { "id": 1,  "name": "Audi",       "slug": "audi" }
  ],
  "count": 48
}

Live test

// response will appear here

GET /v1/models #

GET /v1/models requires API key

List models for a manufacturer.

Query parameters

NameTypeRequiredDescription
makestringyesManufacturer name. Case-insensitive.

cURL

curl -H "Authorization: Bearer YOUR_KEY" \
  "https://wheels-easy-api.nicholasmuradov.workers.dev/v1/models?make=BMW"

Response (200)

{
  "data": [
    { "id": 31, "name": "1er Reihe", "slug": "1er-reihe" },
    { "id": 32, "name": "2er Reihe", "slug": "2er-reihe" }
  ],
  "count": 42
}

Live test

// response will appear here

GET /v1/years #

GET /v1/years requires API key

Production years for a make+model. Returned as a flat array of integers, newest first.

Query parameters

NameTypeRequiredDescription
makestringyesManufacturer.
modelstringyesModel. Cross-language match (3-Series ↔ 3er-Reihe).

cURL

curl -H "Authorization: Bearer YOUR_KEY" \
  "https://wheels-easy-api.nicholasmuradov.workers.dev/v1/years?make=BMW&model=3-Series"

Response (200)

{
  "years": [2026, 2025, 2024, 2023, 2022, 2021, 2020, ...],
  "count": 45
}

Live test

// response will appear here

GET /v1/sizes #

GET /v1/sizes requires API key

Returns all tire sizes that fit the given vehicle. De-duplicates across engine variants.

Query parameters

NameTypeRequiredDescription
makestringyesManufacturer name or slug. Examples: BMW, Volvo, Audi.
modelstringyesModel name or slug. Cross-language: 3-Series3er-Reihe both work.
yearintegernoProduction year. Narrows results to body types active in that year.

cURL

curl -H "Authorization: Bearer YOUR_KEY" \
  "https://wheels-easy-api.nicholasmuradov.workers.dev/v1/sizes?make=Volvo&model=XC60&year=2020"

Response (200)

{
  "sizes": [
    { "display": "235/55R19", "width": 235, "height": 55, "rim": 19 },
    { "display": "235/60R18", "width": 235, "height": 60, "rim": 18 }
  ],
  "count": 2
}

Live test

// response will appear here

GET /v1/engines #

GET /v1/engines requires API key

Returns the engine variants ("Modifikācija" / "Motorisierung") for a given make/model/year. Use the returned id with /v1/sizes-by-engine to narrow tire sizes to one specific engine.

Query parameters

NameTypeRequiredDescription
makestringyesSame as /v1/sizes.
modelstringyesSame as /v1/sizes.
yearintegernoSame as /v1/sizes.

Response (200)

{
  "engines": [
    {
      "id": 3139,
      "name": "316Ci (E92)",
      "power_ps": 122,
      "fuel_type": "Petrol",
      "displacement_cc": 1599,
      "body_type": "3 Series Coupé (E92)",
      "year_from": 2006,
      "year_to": null
    }
  ],
  "count": 1
}

Live test

// response will appear here

GET /v1/sizes-by-engine #

GET /v1/sizes-by-engine requires API key

Returns tire sizes that fit one specific engine variant. Use after /v1/engines to narrow results to the user's exact engine.

Query parameters

NameTypeRequiredDescription
engineIdintegeryesThe id from a /v1/engines response row.

Response (200)

{
  "sizes": [
    { "display": "205/55R16", "width": 205, "height": 55, "rim": 16 }
  ],
  "count": 1
}

Live test

// response will appear here

GET /v1/vehicle #

GET /v1/vehicle requires API key

Full vehicle breakdown in one call: every body type for the make/model/year, the engine variants under each body type, and the de-duplicated tire sizes that fit the vehicle. Saves chaining /v1/engines → /v1/sizes-by-engine when you need everything at once.

Query parameters

NameTypeRequiredDescription
makestringyesManufacturer.
modelstringyesModel.
yearintegernoProduction year. Narrows results to body types active in that year.

cURL

curl -H "Authorization: Bearer YOUR_KEY" \
  "https://wheels-easy-api.nicholasmuradov.workers.dev/v1/vehicle?make=Volvo&model=XC60&year=2020"

Response (200)

{
  "vehicle": {
    "make": "Volvo",
    "model": "XC60",
    "year": 2020,
    "body_types": [
      {
        "id": 4321, "name": "XC60 II (2017–)", "year_from": 2017, "year_to": null,
        "engines": [
          { "id": 12345, "name": "T5", "power_ps": 250, "fuel_type": "Petrol",  "displacement_cc": 1969 },
          { "id": 12346, "name": "B5", "power_ps": 250, "fuel_type": "Hybrid",  "displacement_cc": 1969 }
        ]
      }
    ],
    "sizes": [
      { "display": "235/55R19", "width": 235, "height": 55, "rim": 19 },
      { "display": "235/60R18", "width": 235, "height": 60, "rim": 18 }
    ]
  }
}

Live test

// response will appear here

Use cases #

1. Tire shop "Find your size" widget

Walk the user through Make → Model → Year → see compatible sizes. Drives them to your in-stock product pages with a deep-link.

// Pseudo-code
const sizes = await fetch(`${API}/v1/sizes?make=${make}&model=${model}&year=${year}`,
  { headers: { Authorization: `Bearer ${KEY}` } }).then(r => r.json());

sizes.sizes.forEach(s => {
  // link each size to your shop's catalog filter
  render(`<a href="/tires?size=${s.display}">${s.display}</a>`);
});

2. OEM upgrade calculator

Show every approved tire size for the customer's exact engine variant — including OEM and optional/upgrade fitments — so they can pick the right wider/taller upgrade.

const engines = await fetch(`${API}/v1/engines?make=BMW&model=3-Series&year=2020`).then(r => r.json());
const sel = engines.engines.find(e => e.power_ps === 184 && e.fuel_type === 'Petrol');
const sizes = await fetch(`${API}/v1/sizes-by-engine?engineId=${sel.id}`).then(r => r.json());
// sizes.sizes is already sorted; first is the smallest OEM, last is the largest valid upgrade

3. Ecommerce product-page filter

On a tire product page, hide the "Add to cart" button if the customer's saved vehicle doesn't fit that size. One /v1/sizes call per page-view, cache the result.

Errors #

StatusMeaning
400Missing required query parameter.
401API key missing or invalid.
403API key inactive (subscription cancelled).
502Backend temporarily unavailable. Retry.

CORS #

All endpoints respond with Access-Control-Allow-Origin: *. The widget can be embedded on any domain.