Rate limited
HTTP 429 — what to change
You are getting 429 rate_limited on POST /v1/ingest. The default
limit is 60 requests per minute per device. If your sensor is hitting
that, one of the following is true.
1 · The sensor is in a fast loop
A new firmware that does not back off on success will hammer the ingest
on every loop iteration. Common with DIY ESP32 sketches missing a
delay(), or ESPHome configs where interval: was misread as every loop.
Symptom: 200 OK for the first ~60 requests in a minute, then 429 for the rest of the minute, then the cycle repeats.
Fix: enforce a minimum loop interval in the device firmware. We recommend 60 s for cold-chain, 30 s for door-event, 1–5 s for energy clamp monitoring (read on, see batching below).
2 · You are batching at the wrong layer
For energy meters that read at 1 Hz, sending one request per second is both wasteful and rate-limit-blocked. Batch on the device side:
POST /v1/ingest
{
"device": "panel1",
"measurements": [
{ "ts": "2026-05-17T08:22:00Z", "type": "power", "value": 1240 },
{ "ts": "2026-05-17T08:22:01Z", "type": "power", "value": 1255 },
{ "ts": "2026-05-17T08:22:02Z", "type": "power", "value": 1268 },
…up to 32 entries…
]
}
One HTTP request, 32 measurements, each with its own ts. The endpoint
accepts up to 32 entries per request. Rate-limit budget is per
request, not per measurement.
For 1 Hz sampling: batch every 30 s (30 entries), POST once. Budget is 2 req / min — well under the limit.
3 · A misbehaving retry loop
A 5xx response triggers retry in many client libraries. If the retry
backoff is too tight (e.g. requests default of 0.2 s between retries),
a brief outage on our side bursts into hundreds of requests per minute
when the service comes back.
Recommended retry policy:
- On 5xx: retry with exponential backoff starting at 1 s, multiplying by 2, capped at 60 s, with jitter.
- On 429: respect
Retry-After. Do not retry sooner. - On 401 / 403 / 422: do not retry; the request will never succeed unchanged.
4 · Many devices behind one NAT
The rate limit is per device, not per IP — so 50 devices behind one NAT can collectively send 3000 req / min. If you are getting 429 with only one logical device, you may be sharing a device id across multiple physical sensors. Each physical sensor should have its own device id and token.
5 · You are using the wrong ingest path
If you have an ESP32 sending 60 readings / min at /v1/ingest, half of those are the same channel value. Sending the delta instead — only when the reading changes by > X % — drops volume by 80 % in typical cold-chain installs.
ESPHome supports this with a delta filter on a sensor:
sensor:
- platform: bme280_i2c
temperature:
filters:
- delta: 0.1 # report only on ≥ 0.1 °C change
For HACCP you do not want pure delta filtering (the auditor wants regular
samples). Combine with a heartbeat filter:
filters:
- delta: 0.1
- heartbeat: 60s
This means: report on any 0.1 °C change, and at least once per 60 s regardless of change. Same compliance profile, fraction of the bandwidth.
What to do right now
If you are in production and getting 429 right now, the fastest mitigation is:
- Drop the cadence to 120 s temporarily.
- Open a ticket — for short bursts we can raise the limit on your account within 24 h, no questions asked.
The limit is there to protect the ingest pipeline from misconfigured clients, not to upsell. We do not gate "the actual product" on it.