Errors
All 151 B3OS error codes with HTTP status, meaning, retry advice and the Firecrawl mapping, generated from errors.yaml.
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:
| Member | Meaning |
|---|---|
errors | One item per invalid field: pointer (a JSON pointer such as /url, or #query/<name>, #path/<name>, #header/<name>) and detail. |
reason | A finer cause, for codes that document one. |
required_scope | The scope the credential lacks. |
retry_after_s | The Retry-After value, for clients that read only the body. |
limit | The limit that was hit: id, limit, unit, and window_s or current when they apply. IDs match GET /v1/limits. |
current_status | The object's status, for state conflicts. |
upstream_status | The HTTP status an upstream returned. |
step | The step that failed: a routine step ID, an act index or a render path such as beats/2/do/0. |
pack_error | The 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.
navigation_failed
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.