Skip to main content

Error Codes

Errors always use a real (non-2xx) HTTP status code, and the same JSON body:

{
"success": false,
"message": "Invalid API key",
"code": 401
}

code repeats the HTTP status. Check the status code (or success) — do not rely on message for conditional logic, its wording may change.


HTTP Status Codes​

CodeMeaningCommon Cause
304Not ModifiedETag match — your cached copy is current
400Bad RequestInvalid or unknown query parameters, or a non-numeric {id} path parameter
401UnauthorizedMissing, malformed or unknown x-api-key
403ForbiddenAccount blocked or insufficient permissions
404Not FoundEndpoint path wrong, or the requested resource does not exist on RSI
429Too Many RequestsDaily quota exceeded, or a per-minute request or scrape limit was hit
500Internal Server ErrorAn unexpected error on the server
503Service UnavailableScraping is temporarily unavailable, or a backing service is down
504Gateway TimeoutThe live scrape took too long to complete

Common Messages​

StatusMessageCause
401API key is required in x-api-key headerThe header is missing
401Invalid API key formatThe key is not 32–68 characters of letters, digits or _
401Invalid API keyThe key does not exist (or was deleted or renewed)
403User is blocked: <reason>The account is blocked (the reason is appended when one was given)
429Daily request quota exhaustedYou have used your 500 daily requests on ?refresh=true calls
429Too many requests. Try again in the next minute.Global per-minute request limit (every request counts). Honour the Retry-After header
429API request rate limit exceeded. Try again in the next minute.Per-key limit of live scrapes per minute
429Scraping rate limit exceeded. Try again in the next minute.Global limit of live scrapes per minute
404The requested resource could not be found.The scrape ran but RSI has no such resource
504The scraping request took too long to complete.The live scrape timed out and no cached copy exists
503The service is currently unavailable…Infrastructure failure and no cached copy exists

Scrape failures end the message with [RequestId: …]. Give that id to the maintainers when you ask for support.

For 400 validation errors, message is an array of strings — one per invalid parameter (for example ["property foo should not exist"]) — rather than a single string.

When a live scrape fails but a cached copy exists, the API returns the cached copy with a 200 instead of an error.


For guidance on handling these errors in your code, see Troubleshooting. For how the quota works and what triggers a 429, see Rate Limits & Quota.