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 headerBody
(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+jsonRFC 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)

GroupSustainedBurst
Launch (/v1/game/url, /v1/game/url/demo)50 per second200
Catalogue (/v1/product, /v1/{product}/game)1 per second5
Lookups (/v1/bet, /runecode/v1/*)20 per second40

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 calledSafe to retry?
GET anythingyes
launchyes, with the same body (within 10 minutes) or the same Idempotency-Key (24 hours): you get the same response
launchDemoyes (a new demo session each time)
lookupsyes

On 5xx and timeouts, retry with the same body. On 4xx (except 429) fix the request first.