Register both platforms (CPO and eMSP) on the OCPI hub or negotiate a direct peer connection; exchange the versions endpoint URL and perform the credentials registration handshake by PUTting a Credentials object containing your token and versions URL.
Query the remote party's /ocpi/versions and /ocpi/2.2.1/details endpoints to confirm supported modules (Locations, Sessions, CDRs, Tariffs, Commands, Tokens).
Sync location and EVSE data by having the CPO push EVSE objects via the Locations module PUT/PATCH endpoints, or have the eMSP pull them via GET with pagination using offset and limit parameters.
Implement the Tokens module: the eMSP pushes token objects to the CPO so the CPO can perform local whitelist authorization, or the CPO uses REAL-TIME authorization by calling the eMSP's token-authorize endpoint.
Handle Session and CDR objects: the CPO pushes Session objects (ACTIVE, COMPLETED) and CDR objects to the eMSP after a session ends; the eMSP validates the CDR against tariff objects and triggers billing.
Implement the Commands module to support remote start/stop and unlock commands initiated by the eMSP mobile app, forwarding them to the CSMS via OCPP.
Known gotchas
OCPI 2.2.1 introduced Tariff Restrictions and Smart Charging modules not present in 2.1.1; confirm which version your counterparty supports before designing the integration — version mismatches cause CDR tariff calculation errors.
Token UID format differs between RFID (14-char hex) and app-based tokens; ensure the type field (RFID, APP_USER, AD_HOC_USER, OTHER) is set correctly to avoid authorization failures.
OCPI pagination uses X-Total-Count and Link headers for GET responses; implement correct cursor-based pagination or you will miss EVSEs when a CPO has large location sets.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp