OCPPLAB Gateway is a REST API that drives a fleet of OCPP simulators. Every resource lives under a tenant, and every charger points at a CSMS over WebSocket. This page is the mental model you need before writing integration code.
A tenant (also called an “organization”) is the isolation boundary. Locations, chargers, and OCPI bundles all belong to exactly one tenant.
X-Organization-Id. See Authentication — you can ignore this section unless you are an internal integrator.A location is a physical site: a charging hub, depot, parking lot, or forecourt. It holds address, coordinates, timezone, and an owner name. Chargers are always deployed into exactly one location.
Location routes live at /locations — CRUD plus a few read helpers for listing chargers within a site.
A charger is a deployed, simulated charge point. Each one:
wallbox / wallbox-pulsar-plus)OCPP1.6 or OCPP2.0.1ws_url) — that is the backend you are testingOnce created, the simulator opens a WebSocket to the CSMS and starts emitting OCPP traffic — BootNotification, StatusNotification, Heartbeat, and the rest.
/chargers/{charger_id}/... routes target exactly one charger.
/locations/{location_id}/chargers/... routes fan out to every charger in the site, or to a subset via charger_ids.
The catalog is read-only. It lists the brands, models, connector types, and OCPP versions the simulator supports. Always pick a brand and model from the catalog before creating a charger — the backend rejects unknown slugs.
Commands drive the simulator. They come in two flavors:
start-transaction, stop-transaction, reset, unlock-connectorupdate-configuration, set-local-auth-list, inject-fault, clear-faultMost commands exist on both the single-charger and location-scoped routes. Prefer the location-scoped variant when orchestrating a fleet.
The OCPI section is for roaming and integration testing. A CPO bundle provisions:
Bundles are preset-driven — pass a template like small-urban-ac and the server stamps out the full topology.
GET /chargers/{charger_id}/logs is the first tool to reach for after a command. Every OCPP message crossing the wire — in either direction — lands here with direction, action, raw message frame, and timestamp. Use it to verify commands landed, diff runs against a baseline, or debug low-level protocol issues.
A typical integration flow:
idEvery resource id you receive from a list or create response is the canonical value to pass back in later requests. Don’t construct ids yourself.