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

# Welcome to Solidstudio CPMS Public API

Discover robust API guides and resources built to help you maximize the potential of Solidstudio's REST API

The Public API exposes the CPO backbone's back-office functionality to external integrators: charging infrastructure management, remote commands, sessions, CDRs, tariffs, tokens, roaming partners, and IAM. It is designed for **host-to-host** integration (your backend ↔ CPMS).

## Base URL and versioning

All Public API routes live under:

```
https://<your-environment-host>/api/v1/<resource>
```

The version is part of the path. Currently everything is `v1`, except **commands**, which also has a `v2` (`/api/v2/commands`) that returns an `ocppMessageId` in every response for end-to-end OCPP request correlation. New integrations should prefer commands v2.

## Interactive API reference

A live OpenAPI (Swagger) UI describing every endpoint, schema, and error response is served by the application itself:

```
https://<your-environment-host>/api-docs
```

Use it as the authoritative field-level reference; these guides cover the conceptual layer only.

## Quick start

```bash
curl -s \
  -H "x-api-key: $API_KEY" \
  "https://<host>/api/v1/sessions?page=1&limit=10"
```

See [Authentication](https://developers.solidstudio.io/docs/authorization) for how to obtain a key and what the headers mean.

## Conventions

### Content type

Requests and responses are JSON (`Content-Type: application/json`). Request bodies are limited to **5 MB**.

### Pagination

List endpoints accept query parameters:

| Parameter | Default | Constraints                               |
| --------- | ------- | ----------------------------------------- |
| `page`    | `1`     | positive integer                          |
| `limit`   | `10`    | positive integer, max `1000`              |
| `offset`  | —       | optional; overrides `page`-based skipping |

Responses use a common envelope:

```json
{
  "pagination": {
    "page": 1,
    "limit": 10,
    "totalPages": 12,
    "totalCount": 116,
    "previous": null,
    "next": "https://<host>/api/v1/sessions?page=2&limit=10"
  },
  "data": [ ... ]
}
```

`previous`/`next` are ready-to-follow URLs (or `null` at the edges).

### Filtering with RSQL

Most list resources have a companion `POST <resource>/rsql-list` endpoint accepting a single expressive filter instead of dozens of query parameters:

```bash
curl -s -X POST \
  -H "x-api-key: $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "filter": "status == '\''COMPLETED'\'' and startDate =gte= '\''2026-01-01T00:00:00Z'\''", "sort": "-startDate" }' \
  "https://<host>/api/v1/sessions/rsql-list?page=1&limit=50"
```

* Body: `{ "filter": "<rsql>", "sort": "<field>|-<field>" }` — both optional.
* Pagination stays in the query string; the response uses the same pagination envelope.
* Each `rsql-list` endpoint documents its filterable fields in the Swagger UI.
* Syntax reference: [RSQL](https://developers.solidstudio.io/docs/rsql)

Several `rsql-list` endpoints (connectors, charging pools/stations/points) also support asynchronous CSV export; poll export status via `GET /api/v1/rsql-csv-exports/:id`.

### Errors

| Status | Meaning                                                                  |
| ------ | ------------------------------------------------------------------------ |
| `400`  | Validation failed (unknown fields are stripped; invalid values rejected) |
| `401`  | Missing, invalid, or expired API key                                     |
| `403`  | API key lacks the required permission                                    |
| `404`  | Resource not found                                                       |
| `422`  | Request understood but not processable in current state                  |
| `500`  | Unexpected server error                                                  |

Standard errors follow the NestJS shape:

```json
{ "statusCode": 400, "message": ["limit must not be greater than 1000"], "error": "Bad Request" }
```

Domain errors (business-rule violations) use:

```json
{ "reason": "<machine-readable-reason>", "issues": [ ... ] }
```

### Request correlation

Every response carries an `X-Correlation-Id` header. Send your own `x-correlation-id` request header to propagate an existing trace ID; otherwise one is generated. Quote it when reporting issues. For commands, prefer the v2 endpoints and store the returned `ocppMessageId` — it traces the request through CPMS → OCPP adapter → charging station logs.

## Resource catalog

All paths are relative to `/api/v1` unless noted. The **permission** column is what your API key's role must grant (see [Authentication](https://developers.solidstudio.io/docs/authorization)).

### Charging infrastructure

| Resource                | Path                                                 | Read permission              |
| ----------------------- | ---------------------------------------------------- | ---------------------------- |
| Charging pools          | `/charging-pools`, `/charging-pools/rsql-list`       | `charging-pool:read`         |
| Charging pool groups    | `/charging-pool-groups`                              | `charging-pool:read`         |
| Charging stations       | `/charging-stations`, `/charging-stations/rsql-list` | `charging-station:read`      |
| Charging station groups | `/charging-station-groups`                           | `charging-station:read`      |
| Station OCPP logs       | `/charging-stations/:id/ocpp-logs/rsql-list`         | `charging-station:read-logs` |
| Charging points         | `/charging-points`, `/charging-points/rsql-list`     | `charging-point:read`        |
| Charging point groups   | `/charging-point-groups`                             | `charging-point:read`        |
| Connectors              | `/connectors`, `/connectors/rsql-list`               | `connector:read`             |
| Connector groups        | `/connector-groups`                                  | `connector:read`             |
| Business status         | `/business-status`                                   | `charging-station:read`      |
| Payter terminals        | `/payter-terminals`                                  | `payter:read`                |

Hierarchy: **charging pool** (location) → **charging station** (physical OCPP device) → **charging point** (EVSE) → **connector** (plug).

### Charging operations

| Resource                            | Path                               | Permission                                       |
| ----------------------------------- | ---------------------------------- | ------------------------------------------------ |
| Commands (v1)                       | `/commands/*`                      | `charging-station:remote-control`                |
| Commands (v2, with `ocppMessageId`) | `/api/v2/commands/*`               | `charging-station:remote-control`                |
| Sessions                            | `/sessions`, `/sessions/rsql-list` | `session:read`                                   |
| CDRs (charge detail records)        | `/cdrs`, `/cdrs/rsql-list`         | `cdr:read`                                       |
| Charging profiles                   | `/charging-profiles`               | `smart-charging:*`                               |
| OCPP configuration                  | `/ocpp-configuration`              | `charging-station:read-config` / `update-config` |
| OCPP configuration logs             | `/ocpp-config-logs`                | `charging-station:read-config`                   |
| Firmware                            | `/firmware`                        | `firmware:*`                                     |
| Exports                             | `/exports`                         | `cdr:read`                                       |

### Pricing and roaming

| Resource           | Path                                            | Permission          |
| ------------------ | ----------------------------------------------- | ------------------- |
| Tariffs            | `/tariffs`                                      | `tariff:*`          |
| Tariff rules       | `/tariffs-rules`, `/tariffs-rules-dictionaries` | `tariff-rule:*`     |
| Tokens (RFID/eMSP) | `/tokens`                                       | `token:*`           |
| Roaming partners   | `/partner`                                      | `roaming-partner:*` |
| OCPI partners      | `/ocpi-partners`, `/ocpi-partners/connections`  | `ocpi-partner:*`    |
| Operators          | `/operators`                                    | `operator:*`        |

### Platform

| Resource                  | Path                | Permission                        |
| ------------------------- | ------------------- | --------------------------------- |
| Webhooks                  | `/webhooks`         | `webhook:read` / `webhook:manage` |
| IAM (roles & permissions) | `/iam`              | `system:manage-iam`               |
| API key role assignment   | `/api-keys`         | `system:manage-iam`               |
| User role assignment      | `/users`            | `system:manage-iam`               |
| Bulk operations           | `/bulk-operations`  | `bulk-operation:*`                |
| CSV export status         | `/rsql-csv-exports` | key that started the export       |

<br />