Skip to main content

Game API errors and rate limits (401, 404, 409, 429 and how to back off)

What each error code means, the two rate limits, the Retry-After header, and how to batch requests.

Written by Liam Radford

Error codes

Every error response is JSON: { "success": false, "error": "..." }.

Code

Meaning

What to do

400

The request is wrong (missing or invalid fields)

Fix the request. The message says what

401

Missing, wrong or expired key, or the key belongs to another workspace

Check the key, its expiry and the workspace ID. Make a new key if needed

404

Unknown user (for example not a member of the workspace) or no active session to end

Often safe to ignore

405

Wrong HTTP method

Use the method in the reference

409

A conflict, such as a session already active, or no Discord webhook set up for /logs

Often safe to ignore (start) or set it up (webhook)

429

Rate limited

Wait for Retry-After seconds, then retry

502

Discord refused a forwarded log message

Check the webhook

Rate limits

Two limits apply per 5-minute window:

Limit

Value

Counted by

Per client address

1,000 requests

The caller's address and the workspace

Per API key

200 requests

The key and the workspace

When you go over, you receive 429 with a Retry-After header and RateLimit-* headers showing your budget. The address limit exists so that bogus keys cannot be used to probe the API for free.

Roblox adds its own limit: 500 HttpService requests per minute per server.

How to stay within them

  • Only track staff ranks. Do not send activity for everyone.

  • Batch. For /logs, send up to 25 entries in one request, every few seconds, instead of one request per chat line.

  • Back off on 429. Wait for the Retry-After time, and do not retry in a tight loop.

  • Cache reads. Member lists and workspace info change slowly.

The older activity endpoints

The downloadable loader uses older /api/activity/* endpoints with a separate activity key and a much higher limit (6,000 requests per 5 minutes per address and per key), because every join and leave from every server calls them. If you write your own integration, use the public API above.

Quick checks when something fails

  1. Is the key correct, not expired and made by this workspace?

  2. Is the workspace ID the Roblox group ID?

  3. Did you send Authorization: Bearer rosterr_...?

  4. Are you calling from a server script with HTTP requests enabled?

  5. Are you being rate limited (429)?

Related articles

  • The Rosterr game API: what it is, how to make an API key and keep it safe

  • Rosterr game API: endpoints reference

  • Track staff time with the game API (Luau example)

Did this answer your question?