New: OCPP 2.0.1, spot-price tariffs and load management with 1/3-phase switching Try the live console →

Platform

We handle the foundation. You build the edge.

Our REST API and webhooks are documented, and you can call the API live on this page.

MethodEndpointDescription
GET/api/v1/chargersAll chargers with live status
GET/api/v1/chargers/{id}One charger
GET/api/v1/sessions?active=1&limit=50Charging sessions
GET/api/v1/statsNetwork KPIs
GET/api/v1/tariffCurrent tariff
GET/api/v1/sitesLoad per site with limits
GET/api/v1/eventsServer-sent event stream of OCPP traffic
POST/api/v1/chargers/{id}/start|stop|reset|unlockRemote command (API key)
POST/api/v1/sites/{site}/meterBuilding load in kW for load management (API key)
// Click "Try it" to call the live API

OCPP endpoint

wss://ocpp.askendal.com/ocpp/<chargePointId>   (subprotocol ocpp1.6, ocpp2.0.1 or ocpp2.1; a password with Basic Auth, or a client certificate)

Authentication

Reading is open. Commands and meter readings need an API key, created by an admin under Admin → API keys.

curl -X POST https://voltvik.askendal.com/api/v1/chargers/CP-05/start -H "Authorization: Bearer vvk_…"

# Building meter: report the building's own load every minute or so
curl -X POST https://voltvik.askendal.com/api/v1/sites/Gallerian/meter -H "Authorization: Bearer vvk_…"      -H "Content-Type: application/json" -d '{"building_kw": 42.5}'

Webhooks

An admin adds endpoints under Admin → Webhooks. Each event is POSTed as JSON and retried after 10 s, 1 min and 5 min if your endpoint does not answer 2xx.

EventWhen
session.startedA charging session starts (OCPP 1.6J StartTransaction or 2.0.1 TransactionEvent Started)
session.stoppedA session ends, with kWh, cost and reason
charger.statusA charger changes status (Available, Charging, Faulted …)
lead.createdSomeone submits a form on the website
POST your-url
X-Voltvik-Event: session.stopped
X-Voltvik-Signature: t=1793600000,v1=<hex HMAC-SHA256 of "t.body" with your signing secret>

{ "id": "…", "event": "session.stopped", "created_at": "…",
  "data": { "session_id": 1281, "charger_id": "CP-03", "kwh": 41.2, "cost": 229.07, "currency": "SEK", "reason": "EVDisconnected", … } }

// Verify in Node.js
const [t, v1] = sig.split(',').map(x => x.split('=')[1]);
const ok = crypto.createHmac('sha256', secret).update(t + '.' + rawBody).digest('hex') === v1;