Documentation menu

Error codes

Every error the API returns — one shape, a fixed code list, and explicit guidance on what is retryable.

Every non-2xx response has the same shape, and every code on this page is in the enum in /openapi.json — there are no undocumented errors.

{
  "error": {
    "code": "budget_exceeded",
    "message": "Run halted at max_budget_usd=500 after 74 episodes.",
    "run_id": "run_8843",
    "doc_url": "https://roborama.com/docs/errors/#budget_exceeded"
  }
}

run_id appears when the error concerns a specific run. SDKs raise these as typed exceptions carrying the same fields.

Auth and access

CodeHTTPMeaningRetry?
invalid_api_key401key missing, malformed, or revoked; live keys use the rbr_live_ prefixno — fix the key
insufficient_scope403key is valid but lacks the needed scope, e.g. runs:writeno — issue a key with the scope
not_found404no such run, robot, environment, suite, or streamno
publish_forbidden403publish="leaderboard" requested without leaderboard opt-in on the accountno — opt in first
rate_limited429request rate exceeded; Retry-After header is setyes — after the header's delay

Validation (submission rejected, nothing ran)

These fire before any motor moves; a rejected submission costs nothing.

CodeHTTPMeaningRetry?
contract_validation_failed422declared action_space or observation_contract doesn't match the pinned robot and scene (policies)no — fix the declaration or the pin
firmware_pin_unavailable422requested model@firmware isn't installed on any cell; check robots.list() firmwaresno — pin an available revision
environment_unavailable422environment id or revision not in the catalogue, or offline for rebuildno — check environments.list()
task_unknown422task id or version not recognized, e.g. a typo in load_dishwasher@v2no
scenario_format_invalid422verify() scenarios parse as none of: PolaRiS/Isaac/world-model exports, layout-replay specsno — fix the file
episodes_invalid422episodes is neither a positive int nor a well-formed auto(ci=..., moe=...)no
quote_expired409submission referenced a quote past its validity windowyes — re-quote and resubmit

Runtime (the run itself)

CodeHTTPMeaningRetry?
budget_exceeded402max_budget_usd hard stop fired mid-run; partial results keptresubmit with a higher cap if the interval is too wide
monthly_budget_exceeded402account-level hard budget reached; submissions rejected, in-flight runs haltedno — raise the budget
queue_timeout408job couldn't be scheduled within its priority tier's windowyes — resubmit, or use burst
policy_endpoint_timeout408endpoint policy persistently exceeded latency_budget_ms; run haltedfix the endpoint, then resubmit
estop_triggered409hardware or safety emergency stop during the run; also emitted as the estop.triggered webhookcontact support if unexpected
retention_expired410artifacts past their data.retention window (or purged)no — the data is gone, by design

Handling the important one

budget_exceeded is the code every integration should handle deliberately, because it carries a partial result with honest statistics — n and the interval describe the episodes that ran.

handling budget_exceeded
import roborama  # reads ROBORAMA_API_KEY from the environment

try:
    run = roborama.run(
        robot="g1-edu-pro@fw2.3",
        environment="kitchen-std@v1.2",
        task="pick_place@v1",
        episodes=600,
        max_budget_usd=500,   # deliberately too small for 600 episodes
    )
    print(run.result())
except roborama.BudgetExceeded as err:
    # budget_exceeded: the hard stop fired mid-run; partial results are kept
    print(err.code, err.run_id)
    partial = err.partial_result
    print(partial.n, partial.success_rate, partial.ci95)