If you own an EV charger in the Netherlands and it’s MID-certified, it can generate ERE certificates (Energie uit Hernieuwbare Bronnen voor vervoer, roughly “renewable energy for transport”) that get sold on to fuel suppliers who need to meet their renewable-fuel obligations. Joulo is one of the platforms that handles this: it reads your charger’s metered energy, converts it into ERE credits, sells them on the market, and pays you a share.
The dashboard is fine for a glance, but if you already pull other home data into your own monitoring (Home Assistant, Grafana, a cron job that emails you a summary), you probably want the same numbers as data, not a login. Joulo exposes a clean REST API for exactly that. Here’s what’s actually useful in it.
What you need
- An EV charger connected to Joulo via
cloud_apiand marked MID certified (this is what makes it ERE-eligible in the first place — check your charger’s product page or ask your installer if you’re not sure). - A Joulo account with API access enabled, and a bearer token for your account.
- Store that token somewhere sane — a secrets manager (Bitwarden, 1Password, whatever you already use), not a plaintext file in a repo.
Connection
- Base URL:
https://api.joulo.nl/functions/v1/api - Auth: Bearer token in the
Authorizationheader
Every endpoint below just needs Authorization: Bearer <your-token>.
The endpoints that matter
GET /chargers
Charger status, live meter values, and whether a session is currently active.
{
"chargers": [{
"id": "<your-charger-id>",
"nickname": "My Charger",
"connection_type": "cloud_api",
"status": "active",
"mid_certified": true,
"mid_eligible": true,
"is_charging": false
}]
}When a session is running, current_session includes kwh_so_far and id_tag — handy
if you want a “charging now, X kWh so far” sensor.
GET /sessions
Recent charging sessions, paginated (default limit=20). Each session includes id,
charger_id, charger_nickname, started_at, ended_at, kwh, status,
counts_for_ere, ere_credits, and id_tag. This is your raw log — good for a
“sessions this week” table or catching a session that didn’t count toward ERE for some
reason (counts_for_ere: false).
GET /energy
Monthly energy totals and ERE credits, aggregated:
{
"months": [
{"month": "2026-07-01", "kwh": 1074.14, "sessions": 58, "ere_credits": 357.36}
],
"total_kwh": 5424.72,
"total_ere_credits": 1804.77,
"total_sessions": 191
}This is the one to graph if you want a “kWh delivered per month” or “ERE credits earned per month” chart without doing the aggregation yourself.
GET /ere-position
The most interesting endpoint if you actually care about the money side — your ERE reserve, sale, and forecast position for the current compliance year:
total_expected_eur— projected full-year income from ERE salesreserved.net_eur— already sold/reservedpaid.net_eur— already paid out to youunsold.ere— ERE credits still sitting unsoldunsold.forecast_net_eur— projected value of what’s still unsoldeffective_fee_pct— Joulo’s platform feeindicative_price_per_ere— current market price per EREquarters[]— per-quarter breakdown of sold ERE and price
That last field is worth watching over time: ERE market prices move, and this tells you whether waiting to sell is paying off or not.
POST /chargers/reboot
A remote OCPP reset if your charger gets stuck: {"charger_id": "<id>", "type": "Soft"}
or "Hard". Useful as a “before you drive to the garage and unplug it” fallback.
Turning this into something you actually check
The API alone is just data — the value is in not having to think about checking it. A few ways to use these endpoints without building a whole app:
- A daily/weekly script that hits
/energyand/ere-positionand posts a short summary to whatever you already use for notifications. - A Home Assistant
restsensor polling/chargersfor live status and/ere-positionforunsold.forecast_net_eur, so the projected payout shows up next to your other energy dashboard numbers. - A simple monthly export of
/sessionsif you want your own copy of the session history outside Joulo’s dashboard — useful if you ever want to sanity-check a payout against your own logs.
None of this replaces Joulo’s dashboard, but it means the numbers you care about show up where you already look, instead of being one more site to remember to check.
Adding it to Home Assistant
Here’s the concrete version of that second bullet — a rest sensor package that pulls
charger status, monthly totals, and your ERE revenue position straight into HA, next to
your other energy sensors.
1. Store the token in secrets.yaml
# secrets.yaml
joulo_api_token: "<your-bearer-token>"2. Add a rest sensor package
Home Assistant’s rest platform can poll a JSON endpoint once and expose multiple
sensors from the same response, so you only need one HTTP call per source endpoint even
though you’re pulling out several values.
# packages/joulo.yaml
rest:
- resource: "https://api.joulo.nl/functions/v1/api/chargers"
method: GET
headers:
Authorization: !secret joulo_api_token
scan_interval: 300
sensor:
- name: "Joulo Charger Status"
value_template: "{{ value_json.chargers[0].status }}"
- name: "Joulo Is Charging"
value_template: "{{ value_json.chargers[0].is_charging }}"
- name: "Joulo Session kWh"
value_template: "{{ value_json.chargers[0].current_session.kwh_so_far | default(0) }}"
unit_of_measurement: "kWh"
- resource: "https://api.joulo.nl/functions/v1/api/energy"
method: GET
headers:
Authorization: !secret joulo_api_token
scan_interval: 3600
sensor:
- name: "Joulo Total kWh"
value_template: "{{ value_json.total_kwh }}"
unit_of_measurement: "kWh"
state_class: total_increasing
- name: "Joulo Total ERE"
value_template: "{{ value_json.total_ere_credits }}"
state_class: total_increasing
- name: "Joulo Monthly kWh"
value_template: "{{ value_json.months[-1].kwh }}"
unit_of_measurement: "kWh"
- resource: "https://api.joulo.nl/functions/v1/api/ere-position"
method: GET
headers:
Authorization: !secret joulo_api_token
scan_interval: 3600
sensor:
- name: "Joulo Expected Year Revenue"
value_template: "{{ value_json.total_expected_eur }}"
unit_of_measurement: "EUR"
- name: "Joulo Unsold ERE"
value_template: "{{ value_json.unsold.ere }}"
- name: "Joulo Unsold Forecast Revenue"
value_template: "{{ value_json.unsold.forecast_net_eur }}"
unit_of_measurement: "EUR"
- name: "Joulo ERE Price"
value_template: "{{ value_json.indicative_price_per_ere }}"
unit_of_measurement: "EUR"A few things worth calling out:
scan_intervalis generous on purpose — charger status can poll more often (every 5 minutes) since it changes throughout the day, but the energy and ERE-position endpoints only need an hourly refresh; there’s no reason to hammer the API for numbers that update once a day at most.state_class: total_increasingon the cumulative sensors (total_kwh,total_ere_credits) lets Home Assistant’s long-term statistics and the Energy dashboard treat them as proper counters, so you get correct daily/monthly deltas instead of just a raw number.- If your charger reports
current_sessionas absent when idle, the| default(0)filter onkwh_so_farkeeps the sensor from erroring out between sessions.
3. Optional: a reboot button
If you also want the remote OCPP reset from the API, wire it up as a rest_command and
trigger it from a dashboard button or automation:
# configuration.yaml (or a package)
rest_command:
joulo_reboot_charger:
url: "https://api.joulo.nl/functions/v1/api/chargers/reboot"
method: POST
headers:
Authorization: !secret joulo_api_token
Content-Type: "application/json"
payload: '{"charger_id": "<your-charger-id>", "type": "Soft"}'Call it with rest_command.joulo_reboot_charger from a script or a dashboard button —
handy for the “before you drive to the garage” scenario instead of physically unplugging
the charger.
4. Put it on your dashboard
Once the sensors exist, they’re just entities — drop sensor.joulo_expected_year_revenue
and sensor.joulo_unsold_forecast_revenue on the same energy dashboard as your solar and
grid numbers, and the ERE revenue story sits right next to the rest of your home energy
picture instead of living behind a separate login.