REST API for European vehicle tire-size lookups. JSON responses. Authenticated via API key (Bearer token or query param).
All endpoints under /v1 require an API key. Pass it either as an Authorization: Bearer … header or as a ?key=… query parameter.
Dataset stats — manufacturer/model/engine/fitment counts and the year range covered. Public, useful for sanity checks before integrating.
curl https://wheels-easy-api.nicholasmuradov.workers.dev/v1/coverage
{
"coverage": {
"makes": 48,
"models": 989,
"body_types": 4506,
"engines": 38976,
"fitments": 138155,
"tire_sizes": 491,
"year_range": [1966, 2026]
}
}
List all manufacturers we cover. Each row has an internal id, the canonical name, and a URL-safe slug.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://wheels-easy-api.nicholasmuradov.workers.dev/v1/makes"
{
"data": [
{ "id": 39, "name": "Aiways", "slug": "aiways" },
{ "id": 21, "name": "Alfa Romeo", "slug": "alfa-romeo" },
{ "id": 1, "name": "Audi", "slug": "audi" }
],
"count": 48
}
// response will appear here
List models for a manufacturer.
| Name | Type | Required | Description |
|---|---|---|---|
make | string | yes | Manufacturer name. Case-insensitive. |
curl -H "Authorization: Bearer YOUR_KEY" \
"https://wheels-easy-api.nicholasmuradov.workers.dev/v1/models?make=BMW"
{
"data": [
{ "id": 31, "name": "1er Reihe", "slug": "1er-reihe" },
{ "id": 32, "name": "2er Reihe", "slug": "2er-reihe" }
],
"count": 42
}
// response will appear here
Production years for a make+model. Returned as a flat array of integers, newest first.
| Name | Type | Required | Description |
|---|---|---|---|
make | string | yes | Manufacturer. |
model | string | yes | Model. Cross-language match (3-Series ↔ 3er-Reihe). |
curl -H "Authorization: Bearer YOUR_KEY" \
"https://wheels-easy-api.nicholasmuradov.workers.dev/v1/years?make=BMW&model=3-Series"
{
"years": [2026, 2025, 2024, 2023, 2022, 2021, 2020, ...],
"count": 45
}
// response will appear here
Returns all tire sizes that fit the given vehicle. De-duplicates across engine variants.
| Name | Type | Required | Description |
|---|---|---|---|
make | string | yes | Manufacturer name or slug. Examples: BMW, Volvo, Audi. |
model | string | yes | Model name or slug. Cross-language: 3-Series ↔ 3er-Reihe both work. |
year | integer | no | Production year. Narrows results to body types active in that year. |
curl -H "Authorization: Bearer YOUR_KEY" \
"https://wheels-easy-api.nicholasmuradov.workers.dev/v1/sizes?make=Volvo&model=XC60&year=2020"
{
"sizes": [
{ "display": "235/55R19", "width": 235, "height": 55, "rim": 19 },
{ "display": "235/60R18", "width": 235, "height": 60, "rim": 18 }
],
"count": 2
}
// response will appear here
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.
| Name | Type | Required | Description |
|---|---|---|---|
make | string | yes | Same as /v1/sizes. |
model | string | yes | Same as /v1/sizes. |
year | integer | no | Same as /v1/sizes. |
{
"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
}
// response will appear here
Returns tire sizes that fit one specific engine variant. Use after /v1/engines to narrow results to the user's exact engine.
| Name | Type | Required | Description |
|---|---|---|---|
engineId | integer | yes | The id from a /v1/engines response row. |
{
"sizes": [
{ "display": "205/55R16", "width": 205, "height": 55, "rim": 16 }
],
"count": 1
}
// response will appear here
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.
| Name | Type | Required | Description |
|---|---|---|---|
make | string | yes | Manufacturer. |
model | string | yes | Model. |
year | integer | no | Production year. Narrows results to body types active in that year. |
curl -H "Authorization: Bearer YOUR_KEY" \
"https://wheels-easy-api.nicholasmuradov.workers.dev/v1/vehicle?make=Volvo&model=XC60&year=2020"
{
"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 }
]
}
}
// response will appear here
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>`);
});
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
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.
| Status | Meaning |
|---|---|
400 | Missing required query parameter. |
401 | API key missing or invalid. |
403 | API key inactive (subscription cancelled). |
502 | Backend temporarily unavailable. Retry. |
All endpoints respond with Access-Control-Allow-Origin: *. The widget can be embedded on any domain.