Skip to main content

Rate Limits

Limits are enforced at two levels: per profile and per device. Defaults vary by plan. Exceeding a limit returns ACK|ERR|rate_limited (or HTTP 429).

RPM = requests per minute.

Per profile

ResourceTransportsScaleStarterFreeUplink RPM (PUSH)UDP, TCP, HTTP, MQTT1,00050060Downlink RPM (PULL)UDP, TCP, HTTP, MQTT1,00050060Connections per IPTCP, HTTP, MQTT20103

Per device

ResourceTransportsScaleStarterFreeMax payload sizeUDP, TCP, HTTP, MQTT100 KB100 KB100 KBConnection TTLTCP, MQTT15 s10 s10 sKeep-alive idle timeoutTCP, MQTT5 s5 s5 s

:::info Connection TTL vs Keep-alive idle timeout

These two TCP limits serve different purposes:

Both timers start when the connection is accepted. TTL counts total elapsed time; keep-alive resets on every received frame.

:::

Error and close responses

ConditionRaw ACKHTTP StatusRPM exceededACK|ERR|rate_limited429Payload too largeACK|ERR|payload_too_large413Per-IP connections exceededACK|ERR|rate_limited (then close)429 (then close)Connection TTL exceededACK|ERR|ttl_expired (then close)N/AKeep-alive idle timeoutACK|ERR|keep_alive_timeout (then close)N/A

PING is exempt from rate limiting on TCP and UDP. On HTTP, HEAD counts toward the uplink RPM. On MQTT, keepalive is handled natively by PINGREQ/PINGRESP.

See each transport page for transport-specific limits.