Every B3OS error has a stable code. Native endpoints return it in an RFC 9457 problem with the content type application/problem+json:

json
{ "type": "https://docs.beta.b3os.org/errors#rate_limited", "title": "Rate limited", "status": 429, "code": "rate_limited", "detail": "60 scrapes per minute allowed; retry in 12 seconds", "instance": "req_01m5t4yg394wegr3j4y01qb363", "retry_after_s": 12, "limit": { "id": "vision.scrape.rpm", "limit": 60, "unit": "requests", "window_s": 60, "current": 60 }}

type links to the code's entry on this page (https://docs.beta.b3os.org/errors#<code>). instance is the request ID, the same value as the x-request-id header; GET /v1/requests/{request_id} returns the request's record. detail explains this occurrence and may change between releases, so branch on code, never on detail.

Retryable codes can succeed later with the same request: wait Retry-After seconds when the header is present. Codes marked not retryable need a change to the request, the account or the object first.

Some codes add members to the problem:

MemberMeaning
errorsOne item per invalid field: pointer (a JSON pointer such as /url, or #query/<name>, #path/<name>, #header/<name>) and detail.
reasonA finer cause, for codes that document one.
required_scopeThe scope the credential lacks.
retry_after_sThe Retry-After value, for clients that read only the body.
limitThe limit that was hit: id, limit, unit, and window_s or current when they apply. IDs match GET /v1/limits.
current_statusThe object's status, for state conflicts.
upstream_statusThe HTTP status an upstream returned.
stepThe step that failed: a routine step ID, an act index or a render path such as beats/2/do/0.
pack_errorThe error a pack's error mapping chose.

Compatibility paths keep their upstream error shapes: /v1/infer/* answers in the OpenAI shape with the B3OS code in error.code, /compat/firecrawl/* answers in the Firecrawl shape listed with each code below, and the device-login endpoints answer in the OAuth shape. See Errors in the API overview for how each surface reports them.

Request shape

invalid_request

400 · Invalid request · Not retryable · Members: errors · Firecrawl: 400 BAD_REQUEST "Bad Request"

The request body, query string, path or headers failed validation, or the body is not valid JSON. errors[] lists each problem: pointer is a JSON pointer into the body (/url, /steps/0/uses), or #query/<name>, #path/<name> or #header/<name> for parameters (for example #query/limit). Fix the request before retrying.

invalid_url

400 · Invalid URL · Not retryable · Members: errors · Firecrawl: 400 invalid_url "Invalid URL"

A URL you supplied (a page to scrape, a webhook, an action endpoint) does not parse, is not absolute, or uses a scheme other than http or https. The errors[] pointer names the field.

unsupported_media_type

415 · Unsupported media type · Not retryable · Firecrawl: 415 unsupported_media_type "Unsupported Media Type"

The Content-Type is not accepted by this operation. Most operations take application/json; file uploads take application/octet-stream.

not_acceptable

406 · Not acceptable · Not retryable

The Accept header asks for a representation this operation cannot produce. Operations that stream accept text/event-stream; everything else returns application/json unless documented otherwise.

payload_too_large

413 · Payload too large · Not retryable · Firecrawl: 413 payload_too_large "Payload Too Large"

The request body is larger than this operation accepts (x-b3os-max-body in the OpenAPI spec). Send less data per request, or use the file and batch endpoints for bulk data.

route_not_found

404 · Route not found · Not retryable · Firecrawl: 404 route_not_found "Not Found"

No operation exists at this method and path. Check the path against the API reference.

method_not_allowed

405 · Method not allowed · Not retryable · Firecrawl: 405 method_not_allowed "Method Not Allowed"

The path exists but does not accept this HTTP method. The Allow header lists the methods it accepts.

edge_only

421 · Served by beta-api.b3os.org · Not retryable

This operation is served by beta-api.b3os.org, not by the node you called; call it there with an API key. Inside a B3OS sandbox, http://127.0.0.1:7700 reaches the node products directly, but account operations (keys, usage, limits, organizations, projects, sign-in, the pack registry) exist only at https://beta-api.b3os.org. dist/routes.json marks them served_by: edge.

limit_exceeded

422 · Limit exceeded · Not retryable · Members: limit · Firecrawl: 422 limit_exceeded "Limit exceeded"

A parameter asks for more than your plan allows, for example vcpu: 4 when sandboxes allow 2, or a crawl limit above 500. The limit member names the limit and its value. Lower the value; GET /v1/limits lists every limit that applies to you.

idempotency_key_invalid

400 · Invalid idempotency key · Not retryable · Firecrawl: 400 idempotency_key_invalid "Invalid idempotency key"

The Idempotency-Key header is empty, longer than 255 characters, or contains characters outside printable ASCII.

idempotency_key_conflict

409 · Idempotency key conflict · Not retryable · Firecrawl: 409 idempotency_key_conflict "Idempotency key already used for a different request"

This Idempotency-Key was already used in the last 24 hours with a different method, path or body, or by a different API key in the same project. Use a new key for a new request.

idempotency_request_in_progress

409 · Request in progress · Retryable · Members: retry_after_s · Firecrawl: 409 idempotency_request_in_progress "A request with this idempotency key is in progress"

A request with this Idempotency-Key is still being processed. Retry after Retry-After seconds to receive the stored response.

conflict

409 · Conflict · Not retryable · Members: current_status

The object's current state does not allow this operation. The current_status member, when present, shows the state. Fetch the object and reconcile before retrying.

resource_not_found

404 · Not found · Not retryable

The object does not exist or belongs to another project. B3OS returns 404 (never 403) for objects outside your project so that IDs do not leak across tenants. Product-specific codes such as sandbox_not_found are used where they exist.

not_implemented

501 · Not implemented · Not retryable · Firecrawl: 501 not_implemented "Not Implemented"

The operation is part of the published contract but is not available on this deployment yet (operations marked x-b3os-stage: stretch). The detail names the alternative when there is one.

Authentication and authorization

unauthorized

401 · Unauthorized · Not retryable · Members: reason · Firecrawl: 401 unauthorized "Unauthorized"

The request has no usable credentials. The reason member says why: missing (no Authorization header; send Bearer <key> with a b3os_sk_ key or a b3os_pat_ token from b3os login), malformed (wrong prefix or checksum; check the whole value was copied), unknown, expired, revoked, replayed or wrong_node (node tokens only), or ticket (a stream ticket that is unknown, older than 30 seconds, already used, or bound to another resource). Inside a B3OS sandbox, call http://127.0.0.1:7700 with no key instead.

forbidden

403 · Forbidden · Not retryable · Members: reason, required_scope · Firecrawl: 403 forbidden "Forbidden"

The caller is authenticated but not allowed to do this. The reason member says why: scope (the key lacks the scope in required_scope, for example sandboxes:write; create a key with it or grant it to the sandbox in api.scopes), scope_escalation (a new key, token or sandbox grant asks for scopes or a spend cap beyond the caller's own), role (your organization role does not allow it), session_required (the operation only accepts a signed-in dashboard session), or csrf (a cookie-authenticated write without a valid x-b3os-csrf header; fetch GET /v1/auth/session for a new csrf_token).

ticket_limit

429 · Too many stream tickets · Retryable · Members: retry_after_s

The node holds too many unredeemed stream tickets. Tickets expire after 30 seconds; request one only when you are about to open the stream, and retry after Retry-After seconds.

auth_unavailable

503 · Authentication temporarily unavailable · Retryable · Members: retry_after_s · Firecrawl: 503 auth_unavailable "Service Unavailable"

The node cannot verify tokens right now (its replay cache is full or its verification keys are rotating). Retry after Retry-After seconds.

signed_url_invalid

403 · Invalid or expired signed URL · Not retryable · Members: reason

A usercontent.b3os.org link was refused: a render artifact URL (node, exp, sig) or a sandbox port preview token (/sbx/<sandbox>/<port>/<token>/). The reason member is missing (no signature or token), malformed, expired (past exp), signature (it does not verify, for example because the URL was changed) or wrong_node. Get a fresh link: GET /v1/render/artifacts/{artifact_id} or POST /v1/sandboxes/{sandbox_id}/ports/{port}/url.

Limits and billing

rate_limited

429 · Rate limited · Retryable · Members: retry_after_s, limit · Firecrawl: 429 rate_limited "Rate limit exceeded"

Too many requests in the current window. Wait Retry-After seconds; the RateLimit-* headers and the limit member show which limit applies (for example vision.scrape.rpm). The device-login endpoints (POST /v1/auth/device/code, POST /v1/auth/device/token) return it in the OAuth error shape ({"error": "rate_limited", "error_description": ...}) when one address starts or polls too many logins; polling faster than the device code's interval is slow_down (400) instead.

concurrency_limited

429 · Concurrency limit reached · Retryable · Members: retry_after_s, limit · Firecrawl: 429 concurrency_limited "Concurrency limit reached"

You already have the maximum number of concurrent operations of this kind (for example 10 running sandboxes or 5 browser sessions). Wait for one to finish, or stop one you no longer need.

quota_exceeded

429 · Quota exceeded · Retryable · Members: retry_after_s, limit · Firecrawl: 429 quota_exceeded "Quota exceeded"

A daily or monthly quota is used up (for example 50,000 routine steps per day, or the per-organization egress budget). Retry-After is the number of seconds until the quota resets.

credits_exhausted

402 · Credits exhausted · Not retryable · Firecrawl: 402 credits_exhausted "Insufficient credits"

Your organization has no credits left. Requests fail until credits are added; the dashboard shows the balance.

spend_cap_exceeded

402 · Key spend cap reached · Not retryable · Firecrawl: 402 spend_cap_exceeded "Key spend cap reached"

This API key reached its spend cap. Raise the cap with PATCH /v1/keys/{key_id} or use another key. Other keys in the organization are not affected.

Egress and upstreams

egress_denied

403 · Destination not allowed · Not retryable · Members: reason · Firecrawl: 403 egress_denied "Destination not allowed"

The egress guard refused the destination: a scheme other than http/https, or an address that is loopback, private (10/8, 172.16/12, 192.168/16), CGNAT or tailnet (100.64/10), link-local or metadata (169.254/16), benchmark (198.18/15), unique-local or link-local IPv6, multicast, or the node's own address; a redirect hop that lands on one of those; or a host or port outside a sandbox or pack allowlist. The reason member is one of scheme, loopback, private_address, tailnet, link_local, metadata, multicast, node_address, not_allowlisted.

upstream_error

502 · Upstream error · Not retryable · Members: upstream_status, pack_error · Firecrawl: 502 upstream_error "Bad Gateway"

The third-party server answered with an error or a response B3OS could not use. upstream_status carries its HTTP status; for pack actions, pack_error carries the error the pack's error mapping chose. Whether a retry helps depends on the upstream (pack_error.retryable when present); B3OS retries only read-only calls itself.

upstream_unreachable

502 · Upstream unreachable · Retryable · Members: reason · Firecrawl: 502 upstream_unreachable "Bad Gateway"

B3OS could not reach the destination: DNS resolution failed, the connection was refused or reset, or the TLS handshake failed. The reason member is dns, connect or tls.

upstream_timeout

504 · Upstream timeout · Retryable · Firecrawl: 504 upstream_timeout "Gateway Timeout"

The destination did not respond within the operation's timeout. Retry later or raise timeout_ms where the operation has one.

upstream_too_large

502 · Upstream response too large · Not retryable · Firecrawl: 502 upstream_too_large "Upstream response too large"

The destination's response exceeded the size cap for this operation, so B3OS stopped reading it.

too_many_redirects

502 · Too many redirects · Not retryable · Firecrawl: 502 too_many_redirects "Too many redirects"

The destination redirected more than 10 times. Each hop is checked by the egress guard; a hop to a refused address returns egress_denied instead.

cap_invalid

407 · Egress capability invalid · Not retryable

A request on b3osd's egress capability socket (the actions-js sidecar's way out, packages/spec/sidecars/ actions-js.md §5) carried no Proxy-Authorization: Bearer <capability token>, or a token that is unknown, expired or revoked. Tokens are issued per action invocation and end with it; start a new invocation.

Availability

node_unavailable

503 · Node unavailable · Retryable · Members: retry_after_s · Firecrawl: 503 node_unavailable "Service Unavailable"

The B3OS node that serves this product is unreachable from the edge (restart or network). Retry after Retry-After seconds. Inbound routine webhooks are queued durably and replayed in order when the node returns.

product_unavailable

503 · Product unavailable · Retryable · Members: retry_after_s · Firecrawl: 503 product_unavailable "Service Unavailable"

The node is up but this product is not ready, for example while its browser pool or a sidecar restarts. /readyz and the status page show per-product readiness.

capacity_unavailable

503 · No capacity available · Retryable · Members: retry_after_s · Firecrawl: 503 capacity_unavailable "Service Unavailable"

No warm capacity is free and the wait queue is full (sandbox slots, browsers, capture workers). This is node-wide, not your plan limit. Retry after Retry-After seconds.

budgets_unavailable

503 · Budgets unavailable · Retryable · Members: retry_after_s · Firecrawl: 503 budgets_unavailable "Service Unavailable"

The node could not refresh its budget snapshot from beta-api.b3os.org recently, so it cannot check your credits and caps and does not start metered work (scrapes, renders, sandboxes, routine steps, action calls, inference) until it can. Requests that cost nothing still work. Retry after Retry-After seconds.

request_timeout

504 · Request timeout · Retryable · Firecrawl: 504 request_timeout "Gateway Timeout"

The operation did not finish within its time limit (x-b3os-timeout-ms). A handler works on a request for at most 60 seconds; x-b3os-timeout-ms allows up to 65,000 ms end to end, the extra 5 seconds covering queueing and the edge, which keeps every request under Cloudflare's 100-second origin limit. For long work, create a job and use ?wait=, the events stream or a webhook.

invoke_depth_exceeded

508 · Call depth exceeded · Not retryable

A product called another product in-process more than the allowed nesting depth (for example a routine whose steps call routines that call it back). Break the cycle in your routine or action composition.

internal

500 · Internal error · Retryable · Firecrawl: 500 internal "Internal Server Error"

Something failed inside B3OS. Retrying with backoff usually works. If it persists, contact support with the instance value (the request ID).

Jobs

job_not_found

404 · Job not found · Not retryable · Firecrawl: 404 job_not_found "Extract job not found"

No job with this job_ ID exists in your project, or its record has expired.

job_already_finished

409 · Job already finished · Not retryable · Members: current_status · Firecrawl: 409 job_already_finished "Job already finished"

The job (or routine run) already reached a terminal status, so it cannot be canceled or signaled. The current_status member shows succeeded, failed or canceled.

job_canceled

409 · Job canceled · Not retryable

Used as the error of a job that was canceled before it finished. Partial results, if any, stay on the job.

job_timed_out

504 · Job timed out · Retryable

Used as the error of a job that ran past its time budget. Retry with a smaller workload or a larger budget where one is configurable.

job_expired

410 · Job results expired · Not retryable · Firecrawl: 404 job_expired "Job expired"

The job finished, but its results were deleted at the end of the retention period (see the job's expires_at).

stream_resume_unavailable

410 · Stream position expired · Not retryable

Last-Event-ID points at events that are no longer retained. Reconnect without Last-Event-ID and read the current state from the job object.

invalid_webhook_url

422 · Invalid webhook URL · Not retryable · Firecrawl: 400 invalid_webhook_url "Invalid webhook URL"

The webhook.url is not an absolute https:// URL, is longer than 2,048 characters, or resolves to an address the egress guard refuses.

Platform

api_key_not_found

404 · API key not found · Not retryable

No API key with this ID exists in your organization.

project_not_found

404 · Project not found · Not retryable

No project with this ID exists in your organization.

org_not_found

404 · Organization not found · Not retryable

No organization with this ID exists, or you are not a member of it.

request_not_found

404 · Request not found · Not retryable

No request with this ID exists in your project. Request records are kept for 7 days.

project_not_empty

409 · Project not empty · Not retryable

The project still has running sandboxes, open browser sessions or active routines. Stop or delete them, then delete the project.

last_project

409 · Last project · Not retryable

An organization must keep at least one project. Create another project before deleting this one.

invite_code_invalid

400 · Invalid invite code · Not retryable

The invite code is unknown or expired. Beta access is by invite; check the code you were sent.

invite_code_used

409 · Invite code already used · Not retryable

The invite code was already redeemed. Each code creates one organization.

email_code_invalid

400 · Invalid email code · Not retryable

The sign-in code is wrong or expired (codes are valid for 10 minutes). Request a new code.

user_code_not_found

404 · Device code not found · Not retryable

The device login code is unknown or expired. Run b3os login again for a new code.

device_authorization_finished

409 · Device login already decided · Not retryable

This device login was already approved or denied.

publisher_not_allowed

403 · Publisher not allowed · Not retryable

In the beta, only first-party publishers (io.b3os) can publish packs to the registry.

pack_version_exists

409 · Pack version exists · Not retryable

This pack version is already published. Versions are immutable; publish a higher semver version.

pack_invalid

422 · Invalid pack · Not retryable · Members: errors

The pack manifest failed b3pack.schema.json validation or publish-time compilation. errors[] points into the manifest.

pack_signature_invalid

422 · Invalid pack signature · Not retryable

The publisher signature does not verify against the uploaded manifest and bundle hashes, or the signing key is not registered to the publisher.

org_suspended

403 · Organization suspended · Not retryable

The organization is suspended, so its keys, tokens and dashboard sessions cannot start work. Account operations that read the organization still answer. Contact support.

hook_queue_full

503 · Webhook queue full · Retryable · Members: retry_after_s

The node is unreachable and this hook already holds the most deliveries the edge queues for one hook (10,000, or 72 hours of them). The delivery was not stored; retry after Retry-After seconds, as webhook providers do.

Device login

The device-login endpoints (POST /v1/auth/device/code, POST /v1/auth/device/token) answer with the OAuth error shape {"error": "<code>", "error_description": "…"} (RFC 6749 section 5.2, RFC 8628 section 3.5) instead of a problem.

authorization_pending

400 · Authorization pending · Retryable

The user has not approved the device login yet. Keep polling at the interval from the device code response.

slow_down

400 · Slow down · Retryable

The client polled the token endpoint faster than the device code's interval. Add 5 seconds to the polling interval, as RFC 8628 requires. Too many logins from one address get rate_limited (429) instead.

access_denied

400 · Access denied · Not retryable

The user denied the device login. Stop polling.

expired_token

400 · Device code expired · Not retryable

The device code expired before approval. Start a new login.

invalid_grant

400 · Invalid grant · Not retryable

The device code is unknown or was already exchanged for a token.

invalid_client

401 · Invalid client · Not retryable

The client_id is not a registered B3OS client (b3os-cli, b3os-mcp, b3os-sdk).

unsupported_grant_type

400 · Unsupported grant type · Not retryable

The token endpoint only accepts grant_type=urn:ietf:params:oauth:grant-type:device_code.

Vision

session_not_found

404 · Browser session not found · Not retryable

No browser session with this brs_ ID exists in your project.

session_closed

409 · Browser session closed · Not retryable · Members: current_status

The session was closed or reached its timeout, and its browser was destroyed. Create a new session; save cookies and storage to a profile first if you need them again.

profile_not_found

404 · Browser profile not found · Not retryable · Firecrawl: 404 profile_not_found "Profile not found"

No browser profile with this ID or name exists in your project. Profiles never cross organizations.

profile_domain_mismatch

422 · Profile domain mismatch · Not retryable · Members: errors · Firecrawl: 422 profile_domain_mismatch "Profile domain mismatch"

A cookie domain or origin host in the uploaded or saved storage state is not one of the profile's domains (or a subdomain of one). Add the domain to domains, or remove the state for it.

profile_conflict

409 · Profile changed since it was loaded · Not retryable · Members: current_status · Firecrawl: 409 profile_conflict "Profile changed since it was loaded"

The session loaded an older revision of the profile than the current one, so saving back would discard newer state. Save with overwrite_profile: true to replace it anyway, or reload the profile in a new session.

profile_name_taken

409 · Profile name taken · Not retryable

Another profile in this project already uses this name. Names are unique per project.

crawl_not_found

404 · Crawl not found · Not retryable · Firecrawl: 404 crawl_not_found "Crawl job not found"

No crawl with this crawl_ ID exists in your project, or it expired.

batch_not_found

404 · Batch scrape not found · Not retryable · Firecrawl: 404 batch_not_found "Batch scrape job not found"

No batch scrape with this batch_ ID exists in your project, or it expired.

robots_disallowed

403 · Disallowed by robots.txt · Not retryable · Firecrawl: 403 robots_disallowed "Disallowed by robots.txt"

The site's robots.txt or Content Signals disallow fetching this URL for this purpose. Vision honors them by default and the beta does not offer an override.

content_type_unsupported

422 · Content type not supported · Not retryable · Members: reason · Firecrawl: 422 content_type_unsupported "Unsupported content type"

The URL returned a content type vision cannot convert to the requested formats (for example video or a binary archive). The reason member carries the content type.

502 · Navigation failed · Retryable · Members: reason · Firecrawl: 502 navigation_failed "Bad Gateway"

The browser could not load the page (a net::ERR_* failure, a crash, or an aborted navigation). The reason member carries the browser's error string.

scrape_timeout

504 · Scrape timed out · Retryable · Firecrawl: 408 SCRAPE_TIMEOUT "Request Timeout"

The page did not finish loading and converting within timeout_ms. Retry with a larger timeout, or use engine: "fetch" for pages that do not need JavaScript.

target_not_found

422 · Target not found · Not retryable · Members: step · Firecrawl: 422 target_not_found "Action target not found"

No element matched the action's target (CSS selector, visible text, or role plus accessible name) within the wait time, or the element stayed outside the viewport after scrolling it into view. Used by browser actions (act, scrape actions) and by render scripts and element screenshots.

act_step_failed

422 · Browser action failed · Not retryable · Members: step · Firecrawl: 422 act_step_failed "Action failed"

A browser action in an act batch failed (for example evaluate threw). The step member is the zero-based index of the failed action; results of earlier actions are still returned.

cdp_method_blocked

403 · CDP method not allowed · Not retryable

Returned as a CDP error (JSON-RPC error.data.code) on the session's CDP socket, not as an HTTP status. The proxy blocks Browser.* except the version, permission, window and download methods CDP clients such as Playwright and Puppeteer send (downloads are kept in the session's own directory), SystemInfo.*, targets outside the session, host file access, and navigation to anything but http:, https: and about:blank (file:, chrome:, chrome-extension:, view-source:, devtools:, data:, ...).

extraction_failed

502 · Extraction failed · Retryable · Firecrawl: 502 extraction_failed "Extraction failed"

The model could not produce JSON that matches your schema after retries. Simplify the schema or the prompt.

scrape_no_cached_data

404 · No cached copy · Not retryable · Firecrawl: 404 SCRAPE_NO_CACHED_DATA "No cached data"

The scrape asked to be answered from the page cache only (Firecrawl minAge), and this node holds no cached copy of the URL that satisfies it. Scrape without the cache-only option to fetch the page.

Render

screenshot_not_found

404 · Screenshot not found · Not retryable

No screenshot with this shot_ ID exists in your project, or it expired.

video_not_found

404 · Video not found · Not retryable

No video with this vid_ ID exists in your project, or it expired.

artifact_not_found

404 · Artifact not found · Not retryable

No artifact with this art_ ID exists in your project.

artifact_expired

410 · Artifact expired · Not retryable

The artifact was deleted at the end of its retention period (7 days by default). Render it again.

capture_failed

502 · Capture failed · Retryable · Members: reason

The page could not be loaded or captured (navigation error, crash, or a page that never became ready). reason carries the browser's error.

script_invalid

422 · Invalid video script · Not retryable · Members: errors

The video script failed validation before recording started. errors[] points at the failing beats and steps.

script_step_failed

422 · Script step failed · Not retryable · Members: step

A step in the video script failed during recording (for example its target never appeared). Used as the video job's error; step is the path of the failed step, such as beats/2/do/0.

restyle_unavailable

409 · Restyle not available · Not retryable

The source video has no archived raw capture: it did not succeed, or its raw capture expired. Record the video again.

style_invalid

422 · Invalid style · Not retryable · Members: errors

A style value is unknown or malformed (preset, frame, font, color or gradient). errors[] points at it.

Sandboxes

sandbox_not_found

404 · Sandbox not found · Not retryable

No sandbox with this sbx_ ID exists in your project.

sandbox_not_running

409 · Sandbox not running · Not retryable · Members: current_status

The operation needs a running sandbox, but it is paused or stopped. current_status shows which. Resume a paused sandbox with POST /v1/sandboxes/{sandbox_id}/resume; a stopped sandbox cannot be restarted.

template_not_found

404 · Template not found · Not retryable

No template with this name or tpl_ ID exists. GET /v1/sandboxes/templates lists them.

snapshot_not_found

404 · Snapshot not found · Not retryable

No snapshot with this snap_ ID exists in your project.

file_not_found

404 · File not found · Not retryable

Nothing exists at this path inside the sandbox.

path_invalid

422 · Invalid path · Not retryable

The path must be absolute, at most 4,096 bytes, and contain no NUL bytes.

not_a_directory

422 · Not a directory · Not retryable

A component of the path is a file, so the operation cannot treat it as a directory.

file_too_large

413 · File too large · Not retryable

The file exceeds the 64 MiB per-request transfer limit. Split it, or fetch it from inside the sandbox.

port_not_exposed

404 · Port not exposed · Not retryable

The port is not in the sandbox's ports list. Ports are declared when the sandbox is created.

process_not_found

404 · Process not found · Not retryable

No background process with this ID is running in the sandbox.

kernel_unavailable

409 · Code kernel unavailable · Not retryable

run_code needs a sandbox created from the code-interpreter template.

language_unsupported

422 · Language not supported · Not retryable

The template's kernel does not run this language. code-interpreter runs python and javascript.

guest_unreachable

502 · Sandbox agent unreachable · Retryable

The agent inside the microVM did not answer (the guest is hung or out of memory). Retry once; if it repeats, delete the sandbox and create a new one.

snapshot_failed

500 · Snapshot failed · Retryable

Writing the snapshot failed. The sandbox keeps running unchanged; retry the snapshot.

fork_unavailable

409 · Fork not available · Not retryable

Forking needs a sandbox created with forkable: true, which enables dirty-page tracking.

Routines

routine_not_found

404 · Routine not found · Not retryable

No routine with this ID or name exists in your project.

routine_version_not_found

404 · Routine version not found · Not retryable

The routine has no version with this ver_ ID or number.

run_not_found

404 · Run not found · Not retryable

No routine run with this run_ ID exists in your project. Run history is kept for 30 days.

hook_not_found

404 · Hook not found · Not retryable

No webhook trigger with this hk_ ID exists, or its routine was deleted.

routine_invalid

422 · Invalid routine · Not retryable · Members: errors

The routine definition failed schema validation or compilation (unknown step reference, dependency cycle, CEL parse error or unknown name). errors[] points into the request body, for example /steps/2/with/url.

routine_name_taken

409 · Routine name taken · Not retryable

Another routine in this project already has this name. POST /v1/routines only creates; use PUT /v1/routines/{name} to publish a new version of an existing routine.

run_not_waiting

409 · Run is not waiting for this signal · Not retryable

The run can no longer receive this signal: it already finished, or 16 signals of this name are already buffered. Signals sent before their wait step starts are buffered (up to 16 per name) and consumed in order.

run_as_revoked

403 · Publishing key revoked · Not retryable

Routine runs execute as the key that published the active version, and that key is revoked or expired. Its triggers are paused. Publish a new version with a valid key to resume.

webhook_signature_invalid

401 · Webhook verification failed · Not retryable · Members: reason

The inbound webhook failed verification. The reason member is signature (missing or not matching) or timestamp (the signed timestamp is missing or further from the node's clock than the tolerance: a routine trigger's tolerance_s or a pack trigger's verify.toleranceS, at most 300 seconds for both). For a delivery the edge queued while the node was down and replays later, the tolerance applies to the time the edge received it, which the edge signs; a bad edge signature is signature too.

step_failed

422 · Step failed · Not retryable · Members: step

Used as a run's error when a step failed after its retries and had no continue_on_error. step is the step ID; the step's own error is in the run's steps[].

expression_error

422 · Expression error · Not retryable · Members: step

A ${{ }} expression failed at run time (for example a missing field or a type mismatch). Used in step errors; step is the step ID.

run_input_invalid

422 · Invalid run input · Not retryable · Members: errors

The run's input (after the routine's inputs defaults were applied) does not match the routine's inputs schema. errors[] points into the request body, for example /input/topic.

step_timed_out

504 · Step timed out · Retryable

Used as a step's error when an attempt ran past its timeout_ms (or defaults.timeout_ms). Pure and read steps retry it under their retry policy; write steps retry only when their own retry asks for it.

step_outcome_unknown

409 · Step outcome unknown · Not retryable

Used as a step's error after a restart of a strict run: the node had recorded the intent to run this irreversible step but not its result, so it cannot know whether the effect happened and does not repeat it. Check the destination, then start a new run if needed.

hook_attestation_unverifiable

503 · Webhook replay cannot be checked yet · Retryable · Members: retry_after_s

The edge replayed a webhook delivery it queued while the node was down, the provider's signed timestamp is outside the tolerance of the node's clock, and the edge signed its receive time with a key id (x-b3os-edge-kid) this node does not trust yet. The edge keeps the delivery and retries it. Operators add the edge key to [[auth.edge_keys]].

Actions and triggers

pack_not_found

404 · Pack not found · Not retryable

No pack with this ID (<namespace>/<name>, for example io.b3os/github) is available.

pack_version_not_found

404 · Pack version not found · Not retryable

The pack has no version that satisfies this version or range.

action_not_found

404 · Action not found · Not retryable

The pack version has no action with this key. GET /v1/actions/search finds actions by name and description.

trigger_not_found

404 · Trigger not found · Not retryable

The pack version has no trigger with this key.

trigger_subscription_not_found

404 · Trigger subscription not found · Not retryable

No trigger subscription with this tsub_ ID exists in your project. Subscriptions exist while a published routine version has the type: action trigger that created them; a rollback, a version without that trigger, or deleting the routine removes them.

action_ref_invalid

400 · Invalid action reference · Not retryable

The reference does not match <namespace>/<name>/<action>@<version>, for example io.b3os/github/create-issue@1.0.0. The namespace is reverse-DNS with at least one dot.

action_input_invalid

422 · Invalid action input · Not retryable · Members: errors

The input does not match the action's input schema. errors[] points into the request body, for example /input/title.

action_output_invalid

502 · Upstream returned unexpected data · Not retryable · Members: upstream_status

The upstream answered, but the mapped result does not match the action's output schema. Report it to the pack publisher.

action_memory_exceeded

502 · Action ran out of memory · Not retryable

A JavaScript (T1) action used more memory than its limit (execution.memoryMb in the pack manifest, 128 MB by default) and was stopped. The same input fails the same way: send less data per call, or report it to the pack publisher.

connection_required

422 · Connection required · Not retryable

The action needs a stored credential and none was supplied, or the caller may not use the one supplied (it needs vault:run, and sandbox principals need the connection in api.connections).

connection_mismatch

422 · Connection does not match · Not retryable

The connection's kind, pack or bound hosts do not match what the action declares.

pack_unavailable

503 · Pack unavailable · Retryable

The node could not load this pack version: it failed content-hash or publisher-signature verification, or the download from the registry failed.

action_expression_error

422 · Action expression failed · Not retryable · Members: errors

A ${{ }} expression in the pack failed for this input before anything was sent (a missing field, a type mismatch, a URL that does not parse, a header with CR or LF), or a webhook delivery could not be evaluated by the trigger's dedupe key, filter or handshake. errors[] names the template field. Nothing reached the upstream; if the input is valid, report it to the pack publisher.

Vault

connection_not_found

404 · Connection not found · Not retryable

No connection with this conn_ ID exists in your project.

connection_invalid

422 · Invalid connection · Not retryable · Members: errors

The secret fields do not match the connection kind (for example basic without password), or a bound host is not a valid hostname. errors[] points at the field; secret values are never echoed.

blob_not_found

404 · Stored object not found · Not retryable

An encrypted object the vault keeps for another product (such as a browser profile's storage state) does not exist. Products usually report their own not-found code instead.

blob_too_large

413 · Stored object too large · Not retryable

An object another product asked the vault to store (such as a browser profile's storage state) is larger than the vault keeps per object (16 MiB by default). Store less state, for example by clearing large localStorage or IndexedDB entries before saving the profile.

vault_unavailable

503 · Vault unavailable · Retryable · Members: retry_after_s

The vault on this node is not unlocked yet (its key is not loaded). Retry shortly; operations that need credentials fail until then.

Infer

/v1/infer/* operations use the OpenAI error shape {"error": {"message", "type", "code", "param"}} with the B3OS code in error.code. GET /v1/infer/audio/voices is a B3OS endpoint and returns problems.

model_not_available

404 · Model not available · Not retryable

The model is not served on this node. GET /v1/infer/models lists the models that are. To use a model from the B3IQ gateway instead, set "route": "gateway"; B3OS never falls back silently.

context_length_exceeded

400 · Context length exceeded · Not retryable

The prompt plus max_tokens exceeds the model's context window (b3os.context_length in the model list).

unsupported_parameter

400 · Unsupported parameter · Not retryable

The model or runtime does not support a parameter you sent (for example n greater than 1, image input on a text-only model, or an audio format that is not enabled). The message names the parameter.

voice_not_found

404 · Voice not found · Not retryable

The voice is not available for this speech model. GET /v1/infer/audio/voices lists them.

infer_backend_unavailable

503 · Model runtime unavailable · Retryable · Members: retry_after_s · Firecrawl: 503 infer_backend_unavailable "Service Unavailable"

The model runtime on the node is restarting or overloaded. Retry after Retry-After seconds.

Firecrawl compatibility

These codes appear only on /compat/firecrawl/*. Every other code that path can return has its Firecrawl mapping listed in its own entry.

unsupported_endpoint

404 · Endpoint not supported · Not retryable · Firecrawl: 404 unsupported_endpoint "Endpoint not supported by B3OS"

The Firecrawl endpoint exists upstream but B3OS does not implement it. The problem's detail is the B3OS alternative (the operation's x-b3os-unsupported.alternative), for example the native /v1/vision/sessions API instead of /v2/interact, so the Firecrawl error reads Endpoint not supported by B3OS: <alternative>.

unsupported_option

400 · Option not supported · Not retryable · Firecrawl: 400 unsupported_option "Option not supported by B3OS"

The request uses a Firecrawl option B3OS cannot honor (for example proxy: "enhanced" or the branding format). The problem's detail names the option, so the Firecrawl error reads Option not supported by B3OS: <detail>. B3OS refuses rather than silently ignoring it.

Ask a question... ⌘I