Skip to Content
webagent docs
Reference

Errors

Every error code the API returns, its HTTP status, what it means and what to do.

Open as .md

Every failed request returns a JSON body with one error object, and an HTTP status that depends only on the code.

Error body
{
  "error": {
    "code": "not_found",
    "message": "Session sess_us_... not found",
    "details": {},
    "requestId": "..."
  }
}
  • Match on error.code, not on message. The message is for people and can change.
  • details depends on the code. The column below lists the fields you can rely on.
  • requestId identifies the request in our logs. Quote it when you ask for support.
  • A client that sees a code it does not know should treat it like internal and use the HTTP status.
  • In the MCP tools a failed call is a tool result marked as an error, with the text [code] message.
  • The SDK throws WebagentApiError with the same code, status, details and requestId.
CodeHTTPMeaningDetailsWhat to do
internal500Bug or unexpected failure on our side
timeout504An operation ran past its time limitmsRetry. If it keeps happening, make the request smaller.
invalid_input400Request body, query or params failed validationzod issuesRead error.details (the failed fields), fix the request, send it again.
not_found404No such resource (or not visible to this tenant)Check the id and the project of your key. A resource you cannot see is also reported as not found.
session_closed410The session has endedStart a new session. A closed session cannot be reopened.
session_paused409A human took over; agent actions wait for hand-backA person took over in the live view. Wait for hand-back, or stop the session.
browser_crashed502The browser process died
browser_launch_failed503Chromium did not startlaunch (why, retryable)error.details.launch says why and whether a retry can help.
page_crashed502The tab's renderer crashed; navigate/reload recoversRun navigate or reload on the tab. The browser is still alive.
protocol_error502CDP/Playwright returned an errorprotocol message
target_detached409The tab or frame went away mid-action
navigation_blocked403URL refused by policy (SSRF guard, site rules)url, reasonThe address is private, loopback or otherwise refused. Use a public URL or a tunnel: see Test a local app.
element_not_found422No element matched the targettarget
element_not_visible422Element exists but is not visibletarget
element_disabled422Element is disabledtarget
capacity_exceeded503No runner capacity, or a tenant limit reachedlimitClose sessions you no longer need, then retry. error.details.limit says which limit you hit.
runner_unavailable503The session's runner cannot be reached; retry briefly, then treat the session as lostreasonRetry in a few seconds. If it keeps failing, treat the session as lost and start a new one.
unauthorized401Missing or bad API key / tokenCheck the API key (Authorization: Bearer wa_... or x-api-key). Make a new key if it was revoked.
forbidden403Authenticated but not allowedreasonYour key or account is not allowed to do this. Read the message and error.details.reason; an admin may be needed.
conflict409State conflicts with the request (id in use)
consent_required403A third-party skill needs admin consent firstskill, asksAn admin has to accept what the skill asks for first (error.details.asks).
unsupported_on_engine422This engine cannot do the actionengine, featureUse another engine, or drop the option. error.details.engine and error.details.feature say what is missing.
wrong_region421The API key belongs to another region; retry on that region's APIregionSend the request to the API of the region in error.details.region.
rate_limited429Too many requests; also sends Retry-AfterretryAfterSWait error.details.retryAfterS seconds (also the Retry-After header), then retry.
idempotency_key_reused422Idempotency-Key already used with a different requestUse a new Idempotency-Key for a different request.
idempotency_in_progress409First request with this Idempotency-Key still running; retry laterThe first request is still running. Wait, then retry with the same key.
auth_unavailable503Identity service unreachable (dashboard sign-in); retryRetry in a few seconds.
reauth_required401Sensitive action needs a sign-in within the last 120 s; sign in againSign in again in the dashboard, then repeat the action.
payload_too_large413The request body is larger than the endpoint acceptslimitBytesSend less data. error.details.limitBytes is the limit.
method_not_allowed405The route exists but not for this method; also sends AllowUse another HTTP method. The Allow response header lists the ones the route accepts.
org_suspended403This organisation is suspended. Contact support.Contact support.

Two reasons share an existing code instead of having their own:

  • A replayed Idempotency-Key whose first answer was too large to keep returns conflict with details.reason: "idempotency_not_replayable".
  • A dashboard sign-in by a user with no organization returns forbidden with details.reason: "needs_org".