Operator-side limits
Limits apply per
client_id, not per IP. If you operate multiple clients, each gets its own quota.
Charger-side limits
The 10 req/s charger-side limit is intentionally generous — normal operation runs well below it.
Exceeding the limit
When a client exceeds its rate limit, the API returns:- HTTP 429 Too Many Requests
- Application code 5001
- Body:
{ "code": 5001, "message": "Too many requests", "details": { "retry_after_seconds": <int> } }
retry_after_seconds field (where present) tells your client how long to wait before retrying.
Client design recommendations
Use the WebSocket stream for realtime data
The single biggest cause of accidental rate-limit breach is pollingGET /devices/{id} repeatedly to track live state. Don’t do that — subscribe to the WebSocket telemetry stream (/v1/operator/stream) instead. One WebSocket connection replaces hundreds of REST polls.
Cache aggressively at your BFF
Site lists, device metadata, firmware versions, and other slow-moving data can be cached for minutes or even hours. Only telemetry-flavoured data needs to be real-time.Batch where possible
Use pagination (page, size) and time-range filters on /charging-records to fetch large datasets in fewer requests. The size cap is 100 per page; aim for full pages.