Skip to content

My volvo API connected vehicle v2

xavier edited this page Aug 18, 2026 · 3 revisions

official endpoints:

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

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.

Reused terms

Timestamp

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.

invoke Status

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

auth header

  • 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)

Tracking:

Volvo uses 2 tracking headers:

  • vcc-api-operationId - UUID
  • traceparent - W3C traceparent (Playground only sends it back)

List vehicles

GET: /vehicles

This endpoints sends all cars VINs.

It only needs auth header

{
  "data": [
    {
      "vin": "VIN123"
    },
    {
      "vin": "VIN321"
    }
  ]
}

Get vehicle information

GET: /vehicles/{VIN}

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

engine status

GET: /vehicles/{VIN}/engine-status

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

engine start

POST: /vehicles/{VIN}/commands/engine-start

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

engine stop

POST: /vehicles/{VIN}/commands/engine-stop

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
  }
}

Climate start

POST: /vehicles/{VIN}/commands/climatization-start

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
  }
}

Climate stop

POST: /vehicles/{VIN}/commands/climatization-stop

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
  }
}

Windows Status

GET: /vehicles/{VIN}/windows

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

Doors Status

GET: /vehicles/{VIN}/doors

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

locking the car

POST: /vehicles/{VIN}/commands/lock

Locks the car.

It needs auth header and VIN (PATH)

{
  "data": {
    "vin": <str>,
    "invokeStatus": <str>,
    "message": <str> 
  }
}

locking the car (reduced)

POST: /vehicles/{VIN}/commands/lock-reduced-guard

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> 
  }
}

Unlocking the car

POST: /vehicles/{VIN}/commands/unlock

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
}

flashing the lights

POST: /vehicles/{VIN}/commands/flash

Flashes the lights.

It needs auth header and VIN (PATH)

{
  "data": {
    "vin": <str>,
    "invokeStatus": <str>,
    "message": <str>
  }
}

horn

POST: /vehicles/{VIN}/commands/honk

Sounds the horn.

It needs auth header and VIN (PATH)

{
  "data": {
    "vin": <str>,
    "invokeStatus": <str>,
    "message": <str>
  }
}

horn and flash lights

POST: /vehicles/{VIN}/commands/honk-and-flash

Sounds the horn and flashes the lights.

It needs auth header and VIN (PATH)

{
  "data": {
    "vin": <str>,
    "invokeStatus": <str>,
    "message": <str>
  }
}

statistics

STATIC

GET: /vehicles/{VIN}/statistics

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"
    }
  }
}

tyres

GET: /vehicles/{VIN}/tyres

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.

fuel

GET: /vehicles/{VIN}/fuel

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.

odometer

GET: /vehicles/{VIN}/odometer

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"
    }
  }
}

engine

GET: /vehicles/{VIN}/engine

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

GET: /vehicles/{VIN}/diagnostics

diagnostics of the car.

It needs auth header and VIN (PATH) checks needed

brakes

GET: /vehicles/{VIN}/brakes

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

warnings

GET: /vehicles/{VIN}/warnings

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.

commands

GET: /vehicles/{VIN}/commands

List of commands available for the car.

It needs auth header and VIN (PATH) INFO: It is made to look like official but the playground url is 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)

command accessability

GET: /vehicles/{VIN}/command-accessibility

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"

Clone this wiki locally