-
Notifications
You must be signed in to change notification settings - Fork 0
My volvo API connected vehicle v2
Errors caught in official docs and specification. docs are outdated (more than one diffrences between specification) specification dont says responses are in {data: }
Error responses could not be the same as in official API. Could be more informative or less informative. In future there are plans of two modes real and informative mode.
Timestamp in ISO-8601 format when the value has been last retrieved from the vehicle in this plaground the current time or if car is unavailble then the time when car is set to that.
Possible values: RUNNING, WAITING, COMPLETED, REJECTED, UNKNOWN, TIMEOUT, CONNECTION_FAILURE, VEHICLE_IN_SLEEP, DELIVERED, CAR_ERROR, NOT_ALLOWED_PRIVACY_ENABLED, NOT_ALLOWED_WRONG_USAGE_MODE.
Exception: RUNNING for sure can only go to engine and climate endpoints
- authorization access token generated thru Oauth. Not checked in this playground if disabled Oauth2
- vcc-api-key your api key (dont use your official api key in this playground for safety)
if POST
- Content-Type always application/json if GET
- Accept always application/json or */* (likely optional)
Volvo uses 2 tracking headers:
- vcc-api-operationId - UUID
- traceparent - W3C traceparent (Playground only sends it back)
This endpoints sends all cars VINs.
It only needs auth header
{
"data": [
{
"vin": "VIN123"
},
{
"vin": "VIN321"
}
]
}
This endpoints send information about the car.
It needs auth header and VIN
{
"data": {
"vin": <str>,
"modelYear": <int>,
"gearbox": "AUTOMATIC", #static data
"fuelType": <str>,
"externalColour": "SAVILE GREY STATIC", #static data
"batteryCapacityKWH": 78, #static data
"images": {
"exteriorImageUrl": "link-to-exterior-image", #static data
"internalImageUrl": "link-to-internal-image" #static data
},
"descriptions": {
"model": "V60 II STATIC", #static data
"upholstery": "CHARCOAL/LEAC/CHARC STATIC", #static data
"steering": "LEFT STATIC" #static data
}
}
}
legend:
- fuelType: HYBRID, ELECTRIC, DIESEL, PETROL
info: mostly static in playground but in future you will be able to change the static data
Vehicle's latest engine status value.
It needs auth header and VIN (PATH)
{
"data": {
"engineStatus": {
"value": <str>,
"timestamp": "2026-07-06T20:32:17.170Z"
}
}
}
legend:
- value: RUNNING or STOPPED
Starts the engine.
It needs auth header and VIN (PATH)
Body: {runtimeMinutes: <int>} (range from 1-15)
{
"data": {
"vin": <str>,
"invokeStatus": <str>,
"message": "" # if you know what volvo gives here make an issue
}
}
legend:
- invokeStatus read reused terms
Stops the engine.
It needs auth header and VIN (PATH)
{
"data": {
"vin": <str>,
"invokeStatus": <str>,
"message": "" # if you know what volvo gives here make an issue
}
}
Starts the climate.
It needs auth header and VIN (PATH)
{
"data": {
"vin": <str>,
"invokeStatus": <str>,
"message": "" # if you know what volvo gives here make an issue
}
}
Stops the climate.
It needs auth header and VIN (PATH)
{
"data": {
"vin": <str>,
"invokeStatus": <str>,
"message": "" # if you know what volvo gives here make an issue
}
}
Status of the windows.
It needs auth header and VIN (PATH)
{
"data": {
"frontLeftWindow": {
"value": <str>,
"timestamp": "2020-11-19T21:23:24.123Z"
},
"frontRightWindow": {
"value": <str>,
"timestamp": "2020-11-19T21:23:24.123Z"
},
"rearLeftWindow": {
"value": <str>,
"timestamp": "2020-11-19T21:23:24.123Z"
},
"rearRightWindow": {
"value": <str>,
"timestamp": "2020-11-19T21:23:24.123Z"
}
}
}
legend:
- value: CLOSED, AJAR, OPEN, UNSPECIFIED
Status of the doors and locks.
It needs auth header and VIN (PATH)
{
"data": {
"centralLock": {
"value": <str>,
"timestamp": "2026-07-21T12:48:31.896Z"
},
"frontLeftDoor": {
"value": <str>,
"timestamp": "2026-07-21T12:48:31.896Z"
},
"frontRightDoor": {
"value": <str>,
"timestamp": "2026-07-21T12:48:31.896Z"
},
"hood": {
"value": <str>,
"timestamp": "2026-07-21T12:48:31.896Z"
},
"rearLeftDoor": {
"value": <str>,
"timestamp": "2026-07-21T12:48:31.896Z"
},
"rearRightDoor": {
"value": <str>,
"timestamp": "2026-07-21T12:48:31.896Z"
},
"tailGate": {
"value": <str>,
"timestamp": "2026-07-21T12:48:31.896Z"
},
"tankLid": {
"value": <str>,
"timestamp": "2026-07-21T12:48:31.896Z"
}
}
}
legend:
- value (cental lock): LOCKED, UNLOCKED, UNSPECIFIED
- value (doors): CLOSED, OPEN, AJAR, UNSPECIFIED
Locks the car.
It needs auth header and VIN (PATH)
{
"data": {
"vin": <str>,
"invokeStatus": <str>,
"message": <str>
}
}
Locks the car.
DISABLED Manual support can be enabled (works like lock) It needs auth header and VIN (PATH)
{
"data": {
"vin": <str>,
"invokeStatus": <str>,
"message": <str>
}
}
Unlocks the car.
It needs auth header and VIN (PATH)
{
"vin": <str>,
"invokeStatus": <str>,
"message": <str>,
"readyToUnlock": True,
"readyToUnlockUntil": 5,
"details": "Not fully implemented manual button press needed in real life" #added as warning
}
Flashes the lights.
It needs auth header and VIN (PATH)
{
"data": {
"vin": <str>,
"invokeStatus": <str>,
"message": <str>
}
}
Sounds the horn.
It needs auth header and VIN (PATH)
{
"data": {
"vin": <str>,
"invokeStatus": <str>,
"message": <str>
}
}
Sounds the horn and flashes the lights.
It needs auth header and VIN (PATH)
{
"data": {
"vin": <str>,
"invokeStatus": <str>,
"message": <str>
}
}
STATIC
Statistics of the car.
It needs auth header and VIN (PATH)
"data": {
"averageFuelConsumption": {
"value": 7.2374,
"unit": "l/100km",
"timestamp": "2026-07-21T12:58:33.226Z"
},
"averageEnergyConsumption": {
"value": 7.2374,
"unit": "kWh/100km",
"timestamp": "2026-07-21T12:58:33.226Z"
},
"averageFuelConsumptionAutomatic": {
"value": 7.4732,
"unit": "l/100km",
"timestamp": "2026-07-21T12:58:33.226Z"
},
"averageEnergyConsumptionAutomatic": {
"value": 7.4732,
"unit": "kWh/100km",
"timestamp": "2026-07-21T12:58:33.226Z"
},
"averageEnergyConsumptionSinceCharge": {
"value": 7.4732,
"unit": "kWh/100km",
"timestamp": "2026-07-21T12:58:33.226Z"
},
"averageSpeed": {
"value": 50,
"unit": "km/h",
"timestamp": "2026-07-21T12:58:33.226Z"
},
"averageSpeedAutomatic": {
"value": 66,
"unit": "km/h",
"timestamp": "2026-07-21T12:58:33.226Z"
},
"tripMeterManual": {
"value": 500,
"unit": "km",
"timestamp": "2026-07-21T12:58:33.226Z"
},
"tripMeterAutomatic": {
"value": 420,
"unit": "km",
"timestamp": "2026-07-21T12:58:33.226Z"
},
"distanceToEmptyTank": {
"value": 1312,
"unit": "km",
"timestamp": "2026-07-21T12:58:33.226Z"
},
"distanceToEmptyBattery": {
"value": 312,
"unit": "km",
"timestamp": "2026-07-21T12:58:33.226Z"
}
}
}
Status of tyres.
It needs auth header and VIN (PATH)
{
"data": {
"frontLeft": {
"value": <str>,
"timestamp": "2026-07-22T11:34:06.553Z"
},
"frontRight": {
"value": <str>,
"timestamp": "2026-07-22T11:34:06.553Z"
},
"rearLeft": {
"value": <str>,
"timestamp": "2026-07-22T11:34:06.553Z"
},
"rearRight": {
"value": <str>,
"timestamp": "2026-07-22T11:34:06.553Z"
}
}
}
legend:
- value: UNSPECIFIED, NO_WARNING, VERY_LOW_PRESSURE, LOW_PRESSURE, HIGH_PRESSURE.
Status of fuel.
It needs auth header and VIN (PATH)
{
"data": {
"fuelAmount": {
"value": <int>, # 0-inf
"unit": "l",
"timestamp": "2026-07-22T11:35:44.174Z"
},
"batteryChargeLevel": {
"value": <int>, # 0-100
"unit": "%",
"timestamp": "2026-07-22T11:35:44.174Z"
}
}
}
INFO: if car is electric then the fuel Amount isnt sent and if the car is petrol/diesel then the batteryChargeLevel isnt sent. If the car is hybrid then both are sent.
Status of odometer.
It needs auth header and VIN (PATH)
{
"data": {
"odometer": {
"value": 0, # 0-inf
"unit": "km",
"timestamp": "2026-07-22T11:37:42.485Z"
}
}
}
diagnostics of engine.
It needs auth header and VIN (PATH)
{
"data": {
"engineCoolantLevelWarning": {
"value": <str>,
"timestamp": "2026-07-22T11:38:59.340Z"
},
"oilLevelWarning": {
"value": <str>,
"timestamp": "2026-07-22T11:38:59.340Z"
}
}
}
values: UNSPECIFIED, NO_WARNING, TOO_LOW
diagnostics of the car.
It needs auth header and VIN (PATH) checks needed
diagnostics of brake fluid.
It needs auth header and VIN (PATH)
{
"data": {
"brakeFluidLevelWarning": {
"value": "<str>",
"timestamp": "2026-07-22T11:43:11.924Z"
}
}
}
legend: values: UNSPECIFIED, NO_WARNING, TOO_LOW
Shows a lot of warnings for the lights
It needs auth header and VIN (PATH)
classic cars different from new cars. Need to check with volvo specification Some data will different from car to car.
List of commands available for the car.
It needs auth header and VIN (PATH) INFO: It is made to look like official but its not /v2/.. for now
{
"data": [
{
"command": "CLIMATIZATION_START",
"href": "/v2/vehicles/VIN123/commands/climatization-start"
},
{
"command": "CLIMATIZATION_STOP",
"href": "/v2/vehicles/VIN123/commands/climatization-stop"
},
{
"command": "ENGINE_START",
"href": "/v2/vehicles/VIN123/commands/engine-start"
},
{
"command": "ENGINE_STOP",
"href": "/v2/vehicles/VIN123/commands/engine-stop"
},
{
"command": "FLASH",
"href": "/v2/vehicles/VIN123/commands/flash"
},
{
"command": "HONK",
"href": "/v2/vehicles/VIN123/commands/honk"
},
{
"command": "HONK_AND_FLASH",
"href": "/v2/vehicles/VIN123/commands/honk-and-flash"
},
{
"command": "LOCK",
"href": "/v2/vehicles/VIN123/commands/lock"
},
{
"command": "UNLOCK",
"href": "/v2/vehicles/VIN123/commands/unlock"
}
]
}
legend:
- href doesn't point to playground url but real life api endpoints (when more than one api will be implented then it will match)
- addtional command exists REDUCED_GUARD_LOCK it is not default added (it would be like lock/only on AAOS cars)
Returns if the car is able to execute commands.
It needs auth header and VIN (PATH)
{
"data": {
"availabilityStatus": {
"value": <str>,
"unavailableReason": <str>,
"timestamp": "2026-07-28T21:25:29.446Z"
}
}
}
legend:
- unavailableReason only sent if not available "UNSPECIFIED", "NO_INTERNET", "POWER_SAVING_MODE", "CAR_IN_USE" also "" if you want to reset it ( if set to one of them auto invoice selection will be activated)
- value: "AVAILABLE", "UNAVAILABLE", "UNSPECIFIED"