Fitment intelligence,
via REST.
The same database that powers Manchester Alloys, International Alloys, Ally and Whell โ now exposed as a simple, tiered API. Free for makes & models. Paid for the data your business actually runs on.
Pricing tiers
- โ /makes, /models, /years, /variants
- โ /lookup (vehicle shell + diameters)
- โ /vehicles/:id (PCD, CB, TPMS, torque)
- โ Fitment widths & offsets
- โ OEM tyre sizes
- โ PCD cross-compatibility
- โ Everything in Free
- โ Fitment widths + offset ranges
- โ OEM tyre sizes per diameter
- โ Front/rear split for staggered
- โ PCD cross-compatibility (wobbly bolt)
- โ Compatible-wheel-SKU matches
- โ Everything in Tyre Dealer
- โ /compatible-wheels (live SKU matches)
- โ Stock + trade pricing
- โ Forge image generation quota
- โ Higher quota, lower latency
- โ SLA + on-prem option
Authentication
Paid tiers identify themselves with an API key. Pass it via the X-AIWT-Key header on every request:
curl -H "X-AIWT-Key: aiwt_xxxxxxxxxxxxxxxxxxxxxxxx" \ https://api.aiwheeltech.com/api/v1/vehicles/205
Or via standard Authorization header:
curl -H "Authorization: Bearer aiwt_xxxxxxxxxxxxxxxxxxxxxxxx" \ https://api.aiwheeltech.com/api/v1/vehicles/205
No header โ caller defaults to the free tier. Paid-tier responses include the data your tier covers; lower tiers see _redacted arrays naming the fields they would unlock by upgrading.
Endpoints
GET /api/v1/makes
๐ข Free
List every make in the database.
{
"makes": ["Alpine","Aston Martin","Audi","Bentley","BMW","BYD", ...]
}
GET /api/v1/models?make=BMW
๐ข Free
Distinct model names for a given make.
{
"make": "BMW",
"models": ["1 Series","2 Series","3 Series","M3","M4","X5", ...]
}
GET /api/v1/years?make=BMW&model=M3
๐ข Free
Years covered by any variant of this make/model.
GET /api/v1/variants?make=BMW&model=M3&year=2022
๐ข Free
Variants matching the make/model/year tuple.
GET /api/v1/lookup?make=BMW&model=M3&year=2022
๐ข Free
โ shell + diameters only
๐ถ Tyre Dealer
โ full
One-shot selector lookup. Free tier sees vehicle + diameters; tyre_dealer+ adds fitments, OEM tyres, aliases, PCD cross-compat.
Tyre Dealer response:
{
"vehicle": { "id": 205, "make": "BMW", "model": "M3", "variant": "M3 G80/G81 Facelift",
"year_from": 2022, "year_to": 2024, "factory_setup": "staggered",
"pcd": "5x112", "centre_bore": "66.6", "tpms_type": "direct", ... },
"diameters": [{"diameter": 18, "setup": "staggered"}, ...],
"fitments": [{"position": "front", "width": "8.5", "offset_min": 25, "offset_max": 45 }, ...],
"tyres": [{"diameter": 19, "position": "front", "tyre_size": "275/35R19", "is_oe": true}, ...],
"pcd_cross_compatible": [{"pcd": "5x114.3", "wobbly_bolt_spec": "M14x1.25 -2mm shift"}]
}
GET /api/v1/vehicles/:id
๐ข Free
โ shell + diameters
๐ถ Tyre Dealer
โ + fitments, tyres, aliases
Full record by vehicle id. Same tier behaviour as /lookup. Includes primary_image_url + primary_thumb_url (Flux-rendered side-profile, 256ร256 webp thumb).
GET /api/v1/vehicles/:id/compatible-wheels
๐ถ Tyre Dealer
Compatible wheel SKUs for this vehicle โ joins fitments to the wheel_skus catalog with PCD adjacency (wobbly-bolt) and centre-bore tolerance. Each match flags requires_wobbly_bolt when fitting across PCD.
Sample match:
{
"vehicle_id": 205,
"compatible_pcds": ["5x112","5x114.3"],
"count": 24,
"compatible": [
{
"sku_id": 5512, "sku_code": "OZ-LEGGERA-19BLK-512",
"brand": "OZ Racing", "model": "Leggera HLT",
"pcd": "5x112", "width": "8.5", "diameter": 19, "offset": 32,
"stock_qty": 4, "retail_price": 489.00, "trade_price": 360.00,
"for_position": "front", "requires_wobbly_bolt": false
}, ...
]
}
GET /api/v1/wheels
๐ข Free
โ card list (no trade prices)
๐ถ Tyre Dealer
โ + trade + supplier units
Paginated catalogue browse. Filters: brand, model, colour, diameter, width, pcd, centre_bore, in_stock, available, min_price, max_price. ?page=1&limit=24 (max 100). ?include_skus=1 expands every SKU.
GET /api/v1/wheels?diameter=19&pcd=5x112&limit=2
{
"total": 64, "page": 1, "limit": 2, "pages": 32, "tier": "tyre_dealer",
"products": [
{
"id": 4, "brand": "GMP Italia", "model": "Atom", "colour": "Black Polished",
"image_url": "...", "sku_count": 3,
"diameters": [19], "pcds": ["5x112"],
"from_retail": 297, "from_trade": 202.07, "from_cost": 134.71,
"in_stock_same_day": false, "available_from_supplier": true,
"same_day_units": 0, "supplier_units": 25
}, ...
]
}
GET /api/v1/wheels/_meta
๐ข Free
Lookup tables for filter UIs โ distinct brands, diameters, pcds.
GET /api/v1/wheels/:id
๐ข Free
โ shell + redacted SKUs
๐ถ Tyre Dealer
โ full
Single wheel product + every SKU. Public callers see a shell (brand, model, image, retail) and SKUs with boolean stock flags only. Tyre Dealer+ sees full product record + per-SKU trade/cost prices, same-day vs supplier qty, lead times.
GET /api/v1/tyres
๐ข Free
โ list (no cost / supplier qty)
๐ถ Tyre Dealer
โ + cost + supplier units
Paginated tyre catalogue (each row IS a SKU โ tyres are flat). Filters: brand, model, width, profile, diameter, season, runflat, in_stock, available, min_price, max_price.
GET /api/v1/tyres/_meta
๐ข Free
Distinct brands, diameters, seasons.
GET /api/v1/tyres/:id
๐ข Free
โ shell
๐ถ Tyre Dealer
โ + cost + supplier qty
Single tyre. Public sees the retail-facing view (no cost, no supplier SKU, no landed-cost breakdown).
GET /api/v1/health
๐ข Free
Liveness probe. Returns DB time + version.
aiwt-stock.js
Don't want to write the frontend? Drop two tags onto any HTML page and get a filterable grid backed by your tier. Works on WordPress, Shopify, plain static. Auto-mounts every [data-aiwt-stock] element on the page.
<link rel="stylesheet" href="https://aiwheeltech.com/aiwt-stock.css">
<div data-aiwt-stock data-kind="wheels"
data-key="aiwt_xxxxxxxxxxxxxxxxxxxxxxxx"
data-filters="brand,diameter,pcd" data-page-size="24"></div>
<script src="https://aiwheeltech.com/aiwt-stock.js" defer></script>
See it live on the playground โ paste your key and watch the same widget that powers Manchester Alloys and International Alloys.
Errors
| status | error code | meaning |
|---|---|---|
| 401 | auth_required | This endpoint needs an API key. Pass X-AIWT-Key. |
| 403 | tier_insufficient | Your tenant's tier doesn't cover this endpoint. Response includes required_tier. |
| 404 | no vehicle matched / not found | The id/selector tuple resolved nothing. |
| 429 | quota_exceeded | Tenant exceeded monthly lookups. Resets on the 1st of next month. |
| 503 | โ | Database unreachable. We log + alert on these. |
CORS & caching
Access-Control-Allow-Origin: * on all /api/v1/* responses โ browser-side use is fine. Cache-Control: public, max-age=60 on read responses.
For high-volume clients we recommend caching at your edge โ fitment data is approximately stable per vehicle.
Ready to integrate?
Drop a line โ we'll send you a key, no card, no friction.
Email [email protected]