Quotas
All windows are 60 seconds.| Category | Limit per minute | Counted per | Endpoints |
|---|---|---|---|
lookup | 60 | Guild | All lookup endpoints |
bindings_read | 100 | Guild | GET /bindings/list |
bindings_write | 30 | Guild | Add, update, remove, test, validate bindings |
moderation_check | 300 | API key | Ban status, mute status, Shield check and batch |
moderation_read | 100 | Guild | Active bans and mutes |
moderation_write | 50 | Guild | Roblox ban, unban, mute, unmute |
config_read | 100 | Guild | Guild roles |
roblox_activity | 200 | API key | Staff permission lookups |
staff_activity | 200 | API key | Action logging, game registration |
staff_session | 100 | API key | Session start and end |
staff_heartbeat | 300 | API key | Staff heartbeat |
server_heartbeat | 300 | API key | Server heartbeat |
server_poll | 300 | API key | Command polling |
server_ack | 100 | API key | Command acknowledgement |
The high-frequency checks that a game runs per player join, ban and mute status and Shield, sit in
moderation_check at 300 per minute per key, which is generous for normal play.When you hit a limit
A request over the limit returns429 with a Retry-After header.
429
429:
| Header | Meaning |
|---|---|
Retry-After | Seconds to wait before retrying |
X-RateLimit-Limit | The category’s limit |
X-RateLimit-Remaining | Requests left in the window, 0 on a 429 |
X-RateLimit-Reset | Unix timestamp when the window resets |
Staying under the limit
- Cache status checks. Ban and mute checks are already cached server-side for a short window. Avoid adding
no_cache=trueunless you truly need a live read. - Batch where you can. Use
POST /lookup/statusandPOST /shield/batchinstead of looping single requests. - Back off on 429. Respect
Retry-Afterrather than retrying immediately.