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": {
...
}
}
| Field | Type | Description |
|---|---|---|
success | boolean | Always true for successful responses |
message | string | Human-readable status message |
updatedAt | string | ISO 8601 timestamp of when the data was last scraped from the RSI website. Omitted when not available |
expiresAt | string | ISO 8601 timestamp after which the cached data is re-scraped by the next request. Omitted when not available |
data | any | The 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
}
| Field | Type | Description |
|---|---|---|
success | boolean | Always false for error responses |
message | string | Human-readable description of the error |
code | number | HTTP 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;
coderepeats it in the body. datais omitted entirely on error responses (there is no"data": null).updatedAtandexpiresAtare omitted for endpoints that do not cache (e.g.GET /v2/me).
Response headers
| Header | When | Description |
|---|---|---|
ETag | Successful responses | Weak fingerprint of the body (W/"...") — send it back in If-None-Match to get a 304. See HTTP Caching (ETags) |
Last-Modified / Expires | Cached RSI data | Same moments as updatedAt / expiresAt, in HTTP-date format |
X-Data-Source | Cached RSI data | cache or live |
X-Quota-Consumed | Successful responses | Daily requests used by this call — 0 unless it was a billed ?refresh=true |
X-RateLimit-Limit / X-RateLimit-Remaining / X-RateLimit-Reset | Every response | Per-minute request limit — see Rate Limits & Quota |
For the full list of error codes and what causes them, see Error Codes.