Errors and rate limits
Handle API v2 error envelopes, status codes, scope failures, and retry timing.
Last updatedAPI v2 returns machine-readable errors in one envelope:
{
"error": {
"code": "validation_failed",
"message": "body/userId must be integer",
"details": {
"issues": [
{
"instancePath": "/userId",
"keyword": "type",
"message": "must be integer"
}
]
}
}
}Branch application logic on error.code, not on human-readable message. The wording can improve without changing the condition. details is optional and varies by error.
Status codes
| Status | Meaning |
|---|---|
200 OK | A read or completed action returned data. |
201 Created | A resource was created. |
202 Accepted | Work was accepted and can complete asynchronously. Read the returned state. |
204 No Content | The action succeeded without a JSON body. |
400 Bad Request | Input validation failed. Inspect error.details.issues when supplied. |
401 Unauthorized | Credentials are missing or cannot be authenticated. |
403 Forbidden | The key, API switch, scope, subscription, plan, trial, or feature blocks access. |
404 Not Found | The route or requested community resource does not exist. |
409 Conflict | Current state conflicts with the write, such as a duplicate blacklist entry. |
429 Too Many Requests | Wait for the response’s retry interval. |
500 Internal Server Error | A service error prevented the request. Reconcile state before retrying a write. |
503 Service Unavailable | A required dependency is unavailable. Reconcile writes before retrying. |
Roblox dependency failures can return 502 Bad Gateway for an unavailable or rejected upstream connection and 504 Gateway Timeout for a timed-out request. Reconcile the resource before retrying a write.
Each generated endpoint page lists the responses declared by its route schema. Runtime dependency failures can also return 502, 503, or 504 even when that status is not listed on the individual page.
Important error codes
Authentication and entitlement codes include missing_credentials, unauthorized, api_disabled, key_disabled, legacy_key_unsupported, insufficient_scope, entitlement_required, api_access_unavailable, and feature_unavailable. Routing and validation can return route_not_found and validation_failed. Dependency failures can return dependency_unavailable or a more specific code such as data_rights_unavailable.
An insufficient_scope response also sets WWW-Authenticate with the required scope and includes required and granted scopes in details.
Roblox connection and medal errors
These codes apply to Roblox-backed operations or medal changes, as appropriate. Roblox authorization is separate from the Clan Labs API key supplied by your integration.
| Status and code | Next action |
|---|---|
409 roblox_cloud_not_configured | Ask the Super Owner to connect Roblox in Settings → Roblox Cloud. |
409 roblox_cloud_reconnect_required | Ask the Super Owner to restore the community's Roblox authorization. |
503 roblox_cloud_refresh_pending | Connection resolution is busy; the current response sends Retry-After: 1. |
502 roblox_cloud_configuration_unavailable | Retry later or contact support about the unavailable service configuration. |
502 roblox_cloud_credentials_invalid | Check the Roblox authorization and the authorizing account's permission to manage the target. |
429 roblox_cloud_rate_limited | Roblox throttled the request; the current response sends Retry-After: 30. |
504 roblox_cloud_timeout | Inspect current Roblox state before repeating the write. |
502 roblox_cloud_unavailable | Retry safe reads with bounded backoff while Roblox recovers. |
409 medal_limit_reached | The member has reached the API's 1,000 total medal-occurrence limit. Removal can free a slot. |
Always honor the actual response's retry interval. A Roblox rate-limit response is distinct from the API key's request budget and need not contain its limit, remaining, or resetMs details.
Rotating a working Clan Labs API key does not reconnect Roblox. See Roblox connection recovery and medal retry behavior.
Roblox operation outcomes
When shared Roblox scheduling is enabled, synchronous rank and suspension routes, member refreshes that run AutoRank, experience writes, and event finishing can return these outcomes. Experience changes, finished events, and their awards may already be committed when a Roblox rank outcome is pending; check the operation status before repeating those writes.
| Status and code | Next action |
|---|---|
409 deadline-cancelled-before-dispatch | The unsent operation was cancelled at its deadline and cannot execute later. Check current state before a new attempt. |
504 outcome-pending-check-status | A request was sent and its outcome is unresolved. Check the returned operation reference before another write. If access is revoked or cannot be verified, the reference is omitted; reconcile current Roblox state before retrying. |
504 provider-rejected-408 | Roblox returned a request timeout. Check any returned operation reference and reconcile current Roblox state before repeating the write. |
429 queue-full | Admission capacity is exhausted. Reduce submissions and wait for capacity; this response can omit Retry-After. |
429 provider-rejected-429 | Roblox rejected a scheduled attempt for throttling. Honor Retry-After when supplied. If Location or X-Roblox-Operation-Id is present, check that operation before another write; otherwise inspect current Roblox resource state before retrying. |
502 authorization-intervention-required | Roblox rejected the community connection. Ask the Super Owner to review its authorization. If Location or X-Roblox-Operation-Id is present, check that operation before retrying; otherwise inspect the current Roblox resource state before repeating the request. |
403 actor-authorization-revoked | The API key, its required permission, the community API switch or API-access entitlement changed before dispatch. Restore authorization before retrying. This response has no operation status link. |
503 roblox_scheduler_unavailable | A synchronous route could not access the shared scheduler. Check current resource and operation state before retrying the write. |
Existing synchronous success responses still mean the rank change is confirmed or the current rank already matches. The separate asynchronous endpoint returns 202 for acceptance. Its submit, read, and cancellation resources advertise these availability codes:
| Status and code | Next action |
|---|---|
503 scheduler_disabled | Asynchronous Roblox operations are not enabled for this deployment. An administrator must enable the feature before you can use these endpoints. |
503 scheduler-disabled | Dispatch admission is disabled. An administrator must restore scheduler admission; check any existing operation before submitting another write. |
503 scheduler-unavailable | The worker runtime is temporarily unavailable. Retry status reads with bounded backoff and check the existing operation before resubmitting a write. |
503 roblox_scheduler_unavailable | The shared scheduler cannot be accessed. Retry safe reads with bounded backoff; reconcile the resource and any existing operation before retrying a write. |
See Roblox operations for polling and cancellation.
Rate limiting
Rate limits protect both unauthenticated traffic and authenticated keys. The values are deployment-configurable, so clients must not assume a fixed number from old examples.
A limited response uses 429 rate_limit_exceeded, sets Retry-After in seconds, and includes values such as:
{
"error": {
"code": "rate_limit_exceeded",
"message": "Too Many Requests",
"details": {
"limit": 100,
"remaining": 0,
"resetMs": 30000
}
}
}The numbers above illustrate the shape only. Always use the values in the actual response.
For rate_limit_exceeded, wait at least the supplied Retry-After, add jitter when many workers share a key, reduce polling, and avoid retry storms. For scheduler queue-full, the header can be absent: reduce submissions and retry with bounded exponential backoff. When submitting to POST /v2/roblox-operations/ranks, reuse the same Idempotency-Key for the same intent. Synchronous routes do not accept that header: check the current resource and any returned operation status before repeating the route's write. Experience changes, event awards, and other local effects may already be committed; follow that route's retry guidance. A 429 does not justify rotating keys.
For 503, use Retry-After when the response supplies it. Retry safe reads with bounded backoff. Before retrying a write, fetch the current resource and determine whether the first attempt changed it.
For a diagnostic checklist, see API request errors.