Paste this. It works.
Discovery is public, because the map has to draw before anybody signs in — no key, no form, and the request below runs against production right now. Reading your own sessions or sending a charger a command takes a key, and that is further down.
curl "https://api.athenire.com/v1/stations?lat=17.385&lng=78.4867&radius_km=25&limit=2"[
{
"id": "pk-061bf1",
"name": "Pk",
"latitude": 17.4435,
"longitude": 78.3772,
"available": 1,
"total": 1,
"max_power_kw": 30,
"price_per_kwh": 18.0,
"currency": "INR",
"connector_types": ["CCS2"],
"distance_km": 13.31,
"source": "network",
"price_known": true,
"reliability": null
}
]Two fields worth noticing. source says whether a listing is ours, a roaming partner's, or a public charger we can show but not book — the app draws and starts each differently. price_knownis false when we hold no published tariff, so you can render “price at start” instead of a zero that reads as free.
Two hundred operations, one spec
Generated from the running service, so the documentation cannot drift from the API.
API reference
Searchable, with a request builder on every operation. Rendered by Scalar from our own OpenAPI document.
OpenAPI 3.1
The raw spec. Generate a client in whatever language you are in, rather than reading prose and hoping.
Swagger
The same spec in the interface you may already be used to. ReDoc is at /redoc.
Everything past discovery takes a key
One that names the caller, carries only what it was granted, and can be revoked on its own.
sessions:readCompleted charges — energy, cost, whether it was paid. Deliberately not the driver: who charged is not an integration's business, and a scope that quietly included it would be unsafe to grant.
stations:readYour sites and where they are, as a partner's map would draw them.
commands:writeReset, unlock, take a charger out of service. This one reaches hardware somebody may be standing at.
money:readSettlement statements. The scope most worth keeping off a key that only needs to read sessions.
curl -H "X-API-Key: ak_live_…" \
"https://api.athenire.com/v1/api/sessions?limit=50"
# or, if your client already speaks bearer:
curl -H "Authorization: Bearer ak_live_…" \
"https://api.athenire.com/v1/api/stations"POST /v1/webhooks
{
"url": "https://yours.example/athenire",
"events": ["session.completed"]
}
# every delivery carries:
X-Athenire-Signature: v1=<hmac sha256>
X-Athenire-Timestamp: 1789…Keys are minted in the operator console under Settings, and the secret is shown once — we store only a hash of it, so a lost key is replaced rather than recovered. Grant the narrowest set that works: a key holding every scope is the shared secret this replaced, wearing a different name. Each key carries its own rate limit, and revoking one does not disturb the others.
Webhooks are the other half. Polling every thirty seconds to learn that a charge finished is a question we could have answered by telling you — deliveries are signed with a secret shown once, retried with backoff, and a delivery that died is one you replay yourself from the console rather than asking us to.
Open standards, including the one we have not finished
A protocol list is only useful if it distinguishes what is running from what is intended.
OCPP 1.6-J and 2.0.1
Point a charge point at our CSMS websocket and it registers itself. Both subprotocols are offered on the handshake, in preference order, and the charger picks.
OCPI 2.2.1, both roles
We run the CPO side and the eMSP side, so we can accept a partner's drivers and send ours out. Party id, versions URL and credentials handshake are on the roaming page.
Beckn / UEI
BAP and BPP against core 1.1.0 and the ev-charging:uei domain, so a charge here is discoverable from any UEI-compliant app rather than only from ours.
ISO 15118
Plug-and-charge identifiers are carried through the session model. The certificate handling that makes it usable end to end is not built yet, and we would rather say so.
A charge point, in your browser
A real OCPP charge point that boots, heartbeats, authorises, streams MeterValues and evaluates smart-charging profiles — all client-side, so you can watch the frames without owning hardware or asking us for anything. Run a fleet of them if you want to see what load looks like.
Open the simulatorPeering as a network instead? Our OCPI details are here.