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

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

See Authentication 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:

ParameterDefaultConstraints
page1positive integer
limit10positive integer, max 1000
offsetoptional; overrides page-based skipping

Responses use a common envelope:

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

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

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

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

Standard errors follow the NestJS shape:

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

Domain errors (business-rule violations) use:

{ "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).

Charging infrastructure

ResourcePathRead permission
Charging pools/charging-pools, /charging-pools/rsql-listcharging-pool:read
Charging pool groups/charging-pool-groupscharging-pool:read
Charging stations/charging-stations, /charging-stations/rsql-listcharging-station:read
Charging station groups/charging-station-groupscharging-station:read
Station OCPP logs/charging-stations/:id/ocpp-logs/rsql-listcharging-station:read-logs
Charging points/charging-points, /charging-points/rsql-listcharging-point:read
Charging point groups/charging-point-groupscharging-point:read
Connectors/connectors, /connectors/rsql-listconnector:read
Connector groups/connector-groupsconnector:read
Business status/business-statuscharging-station:read
Payter terminals/payter-terminalspayter:read

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

Charging operations

ResourcePathPermission
Commands (v1)/commands/*charging-station:remote-control
Commands (v2, with ocppMessageId)/api/v2/commands/*charging-station:remote-control
Sessions/sessions, /sessions/rsql-listsession:read
CDRs (charge detail records)/cdrs, /cdrs/rsql-listcdr:read
Charging profiles/charging-profilessmart-charging:*
OCPP configuration/ocpp-configurationcharging-station:read-config / update-config
OCPP configuration logs/ocpp-config-logscharging-station:read-config
Firmware/firmwarefirmware:*
Exports/exportscdr:read

Pricing and roaming

ResourcePathPermission
Tariffs/tariffstariff:*
Tariff rules/tariffs-rules, /tariffs-rules-dictionariestariff-rule:*
Tokens (RFID/eMSP)/tokenstoken:*
Roaming partners/partnerroaming-partner:*
OCPI partners/ocpi-partners, /ocpi-partners/connectionsocpi-partner:*
Operators/operatorsoperator:*

Platform

ResourcePathPermission
Webhooks/webhookswebhook:read / webhook:manage
IAM (roles & permissions)/iamsystem:manage-iam
API key role assignment/api-keyssystem:manage-iam
User role assignment/userssystem:manage-iam
Bulk operations/bulk-operationsbulk-operation:*
CSV export status/rsql-csv-exportskey that started the export


Did this page help you?