Charging network

How to browse the charging infrastructure the EMSP offers to its drivers, control what drivers see, restrict private pools, and manage the OCPI partners that supply the data.

Where the data comes from

The EMSP does not own most of the infrastructure. Charging pools, points and connectors are pushed into the platform by the e-roaming integrations through internal APIs that are not part of the Public API. Every pool carries the source it came from:

sourceOrigin
OCPI_PARTNERA CPO connected directly over OCPI. Default when a feed does not set a source.
GIREVEThe Gireve roaming hub (OCPI).
HUBJECTThe Hubject roaming hub (OICP).

The Public API therefore has no create, update or delete endpoints for pools, points or connectors. Through the back office you can:

  • query the network (pools, charging points, connectors),
  • hide or show a pool to drivers,
  • restrict a private pool to selected users and organizations, and switch payments off there,
  • read map and status summaries

Hierarchy

Charging pool (location)
└── Charging point (EVSE)
    └── Connector (plug)
LevelIdentifiers in back-office responsesNotable fields
Charging poolid (EMSP database id)name, type, address, country, latitude/longitude, cpo, source, hideDate, isPrivate, tags
Charging point (EVSE)id, evseId (eMI3 EVSE id from the CPO, may be null)status, physicalReference, parent chargingPool, cpo, tags
Connectorid, cpoConnectorIdstandard, format, powerType, amperage, voltage, powerKwh, tariff, parent chargingPoint and chargingPool, updatedAt, tags

Querying the network

Pools, charging points and connectors share one query model. Use the v3 endpoints:

OperationPoolsCharging pointsConnectors
Paged searchPOST /v3/backoffice/charging-pools/queryPOST /v3/backoffice/charging-points/queryPOST /v3/backoffice/connectors/query
All matching idsPOST /v3/backoffice/charging-pools/query/idsPOST /v3/backoffice/charging-points/query/idsPOST /v3/backoffice/connectors/query/ids
Fetch by idsPOST /v3/backoffice/charging-pools/getByIdsPOST /v3/backoffice/charging-points/getByIdsPOST /v3/backoffice/connectors/getByIds
Filter valuesGET /v3/backoffice/charging-pools/filtersGET /v3/backoffice/charging-points/filtersGET /v3/backoffice/connectors/filters
  • Search: filters go in the JSON body. The body is optional: no body means no filters. Paging uses the query parameters page (1-based, default 1) and size (default 10), both >= 1. Results come in the standard page envelope.
  • Ids: same body, no paging. Returns a JSON array of ids. Fails with 400 BAD_REQUEST (Result set is too big. Maximum supported is N) when more than the configured bulk batch size match. The default is 10 000. Use it to feed bulk operations.
  • Fetch by ids: body { "ids": [...] }, same size limit. Returns a plain array, not a page.
  • Filters: returns the values that currently exist, for building filter UIs. Pools: cpos, types, countries, sources. Charging points: statuses, countries, cpos, sources, chargingPoolNames. Connectors: statuses, countries, formats, standards, powerTypes, cpos, sources.

Filter fields (all optional, combined with AND):

ResourceBody fields
Poolsname, address, types[], countries[], cpoIds[], locationSources[]
Charging pointsstatuses[], countries[], cposIds[], chargingPoolsIds[], evsesIds[], address, physicalReference, chargingPoolName, updatedAtFrom, updatedAtTo, locationSources[]
Connectorsstandards[], formats[], powerTypes[], statuses[], countries[], cposIds[], chargingPoolsIds[], chargingPointsIds[], evsesIds[], tariffsIds[], address, amperageFrom/amperageTo, voltageFrom/voltageTo, powerFrom/powerTo, updatedAtFrom, updatedAtTo, locationSources[]

Matching rules:

  • Array fields match exactly: the value must be one of the listed values.
  • name, chargingPoolName, physicalReference and address are case-insensitive substring matches. address is matched against "<address> <postalCode> <city>".
  • Numeric ranges include the From value and exclude the To value.
  • updatedAtFrom/updatedAtTo are ISO-8601 timestamps with offset.
  • Sort order is fixed. Pools: named pools first, then by name, then by most recently updated. Points: by status (AVAILABLE first), then by evseId. Connectors: by their point's order, then by standard.
  • Deleted resources are never returned. Hidden and private pools are returned. Check hideDate and isPrivate.
  • v3 responses include the resource's tags.
curl -s -X POST \
  -H "Authorization: $API_KEY" -H "Content-Type: application/json" \
  -d '{ "countries": ["DEU"], "locationSources": ["HUBJECT"], "name": "garage" }' \
  "https://<host>/v3/backoffice/charging-pools/query?page=1&size=20"
{
  "content": [
    {
      "id": "pool-0001",
      "name": "Main Street Garage",
      "type": "PARKING_GARAGE",
      "address": "Main Street 1",
      "country": "DEU",
      "cpo": { "id": "cpo-0001", "name": "Example CPO", "countryCode": "DE", "partyId": "EXA" },
      "longitude": 13.3849,
      "latitude": 52.5321,
      "source": "HUBJECT",
      "hideDate": null,
      "isPrivate": false,
      "tags": ["garage"]
    }
  ],
  "totalElements": 1,
  "totalPages": 1,
  "currentPage": 1
}

Find out-of-order EVSEs of one CPO and fetch their connectors:

curl -s -X POST \
  -H "Authorization: $API_KEY" -H "Content-Type: application/json" \
  -d '{ "statuses": ["OUTOFORDER", "INOPERATIVE"], "cposIds": ["cpo-0001"] }' \
  "https://<host>/v3/backoffice/charging-points/query/ids"
# -> ["point-0001","point-0002"]

curl -s -X POST \
  -H "Authorization: $API_KEY" -H "Content-Type: application/json" \
  -d '{ "chargingPointsIds": ["point-0001", "point-0002"] }' \
  "https://<host>/v3/backoffice/connectors/query?page=1&size=50"

Visibility: hide and show

Hiding a pool sets its hideDate. Showing it clears the value. A hidden pool is not deleted. It is left out of the driver-facing map, search and occupancy results. The back-office query endpoints still return hidden pools.

curl -s -X POST -H "Authorization: $API_KEY" \
  "https://<host>/v3/backoffice/charging-pools/hide/pool-0001"
curl -s -X POST -H "Authorization: $API_KEY" \
  "https://<host>/v3/backoffice/charging-pools/show/pool-0001"

Both return 200 with an empty body, or 404 NOT_FOUND for an unknown pool. To hide or show many pools, use the bulk operations /v2/backoffice/bulk/charging-pools/{hide|show}/{query|byIds} (see Bulk operations).

Private pools

A pool is private (isPrivate: true) when one of these applies:

  • the CPO does not publish it (OCPI publish: false), or
  • an admin has configured access for it.

Drivers see a private pool only if they have access to it. A driver has access when they are assigned directly or when their organization is assigned.

Access management on /backoffice/charging-pools/{chargingPoolId}/private-access:

  • GET: lists the assignments as a page of { type, id, name, createdAt }. Optional parameter type (USER or ORGANIZATION). page is 1-based (default 1). size defaults to 10, maximum 100.
  • POST: grants access to a batch of subjects { "subjects": [{ "type": "USER"|"ORGANIZATION", "id": "<db id>" }] }. The default maximum is 100 subjects per request. The pool must already be private: granting on a published pool returns 400 with code CHARGING_POOL_NOT_PRIVATE. A batch can partly succeed:
    • created lists the new assignments.
    • skipped lists subjects that already have access, with reason ALREADY_ASSIGNED or COVERED_BY_ORGANIZATION.
    • removed lists users whose direct assignment was dropped because an organization granted in this batch now covers them.
  • DELETE /users/USERID and DELETE /organizations/{organizationId}: revoke one assignment (204).
  • DELETE on the collection: resets the pool to the CPO settings (204). This removes all assignments and the payment methods assigned to the pool. Afterwards the pool is private only if the CPO keeps it unpublished.
curl -s -X POST \
  -H "Authorization: $API_KEY" -H "Content-Type: application/json" \
  -d '{ "subjects": [
        { "type": "ORGANIZATION", "id": "org-0001" },
        { "type": "USER", "id": "user-0001" } ] }' \
  "https://<host>/backoffice/charging-pools/pool-0001/private-access"
{
  "created": [
    { "type": "ORGANIZATION", "id": "org-0001", "name": "Example Fleet Ltd", "createdAt": "2026-01-15T10:00:00Z" }
  ],
  "skipped": [
    { "type": "USER", "id": "user-0001", "name": "[email protected]", "reason": "COVERED_BY_ORGANIZATION",
      "organizationId": "org-0001", "organizationName": "Example Fleet Ltd" }
  ],
  "removed": []
}

GET /backoffice/private-infrastructure lists every private pool that is not deleted, with its assigned organizations, users and payment methods. Optional parameters:

  • poolName, organization, user: name filters.
  • onlyWithoutAssignments: default false.
  • page: 1-based, default 1.
  • size: default 10, maximum 100.

lastEditedAt is null for pools that were never configured. cpoPublished: true marks pools that are private only because an admin configured them. These pools become public once they are reset.

Payments can be switched off at a private pool with PUT /backoffice/charging-pools/{chargingPoolId}/payment-methods. See Payments & settlement.

Overview

  • GET /backoffice/overview/summary: counts of pools per derived status.
  • GET /backoffice/overview/map: every pool that is not deleted and has at least one point, with coordinates and derived status. The response is not paged. Hidden and private pools are included.
curl -s -H "Authorization: $API_KEY" "https://<host>/backoffice/overview/summary"
{ "chargingPools": { "fullyOperational": 812, "partiallyOperational": 95, "planned": 14, "offline": 37 } }

Each entry under data in a /map response has the fields id, name, type, address, country, postalCode, latitude, longitude and mapStatus.

Related


Did this page help you?