1. Onboarding
Each battery needs asite_id and asset_id in Axle’s system before you can send telemetry or
receive dispatch for it — these are the identifiers used throughout the rest of the integration.
There are two ways to get there.
Pick one. They’re alternatives rather than steps: either you create the site and asset yourself
through our API, or Axle creates them during signup and hands you the identifiers. Doing both will
give you two sets of identifiers for one battery.
What we mean by a “battery”. Axle treats a battery as a complete battery system — the
battery, its inverter and its meter. If a site has several battery units behind a single system,
register them as one asset with the combined capacity.
- Through your app
- Through Axle's signup flow
If you already collect address, consent and asset details yourself, call Axle’s onboarding API
directly.Example requestYour backend authenticates as described in Authentication.
Onboard site and asset
Register a site and battery, returns
site_id and asset_id.Use
vpp_limited_control in the dispatch_methods array. That’s event-only mode, which is
what the integration on this page delivers today — full_asset_schedule_control isn’t yet
available over the dispatch webhook.You don’t need to send us tariff details either way. We collect those from the customer
ourselves, and they can opt into full optimisation later from their Axle account pages.Identifiers are scoped to one environment and one organisation. A sandbox
asset_id won’t resolve
against production, a production token won’t reach sandbox assets, and no other organisation can
see yours. If telemetry comes back with an unknown asset_id, that mismatch is the first thing to
check.2. Telemetry
Send regular readings for each battery so we can optimise it and verify delivery. Which readings we need depends on the mode the battery runs in:boundary_import_kw is grid import and export at the site boundary. Grid power is bidirectional, so
the sign tells us the direction: positive = import from the grid, negative = export to the
grid.
Push readings to the readings endpoint, which lists every accepted label and its sign
convention.
Cadence
Send readings every 5 minutes. Ordinary scheduler and network jitter around that is fine, we don’t need the interval to be exact, and we’d rather have a steady 5-minute snapshot than raw per-minute telemetry.Timestamps
Every reading carries astart_timestamp and an end_timestamp, and which of the two forms you use
depends on the reading:
The lifetime meter registers are cumulative, but they’re still instantaneous readings: each one is
the register’s value as read at a single moment. Send them with matching timestamps rather than
spanning back to the previous reading.
Send telemetry
Push battery and boundary readings to Axle.
If pushing readings doesn’t suit your platform, we can also pull readings from custom endpoints
you provide — get in touch to discuss your setup.
3. Dispatch
During a grid event we send a dispatch instruction to a webhook URL you provide. Each instruction covers a single event and sets a target power for every affected asset over a fixed window. You supply the webhook URL when you set up your integration — get in touch to register it.power_kw uses the same sign convention as telemetry: positive = charge (import into the
battery), negative = discharge (export). Apply the target power to each asset for the window
between start_time and end_time.
The target power applies at the inverter. We dispatch at the inverter’s rated power, and we
account for the fact that household load can limit the power the battery actually delivers. If no
power rating was recorded for an asset at registration, we fall back to 5 kW, so send
power_kw when you register the battery.
Timing
We send the instruction 10 minutes before the event starts. That’s deliberate, and it shapes the rest of the contract. We only issue an instruction for an event that is definitely going ahead, which means we never need to withdraw one: there’s no cancellation webhook, and an instruction you’ve received will not be amended. The trade-off is that you need to be able to act on a dispatch within a few minutes of receiving it. If that’s too tight for your cloud-to-device path, get in touch and we can look at extending it. Windows always align to 30-minute boundaries, in ISO-8601 UTC and never with microseconds. Each instruction covers a single continuous window — most commonly an hour, sometimes 30 minutes or two hours — and never several segments.Confirming delivery
Return a2xx and keep telemetry flowing. That’s all we need — there’s no status callback to
implement, and we use your 5-minute readings to verify what was delivered and to settle the event,
which lands two days afterwards.
The same goes for shortfalls. If a local limit gets in the way — low state of charge, thermal
derating, an anti-backflow cap, or a battery that’s simply offline — you don’t need to report it.
The readings will show what the battery actually did.
Dispatch webhook
Full schema for the dispatch instruction we send to your webhook.
If you already have your own dispatch API, we can work with custom dispatch endpoints instead of
the webhook above — get in touch to discuss your setup.
Important points
- Customers should be able to override dispatch instructions at any time.
- The battery should return to its original mode of operation after the dispatch event has finished
Testing your integration
Build against the sandbox athttps://api-sandbox.axle.energy before you go near production.
Identifiers, tokens and webhook signing keys are all distinct between the two.
1
Get sandbox credentials
Get in touch and we’ll set up a sandbox account, then exchange your
credentials for a token as described in
Setting up an environment.
2
Send telemetry against a sandbox asset
Onboard a battery, or ask us to provision one, and push readings to
POST /data/readings.3
Register your webhook endpoint
Send us the URL you want dispatch instructions delivered to, and we’ll register it and issue a
signing key. We start in sandbox and move to production once you’ve signed the integration off.
4
Trigger a test dispatch
Call
POST /webhooks/test to have us deliver a vpp:dispatch:requested event to your registered
endpoint, through the same signing and retry machinery as a real one. See
Testing your endpoint for the request format,
how to point a test at one of your real assets, and how to tell a test event from a real one.Next steps
Webhooks
The delivery contract: envelope, signature verification, responses and retries
Site and asset lifecycle
How sites and assets move through the platform, and how to handle a customer opting out

