GuidesAPI reference
Introduction
  • Overview
Orientation
  • What a CSMS does
  • OCPP in ten minutes
  • The vocabulary
  • Lifecycle of a charging session
  • Which OCPP version am I dealing with?
  • How Flowion maps onto OCPP
Getting started
  • Quickstart
  • Core concepts
  • Set up your workspace
  • Connect a simulated charger
  • Connect a real charger
  • Environments
API guide
  • Authentication
  • Your first API call
  • Interactive API reference
  • Roles and permissions
  • Errors, pagination and versioning
  • Live updates
  • Sending commands to a charger
  • Rate limits
How-to guides
  • Register and provision a charger
  • Read and change charger settings
  • Authorize drivers with RFID cards
  • Start and stop sessions remotely
  • Track sessions and energy
  • Take a charger in and out of service
  • Unlock a stuck connector
  • Reset a charger
  • Send vendor-specific data
  • Keep a site within its electrical limits
  • Use day-ahead electricity prices
  • Receive events with webhooks
  • OCPP feature coverage
Troubleshooting
  • 8 more coming soon
    • My charger will not connectSoon
    • It connects, then dropsSoon
    • A command timed out or returned 409Soon
    • A card is not being authorizedSoon
    • My transaction looks wrongSoon
    • Meter values are missing or sparseSoon
    • Reading the OCPP message logSoon
    • Known limitationsSoon
Reference
  • 5 more coming soon
    • GlossarySoon
    • Endpoint indexSoon
    • OCPP message supportSoon
    • Status and error codesSoon
    • ChangelogSoon
Flowion Docsflowion.io
PreviousSending commands to a chargerNextRegister and provision a charger
Was this page helpful?
Edit this page

Rate limits

Every route under /v1 shares one limit — /livez and /readyz sit outside it, so an orchestrator's health check can never trip a client-facing limit.

The numbers#

One token replenished every 500ms — 2 requests per second sustained — with room for a 30-request burst. That is generous enough for a dashboard's normal polling, or paginating through a large list in one go, and tight enough to cut off a flood. It is a starting point rather than a measured figure, and deployments can override it.

Keyed by IP, not by token

The limit is shared across everything calling from the same address, not budgeted per credential. If you run several integrations from behind one NAT gateway or one shared outbound IP, they compete for the same 2 req/s — plan capacity accordingly. This is a deliberate scope cut: the layer that enforces the limit runs before the request's bearer token is verified, so it has no authenticated caller to key on yet, and trusting an unverified token to pick a bucket would let an attacker mint a fresh one per request.

Hitting it#

A request over the limit gets 429:

HTTP
HTTP/1.1 429 Too Many Requests
Retry-After: 2
JSON
{
  "error": "rate_limited",
  "message": "too many requests; retry after 2s"
}

Retry-After is in seconds — wait at least that long before your next request. There are no X-RateLimit-Remaining or X-RateLimit-Reset headers on a normal, successful response today: the only signal you get about your standing against the limit is the 429 itself, so back off on the first one rather than trying to infer headroom in advance.

Backing off well#

  • Retry a 429 after Retry-After has elapsed, not immediately — a request sent before then only extends the wait.
  • If you are about to paginate through a large collection, prefer larger per_page values (up to the cap of 100 — see Errors, pagination and versioning) over many small pages; fewer requests for the same data costs you nothing against this limit.
  • Prefer live updates to polling on a fixed interval wherever you can — an SSE connection that sits open uses one request, not one every few seconds.

From here, the interactive reference is the fastest way to look up a specific endpoint's exact limits and shape, and the how-to guides walk through using this API for a specific job end to end.