OCPP events
Three event types, all carrying the same charger identity and connection ID.Connection ID
Every OCPP event carries a connection ID. The SDK mints it, it is stable for the life of one WebSocket, and it is fresh on every reconnect. That is what turns a stream of frames into a session you can read top to bottom, and what lets the dashboard show a charger that flapped twenty times in an hour instead of one endless session. The session handle fromconnection() mints and carries the ID for you, so per frame calls do not pass one.
Direction
Direction is from the charge point’s perspective.
Record the direction at the actual socket read or write. A helper both sides call is where directions get flipped, and flipped directions make every request look like a response.
Frames are verbatim
Frames are captured as raw bytes, exactly as they crossed the wire. Nothing is reformatted or stripped. There is no OCPP redaction. If a payload carries data you do not want stored,idTag for example, mask it before you hand the frame to the SDK.
OCPI exchanges
One complete HTTP request and response pair, plus its direction.
Direction is set by the method you call, so there is no argument to get backwards.
Redaction runs before buffering
Redaction happens at the capture chokepoint, the last point before the message enters memory that outlives the call. Nothing unredacted is ever buffered, so nothing unredacted can be delivered, logged, or recovered from a crash dump.The OCPI header allowlist
OCPI headers are filtered by an allowlist, not a denylist. Only these are kept. Everything else, includingAuthorization, Cookie, and X-API-Key, is dropped at capture.
Matching is case insensitive.
ocpiAllowedHeaders extends the list and can never shrink it, so you cannot configure your way into leaking Authorization.
Credentials tokens are masked
The OCPI/credentials module exchanges the tokens partners authenticate with. Those exchanges are worth capturing, since registration failures are a common roaming problem, but the tokens are not.
On any URL ending in /credentials, the token field is replaced with [redacted], both at the root of a request body and under data in a response envelope.
token at either location, it is captured unchanged. Masking never drops data it could not safely rewrite.
Limits
Dropping rather than truncating is deliberate. A body cut in half validates as broken and would generate issues describing the SDK rather than your traffic.
What is never captured
Transport
Batches are posted over HTTPS toingest.evpanda.io. The API key travels in the X-API-Key header, never in a URL. Bodies above roughly 1 KB are compressed with zstd.
The SDK only ever opens connections outward. EVPanda never connects to you, there is no control channel, and no remote configuration. Behind an egress firewall, ingest.evpanda.io on port 443 is the only destination needed.