Developer API
Rate Limits

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.

EndpointLimit
GET /moderation/:guildId/ban-status/:identifier300 / minute
GET /moderation/:guildId/mute-status/:identifier300 / minute
POST /staff/roblox/heartbeat300 / minute
POST /roblox/servers/heartbeat300 / minute
GET /roblox/servers/:serverId/commands300 / minute
POST /staff/roblox/verify200 / minute
POST /roblox/games/register200 / minute
POST /staff/roblox/action200 / minute
GET /guilds/:guildId/staff/roblox/:robloxId/permissions200 / minute
POST /staff/roblox/session/start100 / minute
POST /staff/roblox/session/end100 / minute
POST /roblox/servers/:serverId/commands/:commandId/ack100 / minute
GET /ws/guilds/:guildId/roblox10 connects / minute

Standard guild endpoints

Endpoint groupRead limitWrite limit
Bindings (/bindings/...)100 / min30 / min
Guild config (/guilds/:guildId/...)100 / min20 / min
Audit logs (/guilds/:guildId/audit-logs)100 / min20 / min
Moderation logs and lists100 / min50 / min
Staff (/staff/..., LOA, strikes, notes, quota)100 / min30 / min
Lookup (/lookup/..., /reverse)60 / min60 / min
Sync (/interactions/sync, /roles/...)30 / min30 / min
Bulk sync (/interactions/sync/all)1 / hour1 / hour

Shield

The cross-guild flagged-user list. Uses the moderation hot-path quota:

  • GET /shield/check/:robloxId and POST /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:

  1. Read Retry-After and wait that long.
  2. If you're polling, slow the cadence down. Don't speed it up.
  3. Cache when you can. Ban and mute checks are safe to cache for around 30 seconds in the game server.
  4. Batch when you can. Use POST /lookup/status instead of 50 single lookups, and POST /shield/batch instead of 50 single Shield checks.