---
title: "Record an odometer reading for a charge"
method: POST
path: "/api/v1/charges/{chargeId}/odometer-readings"
tags: ["Charges"]
---

# Record an odometer reading for a charge

`POST /api/v1/charges/{chargeId}/odometer-readings`

## Request

- Base URL: `https://partner-api.monta.com`
- URL: `https://partner-api.monta.com/api/v1/charges/{chargeId}/odometer-readings`
- Auth: HTTP bearer

Required scope: `charge-odometer:write` </br>Organization authorization: `supported`

The reading is stored with `source` set to `partner_api` — provenance cannot be chosen by the caller. Readings are append-only evidence: implausible jumps and decreases are never rejected at write time, they are surfaced asynchronously as verification results. To correct history, record a new reading.

## Path parameters

- `chargeId` integer, required

## Request body

- CreateOdometerReading
  - `odometerKm` integer, required: Odometer reading in whole kilometres. Values outside 0-4000000 are rejected with 422.
  - `readingAt` string, date-time, nullable: When the reading was taken (ISO8601: yyyy-MM-ddTHH:mm:ssZ). Defaults to the time of the request.
  - `sourceRef` string, nullable: Your own identifier for this reading, echoed back on reads. Maximum 128 characters.

## Response `201`

Odometer reading recorded

- OdometerReading
  - `id` integer, required: Id of the odometer reading
  - `chargeId` integer, required: Id of the charge the reading belongs to
  - `vehicleId` integer, nullable: Id of the vehicle the reading was taken from. Null when the charge has no vehicle assigned.
  - `odometerKm` integer, required: Odometer reading in whole kilometres
  - `readingAt` string, date-time, required: When the reading was taken (ISO8601: yyyy-MM-ddTHH:mm:ssZ)
  - `source` 'vehicle_integration' | 'manual_app' | 'manual_hub' | 'partner_api', required: Where the reading came from
  - `sourceLabel` string, required: Human-readable label for `source`
  - `sourceRef` string, nullable: Your own identifier for this reading, echoed back as you sent it
  - `capturePhase` 'start' | 'stop' | 'manual', required: Point in the charge lifecycle the reading was captured at. Readings you push are always `manual`.
  - `confidence` 'verified' | 'declared', required: How trustworthy the value is: `verified` for a Monta vehicle integration, `declared` for anything a human or a partner reported
  - `confidenceLabel` string, required: Human-readable label for `confidence`
  - `editable` boolean, required: True only for readings you pushed yourself. Readings from a vehicle integration, the driver app or the operator hub are another party's evidence and cannot be patched or deleted.
  - `createdAt` string, date-time, nullable: When the reading was recorded (ISO8601: yyyy-MM-ddTHH:mm:ssZ)

## Other responses

- `400`: The request is invalid
- `401`: Consumer with provided credentials was not found
- `403`: Operator doesn't have access to resource
- `404`: Entity with the provided id was not found
- `422`: Validation failed — `odometerKm` missing or outside 0-4000000, `readingAt` unparseable, or `sourceRef` longer than 128 characters

## Changes

- **2026-11-03** `0ca400461c52`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/monta/apis/monta-partner-api/changes/api/v1/charges/:chargeId/odometer-readings/post.md)

---

[API](https://skmtc.dev/monta/apis/monta-partner-api.md) - [All operations](https://skmtc.dev/monta/apis/monta-partner-api/llms.txt) - [OpenAPI document](https://skmtc.dev/monta/apis/monta-partner-api/revisions/0ca400461c52?raw)
