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​

ResourceTransportsScaleStarterFree
Uplink RPM (PUSH)UDP, TCP, HTTP, MQTT1,00050060
Downlink RPM (PULL)UDP, TCP, HTTP, MQTT1,00050060
Command RPMMQTT1,00050060
Connections per IPTCP, HTTP, MQTT20103

Per device​

ResourceTransportsScaleStarterFree
Max payload sizeUDP, TCP, HTTP, MQTT100 KB100 KB100 KB
Connection TTLTCP, MQTT15 s10 s10 s
Keep-alive idle timeoutTCP, MQTT5 s5 s5 s
Connection TTL vs Keep-alive idle timeout

These two TCP limits serve different purposes:

  • Connection TTL is a hard cap on total connection duration. No matter how active the device is, the server closes the connection after this period and sends ACK|ERR|ttl_expired. The device should reconnect.
  • Keep-alive idle timeout is the maximum silence between frames. If the device stops sending data for this long, the server closes the connection with ACK|ERR|keep_alive_timeout. Sending any frame (including PING) resets the timer.

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 Status
RPM exceededACK|ERR|rate_limited429
Payload too largeACK|ERR|payload_too_large413
Per-IP connections exceededACK|ERR|rate_limited (then close)429 (then close)
Connection TTL exceededACK|ERR|ttl_expired (then close)N/A
Keep-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.