Flowion Docs

Commands

CSMS-initiated OCPP commands. Each blocks until the charging station answers (up to ~35s) or the request times out — see each endpoint's own status codes for how a charging station's answer, timeout, or disconnection are told apart.

17 endpoints

Cancels a reservation on a charging_station.

post/v1/charging-stations/{charging_station_id}/commands/cancel-reservationRequires a bearer token

Parameters

NameInTypeDescription
charging_station_id*pathstring<uuid>ChargingStation id

Request bodyCancelReservationRequest

FieldTypeDescription
reservation_id*integer<int32>The id reserve-now returned.

Responses

StatusBodyDescription
200CancelReservationResponseThe charging_station answered — including 'rejected', meaning it holds no such reservation
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo charging_station with this id exists, or the caller cannot access its environment
409ErrorBodyThe charging_station is not connected to the CSMS
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time

Asks a charging_station to change a connector's (or the whole charging_station's) operative/inoperative availability.

post/v1/charging-stations/{charging_station_id}/commands/change-availabilityRequires a bearer token

Parameters

NameInTypeDescription
charging_station_id*pathstring<uuid>ChargingStation id

Request bodyChangeAvailabilityRequest

FieldTypeDescription
connector_id*integer<int32>The station's own wire-level connector number, or 0 for the whole charging_station and all its connectors (1.6 spec §6.7) — not a db connector row id.
evse_idinteger | null<int32>Which EVSE to target, for a 2.0.1 charging_station — omit to target the whole charging station (2.0.1 spec Part 2 §1.6). Ignored by a 1.6 gateway, which uses connector_id alone.
type*AvailabilityTypeThe API's own mirror of [AvailabilityKind]. Duplicated rather than reused because csms-domain deliberately carries no utoipa dependency — see [crate::commands::reset::ResetType] for the same reasoning. The From impl below is where the two are kept in step; adding a variant to either without the other won't compile.

Responses

StatusBodyDescription
200ChangeAvailabilityResponseThe charging_station answered
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo charging_station with this id exists, or the caller cannot access its environment
409ErrorBodyThe charging_station is not connected to the CSMS
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time

Asks a charging_station to change one configuration setting.

post/v1/charging-stations/{charging_station_id}/commands/change-configurationRequires a bearer token

Parameters

NameInTypeDescription
charging_station_id*pathstring<uuid>ChargingStation id

Request bodyChangeConfigurationRequest

FieldTypeDescription
key*string
value*string

Responses

StatusBodyDescription
200ChangeConfigurationResponseThe charging_station answered
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo charging_station with this id exists, or the caller cannot access its environment
409ErrorBodyThe charging_station is not connected to the CSMS
422ErrorBodyThe key or value is not expressible in the charging_station's OCPP version
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time

Asks a charging_station to clear its local Authorization Cache.

post/v1/charging-stations/{charging_station_id}/commands/clear-cacheRequires a bearer token

Parameters

NameInTypeDescription
charging_station_id*pathstring<uuid>ChargingStation id

Responses

StatusBodyDescription
200ClearCacheResponseThe charging_station answered
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo charging_station with this id exists, or the caller cannot access its environment
409ErrorBodyThe charging_station is not connected to the CSMS
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time

Sends a vendor-specific `DataTransfer` message to a charging_station.

post/v1/charging-stations/{charging_station_id}/commands/data-transferRequires a bearer token

This CSMS does not interpret the payload — see the audit trail (GET /charging-stations/{charging_station_id}/commands) for the only record of what was sent.

Parameters

NameInTypeDescription
charging_station_id*pathstring<uuid>ChargingStation id

Request bodyDataTransferRequest

FieldTypeDescription
datastring | nullThe message body, passed through verbatim. Its format is between the caller and the vendor; this service never interprets it.
message_idstring | nullIdentifies a specific message within that implementation. A charging_station that doesn't recognize it answers unknown_message_id.
vendor_id*stringIdentifies the vendor-specific implementation being addressed. 1.6 spec §4.3: it SHOULD be a reversed-DNS name, e.g. com.example.charging_stations.

Responses

StatusBodyDescription
200DataTransferResponseThe charging_station answered
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo charging_station with this id exists, or the caller cannot access its environment
409ErrorBodyThe charging_station is not connected to the CSMS
422ErrorBodyThe request is not expressible in the charging_station's OCPP version
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time

Asks a charging_station to report its configuration settings — a live round-trip, unlike `GET /charging-stations/{charging_station_id}/configuration`'s cached read.

post/v1/charging-stations/{charging_station_id}/commands/get-configurationRequires a bearer token

Parameters

NameInTypeDescription
charging_station_id*pathstring<uuid>ChargingStation id

Request bodyGetConfigurationRequest

FieldTypeDescription
keysarray<string>The settings to look up. Empty or omitted asks for every setting the charging_station has (1.6 spec §5.8).

Responses

StatusBodyDescription
200GetConfigurationResponseThe charging_station answered
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo charging_station with this id exists, or the caller cannot access its environment
409ErrorBodyThe charging_station is not connected to the CSMS
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time

Asks a charging_station what limit is currently in effect.

post/v1/charging-stations/{charging_station_id}/commands/get-effective-limitRequires a bearer token

Parameters

NameInTypeDescription
charging_station_id*pathstring<uuid>ChargingStation id

Request bodyGetEffectiveLimitRequest

FieldTypeDescription
duration_seconds*integer<int32>
scope*EffectiveLimitScopeWhat to ask about — a station-wide total, or one connector. Only two variants, unlike ChargingLimitScope's three: this isn't about a charging profile's purpose, only about which physical thing the answer describes.
unitnull | ChargingRateUnitApi

Responses

StatusBodyDescription
200GetEffectiveLimitResponseThe charging_station answered
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo charging_station with this id exists, the caller cannot access it, or scope names an unknown connector
409ErrorBodyThe charging_station is not connected to the CSMS
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time

Asks a charging_station for its local authorization list version.

post/v1/charging-stations/{charging_station_id}/commands/get-local-list-versionRequires a bearer token

Parameters

NameInTypeDescription
charging_station_id*pathstring<uuid>ChargingStation id

Responses

StatusBodyDescription
200GetLocalListVersionResponseThe charging_station answered
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo charging_station with this id exists
409ErrorBodyThe charging_station is not connected to the CSMS
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time

Asks a 2.0.1 charging_station to report one or more Device Model variables.

post/v1/charging-stations/{charging_station_id}/commands/get-variablesRequires a bearer token

Parameters

NameInTypeDescription
charging_station_id*pathstring<uuid>ChargingStation id

Request bodyGetVariablesRequest

FieldTypeDescription
skip_device_model_checkbooleanRelay without first checking the requested Component/Variable pairs against the charging_station's cached Device Model. Defaults to false — see [crate::commands::set_variables::SetVariablesRequest] for when to set it, and [crate::commands::device_model_validation] for why the escape hatch exists at all.
variables*array<VariableTargetView>

Responses

StatusBodyDescription
200GetVariablesResponseThe charging_station answered
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo charging_station with this id exists, or the caller cannot access its environment
409ErrorBodyThe charging_station is not connected to the CSMS
422ErrorBodyEither the request names a Component/Variable absent from the charging_station's cached Device Model (unknown_variable, refused locally with nothing sent), or it is not expressible in the charging_station's OCPP version (unsupported)
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time

Asks a charging_station to remotely stop a running transaction.

post/v1/charging-stations/{charging_station_id}/commands/remote-stop-transactionRequires a bearer token

Parameters

NameInTypeDescription
charging_station_id*pathstring<uuid>ChargingStation id

Request bodyRemoteStopTransactionRequest

FieldTypeDescription
transaction_id*TransactionIdentifierThe transaction to stop, as the charging_station knows it — for an OCPP 1.6 charging_station, the integer this CSMS allocated and returned in StartTransaction.

Responses

StatusBodyDescription
200RemoteStopTransactionResponseThe charging_station answered
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo charging_station with this id exists, or the caller cannot access its environment
409ErrorBodyThe charging_station is not connected to the CSMS
422ErrorBodyThe request is not expressible in the charging_station's OCPP version
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time

Asks a charging_station to reserve a connector.

post/v1/charging-stations/{charging_station_id}/commands/reserve-nowRequires a bearer token

Parameters

NameInTypeDescription
charging_station_id*pathstring<uuid>ChargingStation id

Request bodyReserveNowRequest

FieldTypeDescription
connector_number*integer<int32>The station's own connector number. `0` reserves the charging_station rather than a named connector (§6.37) — see the module docs for why this is a number rather than a connector id.
expires_at*string<date-time>When the reservation lapses. Enforced by the station, not by this CSMS (§5.13).
id_token*stringThe token the connector is held for. Capped at 20 characters by the wire (§7.14); a longer one is refused before anything is sent.
parent_id_tokenstring | nullOptional group token. A station may admit any token sharing this parent, which is why this CSMS cannot second-guess a start.

Responses

StatusBodyDescription
200ReserveNowResponseThe charging_station answered
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo charging_station with this id exists, or the caller cannot access its environment
409ErrorBodyThe charging_station is not connected to the CSMS
422ErrorBodyA token is too long for OCPP 1.6's 20-character bound
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time

Asks a charging_station to reboot, soft or hard.

post/v1/charging-stations/{charging_station_id}/commands/resetRequires a bearer token

Parameters

NameInTypeDescription
charging_station_id*pathstring<uuid>ChargingStation id

Request bodyResetChargerRequest

FieldTypeDescription
evse_idinteger | null<int32>Which EVSE to reset, for a 2.0.1 charging_station — omit to reset the whole charging station. Ignored by a 1.6 gateway, which has no per-EVSE reset.
schedulenull | ResetSchedule
type*ResetTypeThe API's own mirror of [ResetKind]. Duplicated rather than reused because csms-domain deliberately carries no utoipa dependency — the domain model exists to be free of transport concerns, and OpenAPI is one. Same reason EvseSummary mirrors stations::evse::Evse. The From impls below are where the two are kept in step; adding a variant to either without the other won't compile.

Responses

StatusBodyDescription
200ResetChargerResponseThe charging_station answered
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo charging_station with this id exists, or the caller cannot access its environment
409ErrorBodyThe charging_station is not connected to the CSMS
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time

Pushes a charging_station's local authorization list to it.

post/v1/charging-stations/{charging_station_id}/commands/send-local-listRequires a bearer token

Parameters

NameInTypeDescription
charging_station_id*pathstring<uuid>ChargingStation id

Request bodySendLocalListRequest

FieldTypeDescription
update_type*UpdateTypeRequestThe API's mirror of [LocalListUpdateType] — duplicated because csms-domain carries no utoipa dependency.

Responses

StatusBodyDescription
200SendLocalListResponseThe charging_station answered
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo charging_station with this id exists, or it has no list
409ErrorBodyThe charging_station is not connected to the CSMS
422ErrorBodyThe list cannot be pushed: too large for the charging_station, or it names tokens with no recoverable value
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time

Asks a 2.0.1 charging_station to write one or more Device Model variables.

post/v1/charging-stations/{charging_station_id}/commands/set-variablesRequires a bearer token

Parameters

NameInTypeDescription
charging_station_id*pathstring<uuid>ChargingStation id

Request bodySetVariablesRequest

FieldTypeDescription
skip_device_model_checkbooleanRelay without first checking the requested Component/Variable pairs against the charging_station's cached Device Model. Defaults to false. Set it when the cache is known to be stale (a firmware change can add variables before the next report lands), or to deliberately exercise a station's UnknownComponent handling — sending an arbitrary Component/Variable is a legal OCPP operation whose authority is the charging_station, not this cache. See [crate::commands::device_model_validation].
variables*array<VariableValueView>

Responses

StatusBodyDescription
200SetVariablesResponseThe charging_station answered
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo charging_station with this id exists, or the caller cannot access its environment
409ErrorBodyThe charging_station is not connected to the CSMS
422ErrorBodyEither the request names a Component/Variable absent from the charging_station's cached Device Model (unknown_variable, refused locally with nothing sent), or it is not expressible in the charging_station's OCPP version (unsupported)
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time

Asks a charging_station to (re-)send a specific message type, e.g. a fresh `StatusNotification` or `BootNotification`.

post/v1/charging-stations/{charging_station_id}/commands/trigger-messageRequires a bearer token

Parameters

NameInTypeDescription
charging_station_id*pathstring<uuid>ChargingStation id

Request bodyTriggerMessageRequest

FieldTypeDescription
connector_idinteger | null<int32>Which connector the request is about. Omitting this is not the same as naming every connector: §5.17 reads an absent connector_id as "for all allowed connectorId values", so a triggered status_notification without one asks for the charge point's own status *plus* one per connector. Connector numbering is the charging_station's own and must be greater than 0 here (§6.51) — unlike change-availability, 0 is not meaningful and comes back as a 422.
custom_triggerstring | nullThe vendor-specific trigger name, for requested_message: "custom" on an OCPP 2.1 charging_station (2.1 spec F06, max 50 characters). Passed through opaquely — the CSMS never interprets it; what it means is between operator and vendor, the same stance data-transfer takes. Required with custom, and rejected without it: either half alone reaches the charging_station as a request it cannot act on, so both come back as a 422 rather than being sent.
evse_idinteger | null<int32>Which EVSE the request is about, for a 2.0.1 charging_station — omit to ask about the whole charging station. Ignored by a 1.6 gateway, which has no EVSE concept.
requested_message*MessageTriggerTypeThe API's own mirror of [commands::MessageTrigger]. Duplicated rather than reused because csms-domain deliberately carries no utoipa dependency — see [crate::commands::reset::ResetType] for the same reasoning. This enum used to omit OCPP's two firmware-profile triggers, on the grounds that the Firmware Management profile is out of scope and ocpp-gateway answered both of those messages with a CallError — so asking for a message we would then refuse was not a request worth being able to make. The premise was true and the conclusion was wrong: the two triggers belong to *Remote Trigger*, not Firmware Management (1.6 §7.32 conditions its enum on nothing), and the gateway now answers both messages. See specs/009-ocpp16-certification-hardening/.

Responses

StatusBodyDescription
200TriggerMessageResponseThe charging_station answered
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo charging_station with this id exists, or the caller cannot access its environment
409ErrorBodyThe charging_station is not connected to the CSMS
422ErrorBodyThe request may not be sent to this charging_station, or is not expressible in its OCPP version
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time

Asks a charging_station to remotely start a transaction on one connector.

post/v1/connectors/{connector_id}/commands/start-transactionRequires a bearer token

Parameters

NameInTypeDescription
connector_id*pathstring<uuid>Connector id

Request bodyStartTransactionRequest

FieldTypeDescription
charging_limitnull | SessionChargingLimitRequest
transaction_limitnull | SetTransactionLimitRequest

Responses

StatusBodyDescription
200StartTransactionResponseThe charging_station answered
400ErrorBodyRequest body present but not valid JSON
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo connector with this id exists, or the caller cannot access its environment
409ErrorBodyThe charging_station is not connected to the CSMS
422ErrorBodycharging_limit is not a valid TxProfile, its recurrence and schedule.anchor contradict each other, it is not expressible in the charging_station's OCPP version, or transaction_limit states no ceiling
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time

Asks a charging_station to unlock one connector.

post/v1/connectors/{connector_id}/commands/unlockRequires a bearer token

Parameters

NameInTypeDescription
connector_id*pathstring<uuid>Connector id

Responses

StatusBodyDescription
200UnlockResponseThe charging_station answered
401ErrorBodyMissing, invalid, or expired bearer token
403ErrorBodyThe caller is a member of the charging_station's organization but below the required role
404ErrorBodyNo connector with this id exists, or the caller cannot access its environment
409ErrorBodyThe charging_station is not connected to the CSMS
502ErrorBodyThe charging_station gave no usable answer
503ErrorBodyThe command could not be sent
504ErrorBodyThe charging_station did not answer in time