Errors

A failed call returns a JSON envelope with a stable code, an HTTP status, and a hint for the next step.

Docs menu

Every error response has the same shape:

{
  "error": "the collection 'orders' does not exist",
  "code": "COLLECTION_NOT_FOUND",
  "status": 404,
  "detail": "collection: orders",
  "retryable": false,
  "next_action": "refresh_resource",
  "fix": {
    "operation": "collection.list"
  }
}
Field Type Description
error string Human-readable message. Do not match on its text.
code string The stable error name (COLLECTION_NOT_FOUND, KEY_NOT_FOUND, UNIQUE, and so on). Branch on this.
status integer The HTTP status of the response.
detail string Optional. Extra context: the field, path or value involved.
path string Optional. The request path the error applies to.
retryable boolean Whether the same request can succeed unchanged after a wait.
next_action string A fixed hint: retry, reauthenticate, request_permission, reduce_request_or_increase_limit, refresh_resource, choose_supported_operation, correct_request, inspect_detail, version.live.set, follow_location or sign_in.
fix object Optional. { operation, tool, cli, method, path, arguments } naming the next call to make (an MCP tool name, a CLI command, or an HTTP method and path) and, for a list call, named arguments to run it with.

Branch on code. The error message can change without notice, while the code is stable. Use retryable and next_action to choose the next request instead of inferring it from the code's name.

Code families

Codes are grouped by a four-hex-digit range. A mask (code & 0xF000) identifies the family without a string comparison.

Range Family
0x0000 General, lifecycle, and system
0x1000 Storage I/O
0x2000 Memory
0x3000 Transaction and concurrency
0x4000 Key-value
0x5000 Cursor and batch
0x6000 Graph
0x7000 Dimensional and geo
0x8000 Schema
0x9000 Quota, rate and function limits
0xA000 Auth and session
0xB000 Query
0xC000 App and resource
0xF000 API and serialization

Retry guidance

retryable: true appears only for a transient condition, such as a transaction conflict, rate limit, concurrency limit, server load, or timeout. Retry within your deadline, with backoff. Preserve the request's idempotency key so a retried write is not applied twice.

Do not retry a non-retryable error by resending the same request. A validation error (INVALID_ARGUMENT), permission error, schema violation, or unsupported operation requires a change to the request. If a write guarded by an expected version (if: { _version }) conflicts with another write, read again before the next attempt.

Next-operation hints

fix.operation names the call most likely to resolve a failure, independent of the error text. A *_NOT_FOUND error for a collection, function, account member, API key, or thread points to that resource's list operation. Use it to refresh your view of what exists before trying again. Call the operation named by fix, using fix.tool for MCP, fix.cli for the CLI, or the HTTP method and path.

Every typed error code, its hex value, HTTP status and message are listed below.

Every error code

A failed call returns one of these names in code, along with the HTTP status shown here. A follow-up operation is listed when it resolves the error regardless of which operation raised it.

CodeNumberStatusMessageFollow-up
UNKNOWN0x0001500An unknown error occurred
NOT_IMPLEMENTED0x0002501This feature is not implemented
SYSTEM_CLOSED0x0100503Database system is closed
SYSTEM_ALREADY_OPEN0x0101409Database system is already open
INVALID_ARGUMENT0x0102400That value is not accepted.
INVALID_HANDLE0x0103400That handle is not open.
THREAD_INIT_FAILED0x0104500Thread initialization failed
SHUTDOWN_IN_PROGRESS0x0105503System is shutting down
INTERNAL0x0106500Something went wrong on our side. Try again.
NULL_TREE0x0107500Index tree is not initialized
NULL_SYSTEM0x0108500Tree is not bound to a system
BARRIER_UNSUPPORTED0x0109500Process-wide memory barrier unavailable
STORAGE_IO0x1000500We could not read or save that just now. Try again.
DISK_FULL0x1001503Disk storage is full
FILE_NOT_FOUND0x1002404File not found
PERMISSION_DENIED0x1003403You do not have access to that.
FILE_CORRUPT0x1004500File is corrupted
MMAP_FAILED0x1005500Memory mapping failed
FSYNC_FAILED0x1006500File sync failed
LOCK_FAILED0x1007409File lock failed
NOT_A_DATABASE0x1008500File is not a database
OLD_FORMAT0x1009500Database file is in an older format than this build reads
NEWER_FORMAT0x100A500Database file is in a newer format than this build reads
CONTENT_HASH_COLLISION0x100B409Different bytes are already stored under this content name.
OUT_OF_MEMORY0x2000503Out of memory
BUFFER_TOO_SMALL0x2001500Buffer too small
ALLOCATOR_FAULT0x2002500Memory allocator fault
TRANSACTION_CONFLICT0x3000409Transaction conflict, please retry
RETRY0x3001409Operation should be retried
TRANSACTION_READ_ONLY0x3002403Transaction is read-only
TRANSACTION_NOT_FOUND0x3003404Transaction not found
DEADLOCK_DETECTED0x3004409Deadlock detected
TIMEOUT0x3005504Operation timed out
NO_ACTIVE_TRANSACTION0x3006400No active transaction
LWW_STALE0x3007409A newer version exists
CANCELLED0x3008409Operation cancelled
KEY_NOT_FOUND0x4000404We could not find that.
KEY_TOO_LARGE0x4001400Key exceeds maximum size
VALUE_TOO_LARGE0x4002413Value exceeds maximum size
KEY_EMPTY0x4003400Key cannot be empty
KEY_EXISTS0x4004409Key already exists
MISSING_INDEX0x4005400Required index not found
OWNERSHIP_REQUIRED0x4006403Record ownership required
KEY_PREFIX_COLLISION0x4007409Key prefix collision
KEY_DELETED0x4008404Key was deleted
UNIQUE0x4009409A unique field already holds the value
ID_RESERVED0x400A400_id is assigned by the collection; use put(doc) to choose an id
INVALID_ID0x400B400_id names no document: it must be a base62 id string or a positive whole number
ID_MISMATCH0x400C400the body's _id is not the id in the path
INDEX_DUPLICATES0x400D409documents already share a value of the field: it cannot be declared unique
FIELD_IDS_EXHAUSTED0x400E507every index field id of the collection is taken: a member of this document that a wildcard index rule covers cannot be keyed, so nothing was written
ID_PAST_ROWS0x400F507the collection is a table SQL made, whose row is its id: an id of 2^32 - 1 or more has no row, so nothing was written
ID_NOT_ISSUED0x4010400the collection is a table SQL made, whose row is its id: a given id is taken only once its generator issued it, so nothing was written
ENGINE_GATE_HELD0x4011500a writer of a table SQL made ran inside the SQL engine's gate as a reader: the engine cannot wait for its own reader
ROW_STALE0x4012409the document changed since this row was read: nothing was written, and the row now holds the document as it is; read it and write again
RECORD_TOO_LARGE0x4013413A document holds at most 4,294,967,295 bytes once it is stored. This one would be larger, so nothing was written.
TOO_MANY_ELEMENTS0x4014400An array holds at most 4,294,967,295 elements. This one would hold more, so nothing was written.
CURSOR_EXHAUSTED0x5000200Cursor exhausted
CURSOR_INVALIDATED0x5001409Cursor invalidated
INVALID_RANGE0x5002400That range is not accepted.
BATCH_OP_FAILED0x5003500Batch operation failed
NODE_NOT_FOUND0x6000404Node not found
EDGE_NOT_FOUND0x6001404Edge not found
PROPERTY_NOT_FOUND0x6002404Property not found
INVALID_EDGE0x6003400That edge is not accepted.
PATH_NOT_FOUND0x6004404Path not found
GRAPH_CYCLE_DETECTED0x6005409Cycle detected
DIMENSION_MISMATCH0x7000400Dimension mismatch
POINT_NOT_FOUND0x7001404Point not found
INVALID_BOUNDS0x7002400Those bounds are not accepted.
INVALID_RADIUS0x7003400That radius is not accepted.
SCHEMA_VIOLATION0x8000400Schema violation
TYPE_MISMATCH0x8001400Type mismatch
CONSTRAINT_VIOLATION0x8002409Constraint violation
TOO_MANY_FIELDS0x8003400a collection names at most 4096 distinct fields (the keys of a document and of every object inside it, together); this document would need more
SCHEMA_REFUSED0x8004400The document does not match the collection's schema
SCHEMA_VIOLATORS0x8005409stored documents already break the constraint: it is not declared
SECRET_FIELD0x8006400a secret field cannot be filtered, sorted, grouped, aggregated, joined on or selected by name
TYPE_TAG_NOT_FIRST0x8007400the $type tag must be the first member of its object
FIELD_NAME_TOO_LARGE0x8008400A field name holds at most 65,535 bytes. This one is longer, so nothing was written.
TOO_DEEP0x8009400A value nests at most 1024 objects and arrays, and an update path names at most 1024 steps. This one goes deeper, so nothing was written.
STORAGE_QUOTA_EXCEEDED0x9000507Storage quota exceeded
DOCUMENT_QUOTA_EXCEEDED0x9001507Document quota exceeded
BANDWIDTH_QUOTA_EXCEEDED0x9002429Bandwidth quota exceeded
RATE_LIMIT_EXCEEDED0x9003429Too many requests. Wait a moment and try again.
REQUEST_TOO_LARGE0x9004413Request payload too large
CONCURRENT_LIMIT0x9005429Concurrent request limit exceeded
COLLECTION_LIMIT0x9006413Collection limit exceeded
INDEX_LIMIT0x9007413Index limit exceeded
FUNCTION_LIMIT0x9008429Cloud function limit exceeded
CF_CPU_TIMEOUT0x9009408Cloud function exceeded CPU time limit
CF_MEMORY_EXCEEDED0x900A413Cloud function exceeded memory limit
CF_EXECUTION_FAILED0x900B500Cloud function execution error
SERVER_BUSY0x900C503The server is busy; retry shortly
CF_TENANT_MEMORY0x900D503The tenant's function memory budget is full; retry shortly
CF_WALL_TIMEOUT0x900E504Cloud function exceeded its wall-clock limit
CF_SERVER_MEMORY0x900F503The server is low on memory and starts no new function container; retry shortly
KEY_RATE_LIMIT_EXCEEDED0x9010429This key's own request rate limit is exceeded
REALTIME_LIMIT0x9011429This tenant's realtime_connections_limit is at its cap
CRON_LIMIT0x9012429This tenant's cron_limit is at its cap
SPACE_FULL0x9013507The account's space is full: free space (delete data or an app) or raise the account's space
TOKEN_EXPIRED0xA000401Your sign-in has expired. Sign in again.
TOKEN_INVALID0xA001401Your sign-in is not valid. Sign in again.
TOKEN_REVOKED0xA002401Your sign-in was ended. Sign in again.
SESSION_EXPIRED0xA003401Your session has expired. Sign in again.
ACCOUNT_SUSPENDED0xA004403This account is suspended.
TENANT_SUSPENDED0xA005403Tenant has been suspended
IP_BLOCKED0xA006403IP address is blocked
INSUFFICIENT_PERMISSIONS0xA007403You do not have access to do that.
CREDENTIAL_REQUIRED0xA008401Authentication credentials required
OAUTH_INVALID0xA009401The sign-in provider's answer was not accepted. Try again.
PROVIDER_NOT_CONFIGURED0xA00A409Authentication provider not configured
PROVIDER_DISABLED0xA00B403Authentication provider is disabled
TENANT_READ_ONLY0xA00C423Tenant is read-only: writes are refused
APPROVAL_REQUIRED0xA00D403This call is irreversible and a person must approve it: show the person approve_url, and once they approve, repeat the same call
APPROVAL_INVALID0xA00E403No such approval
APPROVAL_DENIED0xA00F403A person denied this call; a repeat is refused until the approval lapses
AGENT_BUDGET_EXHAUSTED0xA010403This agent session spent its request budget (its own or one of its parents')
KEY_BUDGET_EXHAUSTED0xA011403This key spent its own request budget
EMAIL_VERIFICATION_REQUIRED0xA012403Verify your email address to continue
LIVE_BY_PROMOTE0xA013409This app changes only by promote: change its dev sandbox and promote the versionsource.edit
TENANT_MOVED0xA014308This app moved to another server: send the request to the address in Location
GRANT_REQUIRED0xA015403This app has not been granted the capability the call needs. the system admin grants it.
KEY_ORIGIN_REFUSED0xA016403A publishable key is refused here: the request's Origin is not one of its origins, or the route does not take one
APPROVAL_PENDING0xA017403No person has approved this call yet: show the person approve_url, and once they approve, repeat the same call
APPROVAL_SPENT0xA018403This exact call already ran with its approval; a repeat is refused until the approval lapses
APPROVAL_EXPIRED0xA019403The approval lapsed before it was used: repeat the call without it to ask again
APPROVAL_MISMATCH0xA01A403The approval names another call or another session: it works only for the exact call that asked for it
WEBHOOK_SIGNATURE_INVALID0xA01B400The payment provider webhook's signature does not verify
BILLING_NOT_SET_UP0xA01C503Billing is not set up: the payment provider's keys are not set
EMAIL_TAKEN0xA01D409That email already has an account. Sign in instead.
CREDENTIALS_MISMATCH0xA01E401That email and password do not match.
PASSWORD_LENGTH0xA01F400Use a password of 8 to 128 characters.
EMAIL_INVALID0xA020400Enter a valid email address.
USER_NOT_FOUND0xA021404We could not find that person.
ACCOUNT_LOCKED0xA022423This account is locked. Reset your password to sign in again.
SECRET_KEY_IN_URL0xA023400A secret key was sent in the URL (access_token): only a publishable key may be; send a secret key in the Authorization header, from a server
RECIPIENT_UNSUBSCRIBED0xA024409You turned off this app's email, so no code was sent. Ask for a link to turn it back on.
APP_OVER_PLAN0xA025403This app is paused: the account's plan allows fewer apps than it owns. Move it into the first max_apps on the account's Apps page (account.apps.order), or upgrade.
QUERY_TOO_COMPLEX0xB000400Query is too complex
QUERY_TIMEOUT0xB001504Query execution timed out
RESULT_SET_TOO_LARGE0xB002413Result set exceeds maximum size
SORT_LIMIT_EXCEEDED0xB003400Sort operation exceeds limit
SCAN_LIMIT_EXCEEDED0xB004400Scan operation exceeds limit
INVALID_QUERY_SYNTAX0xB005400That query does not parse.
SQL_FAILED0xB006400The SQL statement did not parse or run
SQL_DIALECT_UNKNOWN0xB007400The SQL dialect must be sqlite or mysql.
TENANT_NOT_FOUND0xC000404Tenant not found
TENANT_ALREADY_EXISTS0xC001409Tenant already exists
TENANT_INVALID0xC002400That app is not one this server knows.
TENANT_CANNOT_DROP_DEFAULT0xC003403Cannot drop the default tenant
COLLECTION_NOT_FOUND0xC004404Collection not foundcollection.list
COLLECTION_ALREADY_EXISTS0xC005409Collection already exists
FUNCTION_NOT_FOUND0xC006404Function not foundfunction.list
THREAD_NOT_FOUND0xC007404Thread not foundthread.list
MESSAGE_NOT_FOUND0xC008404Message not foundthread.messages.list
DATABASE_ERROR0xC009500Database error
ACCOUNT_NOT_FOUND0xC00A404Account not foundaccount.list
ACCOUNT_MEMBER_NOT_FOUND0xC00B404No such member of the accountaccount.member.list
ACCOUNT_LAST_OWNER0xC00C409An account keeps at least one owner
ACCOUNT_HAS_APPS0xC00D409The account still owns apps
ACCOUNT_LIMIT0xC00E409An account limit is reached
ACCOUNT_KEY_NOT_FOUND0xC00F404No such key of the accountaccount.key.list
ACCOUNT_INVITE_NOT_FOUND0xC010404No such invite, or it was used or revokedaccount.invite.list
ACCOUNT_INVITE_EXPIRED0xC011409The invite has expired
ACCOUNT_INVITE_EMAIL0xC012403The invite is for another verified email address
UNDO_TOKEN_NOT_FOUND0xC013404No such undo token for this app, or it was used
UNDO_TOKEN_EXPIRED0xC014410The undo token has expired
UNDO_RESOURCE_CHANGED0xC015409The resource changed after this undo token was issued
APP_OWNED_BY_ANOTHER_ACCOUNT0xC016409The app belongs to another account
KEY_EXPIRED0xC017401The tenant key has expired
TENANT_KEY_NOT_FOUND0xC018404No such key of the tenant
TENANT_SLUG_RESERVED0xC019409This slug was renamed away recently and is held for its former account
TENANT_NOTE_TOO_LONG0xC01A400The suspension note is longer than the 127 bytes the record holds; shorten it (nothing is cut)
TENANT_JOBS_DISABLED0xC01B409This tenant's background work is switched off.
TOOL_BAD_NAME0xC020400A tool's name is 1 to 63 bytes of lowercase letters, digits, '-' and '_', not starting with '-' or '_'
TOOL_HASH_MISMATCH0xC021400The uploaded bytes do not hash to the declared sha256
TOOL_BAD_SIZE0xC022400The tool's image is empty or larger than the per-tenant limit
TOOL_BAD_FORMAT0xC023400The tool's image is not an executable this platform runs
TOOL_TOO_MANY0xC024409This tenant already has as many tools installed as it may
TOOL_STORAGE_IO0xC025500The tool's image could not be stored
TOOL_NOT_INSTALLED0xC026404No such tool version is installed
TOOL_TOO_MANY_BYTES0xC027409This tenant's installed tool images already total as many bytes as it may
TOOL_LIMIT_OUT_OF_RANGE0xC028400A tool limit is above the ceiling this platform allows for it
TOOL_BAD_ARGS0xC029400tool.run's args, env or stdin are not shaped as this operation requires
TOOL_CONFINEMENT_UNAVAILABLE0xC02A503This host cannot confine a tool process; tool.run never runs one unconfined
TOOL_SPAWN_FAILED0xC02B500The tool process could not be started
DIRECT_CHANGES0xC02C409A function deployed outside a version would be overwritten or deleted; send direct:"replace" or direct:"keep"
HOST_NOT_FOUND0xC02D404Host not found
SETTING_IS_PLATFORM0xC035403The key is a server-wide platform setting.
NO_CALL_CONTEXT0xC036400The host call was made outside a function's call: no database or function context is bound
LEDGER_UNAVAILABLE0xC037503The app's ledger could not be opened
APP_QUERY_NOT_INDEXED0xC038400An offered query's where field is not declared indexed on its collection (index.create kind collection)
APP_QUERY_FIELD_NOT_EXPOSED0xC039400The reader names a field the offered query does not select
APP_USE_UNKNOWN_APP0xC03A200The word names an app that does not exist yet; kept, and refused per call until it does
SECRET_NOT_FOUND0xC03B404The app has no secret of this key; secret.list names the ones it has
EDIT_NO_MATCH0xC03C409The unit does not hold the edit's old text as given; read it again (version.unit) and edit what it holdsversion.unit
EDIT_AMBIGUOUS0xC03D400The edit's old text occurs more than once; give more of the surrounding text, or replace_allversion.unit
MODULE_NOT_FOUND0xC040400An import names a file the version does not hold; commit the file or fix the specifier
IMPORT_OUTSIDE_PROJECT0xC041400An import climbs above the version's root; import only files of the version
IMPORT_NEEDS_VERSION0xC042400A function deployed outside a version imports a file; ship it in a version (version.commit, then version.live.set)version.commit
PACKAGE_NOT_FOUND0xC043400A bare import names a package the version does not hold under node_modules; add it with package.add
PACKAGE_NOT_EXPORTED0xC044400The package's "exports" names no entry for the imported subpath; import one it exports
PACKAGE_NOT_ESM0xC045400The package's entry is CommonJS by its own package.json; only ES module packages load
PACKAGE_MANIFEST_INVALID0xC046400The package's package.json is not a JSON object; add the package again with package.add
HOST_TAKEN0xC048409Another app holds this host's label (under one root or another); choose another label
HOST_INVALID0xC049400The host is not <label>.<root domain> with a label of lowercase letters, digits and inner hyphens (1 to 63); the detail says why and suggestion is the nearest valid host
HOST_RESERVED0xC04A409The label belongs to the platform (www, api, mcp, platform), to an app's own host, or to sandbox hosts (it holds --); choose another label
ENV_HOST_NOT_FOUND0xC04B404This app has no such host; env.host.list names its hostsenv.host.list
ENVIRONMENT_NOT_FOUND0xC04C404No such environment: live, a sandbox from sandbox.list, or a host from env.host.listsandbox.list
ROOT_DOMAIN_UNKNOWN0xC04D404The host is not under a root domain of this platform; env.host.list answers the roots a host may be bound underenv.host.list
ROOT_DOMAIN_DISABLED0xC04E409The root domain is disabled: no host is bound under it until the platform admin enables it
JET_KEY_NEEDS_APP0xC053400A key for a featured app belongs to one of the account's apps; jet.key.create makes it for the app named
BILLING_KEY_NOT_TEST0xC060503The payment provider key set is not a test key (sk_test_ or rk_test_); the platform takes test keys only, so nothing was sent
CART_EMPTY0xC061400The cart buys nothing: name at least one plan in items, or funds
CART_PLAN_NOT_FOUND0xC062400The app has no plan by this id; billing.catalog lists every plan
CART_PLAN_NOT_FOR_SALE0xC063400This plan is free: featured.enable or account.plan.change puts the account on it, no cart needed
CART_APP_REPEATED0xC064400The cart names this app twice; one plan an app
CART_COVERED0xC065400The cart's Substrio plan already includes this app at this plan or a higher one; take it out
CART_MIXED0xC066400Every plan in one cart has the first one's currency and interval; buy the other in a cart of its own
FUNDS_OUT_OF_RANGE0xC067400Funds are from 500 to 1000000 in the minor unit (5.00 to 10,000.00)
CART_NOT_FOUND0xC068404The account has no cart by this id; billing.cart.create makes one
CART_CLOSED0xC069409The cart's checkout has started or is paid, so it no longer changes; make a new cart
CHECKOUT_PERSON_ONLY0xC06A403Paying is the person's own: give them the cart's checkout_url to pay on
PAYMENT_NOT_DONE0xC06B409The cart is not paid: the person pays on its checkout page (billing.checkout.start), then this call
PAYMENT_PROCESSING0xC06C409The payment is still being processed by the provider; ask again shortly
SUBSCRIPTION_NONE0xC06D404The account has no subscription to cancel
PROVIDER_ANSWER_INVALID0xC06E503The payment provider's answer was not the object asked for (the field names it); nothing was applied, ask again
PLAN_LIMIT0xC06F409The account's plan allows no more of this (the field names it); account.plan.summary shows the plans that raise it
SPACE_ADDON_NOT_ON_PLAN0xC070400The plan the account would be on sells no space add-on; a plan with space_addon (Scale) does
SPACE_ADDON_HELD0xC071409The account holds space add-on blocks the new plan does not sell; release them first (a cart with space_blocks 0)
SPACE_ADDON_IN_USE0xC072409The account uses more than the space it would keep; delete data first, then release the blocks
PLAN_NOT_ON_SALE0xC073409This plan is priced but not on sale yet: it cannot be bought or moved to until the platform sells it (account.plan.summary shows what can be)
PROVIDER_REFUSED0xC074502The payment provider refused the request; provider_code and provider_param name the cause, and the same request is refused again
PROVIDER_UNREACHABLE0xC075503The call to the payment provider did not finish; nothing was applied, ask again
MCP_TOOL_NOT_FOUND0xC080404The app's MCP manifest has no tool of this name; mcp.tool.list names the ones it has
MCP_TOOL_INVALID0xC081400The tool is not one the app's /mcp can serve; field names the member at fault
MCP_TEST_USER_NOT_FOUND0xC082404The app has no user of this id to call the tool as; user.list names its people
MCP_TOOL_FROM_ROUTE0xC083409The tool is a route's own; its function takes it out with tools: {"<route>": false} (functions/<name>.json)
MCP_RESULT_INVALID0xC084502The app's function answered an _mcp that is no tools/call result; field names the member at fault
MCP_OPERATIONS_IDENTITY_ONLY0xC085403operations declares the platform's own operations: only the platform's identity app declares it
CALLER_USERS_REFUSED0xC088403Only a featured app's entry, called by another app, reads that app's users; an app you merely use never reads yours
NO_CALLER_APP0xC089400This entry was called by no app (a route, a schedule or a direct call), so there are no caller users to read
SELF_FIELD_REFUSED0xC08A403The app has not marked this field of the person as one they may edit themself; field names it
MCP_ROOT_OVERFLOW0xC08B200More lead tools than the root list holds. The tools named are reached through their areas
MCP_TOOL_MEMBER_UNKNOWN0xC08C200A tool entry holds a member outside the tool format. The tool is built without it, and the warning names the route and the member
KEY_AUTOMATION_NEEDS_PERSON0xC090403Only a person signed in as themselves makes an automation key; a key, an agent or the system key makes agent keys
MCP_IDENTITY_FUNCTION_NOT_DEPLOYED0xC091500A function the release ships for the identity app was not deployed at start; the next start tries again
PACKAGE_REGISTRY_UNSET0xC0A0503package.add has no registry: the platform setting package_registry_origin is unset
PACKAGE_UNKNOWN0xC0A1404The registry has no package of that name
PACKAGE_NAME_INVALID0xC0A2400Not an npm package name: lowercase letters, digits, - . _ ~, an optional @scope/
PACKAGE_RANGE_INVALID0xC0A3400Not a version, a range or a dist-tag
PACKAGE_VERSION_NOT_FOUND0xC0A4404No published version of the package meets the range or tag
PACKAGE_VERSION_CONFLICT0xC0A5409One package name would need two versions; a version holds one of each name
PACKAGE_REGISTRY_FAILED0xC0A6502The registry could not be reached or answered with an error
PACKAGE_TARBALL_OUTSIDE_REGISTRY0xC0A7502The registry names a tarball outside its own origin; only the configured registry is fetched from
PACKAGE_INTEGRITY_MISMATCH0xC0A8502The tarball's SHA-512 is not the registry's dist.integrity, or the registry gives no sha512
PACKAGE_TARBALL_INVALID0xC0A9502The tarball is not a gzip tar of a package: a link, an unsafe path, or no package.json
PACKAGE_TOO_LARGE0xC0AA413The package unpacks past 256 MiB, or its metadata past 64 MiB
AGENT_CODE_INVALID0xC0BD401This connect code is unknown, already used or past its life; ask your owner for a new one on the console's Agents page
AGENT_ALREADY_CONNECTED0xC0BE409This connection already acts for your owner, so the connect code is not needed and was not used. A substrio_ae_ code is for an agent with no connection
AGENT_TOOL_UNKNOWN0xC0BF404No tool of this name reaches this credential; GET /v1/_agent/tools names the ones that do
CPU_HISTORY_OFF0xC0C0409This server keeps no usage minutes (usage_history_minutes is 0), so it has no CPU a minute to answer.
SUBSCRIPTION_NOT_FOUND0xC0C1404There is no subscription of yours by this id; subscriptions.mine lists them
PLAN_FEATURE_REQUIRED0xC0C2403Your plan at this app does not include this feature; the app's plans name the ones that do
SUBSCRIBERS_NOT_VISIBLE0xC0C3403Only the selling app and the apps of its own account read its subscribers
SUBSCRIPTION_PERSON_REQUIRED0xC0C4403This is a person's own call: sign in as the person (an agent or a key cannot buy or list for them)
PLAN_FEATURE_UNKNOWN0xC0C5403The route's plan gate names a feature the app's plans file does not have
FILE_EXISTS0xC0C6409A file already exists at the destination path; choose another path, or move with replace: true
APP_NOT_NAMED0xC0C7400This call runs at an app and the request names none: send X-Substrio-Tenant: <app>, or call the app's own host
SYSTEM_PROTECTED0xC0C8403This account or app is the platform's own and cannot be deleted
SHELL_SYNTAX0xC0D0400The command is not in the shell's grammar (the detail says where); nothing ran
SHELL_UNKNOWN_COMMAND0xC0D1400The shell has no such command; the detail lists the ones it has
SHELL_UNKNOWN_VARIABLE0xC0D2400The shell has no such variable: PWD HOME SRC SITE FILES BRANCH and ? are the ones it has
SHELL_PATH_OUTSIDE0xC0D3400The path is under no mount: /src, /site and /files are the shell's whole file system
SHELL_READ_ONLY0xC0D4400/site is the live release, read only: change /src and ship a version
SHELL_WRITE_NOT_GRANTED0xC0D5403The command writes, and the caller's grant reads only; nothing landed
SHELL_FILES_DELETE0xC0D6403A stored file is deleted with file.delete, which asks a person first; nothing landed
SHELL_OFFSET_WRITES0xC0D7400offset continues a command's output, and this command writes: run it without offset
SHELL_CPU_BUDGET0xC0D8408The command ran past the shell's CPU budget; nothing landed: narrow it
SHELL_PIPE_BUDGET0xC0D9413One stage of the command wrote past the shell's pipe budget; nothing landed: narrow it
DASHBOARD_INVALID0xC0E0400The app's dashboard file is not one the console can draw; field names the path in it (nav[2].panels[0].source.route) and the detail what is wrong
REGION_UNAVAILABLE0xC0F3409This region is not offered: it is hidden, unknown or serves no apps yet; region.choices lists the ones you can pick
REGION_FULL0xC0F4409Every host in this region is at its app limit; pick another region from region.choices or try again later
PAYOUT_PROVIDER_UNAVAILABLE0xC110503The payment provider could not finish the payout. The pending payout is saved for a retry
CREDITS_EXHAUSTED0xC111409The prepaid counter has too few credits for this use
CREDIT_PACK_NOT_FOUND0xC112404The app has no credit pack by this id
PREPAID_COUNTER_CHANGED0xC113409Prepaid counter ids and positions must be kept because the mapped balances refer to them
CREDIT_GRANT_CONFLICT0xC114409This credit grant key already names a different grant
CART_PROVIDER_LIMIT0xC116400This cart exceeds the payment provider's invoice item limit
CART_PACK_PRICE_REPEATED0xC117400Each credit pack in a cart must have a distinct provider price so its invoice line names one sale
TEST_TENANT_REQUIRED0xC570403Only a test tenant has fetch stubs and a clock.
ARCHIVE_INVALID0xC580400The archive is not one app.archive made, or an entry does not match its manifest.json; detail names the entry. Nothing was written
ARCHIVE_PASSPHRASE_WRONG0xC581400The X-Substrio-Passphrase header does not open the archive's sealed.bin; send the passphrase it was downloaded with, or none to restore without the sealed part. Nothing was written
WASM_MODULE_INVALID0xC590400The Wasm module is not valid, lacks an export the platform calls (substrio_fetch, substrio_in, substrio_alloc, memory) or imports something the platform does not provide; the detail names it. Nothing was deployed
WASM_COMPILE_FAILED0xC591422The Wasm module is valid but was not compiled within the deploy's time and memory limits. Nothing was deployed
WASM_CELLS_UNSUPPORTED0xC592409Retired: a server that runs tenant code in cells runs Rust functions in them, and no server answers this code. It stays named because published clients map it
RUST_COMPILE_FAILED0xC593422The Rust source did not compile; the detail is the compiler's own diagnostics, with the line and column of each error. Nothing was deployed
RUST_TOOLCHAIN_UNAVAILABLE0xC594503This server cannot compile Rust: its release has no Rust toolchain (a release ships one; a dev build needs SUBSTRIO_RUST), or the tools jail could not run it (the detail says why). Nothing was deployed
CALL_DEPTH_EXCEEDED0xC595508A function call nested more than 64 calls deep, the limit JavaScript's calls have
FUNCTION_NO_PLAIN_ENTRY0xC596400The called function exports no plain entry, so it can only be reached through its routes
QUEUE_NOT_DECLARED0xC597404The live version declares no queue of that name, or it dropped the queue since the call named it
ONCE_IN_PROGRESS0xC598409Another call of the same db.once key is running now. Try again when it has ended
ONCE_INDETERMINATE0xC599409A run of this db.once key was cut short by a restart, so what it wrote is unknown. The key runs again once its keep time has passed
ONCE_CLAIM_LOST0xC59A409The db.once run took longer than its keep time, and another call took the key
LEDGER_REFUSED0xC59B400The ledger refused the call. The reason names the rule, and the entry it applies to when there is one
LEDGER_WRITE_FAILED0xC59C500The ledger could not write the entry. Nothing was stored
WASM_CELL_IMPORT_UNSUPPORTED0xC59D409This server runs tenant code in cells, and a Rust function in a cell cannot call the platform's data, services or ledger yet. The function ran as far as that call and nothing was changed by it
TURNSTILE_REQUIRED0xC59E403A sign-in code is mailed only after the person passes the bot check on the sign-in page. Send the check's token as turnstile_token
TURNSTILE_FAILED0xC59F403The bot check did not pass, or its token was already used or is too old. Run the check again
LOGIN_INTENT_UNKNOWN0xC5A0404No sign-in request has this id and secret. Start a new one with agent.login.begin
LOGIN_INTENT_EXPIRED0xC5A1410This sign-in request is too old. Start a new one with agent.login.begin
LOGIN_INTENT_NOT_CHALLENGED0xC5A2409The person has not passed the bot check on the sign-in page yet, so no code was mailed. They open the link first
LOGIN_REFRESH_REFUSED0xC5A3401The refresh secret does not belong to a live session. The session was revoked or replaced. Sign in again
TURNSTILE_UNREACHABLE0xC5A4503The bot check could not be confirmed with Cloudflare just now. Nothing was mailed. Try again in a moment
LOGIN_CODE_SPENT0xC5A5409This sign-in code was already used here. The code works once in the browser and once for the agent. Start a new sign-in with substrio login --email
LOGIN_GRANT_INVALID0xC5A6404The browser's hand-off is not live for this sign-in. Finish with the code from the email instead
LOGIN_GRANT_EXPIRED0xC5A7410The browser's hand-off lasts one minute and this one is older. Finish with the code from the email instead
BACKUP_NO_RECORDER0xC5A8409This app is not recording its changes, so no backup of it can be taken. Nothing was changed. Promote again after the server restarts the app, or send backup as false when the version touches no data.
JET_REFUSED0xC5A9403A featured app opens only the app that called it. A run with no caller opens only an app where this jet already keeps data
JET_APP_NOT_FOUND0xC5AA404No app has this id, or its database could not be opened. Pass request.auth.app.id
JET_BLOCK_NESTED0xC5AB409A substrio.jet.use block was opened inside another block. Close the first block, then open the next one
JET_BLOCK_CLOSED0xC5AC409The block's d was used after the block ended. Use d only inside its block
JET_BLOCK_ASYNC0xC5AD400A substrio.jet.use block returned a promise. A block is synchronous, so make network calls outside it
JET_RESULT_NOT_PLAIN0xC5AE400A substrio.jet.use block returned a record or a value that is not plain data. Return plain fields, or a chain's json()
JET_TREE_RESERVED0xC5AF403Names that start with _jet. hold a Jet's data for this app. Reach that data through the Jet's routes or an archive
JET_ID_CHANGED0xC5B0409A Jet's id is permanent, because each app's data for that Jet is stored under it. Keep the featured.admin id. Nothing was changed
JET_ID_TAKEN0xC5B1409Another Jet declares this featured.admin id. Choose another id. Nothing was changed
JET_NOT_ON_SERVER0xC5B2200The archive holds data for a Jet this server does not have. The data was restored and stays in the app
JET_NOT_DECLARED0xC5B3400This Jet's plans file does not declare that name under featured.hosted. Declare the collection or store, then deploy
JET_SCHEMA_REFUSED0xC5B4409This app could not take the schema the Jet declares. The app's data is unchanged, and the next block tries again
APP_REQUIRED0xC5B5400This account has several apps, so name the one that uses this Jet in app, or make one with new_app. The account's apps are listed in apps
JET_KEY_OTHER_APP0xC5B6403This key belongs to another app. Send a key of the app on this host, or call that app's host
AI_NOT_AVAILABLE0xC5B9403substrio.ai.chat is available to featured apps
AI_TIER_EMPTY0xC5BA409This tier has no usable provider
AI_PROVIDERS_FAILED0xC5BB503Every provider of this tier failed. Try again shortly
SERIALIZATION0xF000500Serialization error
DESERIALIZATION0xF001400Deserialization error
PIPELINE_TOO_LARGE0xF002400Pipeline too large
INVALID_JSON0xF003400The request body is not valid JSON.
EMPTY_PAYLOAD0xF004400Request payload is empty
BODY_REQUIRED0xF005400Request body is required
METHOD_NOT_ALLOWED0xF006405HTTP method not allowed
ENDPOINT_NOT_FOUND0xF007404API endpoint not found
MISSING_FIELD0xF008400Required field is missing
UNSUPPORTED_OPERATION0xF009400Operation not supported
NO_WAIT_IN_QUERY0xF00A400Cannot wait inside an open query cursor: $whereJS runs per row while the query holds its position; do the waiting work before or after the query
NO_WAIT_IN_TRANSACTION0xF00B400Cannot wait inside db.transaction: it holds the database's writer gate for its whole body; do the waiting work before or after the transaction
NO_WAIT_IN_UPSERT0xF00C400Cannot wait inside an upsert: it holds the collection's upsert gate from its find to its insert; do the waiting work before or after the upsert
NO_WAIT_IN_ENGINE_GATE0xF00D400Cannot wait for a script transaction inside a query's sink or a registered function's call: it holds the database's engine gate, which the transaction needs to open
FETCH_FAILED0xF00E502The fetch's upstream could not be reached or broke off
CRITICAL_SEGFAULT0xFFFF500Critical system failure