DEV Community

Roman Kotenko
Roman Kotenko

Posted on Originally published at napspan.com

"In Betrieb" Is Not "Free". Live Connector Status Across Five European Countries.

Every European country now publishes where its public charge points are. That was the easy half, and the Alternative Fuels Infrastructure Regulation is the reason it happened: since April 2024 operators owe machine-readable data about publicly accessible recharging points, and the national access points duly carry it.

So a planner asks “is there a charger at the depot turn-off?” and gets a confident yes. Then the driver arrives and both connectors are occupied, and the answer was worthless — not wrong, worthless. It answered a question about concrete.

The Field That Looks Like an Answer and Isn’t

Germany is the cleanest illustration, because its registry is genuinely good. We hold 154,210 active German charging records, and 141,083 of them carry a status field. On 116,422 it reads In Betrieb.

That word means the station is registered and commissioned. It is a fact about paperwork and hardware, and it does not change when a van pulls up. Zero of those 116,422 In Betrieb records carry any availability field at all. A fleet system that reads status and colours the pin green has not made a small error — it has answered a different question and presented it as this one.

Germany did start publishing live state in mid-September — 0 stations on 10 September, 327 on 3 October, 3,424 on 15 October. But it does not arrive on the registry record. It arrives over the AFIR dynamic channel as a separate record, and 2,863 of those 3,424 sit within 30 metres of a registry record that still carries no state. The same charger can therefore appear twice: once saying In Betrieb, once saying whether the cable is free. We do not merge the two yet, so filter on availability_status rather than on the registry row.

The distinction matters because the two fields look interchangeable, and only one of them answers the driver’s question.

Where Live Status Actually Exists, and How Much of It

Measured in one transaction against production on 15 October 2026, 15:04 UTC: of 415,272 active charging records we serve across Europe, 121,988 carry a live availability status, and 121,956 of those carry it per connector rather than per site. That is 323,765 individual connectors whose state is published.

It is five countries, and they arrive over four national channels — Germany and Lithuania share the AFIR dynamic one:

Jurisdiction Stations with live status Channel
Netherlands 79,051 nl_ocpi
France 22,079 fr_irve_dynamique
Switzerland 13,755 ch_oicp
Lithuania 3,679 afir_dynamic
Germany 3,424 afir_dynamic

Read that table twice before building on it. Five countries out of the thirty-six we carry — 29.4% of our charging rows, not “Europe”, and the German line is 2.2% of the German records. Anyone selling you continental live charging coverage today is rounding up.

At that same moment the network read: 99,659 available, 10,251 full, 9,470 unknown, 2,608 out of service.

Those last two categories are the ones that get flattened by careless code. Unknown is not full, and out of service is neither — a charger that is broken will still be broken in twenty minutes, which is a different routing decision from one that is merely busy now. We keep the four states separate for exactly that reason.

Per Connector, Because a Station Is Not a Unit

A site with two connectors is not half-free or fully-free; it is one cable in use and one cable open, and those two facts have different owners, different power ratings and different timestamps. The array comes back as it is published — here one Dutch station as it read on 10 September:

curl -H "X-API-Key: $KEY" \
  "https://api.napspan.com/api/v1/features?type=ev_charging&jurisdiction=NLD"
Enter fullscreen mode Exit fullscreen mode
{
  "id": "NLD-ev-ALL-NLLOC016859",
  "name": "NL, Van der Meerstraat 20, 3863 AG Nijkerk",
  "latitude": 52.21755,
  "longitude": 5.472011,
  "properties": {
    "network": "Allego",
    "ports": 2,
    "connector_type": "IEC_62196_T2",
    "availability_status": "available",
    "available_points": 1,
    "occupied_points": 1,
    "unavailable_points": 0,
    "reported_points": 2,
    "availability_source": "nl_ocpi",
    "availability_updated_at": "2026-09-10T15:28:24Z",
    "refill_points": [
      { "id": "NLALLEGO0134202", "state": "occupied",  "status": "CHARGING",  "updated_at": "2026-09-10T15:28:24Z" },
      { "id": "NLALLEGO0134201", "state": "available", "status": "AVAILABLE", "updated_at": "2026-09-09T14:26:19Z" }
    ]
  }
}
Enter fullscreen mode Exit fullscreen mode

Look at the two updated_at stamps in that array. They are the same station, and they are a day apart. The connector someone is actively using reported twenty seconds ago; its neighbour last said anything the previous afternoon. That is not a defect in the feed and it is not one in our ingestion — a connector reports when its state changes, so a quiet cable is a stale cable. It is, however, exactly the sort of thing a dashboard will average into a single meaningless “last updated” if nobody looks.

Three Things to Know Before You Build on It

Freshness is uneven, and one country cannot be aged at all. Of the 121,988 live rows, 107,160 carry an availability_updated_at. Only 18,112 of those — 17% — are inside the last hour; 90,968 are inside 24 hours; and the oldest stamp in the set is from 14 October 2023, a three-year-old reading that is still, technically, a live status field. Set your own staleness threshold and enforce it. Switzerland’s 13,755 stations publish no timestamp whatsoever, so they cannot be aged by us or by you; treat them accordingly.

The per-connector status strings are not normalised, on purpose. Across 323,765 connectors the same state arrives in three casings — AVAILABLE 141,719, available 49,731, Available 15,156 — unknown arrives in three as well, occupied in two. We normalise the station-level availability_status into four values and pass the array through as the operator wrote it, because collapsing a vendor’s string is how you silently lose a state nobody anticipated. Case-fold before you compare.

This is a live reading, not a reservation. An available connector is available to whoever reaches it first. Nothing in AFIR, OCPI or any national feed holds a bay for your driver, and a charger that was free when the route was planned is a probability by the time the vehicle arrives, not a promise.

The Same Call as Everything Else on the Corridor

Charging state is not a separate product. It arrives in the same /features schema, under the same jurisdiction filters, as the live truck-parking occupancy that answers the parallel question for diesel fleets, the cross-border truck bans and VMS signs, and the vehicle-class toll costs for the same corridor. One key, one schema, one set of jurisdiction codes — ISO 3166-1 alpha-3, so NLD and FRA, never NL or FR.

The point of normalising four national channels into one field set is not tidiness. It is that nl_ocpi, fr_irve_dynamique, ch_oicp and afir_dynamic are four different documents with four different vocabularies, and a fleet that wants “is the connector free” should not have to learn all four to find out — nor to discover, the hard way, that another country answers a different question in a field with a similar name.

What This Does Not Do

  • It is not European coverage. Five countries carry live status; thirty-one do not. Germany, the largest registry we hold, carries it on 3,424 separate records — none of its 116,422 In Betrieb registry records has it.
  • It does not reserve anything. See above; this is worth repeating because it is the assumption that costs a driver an hour.
  • It does not tell you the price. Tariff data is a separate and much messier problem; the fuel side of it is covered in per-station fuel prices.
  • An absent availability field means unknown, never free. The 293,284 records without one are not empty car parks; they are stations whose operator publishes nothing about state.

Figures measured against production on 15 October 2026, 15:04 UTC, in a single transaction so they stay mutually consistent; the JSON example is one real record as it read on 10 September, when this article first ran. Charging availability moves by the minute — the counts above describe that moment, and the shape of the finding rather than the numbers is what will still be true next week.

Try It

  • API docs — /features with type=ev_charging, filtered by jurisdiction
  • Live map — the network as it stands right now
  • Free API key — no card, 14-day trial

Originally published on napspan.com.

Top comments (0)