Chargers
Understand charger objects and how Joulo represents your EV chargers
A charger in Joulo represents a physical EV charging station linked to your account. Joulo supports chargers from multiple manufacturers, all accessible through a unified API.
Charger object
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"nickname": "Garage",
"brand": "Zaptec",
"model": "Go 2",
"connection_type": "cloud_api",
"status": "active",
"mid_certified": true,
"mid_eligible": true,
"is_charging": true,
"connection_status": "online",
"last_seen_at": "2026-04-09T10:29:12Z",
"last_seen_basis": "device",
"docs_url": "https://joulo.nl/docs/zaptec",
"current_session": {
"id": "f0e1d2c3-b4a5-6789-0abc-def123456789",
"started_at": "2026-04-09T08:15:00Z",
"kwh_so_far": 12.45,
"meter_start_wh": null,
"estimated_euro": 1.49
},
"latest_meter_wh": 5432100,
"meter_updated_at": "2026-04-09T10:30:00Z"
}Fields
| Field | Type | Description |
|---|---|---|
id | string (UUID) | Unique identifier for the charger. |
nickname | string | User-defined name, set in the Joulo app. |
brand | string or null | Brand of the charger, as the connection reported it or as Joulo's charger catalog knows it. null when Joulo does not know it. |
model | string or null | Model of the charger, from the same sources. null when Joulo does not know it. |
connection_type | string | How Joulo receives data from the charger. See Connection types. |
status | string | The state of this charger's record in Joulo. active for every charger in use, also one that has been silent for weeks. It says nothing about the link: read connection_status for that. |
mid_certified | boolean | Whether this model has a MID-certified energy meter according to the charger catalog. It can differ from mid_eligible while Joulo has not verified the unit yet or granted an exception. |
mid_eligible | boolean | Whether sessions on this charger count for ERE. Use this field to decide whether a session earns ERE. |
is_charging | boolean | Whether a session is open: a transaction runs and the car is plugged in. It does not say whether energy flows. Most open sessions are cars that are already full, so read charging_state for that. |
charging_state | string | Whether energy flows right now, from the meter: charging (the meter rose in the last ten minutes), paused (a session is open but the meter stood still for ten minutes: the car is full, or waits for a schedule or for solar), idle (no session on an OCPP charger) or unknown (no live view: cloud and upload routes report sessions afterwards, the charger is silent, or the session is younger than three minutes). |
power_kw | number or null | Charging power in kW over the last two meter samples, about a minute apart, rounded to one decimal. 0 while paused, null without a live meter. |
last_energy_at | string (ISO 8601) or null | When the meter last rose: the last moment energy flowed, also outside a session. null without meter samples, or when the meter did not move in the last six hours of samples. |
connection_status | string | Whether Joulo hears from the charger. See Connection status. |
last_seen_at | string (ISO 8601) or null | The newest proof that the charger was alive. null when Joulo has none. |
last_seen_basis | string or null | What last_seen_at is: device (an OCPP heartbeat, or the provider vouching for the device) or session (the end of the newest session). |
history_paused_since | string (ISO 8601) | Only present when the provider passes on no sessions since this moment while the link works. Today only Tesla, for Wall Connectors with a MID meter, since 29 September 2026. |
help_url | string | Only present when the charger does not count for ERE: the kennisbank article on MID meters. |
docs_url | string | Joulo's manual for this brand. Present whenever Joulo has one. |
connection_help_url | string | Only present when connection_status names a problem: the page that explains it. |
connection_action_url | string | Only present when you can fix the connection: the reconnect flow, or the stations tab of the dashboard. |
access | object or null | Only present on OCPP chargers: who may charge, as the dashboard shows it under Beheer › Laden & toegang. See Access. |
current_session | object | Active session details, with meter_start_wh (the register at the start, null on routes without one). Only present when is_charging is true. |
latest_meter_wh | number | Latest OCPP meter reading in watt-hours. Present when meter data is available. |
meter_updated_at | string (ISO 8601) | Timestamp of the latest meter reading. |
Connection status
connection_status uses the same rules as the charger card in the Joulo dashboard.
| Value | Meaning |
|---|---|
online | The charger or its provider reported the device in the last 45 minutes. |
seen | It did, but longer ago, within the silence window: 2 hours, 6 for E-Flux. |
unreachable | That signal went quiet, or the provider reports the charger disconnected for 3 hours or more. |
sessions_only | The route gives no device signal, so the newest session is the only proof. This is normal for most cloud APIs and no fault. |
never_connected | Joulo has no signal and no session yet. |
needs_reconnect | The login at the provider expired or was refused. Reconnect through connection_action_url. |
sync_error | The provider refuses data in a way a reconnect does not fix. |
disabled | You switched this charger off in Joulo. |
Treat connection_status as an open string, like connection_type.
Access
access reads the same rule as Beheer › Laden & toegang in the Joulo dashboard. Only OCPP chargers carry it: Joulo answers their authorization requests.
"access": {
"managed_by": "joulo",
"choice": "no_tag",
"chosen_by": "owner",
"charger_setting": "tag"
}| Field | Values | Meaning |
|---|---|---|
managed_by | joulo, external_backend | external_backend: another OCPP backend decides who may charge. The other fields are then null. |
choice | no_tag, any_tag, own_tags, null | The choice the dashboard fills in: "Zonder tag" (plug in and charge), "Met elke tag" (any card) or "Alleen mijn tags" (only cards you approved). null when nobody chose and the charger never reported its own setting. |
chosen_by | owner, joulo, nobody, null | owner: picked in the dashboard. joulo: Joulo set it when the charger joined, and keeps it. nobody: no choice was made. With a charger_setting, choice is what the charger runs. Without one, choice is only the default, and the charger may run something else. |
charger_setting | no_tag, tag, null | What the charger reported at its last reading. null when Joulo cannot read this setting on the charger. |
In the example above, the owner chose "Zonder tag" but the charger still asks for a card. A reset or a firmware update can clear the setting on the charger. Choosing again in the dashboard sends it to the charger.
Connection types
connection_type tells you how Joulo receives data from the charger. It is the connection route, not the brand: brand and model say which charger it is.
| Value | Meaning |
|---|---|
cloud_api | Joulo pulls sessions and status from the manufacturer's or platform's cloud API. |
cloud_pending | You linked the cloud account, but no data has arrived yet. It becomes cloud_api on the first successful sync. |
ocpp | The charge point connects straight to Joulo over WebSocket. |
push_api | A partner registered the charger and pushes its data to Joulo. |
manual | No automatic feed. You enter the readings by hand. |
sap_meter | A meter-only charger for an approved Secundair Allocatiepunt. Joulo fills it from the supply point's own metering. |
Treat connection_type as an open string. Joulo adds a value when it adds a
connection route. Match the values you handle and fall back to a default for
the rest.
Offline behaviour
Connecting a charger to Joulo never makes charging depend on the internet. The CSMS is a read path for metering data, not a gatekeeper for authorization:
- On every
BootNotification(and periodically on reconnect) Joulo pushes an OCPP configuration that makes the charger autonomous:AuthorizationCacheEnabled=true,LocalPreAuthorize=true,LocalAuthorizeOffline=trueandAllowOfflineTxForUnknownId=true. - Chargers with a vendor-specific autostart key (for example Peblar / Prodrive
AuthorizeMode=Automaticwith a localAutoAuthorizeIdtoken) are configured to self-start on plug-in, so charging never waits for aRemoteStartTransactionfrom the CSMS. Authorizerequests that do reach the CSMS are accepted by default, unless you enabled the RFID whitelist for your charger in the dashboard.- Transactions started while the charger is offline are delivered when the WebSocket reconnects (standard OCPP 1.6 offline transaction queuing), so no session data is lost.
Configuration is pushed with a diff against the charger's own GetConfiguration answer, and the accepted values are stored per charger. The Joulo dashboard shows a "works without internet" confirmation on chargers that confirmed all four offline keys. Brands that don't expose these keys but support the OCPP Local Authorization List instead get their approved RFID tags pushed as a local list for the same offline resilience.
Already connected to another OCPP backoffice? If the charger is already configured to an existing OCPP backoffice (its installer, a CPO / charge-card provider, or an energy supplier), be careful when changing the settings. A charger usually connects to one backoffice at a time, so pointing it at Joulo disconnects that link and stops the services relying on it (public charging, expense reimbursement, monitoring). Confirm you're allowed to change it before you do.
You can register OCPP chargers programmatically using POST /chargers. The response includes the WebSocket endpoint and password to configure on your charge point:
{
"id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"nickname": "Oprit",
"connection_type": "ocpp",
"status": "offline",
"ocpp": {
"identity": "CHARGER-001",
"endpoint": "wss://ocpp.joulo.nl/CHARGER-001",
"password": "a8f3b2e1c4d5"
}
}The OCPP password is only returned once when the charger is created. Store it securely.
Cloud-connected chargers (Easee, Wallbox, Zaptec, Enphase, Smappee, V2C) must be linked through the Joulo dashboard by signing in with your manufacturer account.
Enphase polls every 12 hours per account, because the Enphase plan caps requests per month. Coverage and granularity are also limited by the Enphase API. Joulo syncs all data the API provides, but timing and session detail differ from direct OCPP integrations.
MID certification
Chargers with mid_certified: true have a MID-certified (Measuring Instruments Directive) energy meter. This means the kWh readings are legally verifiable and can be used for official ERE-credit registration.