---
updatedAt: 2026-10-28T09:57:32.000Z
agentTools:
  projectIndex: https://developers.solidstudio.io/llms.txt
---

# 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, 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](bulk-operations.md).
* **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`, `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`.

```bash
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"
```

```json
{
  "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:

```bash
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.

```bash
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](bulk-operations.md)).

## 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.

```bash
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"
```

```json
{
  "created": [
    { "type": "ORGANIZATION", "id": "org-0001", "name": "Example Fleet Ltd", "createdAt": "2026-01-15T10:00:00Z" }
  ],
  "skipped": [
    { "type": "USER", "id": "user-0001", "name": "driver@example.com", "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](payments-settlement.md).

## 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.

```bash
curl -s -H "Authorization: $API_KEY" "https://<host>/backoffice/overview/summary"
```

```json
{ "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](getting-started.md)
* [Authorization](authorization.md)
* [Pagination, filtering & errors](pagination-filtering-errors.md)
* [Bulk operations](bulk-operations.md): hide/show and tariff assignment by query or ids
* [Tariffs & coupons](tariffs-coupons.md): tariffs referenced by connectors
* [Payments & settlement](payments-settlement.md): pool payment methods
* [Customers & tokens](customers-tokens.md): users and organizations that private access is granted to
* [Sessions & CDRs](sessions-cdrs.md)