Errors and limits
Error format
Errors on the operator API are, by default, plain-text status lines, as in Engine (Unauthorized). Branch on the HTTP status first; the code refines it. To get a code and message, ask for one:
Accept header | Body |
|---|---|
| (none) | plain text: the HTTP reason phrase |
application/json | { "code": "ERR_GNF", "message": "game not found" } (the same envelope as the wallet API) |
application/problem+json | RFC 9457 problem details with the same code |
Every error response also carries RuneCode-Error-Code: <code>. Every response, success or error, carries X-Request-Id (a UUIDv7): log it and quote it to support. New codes can be added without a new major version, so treat an unknown code by its status. The SDKs send Accept: application/json and raise an error object with status, code, message and requestId.
Codes
See the table in Launching games. In addition: 404 ERR_NF is an unknown round or transaction on a lookup, and 500 ERR_GE is an unexpected error that is safe to retry with the same body.
Rate limits (per operator)
| Group | Sustained | Burst |
|---|---|---|
Launch (/v1/game/url, /v1/game/url/demo) | 50 per second | 200 |
Catalogue (/v1/product, /v1/{product}/game) | 1 per second | 5 |
Lookups (/v1/bet, /runecode/v1/*) | 20 per second | 40 |
Over the limit: 429 ERR_RATE with Retry-After. Back off and retry; do not retry in a tight loop. The limits are configured per operator.
Request limits
Request bodies are limited to 64 KiB. JSON must be one object with no duplicate keys; unknown top-level fields are ignored (extension objects reject unknown fields).
Retrying safely
| You called | Safe to retry? |
|---|---|
GET anything | yes |
launch | yes, with the same body (within 10 minutes) or the same Idempotency-Key (24 hours): you get the same response |
launchDemo | yes (a new demo session each time) |
| lookups | yes |
On 5xx and timeouts, retry with the same body. On 4xx (except 429) fix the request first.