Charger management

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.

RouteReturns
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}/eventsThe 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.

FieldUnitSource
energy_kwhkWh, decimal textThe core's transaction total
energy_whWh, integerThe same total
meter_start_kwh, meter_start_whkWh and WhThe core's meter start, which it stores in kWh
Timeline meter_whWh, integerRaw OCPP 1.6 meterStart and meterStop registers
Sample valueThe sample's unit, times 10 to the power of multiplierThe charger's own reading
Sample value_whWh, integerEnergy 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 (kind started) and StopTransaction (ended, with reason). Both carry meter_wh, the raw register in Wh.
  • OCPP 2.0.1 and 2.1: each TransactionEvent, as started, updated or ended, with trigger_reason, seq_no, charging_state, offline and number_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.

sequence diagram; its source follows
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