Arcora

The Arcora operator API

The HTTPS API your backend serves so your chargers work in the Arcora app. Your backend talks OCPP to the chargers; the app only ever talks to this API.

Basics

Transport
HTTPS, JSON (UTF-8). All paths go under your backend URL + /v1.
Auth
Every request carries Authorization: Bearer <token>, the driver's Arcora session token.
Times
ISO 8601 UTC, e.g. 2026-10-21T16:12:00Z
Money
Decimals in your currency (USD for now), rounded to the cent
Energy, power
kWh and kW, as decimals

Verifying the driver

The token is a signed JWT from Arcora's sign-in provider (Clerk). Verify its signature against Arcora's public keys (JWKS) and check exp and nbf. Reject a missing or invalid token with HTTP 401.

sub is the driver's stable user ID. Scope every session and receipt to it, and never trust a user ID sent in a request body. Another driver's session is a 404, not a 403.

Endpoints

MethodPathReturnsNotes
GET/chargers?lat=&lng=&radiusKm=Charger[]Nearest first; radiusKm defaults to 25
GET/chargers?q=Charger[]Text match on name and address
GET/chargers/{id}Charger
GET/chargers/by-code/{code}ChargerThe code printed on the unit and in its QR link
POST/chargers/{id}/notify204Notify the driver when a port frees up
POST/sessions201 SessionRemote start on a free port
GET/sessions/activeSession or 204The driver’s live session with you, if any
GET/sessions/{id}SessionPolled every 2 s while the session screen is open
POST/sessions/{id}/stopSessionRemote stop; returns Finishing right away
GET/sessions/{id}/receiptReceipt404 until the session is Complete
GET/receiptsReceipt[]The driver’s past sessions, newest first

Errors

Non-2xx responses carry { "error": { "code", "message" } }. The app shows a designed screen for each code below; anything else should be a 5xx, which the app treats as a network problem and offers a retry.
CodeHTTPWhen
NOT_FOUND404Unknown charger, code or session, or one that belongs to another driver
CHARGER_UNAVAILABLE409No free port, charger offline or faulted, or it rejected the remote start
SESSION_ALREADY_ACTIVE409The driver already has a live session with you
PAYMENT_FAILED402You refused the start for a payment reason

From OCPP to the API

The values the app shows come from your chargers’ OCPP messages. Read each sample’s unit: energy defaults to Wh and power to W, and a Wh/kWh mix-up bills 1000 times wrong.
FieldOCPP 1.6JOCPP 2.0.1
kwhDeliveredEnergy.Active.Import.Register now minus at startSame register in TransactionEvent
chargingSpeedKwPower.Active.Import (0 unless charging)Same, in meterValue
socPercentSoC measurand, if the charger sends itSame
stopReasonStopTransaction reasontransactionInfo.stoppedReason
Port statusStatusNotification statusStatusNotification connectorStatus

Starting a session is an OCPP remote start (RemoteStartTransaction in 1.6, RequestStartTransaction in 2.0.1), and stopping is the matching remote stop. Price and cost are yours to compute: OCPP carries no price.

The connection check

Before your chargers appear in the app, Arcora checks your backend from your operator dashboard. It only reads; it never starts a session.
  1. 1Finds your test charger by its code, then by ID
  2. 2Lists chargers near it, and searches by name
  3. 3Sends no token, then a forged token, and expects HTTP 401 both times
  4. 4Asks for an unknown charger and expects a NOT_FOUND error
  5. 5Reads the driver’s active session and receipts

Need an OCPP server to build on? See backend options. The protocol itself is published by the Open Charge Alliance.