Rate Limits
Every endpoint has a quota. When you hit it you get a 429 Too Many Requests with a Retry-After header in seconds. Wait that long, then retry.
Quotas are per API key, so each integration gets its own bucket. If you run two game servers with the same key they share, with different keys they don't.
Hot paths (made for game servers)
These run at high cadence so they have generous limits.
| Endpoint | Limit |
|---|---|
GET /moderation/:guildId/ban-status/:identifier | 300 / minute |
GET /moderation/:guildId/mute-status/:identifier | 300 / minute |
POST /staff/roblox/heartbeat | 300 / minute |
POST /roblox/servers/heartbeat | 300 / minute |
GET /roblox/servers/:serverId/commands | 300 / minute |
POST /staff/roblox/verify | 200 / minute |
POST /roblox/games/register | 200 / minute |
POST /staff/roblox/action | 200 / minute |
GET /guilds/:guildId/staff/roblox/:robloxId/permissions | 200 / minute |
POST /staff/roblox/session/start | 100 / minute |
POST /staff/roblox/session/end | 100 / minute |
POST /roblox/servers/:serverId/commands/:commandId/ack | 100 / minute |
GET /ws/guilds/:guildId/roblox | 10 connects / minute |
Standard guild endpoints
| Endpoint group | Read limit | Write limit |
|---|---|---|
Bindings (/bindings/...) | 100 / min | 30 / min |
Guild config (/guilds/:guildId/...) | 100 / min | 20 / min |
Audit logs (/guilds/:guildId/audit-logs) | 100 / min | 20 / min |
| Moderation logs and lists | 100 / min | 50 / min |
Staff (/staff/..., LOA, strikes, notes, quota) | 100 / min | 30 / min |
Lookup (/lookup/..., /reverse) | 60 / min | 60 / min |
Sync (/interactions/sync, /roles/...) | 30 / min | 30 / min |
Bulk sync (/interactions/sync/all) | 1 / hour | 1 / hour |
Shield
The cross-guild flagged-user list. Uses the moderation hot-path quota:
GET /shield/check/:robloxIdandPOST /shield/batch: 300 / minute per key.POST /shield/import: 50 / minute per key (allowlisted guilds only).
Handling 429
You get a body like this:
{ "status": "error", "code": 429, "message": "Rate limit exceeded", "retry_after": 17 }What to do:
- Read
Retry-Afterand wait that long. - If you're polling, slow the cadence down. Don't speed it up.
- Cache when you can. Ban and mute checks are safe to cache for around 30 seconds in the game server.
- Batch when you can. Use
POST /lookup/statusinstead of 50 single lookups, andPOST /shield/batchinstead of 50 single Shield checks.