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:
source | Origin |
|---|---|
OCPI_PARTNER | A CPO connected directly over OCPI. Default when a feed does not set a source. |
GIREVE | The Gireve roaming hub (OCPI). |
HUBJECT | The 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)
| Level | Identifiers in back-office responses | Notable fields |
|---|---|---|
| Charging pool | id (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 |
| Connector | id, cpoConnectorId | standard, 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:
| Operation | Pools | Charging points | Connectors |
|---|---|---|---|
| Paged search | POST /v3/backoffice/charging-pools/query | POST /v3/backoffice/charging-points/query | POST /v3/backoffice/connectors/query |
| All matching ids | POST /v3/backoffice/charging-pools/query/ids | POST /v3/backoffice/charging-points/query/ids | POST /v3/backoffice/connectors/query/ids |
| Fetch by ids | POST /v3/backoffice/charging-pools/getByIds | POST /v3/backoffice/charging-points/getByIds | POST /v3/backoffice/connectors/getByIds |
| Filter values | GET /v3/backoffice/charging-pools/filters | GET /v3/backoffice/charging-points/filters | GET /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, default1) andsize(default10), 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):
| Resource | Body fields |
|---|---|
| Pools | name, address, types[], countries[], cpoIds[], locationSources[] |
| Charging points | statuses[], countries[], cposIds[], chargingPoolsIds[], evsesIds[], address, physicalReference, chargingPoolName, updatedAtFrom, updatedAtTo, locationSources[] |
| Connectors | standards[], 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,physicalReferenceandaddressare case-insensitive substring matches.addressis matched against"<address> <postalCode> <city>".- Numeric ranges include the
Fromvalue and exclude theTovalue. updatedAtFrom/updatedAtToare ISO-8601 timestamps with offset.- Sort order is fixed. Pools: named pools first, then by name, then by most recently updated. Points: by status (
AVAILABLEfirst), then byevseId. Connectors: by their point's order, then bystandard. - Deleted resources are never returned. Hidden and private pools are returned. Check
hideDateandisPrivate. - 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 parametertype(USERorORGANIZATION).pageis 1-based (default1).sizedefaults to10, maximum100.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 returns400with codeCHARGING_POOL_NOT_PRIVATE. A batch can partly succeed:createdlists the new assignments.skippedlists subjects that already have access, withreasonALREADY_ASSIGNEDorCOVERED_BY_ORGANIZATION.removedlists users whose direct assignment was dropped because an organization granted in this batch now covers them.
DELETE /users/USERIDandDELETE /organizations/{organizationId}: revoke one assignment (204).DELETEon 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: defaultfalse.page: 1-based, default1.size: default10, maximum100.
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
- Getting started
- Authorization
- Pagination, filtering & errors
- Bulk operations: hide/show and tariff assignment by query or ids
- Tariffs & coupons: tariffs referenced by connectors
- Payments & settlement: pool payment methods
- Customers & tokens: users and organizations that private access is granted to
- Sessions & CDRs
Updated 14 days ago