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_api and 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 Authorization header

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 sales
  • reserved.net_eur — already sold/reserved
  • paid.net_eur — already paid out to you
  • unsold.ere — ERE credits still sitting unsold
  • unsold.forecast_net_eur — projected value of what’s still unsold
  • effective_fee_pct — Joulo’s platform fee
  • indicative_price_per_ere — current market price per ERE
  • quarters[] — 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 /energy and /ere-position and posts a short summary to whatever you already use for notifications.
  • A Home Assistant rest sensor polling /chargers for live status and /ere-position for unsold.forecast_net_eur, so the projected payout shows up next to your other energy dashboard numbers.
  • A simple monthly export of /sessions if 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_interval is 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_increasing on 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_session as absent when idle, the | default(0) filter on kwh_so_far keeps 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.