Skip to main content

Response Format

Every API response — success or error — uses a consistent JSON envelope. You never have to guess the shape.

Success​

{
"success": true,
"message": "ok",
"updatedAt": "2026-05-31T10:00:00.000Z",
"expiresAt": "2026-05-31T11:00:00.000Z",
"data": {
...
}
}
FieldTypeDescription
successbooleanAlways true for successful responses
messagestringHuman-readable status message
updatedAtstringISO 8601 timestamp of when the data was last scraped from the RSI website. Omitted when not available
expiresAtstringISO 8601 timestamp after which the cached data is re-scraped by the next request. Omitted when not available
dataanyThe actual response payload
tip

HTTP headers carry the same freshness info.

The Last-Modified and Expires HTTP response headers are set to the same timestamps as updatedAt and expiresAt, in HTTP-date format. Use them for HTTP-level conditional caching — or read the body fields for application-level freshness checks. An X-Data-Source header (cache or live) tells you where the data came from. See HTTP Caching (ETags) for details.

Error​

{
"success": false,
"message": "Unauthorized",
"code": 401
}
FieldTypeDescription
successbooleanAlways false for error responses
messagestringHuman-readable description of the error
codenumberHTTP status code of the error
warning

Check success, not message.

Check the HTTP status code (or success) to detect errors. Do not branch on message — its wording may change without notice.

Key rules​

  • Errors always use a non-2xx HTTP status; code repeats it in the body.
  • data is omitted entirely on error responses (there is no "data": null).
  • updatedAt and expiresAt are omitted for endpoints that do not cache (e.g. GET /v2/me).

Response headers​

HeaderWhenDescription
ETagSuccessful responsesWeak fingerprint of the body (W/"...") — send it back in If-None-Match to get a 304. See HTTP Caching (ETags)
Last-Modified / ExpiresCached RSI dataSame moments as updatedAt / expiresAt, in HTTP-date format
X-Data-SourceCached RSI datacache or live
X-Quota-ConsumedSuccessful responsesDaily requests used by this call — 0 unless it was a billed ?refresh=true
X-RateLimit-Limit / X-RateLimit-Remaining / X-RateLimit-ResetEvery responsePer-minute request limit — see Rate Limits & Quota

For the full list of error codes and what causes them, see Error Codes.