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
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.