API Reference
Car Details
A car detail is the vehicle record Ototo calculates against — catalog price, fuel type, emissions, and the technical data Belgian tax rules depend on. Store one per vehicle and reference it by ID from Calculate or Tax Matrix, or pass the same shape inline to Calculate without storing it first.
Retrieve a car detail
GET /CarDetails/{carDetailId}
GET https://api.ototo.be/v1/CarDetails/{carDetailId}?subscription-key=YOUR_KEY
| Status | Meaning |
200 | The car detail object, in JSON |
401 | Subscription key missing, invalid, or inactive — see Authentication |
404 | No car detail exists for that ID |
500 | Something went wrong on the server. Retry later; contact Ototo if it persists. |
Create a car detail
POST /CarDetails
POST https://api.ototo.be/v1/CarDetails?subscription-key=YOUR_KEY
Content-Type: application/json
Body: a car detail object (see below). Any id or ownerId you send is ignored — both are assigned by Ototo.
| Status | Meaning |
201 | Created. A Location header points at the new resource. |
400 | The car detail object was invalid — the response describes why (missing or invalid data) |
401 | Subscription key missing, invalid, or inactive — see Authentication |
500 | Something went wrong on the server. Retry later; contact Ototo if it persists. |
Update (or create) a car detail
PUT /CarDetails/{carDetailId}
PUT https://api.ototo.be/v1/CarDetails/{carDetailId}?subscription-key=YOUR_KEY
Content-Type: application/json
Body: a car detail object (see below). This call is idempotent — it upserts the record at carDetailId. As with create, any id or ownerId in the body is ignored.
| Status | Meaning |
200 | Updated an existing car detail. A Location header points at the resource. |
201 | No car detail existed at that ID, so one was created. A Location header points at the new resource. |
400 | The car detail object was invalid — the response describes why |
401 | Subscription key missing, invalid, or inactive — see Authentication |
500 | Something went wrong on the server. Retry later; contact Ototo if it persists. |
The car detail object
| Field | Type | Required | Description |
id | guid | ignored on write | Unique identifier. Assigned by Ototo, except that PUT uses the ID in the URL. |
ownerId | guid | ignored on write | Owning account, assigned by Ototo |
name | string | optional, recommended | Display name shown to end users |
internalName | string | optional | An internal identifier of your own choosing |
catalogPrice | decimal | required | Catalog price* |
firstRegistration | date | optional | Date of first registration (yyyy-MM-dd). Required in practice for cars first registered after 2021-01-01, since wltp becomes mandatory from that date. |
fuel | enum | required | See FuelType below |
euroStandard | enum | required | See EuroStandard below |
kilowatt | decimal | required | Engine power, in kW |
wltp | int | conditionally required | WLTP CO₂ emissions. Mandatory for vehicles with firstRegistration on or after 2021-01-01. |
nedC2 | int | required | NEDC2 CO₂ emissions |
capacity | int | conditionally required | Engine capacity in cc. Required when fuel is Diesel, Petrol, LPG, NaturalGas, HydrogenPetrol, HybridPetrol, HybridDiesel, PluginHybridDiesel, or PluginHybridPetrol. |
weight | int | optional, recommended | Vehicle weight. Used to determine "valse hybrides" (false hybrids) and Wallonia road tax. |
batteryCapacity | decimal | conditionally required | Hybrid battery capacity. Required when fuel is PluginHybridDiesel or PluginHybridPetrol; used to determine "valse hybrides". |
nedC2NonHybrid | int | recommended for plug-in hybrids | NEDC2 emissions of the comparable non-hybrid version. Needed for "valse hybride" calculations when fuel is PluginHybridDiesel or PluginHybridPetrol. |
wltpNonHybrid | int | recommended for plug-in hybrids | WLTP emissions of the comparable non-hybrid version. Same purpose as nedC2NonHybrid. |
isActive | bool | optional, defaults to true | Leave as true. Reserved for future functionality. |
* Ototo stores prices excluding VAT. If your subscription is configured to send prices including VAT, tell your Ototo contact — the API will divide by 1.21 before storing. Provide as much of the non-mandatory data as you can: fields that aren't required for today's calculations may be needed by calculators added later.
FuelType
| Name | Value |
Diesel | 10 |
Petrol | 20 |
LPG | 25 |
NaturalGas | 30 |
PluginHybridDiesel | 40 |
PluginHybridPetrol | 50 |
HybridPetrol | 60 |
HybridDiesel | 70 |
Electric | 80 |
HydrogenPetrol | 90 |
Hydrogen | 100 |
EuroStandard
| Name | Value |
NA | 0 |
Euro0 | 10 |
Euro1 | 20 |
Euro2 | 30 |
Euro3 | 40 |
Euro3Filter | 45 |
Euro4 | 50 |
Euro4Filter | 55 |
Euro5 | 60 |
Euro6 | 70 |
Euro7 | 80 |
Enum fields accept either their numeric value or their name as a JSON string, e.g. "fuel": 80 or "fuel": "Electric".
Example
Request — create a car detail
POST https://api.ototo.be/v1/CarDetails?subscription-key=YOUR_KEY
Content-Type: application/json
{
"name": "Tesla Model 3",
"internalName": "TESLA-M3-2026",
"catalogPrice": 45000.00,
"firstRegistration": "2026-01-15",
"fuel": "Electric",
"euroStandard": "NA",
"kilowatt": 150.00,
"wltp": 0,
"nedC2": 0,
"weight": 1750
}
Response — 201 Created
Location: https://api.ototo.be/v1/CarDetails/12345678-1234-1234-1234-123456789abc
Response — 200 OK (GET)
{
"id": "12345678-1234-1234-1234-123456789abc",
"ownerId": "d9dfcaea-561b-46db-8bd4-7edb2d77566d",
"name": "Tesla Model 3",
"internalName": "TESLA-M3-2026",
"catalogPrice": 45000.00,
"firstRegistration": "2026-01-15T00:00:00",
"fuel": "Electric",
"euroStandard": "NA",
"kilowatt": 150.00,
"wltp": 0,
"nedC2": 0,
"capacity": null,
"weight": 1750,
"batteryCapacity": null,
"nedC2NonHybrid": null,
"wltpNonHybrid": null,
"isActive": true
}
See also
- Calculate — run a calculation for this vehicle by
carDetailId, or skip storing it and pass the same object inline
- Tax Matrix — full tax overview for a stored vehicle
- Public Link and QR Code — share a stored vehicle with end users