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.
Building an AI agent or assistant that needs to answer "what tyres fit this car?" The REST endpoints above already return clean, structured fitment JSON that's straightforward to wrap as a tool call. We're now packaging that into a first-class agent / MCP (Model Context Protocol) endpoint — a single structured tool an LLM agent can call to resolve a vehicle to its tyre sizes.
Coming — join the pilot. The MCP endpoint isn't live yet. The underlying fitment lookup is live today (the REST API above); the agent-ready packaging, per-agent keys and rate tiers are in early access and we're onboarding a small group of pilot integrators.
What the pilot covers: an MCP tool definition over the existing lookup, JSON shaped for tool calls, and usage-based access for automation workloads. Pricing is scoped per pilot, not a live checkout.
Note: terms for redistributing or resurfacing fitment data inside third-party agents are still being finalised, so the pilot is scoped to direct lookups for your own product — not bulk data resale. We'll confirm scope on the call.