Transaction detail, meter values and timeline
Available: tenant fleet API. Three read-only routes describe one charging
transaction. They need billing:read, as the transaction list does, so
read-only viewers can use them. {transaction_id} is the resource ID (id)
from GET /v1/tenants/{tenant_id}/transactions, not the charger's OCPP
transactionId.
| Route | Returns |
|---|---|
GET /v1/tenants/{tenant_id}/transactions/{transaction_id} | Station, EVSE and connector, masked ID token, start, stop, stop reason, duration, energy and the linked bill |
GET …/transactions/{transaction_id}/meter-values?after=&limit= | The sampled values the charger reported, newest last |
GET …/transactions/{transaction_id}/events | The charger's transaction messages as one timeline, oldest first |
A transaction of another tenant, or one that does not exist, returns
404 transaction_not_found.
Units
Every energy field names its unit. Ivora does not convert a value silently.
| Field | Unit | Source |
|---|---|---|
energy_kwh | kWh, decimal text | The core's transaction total |
energy_wh | Wh, integer | The same total |
meter_start_kwh, meter_start_wh | kWh and Wh | The core's meter start, which it stores in kWh |
Timeline meter_wh | Wh, integer | Raw OCPP 1.6 meterStart and meterStop registers |
Sample value | The sample's unit, times 10 to the power of multiplier | The charger's own reading |
Sample value_wh | Wh, integer | Energy registers reported in Wh or kWh only |
Detail
{"id":31,"transaction_id":"5031","station_id":12,"station_name":"rcd-01",
"evse_number":1,"connector_id":121,"connector_number":1,
"id_token":"****C3D4","id_token_type":"ISO14443","active":false,
"started_at":"2026-10-01T10:00:00+00:00","ended_at":"2026-10-01T11:30:00+00:00",
"duration_seconds":5400,"stop_reason":"Local","energy_kwh":"6.941","energy_wh":6941,
"bill":{"id":"bill_…","status":"final","currency":"USD","total_minor":243,"energy_kwh":"6.941"}}
id_token shows only the last 4 characters: a copied card value can start
charging. duration_seconds runs until now while the transaction is active.
bill is the managed bill the transaction settles.
After finalization this is the bill finalized with it. While the transaction is
active, it is the open bill on its connector whose charging token started it.
An ended transaction with no bill finalized with it has bill null, even if the
same card has another bill open on that connector. The bill's charging token is never returned. billing repeats the
captured payment the transaction list shows.
Meter values
Each item is one meter reading the core recorded: its timestamp, the message
that carried it (source: meter_values, transaction_event or
stop_transaction) and its samples. Every sample states measurand, value,
unit, multiplier, phase, context and location. When the charger omits
a measurand, unit or context, the OCPP defaults apply and are written out:
Energy.Active.Import.Register, Wh and Sample.Periodic.
Items come in the order the core recorded them, newest last. Pass the last
next_cursor as after to read the next page (limit 1 to 500, default 100).
An empty page returns the same cursor.
Timeline
The timeline merges the protocol's transaction messages, oldest first by the charger's timestamp:
- OCPP 1.6:
StartTransaction(kindstarted) andStopTransaction(ended, withreason). Both carrymeter_wh, the raw register in Wh. - OCPP 2.0.1 and 2.1: each
TransactionEvent, asstarted,updatedorended, withtrigger_reason,seq_no,charging_state,offlineandnumber_of_phases.
A transaction with more than 500 TransactionEvent messages lists the first
500 and sets truncated. Meter readings are not repeated in the timeline: read
them from the meter values route.
Diagram source
sequenceDiagram
participant App as Dashboard
participant API as Ivora API
participant C as Charging core
App->>API: GET transactions
API-->>App: Transaction IDs
App->>API: GET transaction detail
API->>C: Read transaction, station and token
API-->>App: Detail with linked bill
App->>API: GET meter values with after cursor
API-->>App: Samples with units, newest last