Error reference
Every RFC 7807 type URL the platform emits points at a page below. The shape of every error is documented in the getting started guide.
- 4xx
- The request has to change. Fix it and retry.
- 5xx
- Nothing about the request is wrong. Retry with backoff, and report the
requestIdif it persists.
Platform-wide 23
Raised by the gateway, by the shared middleware, or by more than one service. Any endpoint can return these.
| Status | Error | Meaning |
|---|---|---|
| 400 | invalid-request | The request body or query string did not match the endpoint's schema. The detail names each field that failed and why, in the form 'field: reason', separated by semicolons. A few endpoints answer 422 with this same slug when the shape is valid but the values contradict each other, such as two artefacts in one release claiming the same platform. |
| 400 | missing-idempotency-key | All add actions require an Idempotency-Key header so a retried request can't create a duplicate. |
| 401 | invalid-admin-token | Key-management endpoints (/platform/v1/keys/*) authenticate with the platform admin token, not an API key. |
| 401 | invalid-api-key | The supplied key is malformed or not recognised by the platform. |
| 401 | invalid-token | A JWT-authenticated endpoint rejected the bearer token: missing, malformed, expired, wrong issuer/audience, or not signed by a known key. Also returned by RSX ID for an unrecognised, expired, or reused refresh token. |
| 401 | missing-api-key | The request reached an authenticated endpoint without an Authorization header. |
| 401 | revoked-api-key | The key exists but has been revoked, or its rotation grace window has ended. |
| 401 | unauthenticated | The endpoint requires a platform API key and the request carried none that the gateway could verify. |
| 403 | developer-only | This endpoint (developer self-service API keys) needs an RSX ID developer account. |
| 403 | insufficient-role | You are signed in and your account is valid, but it does not hold the staff role this application requires. |
| 403 | insufficient-scope | Your account holds the required staff role but is missing one or more of the scopes this application requires. The error detail names them. |
| 403 | invalid-scope | The key is valid but doesn't hold the scope this endpoint requires (scopes look like project:group:action). RSX ID's OIDC authorize endpoint also uses this slug with a 400 for a different problem: the scopes an application asked for are missing 'openid', include first-party-only scopes it may not receive, or, for an application bound to an RSX resource such as RSX MCP, include a scope that resource does not define. |
| 403 | private-scope | A developer key may only be scoped to public endpoints. One or more requested scopes are private (admin-issued keys only). |
| 403 | signin-not-configured | The surface requires RSX ID sign-in but is missing the application id or issuer settings it needs to check one. |
| 404 | key-not-found | No API key exists with the requested id (platform/v1). |
| 404 | not-found | The requested resource or endpoint does not exist (or is not publicly available). |
| 404 | version-not-found | The package exists but has no version by that name. |
| 409 | idempotency-key-in-flight | A request with this Idempotency-Key is still being processed. Answering now would mean running the operation twice, which is what the key exists to prevent. |
| 409 | key-limit-reached | A developer account has reached its maximum number of active API keys. |
| 410 | version-sunset | This API version passed its published sunset date and no longer serves requests (§6.8: deprecations are announced with Deprecation/Sunset headers well before this). |
| 422 | idempotency-key-reuse | This Idempotency-Key was already used with a different request body, which is a client bug rather than a retry. |
| 429 | rate-limit-exceeded | Your key's token bucket is empty. Every response carries X-RateLimit-* headers. |
| 500 | internal-error | Something failed on our side. The response's requestId identifies the exact request in our logs. |
Platform-wide errors
- Status
- 400
- Meaning
- The request body or query string did not match the endpoint's schema. The detail names each field that failed and why, in the form 'field: reason', separated by semicolons. A few endpoints answer 422 with this same slug when the shape is valid but the values contradict each other, such as two artefacts in one release claiming the same platform.
- Status
- 400
- Meaning
- All add actions require an Idempotency-Key header so a retried request can't create a duplicate.
- Status
- 401
- Meaning
- Key-management endpoints (/platform/v1/keys/*) authenticate with the platform admin token, not an API key.
- Status
- 401
- Meaning
- The supplied key is malformed or not recognised by the platform.
- Status
- 401
- Meaning
- A JWT-authenticated endpoint rejected the bearer token: missing, malformed, expired, wrong issuer/audience, or not signed by a known key. Also returned by RSX ID for an unrecognised, expired, or reused refresh token.
- Status
- 401
- Meaning
- The request reached an authenticated endpoint without an Authorization header.
- Status
- 401
- Meaning
- The key exists but has been revoked, or its rotation grace window has ended.
- Status
- 401
- Meaning
- The endpoint requires a platform API key and the request carried none that the gateway could verify.
- Status
- 403
- Meaning
- This endpoint (developer self-service API keys) needs an RSX ID developer account.
- Status
- 403
- Meaning
- You are signed in and your account is valid, but it does not hold the staff role this application requires.
- Status
- 403
- Meaning
- Your account holds the required staff role but is missing one or more of the scopes this application requires. The error detail names them.
- Status
- 403
- Meaning
- The key is valid but doesn't hold the scope this endpoint requires (scopes look like project:group:action). RSX ID's OIDC authorize endpoint also uses this slug with a 400 for a different problem: the scopes an application asked for are missing 'openid', include first-party-only scopes it may not receive, or, for an application bound to an RSX resource such as RSX MCP, include a scope that resource does not define.
- Status
- 403
- Meaning
- A developer key may only be scoped to public endpoints. One or more requested scopes are private (admin-issued keys only).
- Status
- 403
- Meaning
- The surface requires RSX ID sign-in but is missing the application id or issuer settings it needs to check one.
- Status
- 404
- Meaning
- No API key exists with the requested id (platform/v1).
- Status
- 404
- Meaning
- The requested resource or endpoint does not exist (or is not publicly available).
- Status
- 404
- Meaning
- The package exists but has no version by that name.
- Status
- 409
- Meaning
- A request with this Idempotency-Key is still being processed. Answering now would mean running the operation twice, which is what the key exists to prevent.
- Status
- 409
- Meaning
- A developer account has reached its maximum number of active API keys.
- Status
- 410
- Meaning
- This API version passed its published sunset date and no longer serves requests (§6.8: deprecations are announced with Deprecation/Sunset headers well before this).
- Status
- 422
- Meaning
- This Idempotency-Key was already used with a different request body, which is a client bug rather than a retry.
- Status
- 429
- Meaning
- Your key's token bucket is empty. Every response carries X-RateLimit-* headers.
- Status
- 500
- Meaning
- Something failed on our side. The response's requestId identifies the exact request in our logs.
RSX ID 34
Accounts, sessions, sign-in, OIDC, and connected external identities.
| Status | Error | Meaning |
|---|---|---|
| 400 | invalid-link-state | The state that ties a connection attempt to your account is invalid, expired, or already used. It is single-use and short-lived on purpose, so a redirect cannot be replayed. |
| 400 | invalid-redirect-uri | The OIDC redirect_uri does not exactly match one registered for this client (exact-match only, so no trailing slashes or path differences). |
| 400 | invalid-reset-token | The password-reset token is invalid, already used, or expired. |
| 400 | invalid-target | The authorization request named a resource (RFC 8707) that is not the one this application is registered for, or named one for an application that is not registered for any. An application bound to an RSX resource, such as RSX MCP, issues tokens for that resource only. |
| 400 | invalid-verification-token | The email-verification token is invalid, already used, or expired. |
| 400 | pkce-required | The application is a public client: it has no secret, so RSX ID requires every authorization request it makes to carry a PKCE code_challenge with code_challenge_method=S256. This one did not. |
| 400 | terms-notice-too-short | The effective date is less than 30 days away, the minimum notice the Terms of Service promise for a material change. |
| 401 | invalid-client | The OIDC client_id is not registered with RSX ID, or the client has been revoked. |
| 401 | invalid-credentials | Login failed: the email/handle or password is incorrect. The same error is returned for an unknown account and a wrong password, on purpose: RSX ID never reveals whether an identifier exists. |
| 401 | passkey-invalid | The passkey response could not be verified: the sign-in took too long, was already used, came from a page RSX does not accept passkeys on, or the signature did not check out. |
| 401 | passkey-not-registered | The passkey is not registered to any RSX ID. It may have been removed from the account. |
| 403 | account-suspended | The account is temporarily suspended by a platform admin. Login and access are blocked while suspended. |
| 403 | account-terminated | The account has been permanently terminated by a platform admin. |
| 403 | delegation-not-permitted | An RSX resource such as RSX MCP asked to act in an application on a person's behalf, and that application does not accept agents from it. Returned only on an internal call between RSX services; an agent sees it relayed as the reason a tool was refused. |
| 403 | email-not-verified | The action requires a verified email address, e.g. enabling a developer account. |
| 404 | account-not-found | No RSX ID account exists with the requested id (id/v1, admin surface). |
| 404 | identity-not-linked | The external identity (a Discord or GitHub user) is well-formed, but no RSX ID has it connected and verified. Distinct from account-not-found, which means an RSX account id didn't exist, and from a 400, which means the request itself was malformed. |
| 404 | passkey-not-found | No passkey with that id exists on this account. |
| 404 | session-not-found | No session exists with that id (RSX ID admin surface). |
| 404 | signin-not-permitted | The application is not registered for this sign-in flow, or the request did not arrive over an internal service binding. The embedded sign-in form is first-party only. |
| 404 | terms-revision-not-found | No current terms revision has that id. It may have been withdrawn. |
| 409 | email-taken | An account already uses this email address. |
| 409 | handle-reserved | The @handle was recently released by another account and is held in a 14-day cooldown, reclaimable only by its prior owner (anti-impersonation). |
| 409 | handle-taken | The requested @handle is already in use or is reserved by the platform. |
| 409 | link-already-claimed | That external account is already connected to a different RSX ID. One external identity maps to one RSX account, which is what makes a verified link mean anything. |
| 409 | passkey-limit | The account already holds the maximum number of passkeys, which is ten. |
| 409 | terms-in-force | The terms revision has taken effect and is part of the record, so it cannot be withdrawn. |
| 409 | terms-revision-scheduled | Another terms notice is pending. Only one may be scheduled at a time. |
| 413 | image-too-large | The image is larger than the 10 MiB limit for a profile picture. |
| 415 | image-unsupported | The file is not an image RSX can use as a profile picture, or it could not be decoded. PNG, JPEG, GIF, WebP and AVIF are accepted. |
| 502 | link-exchange-failed | The provider refused to exchange the authorization code for an identity, so the connection could not be completed. Nothing was linked. The detail carries the provider's own message. |
| 503 | avatar-unavailable | RSX ID could not reach the CDN to store or remove the picture. Nothing was changed. |
| 503 | link-unconfigured | Account linking for that provider has no credentials configured on this server yet. |
| 503 | passkeys-unavailable | This RSX ID deployment has no passkey relying party configured, so it cannot run a passkey ceremony. |
RSX ID errors
- Status
- 400
- Meaning
- The state that ties a connection attempt to your account is invalid, expired, or already used. It is single-use and short-lived on purpose, so a redirect cannot be replayed.
- Status
- 400
- Meaning
- The OIDC redirect_uri does not exactly match one registered for this client (exact-match only, so no trailing slashes or path differences).
- Status
- 400
- Meaning
- The password-reset token is invalid, already used, or expired.
- Status
- 400
- Meaning
- The authorization request named a resource (RFC 8707) that is not the one this application is registered for, or named one for an application that is not registered for any. An application bound to an RSX resource, such as RSX MCP, issues tokens for that resource only.
- Status
- 400
- Meaning
- The email-verification token is invalid, already used, or expired.
- Status
- 400
- Meaning
- The application is a public client: it has no secret, so RSX ID requires every authorization request it makes to carry a PKCE code_challenge with code_challenge_method=S256. This one did not.
- Status
- 400
- Meaning
- The effective date is less than 30 days away, the minimum notice the Terms of Service promise for a material change.
- Status
- 401
- Meaning
- The OIDC client_id is not registered with RSX ID, or the client has been revoked.
- Status
- 401
- Meaning
- Login failed: the email/handle or password is incorrect. The same error is returned for an unknown account and a wrong password, on purpose: RSX ID never reveals whether an identifier exists.
- Status
- 401
- Meaning
- The passkey response could not be verified: the sign-in took too long, was already used, came from a page RSX does not accept passkeys on, or the signature did not check out.
- Status
- 401
- Meaning
- The passkey is not registered to any RSX ID. It may have been removed from the account.
- Status
- 403
- Meaning
- The account is temporarily suspended by a platform admin. Login and access are blocked while suspended.
- Status
- 403
- Meaning
- The account has been permanently terminated by a platform admin.
- Status
- 403
- Meaning
- An RSX resource such as RSX MCP asked to act in an application on a person's behalf, and that application does not accept agents from it. Returned only on an internal call between RSX services; an agent sees it relayed as the reason a tool was refused.
- Status
- 403
- Meaning
- The action requires a verified email address, e.g. enabling a developer account.
- Status
- 404
- Meaning
- No RSX ID account exists with the requested id (id/v1, admin surface).
- Status
- 404
- Meaning
- The external identity (a Discord or GitHub user) is well-formed, but no RSX ID has it connected and verified. Distinct from account-not-found, which means an RSX account id didn't exist, and from a 400, which means the request itself was malformed.
- Status
- 404
- Meaning
- No passkey with that id exists on this account.
- Status
- 404
- Meaning
- No session exists with that id (RSX ID admin surface).
- Status
- 404
- Meaning
- The application is not registered for this sign-in flow, or the request did not arrive over an internal service binding. The embedded sign-in form is first-party only.
- Status
- 404
- Meaning
- No current terms revision has that id. It may have been withdrawn.
- Status
- 409
- Meaning
- An account already uses this email address.
- Status
- 409
- Meaning
- The @handle was recently released by another account and is held in a 14-day cooldown, reclaimable only by its prior owner (anti-impersonation).
- Status
- 409
- Meaning
- The requested @handle is already in use or is reserved by the platform.
- Status
- 409
- Meaning
- That external account is already connected to a different RSX ID. One external identity maps to one RSX account, which is what makes a verified link mean anything.
- Status
- 409
- Meaning
- The account already holds the maximum number of passkeys, which is ten.
- Status
- 409
- Meaning
- The terms revision has taken effect and is part of the record, so it cannot be withdrawn.
- Status
- 409
- Meaning
- Another terms notice is pending. Only one may be scheduled at a time.
- Status
- 413
- Meaning
- The image is larger than the 10 MiB limit for a profile picture.
- Status
- 415
- Meaning
- The file is not an image RSX can use as a profile picture, or it could not be decoded. PNG, JPEG, GIF, WebP and AVIF are accepted.
- Status
- 502
- Meaning
- The provider refused to exchange the authorization code for an identity, so the connection could not be completed. Nothing was linked. The detail carries the provider's own message.
- Status
- 503
- Meaning
- RSX ID could not reach the CDN to store or remove the picture. Nothing was changed.
- Status
- 503
- Meaning
- Account linking for that provider has no credentials configured on this server yet.
- Status
- 503
- Meaning
- This RSX ID deployment has no passkey relying party configured, so it cannot run a passkey ceremony.
RSX CDN 35
The files/v1 control plane: uploads, objects, quotas, share links, and archive browsing.
| Status | Error | Meaning |
|---|---|---|
| 400 | entry-is-directory | The requested entry is a directory record, which has no contents of its own. |
| 400 | hash-required | Small uploads go up in a single request, and those must declare a sha-256 digest so the stored bytes can be verified against what was promised. |
| 400 | invalid-part | A reported part number is outside the range this session has. The detail names the part and how many parts exist. |
| 403 | forbidden | The caller asked to act as the CDN's service principal without the scope that permits it, or sent an API key where a user token was required. |
| 403 | uploads-blocked | Uploading is disabled for this account specifically, by an RSX admin. The detail carries the reason when one was recorded. |
| 404 | blob-not-found | The database has a record of the stored bytes but the bytes themselves are not in storage. This is an inconsistency, not a normal missing file. |
| 404 | entry-not-found | The archive has no entry at that index. Entry indexes come from the archive listing and are not stable across re-uploads. |
| 404 | object-not-found | No file exists with that id, or it belongs to another account. The two are deliberately the same answer, so an id cannot be probed to learn whether it exists. |
| 404 | upload-not-found | No upload session exists with that id. Sessions are per-account, and an expired one is swept away. |
| 409 | already-owned | The file is already owned by the account it was being transferred to, so there is nothing to change. |
| 409 | already-revoked | The share link has already been revoked, so revoking it again would change nothing. |
| 409 | manifest-unavailable | The archive's index is still being built, or this file has none because it is not a readable archive. The detail says which. |
| 409 | multipart-complete-failed | Storage rejected the list of parts when assembling the final object, usually because a part is missing, was re-uploaded, or has a mismatched ETag. |
| 409 | not-multipart | This session is a single PUT, so it has no parts to report. Whether a session is multipart is decided when it is opened, from the declared size. |
| 409 | not-revoked | The share link is live, so there is nothing to restore. |
| 409 | text-preview-unavailable | The text preview is still being built, or this file has none because it is not readable text. The detail says which. |
| 409 | upload-aborted | The session was aborted, either by you or by the sweep that clears abandoned uploads. |
| 409 | upload-closed | The session has already been completed or aborted, so it cannot take more parts. The detail names its current state. |
| 409 | upload-incomplete | Finalising was attempted before every part had been written. The detail says how many of the expected parts arrived. |
| 409 | wipe-in-progress | A wipe of this account's files is already running. Starting a second one would race the first. |
| 413 | entry-too-large | The entry is above the size the API will extract on its own. The detail names the limit in bytes. |
| 413 | object-too-large | The declared size is above the platform's maximum object size. The detail names the limit in bytes. |
| 415 | entry-not-extractable | The entry is encrypted, or uses a compression method the extractor cannot decode. |
| 500 | blob-insert-failed | The uploaded bytes were stored but their database row could not be read back after insert. |
| 500 | entry-unreadable | The entry's bytes could not be read out of the stored archive. |
| 500 | manifest-missing | The archive is marked as indexed, but the stored index could not be read back. |
| 500 | object-insert-failed | The file was stored but its database row could not be read back, so no share link could be issued. The bytes are not lost. |
| 500 | object-update-failed | The file's row disappeared between reading it and writing the change, which should not happen. |
| 500 | sniff-failed | The stored bytes could not be read back for content-type detection during finalise. |
| 500 | text-preview-missing | The file is marked as having a text preview, but the stored preview could not be read back. |
| 500 | upload-corrupt | The session row is missing state it cannot work without, such as its storage key or its multipart id. It cannot be finished. |
| 500 | upload-insert-failed | The upload session was created but its row could not be read back, so no session id could be returned. |
| 500 | upload-vanished | The session row disappeared while it was being updated, which should not happen. |
| 503 | uploads-disabled | New uploads are paused across the whole platform by an RSX admin. Existing files are unaffected. |
| 507 | quota-exceeded | This upload would take the account past its storage limit. The detail states how many bytes the upload needs and how many remain. |
RSX CDN errors
- Status
- 400
- Meaning
- The requested entry is a directory record, which has no contents of its own.
- Status
- 400
- Meaning
- Small uploads go up in a single request, and those must declare a sha-256 digest so the stored bytes can be verified against what was promised.
- Status
- 400
- Meaning
- A reported part number is outside the range this session has. The detail names the part and how many parts exist.
- Status
- 403
- Meaning
- The caller asked to act as the CDN's service principal without the scope that permits it, or sent an API key where a user token was required.
- Status
- 403
- Meaning
- Uploading is disabled for this account specifically, by an RSX admin. The detail carries the reason when one was recorded.
- Status
- 404
- Meaning
- The database has a record of the stored bytes but the bytes themselves are not in storage. This is an inconsistency, not a normal missing file.
- Status
- 404
- Meaning
- The archive has no entry at that index. Entry indexes come from the archive listing and are not stable across re-uploads.
- Status
- 404
- Meaning
- No file exists with that id, or it belongs to another account. The two are deliberately the same answer, so an id cannot be probed to learn whether it exists.
- Status
- 404
- Meaning
- No upload session exists with that id. Sessions are per-account, and an expired one is swept away.
- Status
- 409
- Meaning
- The file is already owned by the account it was being transferred to, so there is nothing to change.
- Status
- 409
- Meaning
- The share link has already been revoked, so revoking it again would change nothing.
- Status
- 409
- Meaning
- The archive's index is still being built, or this file has none because it is not a readable archive. The detail says which.
- Status
- 409
- Meaning
- Storage rejected the list of parts when assembling the final object, usually because a part is missing, was re-uploaded, or has a mismatched ETag.
- Status
- 409
- Meaning
- This session is a single PUT, so it has no parts to report. Whether a session is multipart is decided when it is opened, from the declared size.
- Status
- 409
- Meaning
- The share link is live, so there is nothing to restore.
- Status
- 409
- Meaning
- The text preview is still being built, or this file has none because it is not readable text. The detail says which.
- Status
- 409
- Meaning
- The session was aborted, either by you or by the sweep that clears abandoned uploads.
- Status
- 409
- Meaning
- The session has already been completed or aborted, so it cannot take more parts. The detail names its current state.
- Status
- 409
- Meaning
- Finalising was attempted before every part had been written. The detail says how many of the expected parts arrived.
- Status
- 409
- Meaning
- A wipe of this account's files is already running. Starting a second one would race the first.
- Status
- 413
- Meaning
- The entry is above the size the API will extract on its own. The detail names the limit in bytes.
- Status
- 413
- Meaning
- The declared size is above the platform's maximum object size. The detail names the limit in bytes.
- Status
- 415
- Meaning
- The entry is encrypted, or uses a compression method the extractor cannot decode.
- Status
- 500
- Meaning
- The uploaded bytes were stored but their database row could not be read back after insert.
- Status
- 500
- Meaning
- The entry's bytes could not be read out of the stored archive.
- Status
- 500
- Meaning
- The archive is marked as indexed, but the stored index could not be read back.
- Status
- 500
- Meaning
- The file was stored but its database row could not be read back, so no share link could be issued. The bytes are not lost.
- Status
- 500
- Meaning
- The file's row disappeared between reading it and writing the change, which should not happen.
- Status
- 500
- Meaning
- The stored bytes could not be read back for content-type detection during finalise.
- Status
- 500
- Meaning
- The file is marked as having a text preview, but the stored preview could not be read back.
- Status
- 500
- Meaning
- The session row is missing state it cannot work without, such as its storage key or its multipart id. It cannot be finished.
- Status
- 500
- Meaning
- The upload session was created but its row could not be read back, so no session id could be returned.
- Status
- 500
- Meaning
- The session row disappeared while it was being updated, which should not happen.
- Status
- 503
- Meaning
- New uploads are paused across the whole platform by an RSX admin. Existing files are unaffected.
- Status
- 507
- Meaning
- This upload would take the account past its storage limit. The detail states how many bytes the upload needs and how many remain.
RSX Registry 25
npm packages, Cargo crates, platform binaries and OCI images.
| Status | Error | Meaning |
|---|---|---|
| 400 | unsupported-platform | The release has no artefact for the platform requested, or ships several and the request named none. A Native release's platform is its architecture, x86_64 or any. |
| 400 | unsupported-protocol | The registry distributes npm packages, Cargo crates, platform binaries, OCI images and Native packages. Other package ecosystems are deliberately out of scope rather than not yet built. |
| 403 | package-access-denied | The key is valid and holds the right scope, but the package belongs to a different key. A package belongs to the key that created it, because every key on this surface holds the same scopes and scope alone cannot keep two publishers out of each other's namespaces. |
| 404 | artefact-not-found | The version's metadata is intact but the stored bytes it references are not in storage. This is a registry fault rather than a problem with the request. |
| 404 | package-not-found | No package of that name exists under that protocol, or it exists and this key is not among the consumers it is available to. The two answer the same way on purpose: a package whose audience has been narrowed should not be discoverable by guessing its name. |
| 409 | app-review-conflict | The review, channel or publication change is not allowed from the release's or repository's current state, for example approving a revoked release, pointing a channel at an unapproved release, revoking a channel's target, or publishing after someone else did. |
| 409 | native-review-conflict | The review, default or publication change is not allowed from the release's or repository's current state. Examples: approving a revoked release, revoking a package's default, or publishing after someone else already published. |
| 409 | package-exists | A package of that name already exists under that protocol. Names are unique per protocol, and a withdrawn package still owns its name. |
| 409 | publication-incomplete | The version was declared but not all of its artefacts have been uploaded and verified, so it cannot be resolved. A release becomes resolvable when its last artefact arrives, never before. |
| 409 | version-exists | That version is already published, and a published version is immutable: its bytes and metadata are what they were when it was published, permanently. Republishing identical content succeeds as a retry; anything else, including unpublishing and yanking, is refused. |
| 410 | app-release-revoked | The installer belongs to a revoked release, so the internal repository no longer serves it. |
| 411 | length-required | An artefact upload arrived without a Content-Length. Object storage cannot accept a body whose size is not known in advance, so there is nothing to write. |
| 413 | artefact-too-large | The artefact exceeds the limit for how it is being uploaded. Single-request uploads are bounded by object storage; npm tarballs and Cargo crates are bounded more tightly because their protocols carry the bytes inside the request body. |
| 422 | app-asset-invalid | The uploaded installer failed validation, or does not match the platform, version or signing identity the release and application expect. app/get lists the findings. |
| 422 | app-keys-invalid | The application keys document is not signed by a pinned root key, is not newer than the current one, lists no keys, or has expired. |
| 422 | app-quota-exceeded | The release would take the application past its storage quota. |
| 422 | digest-mismatch | The uploaded bytes do not match what the release declared: a different content digest, a different size, or a digest belonging to no artefact of that release. Every artefact is verified against its declared digest as it is stored, so a mismatch is refused rather than recorded. |
| 422 | invalid-package-name | The name is not legal in the ecosystem it was published under. Each ecosystem's own rule applies, because a name its client will not install is not a name worth accepting. |
| 422 | invalid-version | The version is not valid for that protocol. npm, Cargo and binary releases take semantic versions; an OCI release takes a tag; a Native release takes Native's own version string, which is never ordered. |
| 422 | native-archive-invalid | The uploaded archive is not a valid Native package, or its manifest does not name the release that was declared. The registry checks archives with the same rules as Native's installer, so this archive would not install either. |
| 422 | native-keys-invalid | The keys document is not signed by a pinned root key, names another repository, is not newer than the current one, or has already expired. |
| 503 | app-signing-unavailable | The application repositories' online signing key is missing, malformed or not listed in the current keys document, so nothing was signed or published. |
| 503 | app-snapshot-failed | A new generation of an application repository could not be completed. The current generation is unchanged and clients are unaffected. |
| 503 | native-signing-unavailable | The Native repository's online signing key is missing or malformed, or the current keys document does not list it, or that document has expired. Nothing was signed or published. |
| 503 | native-snapshot-failed | A new generation of the Native repository could not be completed. The current generation is unchanged and clients are unaffected. |
RSX Registry errors
- Status
- 400
- Meaning
- The release has no artefact for the platform requested, or ships several and the request named none. A Native release's platform is its architecture, x86_64 or any.
- Status
- 400
- Meaning
- The registry distributes npm packages, Cargo crates, platform binaries, OCI images and Native packages. Other package ecosystems are deliberately out of scope rather than not yet built.
- Status
- 403
- Meaning
- The key is valid and holds the right scope, but the package belongs to a different key. A package belongs to the key that created it, because every key on this surface holds the same scopes and scope alone cannot keep two publishers out of each other's namespaces.
- Status
- 404
- Meaning
- The version's metadata is intact but the stored bytes it references are not in storage. This is a registry fault rather than a problem with the request.
- Status
- 404
- Meaning
- No package of that name exists under that protocol, or it exists and this key is not among the consumers it is available to. The two answer the same way on purpose: a package whose audience has been narrowed should not be discoverable by guessing its name.
- Status
- 409
- Meaning
- The review, channel or publication change is not allowed from the release's or repository's current state, for example approving a revoked release, pointing a channel at an unapproved release, revoking a channel's target, or publishing after someone else did.
- Status
- 409
- Meaning
- The review, default or publication change is not allowed from the release's or repository's current state. Examples: approving a revoked release, revoking a package's default, or publishing after someone else already published.
- Status
- 409
- Meaning
- A package of that name already exists under that protocol. Names are unique per protocol, and a withdrawn package still owns its name.
- Status
- 409
- Meaning
- The version was declared but not all of its artefacts have been uploaded and verified, so it cannot be resolved. A release becomes resolvable when its last artefact arrives, never before.
- Status
- 409
- Meaning
- That version is already published, and a published version is immutable: its bytes and metadata are what they were when it was published, permanently. Republishing identical content succeeds as a retry; anything else, including unpublishing and yanking, is refused.
- Status
- 410
- Meaning
- The installer belongs to a revoked release, so the internal repository no longer serves it.
- Status
- 411
- Meaning
- An artefact upload arrived without a Content-Length. Object storage cannot accept a body whose size is not known in advance, so there is nothing to write.
- Status
- 413
- Meaning
- The artefact exceeds the limit for how it is being uploaded. Single-request uploads are bounded by object storage; npm tarballs and Cargo crates are bounded more tightly because their protocols carry the bytes inside the request body.
- Status
- 422
- Meaning
- The uploaded installer failed validation, or does not match the platform, version or signing identity the release and application expect. app/get lists the findings.
- Status
- 422
- Meaning
- The application keys document is not signed by a pinned root key, is not newer than the current one, lists no keys, or has expired.
- Status
- 422
- Meaning
- The release would take the application past its storage quota.
- Status
- 422
- Meaning
- The uploaded bytes do not match what the release declared: a different content digest, a different size, or a digest belonging to no artefact of that release. Every artefact is verified against its declared digest as it is stored, so a mismatch is refused rather than recorded.
- Status
- 422
- Meaning
- The name is not legal in the ecosystem it was published under. Each ecosystem's own rule applies, because a name its client will not install is not a name worth accepting.
- Status
- 422
- Meaning
- The version is not valid for that protocol. npm, Cargo and binary releases take semantic versions; an OCI release takes a tag; a Native release takes Native's own version string, which is never ordered.
- Status
- 422
- Meaning
- The uploaded archive is not a valid Native package, or its manifest does not name the release that was declared. The registry checks archives with the same rules as Native's installer, so this archive would not install either.
- Status
- 422
- Meaning
- The keys document is not signed by a pinned root key, names another repository, is not newer than the current one, or has already expired.
- Status
- 503
- Meaning
- The application repositories' online signing key is missing, malformed or not listed in the current keys document, so nothing was signed or published.
- Status
- 503
- Meaning
- A new generation of an application repository could not be completed. The current generation is unchanged and clients are unaffected.
- Status
- 503
- Meaning
- The Native repository's online signing key is missing or malformed, or the current keys document does not list it, or that document has expired. Nothing was signed or published.
- Status
- 503
- Meaning
- A new generation of the Native repository could not be completed. The current generation is unchanged and clients are unaffected.
RSX Node 19
Node registration, desired state, and published builds.
| Status | Error | Meaning |
|---|---|---|
| 400 | ingress-zone-not-allowed | The hostname is not in a zone this control plane is allowed to write DNS for. |
| 403 | node-not-yours | The API key is valid but does not speak for that node. A node's key may only read and write its own state. |
| 404 | asset-not-found | No release asset with that id exists on the releases repository, or it is older than the most recent thirty releases, which is as far back as this lookup goes. |
| 404 | job-not-declared | A run names a job, and this node's desired state declares no job with that id. What a run executes is the job's declaration, so there is nothing to run. |
| 404 | no-tunnel | The node has no Cloudflare Tunnel yet, so it has no token to seal. |
| 404 | node-not-registered | No node exists with that id. A node registers itself on first contact, and must do so before it can be given work or report state. |
| 409 | hostname-has-record | The hostname has a DNS record this service did not create, and it will not overwrite one. |
| 409 | hostname-taken | The hostname is already routed to a workload on another node. A hostname belongs to one node at a time. |
| 409 | no-digest | The chosen build has no .sha256 file published beside it, so a node would have nothing to verify the download against. |
| 409 | node-cannot-receive-secrets | The node has not registered a sealing key, so nothing can be sealed to it. Nodes before rsx-node 0.2.0 have none. |
| 409 | node-too-old | The node's build predates this command kind. Nodes before rsx-node 0.2.0 cannot read a command list containing a kind they do not know, so issuing one would also block every other command to that node until it expired. |
| 409 | sealed-to-another-key | The value was sealed to a sealing key the node has since replaced, usually because it was rebuilt. It could never be opened. |
| 501 | releases-not-configured | This service has no GitHub credentials, so it cannot list published node builds. |
| 502 | ingress-sync-failed | Cloudflare refused or failed a change the ingress needed. Desired state was not stored, so the node is still running what it was. |
| 502 | no-download-url | GitHub did not return a download location for the chosen release asset. |
| 502 | registry-unavailable | A container version could not be resolved to a verifiable image digest. Either RSX Registry answered with an error or without a digest (502), or this service has no registry binding at all (501). |
| 502 | releases-unavailable | GitHub refused the request for the node's published builds. The detail carries the status GitHub returned. |
| 503 | ingress-access-not-configured | A hostname asks for Cloudflare Access in front, and the policies to apply are not configured. |
| 503 | ingress-not-configured | A workload declares ingress, and this control plane has no Cloudflare account, allowed zones or pinned cloudflared image configured to serve it. |
RSX Node errors
- Status
- 400
- Meaning
- The hostname is not in a zone this control plane is allowed to write DNS for.
- Status
- 403
- Meaning
- The API key is valid but does not speak for that node. A node's key may only read and write its own state.
- Status
- 404
- Meaning
- No release asset with that id exists on the releases repository, or it is older than the most recent thirty releases, which is as far back as this lookup goes.
- Status
- 404
- Meaning
- A run names a job, and this node's desired state declares no job with that id. What a run executes is the job's declaration, so there is nothing to run.
- Status
- 404
- Meaning
- The node has no Cloudflare Tunnel yet, so it has no token to seal.
- Status
- 404
- Meaning
- No node exists with that id. A node registers itself on first contact, and must do so before it can be given work or report state.
- Status
- 409
- Meaning
- The hostname has a DNS record this service did not create, and it will not overwrite one.
- Status
- 409
- Meaning
- The hostname is already routed to a workload on another node. A hostname belongs to one node at a time.
- Status
- 409
- Meaning
- The chosen build has no .sha256 file published beside it, so a node would have nothing to verify the download against.
- Status
- 409
- Meaning
- The node has not registered a sealing key, so nothing can be sealed to it. Nodes before rsx-node 0.2.0 have none.
- Status
- 409
- Meaning
- The node's build predates this command kind. Nodes before rsx-node 0.2.0 cannot read a command list containing a kind they do not know, so issuing one would also block every other command to that node until it expired.
- Status
- 409
- Meaning
- The value was sealed to a sealing key the node has since replaced, usually because it was rebuilt. It could never be opened.
- Status
- 501
- Meaning
- This service has no GitHub credentials, so it cannot list published node builds.
- Status
- 502
- Meaning
- Cloudflare refused or failed a change the ingress needed. Desired state was not stored, so the node is still running what it was.
- Status
- 502
- Meaning
- GitHub did not return a download location for the chosen release asset.
- Status
- 502
- Meaning
- A container version could not be resolved to a verifiable image digest. Either RSX Registry answered with an error or without a digest (502), or this service has no registry binding at all (501).
- Status
- 502
- Meaning
- GitHub refused the request for the node's published builds. The detail carries the status GitHub returned.
- Status
- 503
- Meaning
- A hostname asks for Cloudflare Access in front, and the policies to apply are not configured.
- Status
- 503
- Meaning
- A workload declares ingress, and this control plane has no Cloudflare account, allowed zones or pinned cloudflared image configured to serve it.
RSX State 6
Persistent consumer state and its audit history.
| Status | Error | Meaning |
|---|---|---|
| 403 | audit-source-not-yours | The audit source was claimed by a different API key, on the same rule as namespaces: the first key to record an event under a source owns it. |
| 403 | state-namespace-not-yours | The RSX State namespace was claimed by a different API key. The first key to write to a namespace owns it, because every key on that service holds the same scopes and scope alone cannot keep two consumers apart. |
| 404 | audit-event-not-found | No audit event has that id, or it belongs to a source your key did not claim. The two answer alike on purpose: an event id is opaque, so confirming one exists but is not yours would tell you nothing useful. |
| 404 | state-entry-not-found | Nothing is stored at that key in that namespace on RSX State. |
| 422 | invalid-audit-event | The audit event contains a field RSX State will not store, most often metadata over the 8 KiB serialised limit. |
| 422 | invalid-state-value | The state value is missing, or it exceeds the 32 KiB serialised limit. The limit is deliberate: RSX State stores documents a program needs in memory, not files. |
RSX State errors
- Status
- 403
- Meaning
- The audit source was claimed by a different API key, on the same rule as namespaces: the first key to record an event under a source owns it.
- Status
- 403
- Meaning
- The RSX State namespace was claimed by a different API key. The first key to write to a namespace owns it, because every key on that service holds the same scopes and scope alone cannot keep two consumers apart.
- Status
- 404
- Meaning
- No audit event has that id, or it belongs to a source your key did not claim. The two answer alike on purpose: an event id is opaque, so confirming one exists but is not yours would tell you nothing useful.
- Status
- 404
- Meaning
- Nothing is stored at that key in that namespace on RSX State.
- Status
- 422
- Meaning
- The audit event contains a field RSX State will not store, most often metadata over the 8 KiB serialised limit.
- Status
- 422
- Meaning
- The state value is missing, or it exceeds the 32 KiB serialised limit. The limit is deliberate: RSX State stores documents a program needs in memory, not files.
RSX Status 6
The service catalogue, incidents and maintenance windows behind status.rsx.group.
| Status | Error | Meaning |
|---|---|---|
| 404 | incident-not-found | No incident exists with the requested id (status/v1). |
| 404 | maintenance-not-found | No maintenance window exists with the requested id (status/v1). |
| 404 | service-not-found | No service with that slug is displayed on the RSX status page (status/v1). A service an operator has taken off the page answers the same way as one that never existed. |
| 409 | status-slug-taken | A service with that slug is already in the status catalogue. Slugs are the public identifier a visitor bookmarks and an external monitor polls, so they are not reused while the first service exists. |
| 422 | invalid-status-record | The request matched its schema but described something impossible: an unknown service slug, a maintenance window that ends before it starts, an incident resolving before it began, or a probe run naming no service in the catalogue. |
| 503 | status-data-unavailable | The status service could not produce current state. This is a failure of the status system itself and says nothing about the services it reports on: it is returned instead of a generic error so that a status page renders 'status data unavailable' rather than the last state it happened to remember. |
RSX Status errors
- Status
- 404
- Meaning
- No incident exists with the requested id (status/v1).
- Status
- 404
- Meaning
- No maintenance window exists with the requested id (status/v1).
- Status
- 404
- Meaning
- No service with that slug is displayed on the RSX status page (status/v1). A service an operator has taken off the page answers the same way as one that never existed.
- Status
- 409
- Meaning
- A service with that slug is already in the status catalogue. Slugs are the public identifier a visitor bookmarks and an external monitor polls, so they are not reused while the first service exists.
- Status
- 422
- Meaning
- The request matched its schema but described something impossible: an unknown service slug, a maintenance window that ends before it starts, an incident resolving before it began, or a probe run naming no service in the catalogue.
- Status
- 503
- Meaning
- The status service could not produce current state. This is a failure of the status system itself and says nothing about the services it reports on: it is returned instead of a generic error so that a status page renders 'status data unavailable' rather than the last state it happened to remember.
RSX Webhooks 7
The GitHub App receiver and the Discord relay it feeds.
| Status | Error | Meaning |
|---|---|---|
| 400 | invalid-payload | The delivery body was not valid JSON, so there was nothing to relay. |
| 401 | invalid-signature | The delivery's HMAC signature did not verify against the configured secret. The receiver takes no other credential, so an unsigned or mis-signed body is refused outright. |
| 404 | repo-not-found | No tracked repository exists with that id. A repository appears here once the GitHub App is installed on it. |
| 422 | discord-permissions | The relay bot cannot operate in the target channel or category. This is checked before a repository is switched on, so the gap surfaces here rather than as silence later. The detail names what is missing. |
| 502 | discord-channel-failed | Discord refused to create the relay channel for this repository, after the permission preflight had passed. The detail carries Discord's own message. |
| 502 | discord-delete-failed | Discord refused to delete the relay channel. Nothing was changed, so the repository is still tracked as it was. |
| 503 | webhooks-unconfigured | The webhook receiver has no signing secret configured, so it cannot verify that a delivery came from GitHub. |
RSX Webhooks errors
- Status
- 400
- Meaning
- The delivery body was not valid JSON, so there was nothing to relay.
- Status
- 401
- Meaning
- The delivery's HMAC signature did not verify against the configured secret. The receiver takes no other credential, so an unsigned or mis-signed body is refused outright.
- Status
- 404
- Meaning
- No tracked repository exists with that id. A repository appears here once the GitHub App is installed on it.
- Status
- 422
- Meaning
- The relay bot cannot operate in the target channel or category. This is checked before a repository is switched on, so the gap surfaces here rather than as silence later. The detail names what is missing.
- Status
- 502
- Meaning
- Discord refused to create the relay channel for this repository, after the permission preflight had passed. The detail carries Discord's own message.
- Status
- 502
- Meaning
- Discord refused to delete the relay channel. Nothing was changed, so the repository is still tracked as it was.
- Status
- 503
- Meaning
- The webhook receiver has no signing secret configured, so it cannot verify that a delivery came from GitHub.
RSX Projects 27
Internal. Projects, work items, specifications and the activity behind them; a third-party caller does not reach these.
| Status | Error | Meaning |
|---|---|---|
| 400 | invalid-search-query | The search expression could not be parsed. Full-text syntax is available: quoted phrases, AND, OR and NOT between terms, and a trailing asterisk for a prefix. |
| 403 | project-access-denied | The account is signed in and admitted to RSX Projects, but its role on this project does not permit the operation. This is a project permission, not the RSX ID staff gate. |
| 404 | activity-not-found | No activity entry matches that id. |
| 404 | comment-not-found | No comment matches that id, or it has been deleted. |
| 404 | document-not-found | No document matches the id, or the project and slug pair. |
| 404 | document-revision-not-found | The document has no revision with that version number. |
| 404 | label-not-found | No label matches that id. |
| 404 | member-not-found | The account is not a member of this project. |
| 404 | milestone-not-found | No milestone matches that id. |
| 404 | project-not-found | No project matches the id or slug in the request. |
| 404 | reference-not-found | No external reference matches that id. |
| 404 | relationship-not-found | Those two work items are not connected by that relationship. |
| 404 | revision-not-found | The specification exists but has no revision with that version number. |
| 404 | specification-not-found | No specification matches the id, or the project and slug pair. |
| 404 | work-not-found | No work item matches the id, or the project and number pair. |
| 409 | entity-archived | The record is archived and is read only. Archiving is what remove does on this surface, so the record still exists and still resolves. |
| 409 | last-owner | The operation would leave the project with no owner, and a project with no owner has nobody answerable for it. |
| 409 | project-builtin | The project is a platform project, such as the documentation docs.rsx.group publishes, and cannot be archived or purged. |
| 409 | project-not-archived | A purge was asked for on a live project. Purging destroys a project and everything under it, so it is never the first thing that happens to data somebody is using. |
| 409 | purge-not-confirmed | A purge must repeat the project's slug in the confirm field, so that it cannot be done by sending the wrong id. |
| 409 | relationship-conflict | The relationship is already recorded, or its opposite is. A symmetric relationship is stored once, so it may have been added from the other end, and two items cannot block each other. |
| 409 | slug-taken | Another record in the same scope already uses this slug. Project slugs are unique platform wide; specification and document slugs are unique within their project. |
| 409 | specification-not-editable | The specification has been superseded and its content is frozen. Its revision history stays readable. |
| 422 | import-not-parseable | The file could not be read as a specification or a document. It needs a title and a slug, from its front matter or from the request, and the slug must be lowercase letters, digits and single hyphens. |
| 422 | invalid-relationship | The relationship cannot exist: a work item cannot be related to itself, and both ends must be in the same project. |
| 422 | invalid-specification-state | A specification cannot supersede itself, and a replacement must be in the same project. |
| 422 | invalid-work-reference | The work item named a milestone, label or specification belonging to a different project, or named more than one governing specification. Platform-wide labels are attachable from anywhere; a project's own are not. |
RSX Projects errors
- Status
- 400
- Meaning
- The search expression could not be parsed. Full-text syntax is available: quoted phrases, AND, OR and NOT between terms, and a trailing asterisk for a prefix.
- Status
- 403
- Meaning
- The account is signed in and admitted to RSX Projects, but its role on this project does not permit the operation. This is a project permission, not the RSX ID staff gate.
- Status
- 404
- Meaning
- No activity entry matches that id.
- Status
- 404
- Meaning
- No comment matches that id, or it has been deleted.
- Status
- 404
- Meaning
- No document matches the id, or the project and slug pair.
- Status
- 404
- Meaning
- The document has no revision with that version number.
- Status
- 404
- Meaning
- No label matches that id.
- Status
- 404
- Meaning
- The account is not a member of this project.
- Status
- 404
- Meaning
- No milestone matches that id.
- Status
- 404
- Meaning
- No project matches the id or slug in the request.
- Status
- 404
- Meaning
- No external reference matches that id.
- Status
- 404
- Meaning
- Those two work items are not connected by that relationship.
- Status
- 404
- Meaning
- The specification exists but has no revision with that version number.
- Status
- 404
- Meaning
- No specification matches the id, or the project and slug pair.
- Status
- 404
- Meaning
- No work item matches the id, or the project and number pair.
- Status
- 409
- Meaning
- The record is archived and is read only. Archiving is what remove does on this surface, so the record still exists and still resolves.
- Status
- 409
- Meaning
- The operation would leave the project with no owner, and a project with no owner has nobody answerable for it.
- Status
- 409
- Meaning
- The project is a platform project, such as the documentation docs.rsx.group publishes, and cannot be archived or purged.
- Status
- 409
- Meaning
- A purge was asked for on a live project. Purging destroys a project and everything under it, so it is never the first thing that happens to data somebody is using.
- Status
- 409
- Meaning
- A purge must repeat the project's slug in the confirm field, so that it cannot be done by sending the wrong id.
- Status
- 409
- Meaning
- The relationship is already recorded, or its opposite is. A symmetric relationship is stored once, so it may have been added from the other end, and two items cannot block each other.
- Status
- 409
- Meaning
- Another record in the same scope already uses this slug. Project slugs are unique platform wide; specification and document slugs are unique within their project.
- Status
- 409
- Meaning
- The specification has been superseded and its content is frozen. Its revision history stays readable.
- Status
- 422
- Meaning
- The file could not be read as a specification or a document. It needs a title and a slug, from its front matter or from the request, and the slug must be lowercase letters, digits and single hyphens.
- Status
- 422
- Meaning
- The relationship cannot exist: a work item cannot be related to itself, and both ends must be in the same project.
- Status
- 422
- Meaning
- A specification cannot supersede itself, and a replacement must be in the same project.
- Status
- 422
- Meaning
- The work item named a milestone, label or specification belonging to a different project, or named more than one governing specification. Platform-wide labels are attachable from anywhere; a project's own are not.
RSX Access 11
Installing RSX applications and integrations, such as Roxy: whether you may, into what, and the state of what you installed.
| Status | Error | Meaning |
|---|---|---|
| 400 | installation-state-invalid | The link that ties this installation to your RSX ID is invalid, has expired, has already been used, or was started from a different RSX ID. It is single-use and lasts ten minutes, so a Discord redirect cannot be replayed or finished by somebody else. |
| 403 | application-disabled | The application is registered but is not accepting new installations right now. Installations that already exist are unaffected. |
| 404 | application-not-found | No application with that id is registered with RSX Access. |
| 404 | installation-not-found | No installation with that id belongs to your RSX ID. An installation that exists but belongs to someone else gets the same answer. |
| 409 | application-exists | An application with that id is already registered. An id is permanent: it is part of the scope that gates the application, so it cannot be reused for something else. |
| 409 | installation-revoked | The installation has already been revoked. A revoked installation stays on record and is never reactivated. |
| 422 | installation-not-supported | The application cannot be installed into this kind of target, for example a personal installation of an application that only supports Discord servers. The detail lists what it supports. |
| 422 | installation-target-invalid | The target is not one this installation can be recorded against. Either the id is not a valid Discord id, which is 17 to 20 digits, or a personal installation named a Discord account other than the one verified on your RSX ID. |
| 502 | installation-exchange-failed | Discord refused to exchange the authorisation code, most often because it expired or was already used. Nothing was installed and nothing was recorded. The detail carries Discord's own message. |
| 503 | access-dependency-unavailable | RSX Access needed an answer from another service, such as RSX ID confirming your linked Discord account or Discord completing an installation, and could not get one. It refuses rather than decide without it, and nothing was changed. |
| 503 | application-not-configured | The application is open, but RSX has not finished setting up its Discord side, so there is nowhere to send you to install it. Nothing was changed. |
RSX Access errors
- Status
- 400
- Meaning
- The link that ties this installation to your RSX ID is invalid, has expired, has already been used, or was started from a different RSX ID. It is single-use and lasts ten minutes, so a Discord redirect cannot be replayed or finished by somebody else.
- Status
- 403
- Meaning
- The application is registered but is not accepting new installations right now. Installations that already exist are unaffected.
- Status
- 404
- Meaning
- No application with that id is registered with RSX Access.
- Status
- 404
- Meaning
- No installation with that id belongs to your RSX ID. An installation that exists but belongs to someone else gets the same answer.
- Status
- 409
- Meaning
- An application with that id is already registered. An id is permanent: it is part of the scope that gates the application, so it cannot be reused for something else.
- Status
- 409
- Meaning
- The installation has already been revoked. A revoked installation stays on record and is never reactivated.
- Status
- 422
- Meaning
- The application cannot be installed into this kind of target, for example a personal installation of an application that only supports Discord servers. The detail lists what it supports.
- Status
- 422
- Meaning
- The target is not one this installation can be recorded against. Either the id is not a valid Discord id, which is 17 to 20 digits, or a personal installation named a Discord account other than the one verified on your RSX ID.
- Status
- 502
- Meaning
- Discord refused to exchange the authorisation code, most often because it expired or was already used. Nothing was installed and nothing was recorded. The detail carries Discord's own message.
- Status
- 503
- Meaning
- RSX Access needed an answer from another service, such as RSX ID confirming your linked Discord account or Discord completing an installation, and could not get one. It refuses rather than decide without it, and nothing was changed.
- Status
- 503
- Meaning
- The application is open, but RSX has not finished setting up its Discord side, so there is nowhere to send you to install it. Nothing was changed.
RSX AI 10
Assistants: which model answers, what it may use, and why an answer could not be given.
| Status | Error | Meaning |
|---|---|---|
| 400 | model-not-available | The model is neither a tier nor an enabled text model. The list is an allowlist, so an id that works on Workers AI elsewhere is still refused here unless RSX has checked it. |
| 400 | thinking-unsupported | The request asked a model that does not reason to think before answering. |
| 400 | tools-unsupported | The request gave tools to a model that cannot use them. RSX refuses rather than drop the tools, because an assistant without them answers confidently that it cannot look anything up. |
| 403 | audience-not-permitted | The request asked for `audience: "staff"`, which gives the assistant RSX's internal knowledge, with a key that does not hold the `ai:knowledge:staff` scope. |
| 422 | content-blocked | The AI Gateway's content policy refused the conversation or the assistant's reply. This is a policy decision, not a fault, and nothing was answered. |
| 429 | budget-exhausted | The API key has spent its RSX AI budget for the day, measured in Workers AI neurons, or its budget is 0 and it is switched off. Nothing was run. Budgets reset at midnight UTC. |
| 429 | too-many-turns | The API key already has as many assistant turns running as it is allowed at once. The cap is what bounds how far past its budget a key can go, because a turn's cost is known only when it ends. |
| 502 | empty-response | The model finished without writing an answer, usually because its reasoning used the whole output budget. RSX reports it rather than return a blank reply. |
| 502 | model-failed | Workers AI did not complete the request. The model was unavailable or failed partway, and nothing was answered. |
| 503 | usage-unavailable | RSX AI could not check the key's usage, and does not run a turn it cannot account for. Nothing was run and nothing was charged. |
RSX AI errors
- Status
- 400
- Meaning
- The model is neither a tier nor an enabled text model. The list is an allowlist, so an id that works on Workers AI elsewhere is still refused here unless RSX has checked it.
- Status
- 400
- Meaning
- The request asked a model that does not reason to think before answering.
- Status
- 400
- Meaning
- The request gave tools to a model that cannot use them. RSX refuses rather than drop the tools, because an assistant without them answers confidently that it cannot look anything up.
- Status
- 403
- Meaning
- The request asked for `audience: "staff"`, which gives the assistant RSX's internal knowledge, with a key that does not hold the `ai:knowledge:staff` scope.
- Status
- 422
- Meaning
- The AI Gateway's content policy refused the conversation or the assistant's reply. This is a policy decision, not a fault, and nothing was answered.
- Status
- 429
- Meaning
- The API key has spent its RSX AI budget for the day, measured in Workers AI neurons, or its budget is 0 and it is switched off. Nothing was run. Budgets reset at midnight UTC.
- Status
- 429
- Meaning
- The API key already has as many assistant turns running as it is allowed at once. The cap is what bounds how far past its budget a key can go, because a turn's cost is known only when it ends.
- Status
- 502
- Meaning
- The model finished without writing an answer, usually because its reasoning used the whole output budget. RSX reports it rather than return a blank reply.
- Status
- 502
- Meaning
- Workers AI did not complete the request. The model was unavailable or failed partway, and nothing was answered.
- Status
- 503
- Meaning
- RSX AI could not check the key's usage, and does not run a turn it cannot account for. Nothing was run and nothing was charged.
RSX Link 20
Device identity: enrolling an installation with a person's approval and its own key, device sessions, and revocation.
| Status | Error | Meaning |
|---|---|---|
| 400 | link-invalid-public-key | The enrolment's publicKey is not a P-256 public key in SPKI DER form, base64url without padding. |
| 400 | link-unsupported-platform | The enrolment named a platform RSX Link does not enrol. The supported values are windows, linux and android. |
| 400 | link-unsupported-protocol | The request named a Link protocol version this service does not speak. Version 1 is the only one. |
| 401 | link-challenge-expired | The session challenge is unknown, already used, more than 60 seconds old, or was issued for a different device. |
| 401 | link-invalid-proof | The signature did not verify, the fingerprint did not match the enrolled key, or the signature was not raw r||s of 64 bytes. A session challenge is used up by the attempt. |
| 401 | link-session-invalid | The device session is missing, unknown or expired. Sessions last fifteen minutes and are not refreshed. |
| 403 | link-account-unavailable | RSX ID reports the account is suspended, terminated or no longer exists, so it cannot approve devices and its devices cannot sign in. |
| 403 | link-device-revoked | The device has been revoked by its owner. Its sessions stopped working at the moment of revocation, and it can obtain no new ones. |
| 403 | link-enrolment-denied | The person asked to approve this device denied it. |
| 404 | link-device-not-found | No device with that id belongs to your account. A device on someone else's account gets this same answer, so an id cannot be used to learn whether a device exists. |
| 404 | link-enrolment-not-found | No enrolment matches this id and secret, or this code. Every mismatch gets this same answer, so it cannot be used to find out which part was wrong. |
| 409 | link-device-limit-reached | The account already has the most active devices it may have. |
| 409 | link-enrolment-consumed | This enrolment has already created a device. One enrolment makes one device. |
| 409 | link-enrolment-decided | The enrolment was approved or denied by someone else, or changed state while this decision was being made. |
| 409 | link-enrolment-pending | The enrolment has not been approved yet, so there is no challenge to prove against. |
| 409 | link-key-already-enrolled | This public key already belongs to an active device. A key can be one device only. |
| 409 | link-key-revoked | This public key belonged to a device that was revoked. A revoked key can never be enrolled again. |
| 410 | link-enrolment-cancelled | The enrolment was cancelled by its agent, or after five proofs failed to verify. It cannot be revived. |
| 410 | link-enrolment-expired | The enrolment ran out of time: ten minutes to be approved, then five to be completed. An expired enrolment cannot be revived. |
| 503 | link-dependency-unavailable | RSX Link could not confirm the account's standing with RSX ID, and does not guess. Nothing was changed. |
RSX Link errors
- Status
- 400
- Meaning
- The enrolment's publicKey is not a P-256 public key in SPKI DER form, base64url without padding.
- Status
- 400
- Meaning
- The enrolment named a platform RSX Link does not enrol. The supported values are windows, linux and android.
- Status
- 400
- Meaning
- The request named a Link protocol version this service does not speak. Version 1 is the only one.
- Status
- 401
- Meaning
- The session challenge is unknown, already used, more than 60 seconds old, or was issued for a different device.
- Status
- 401
- Meaning
- The signature did not verify, the fingerprint did not match the enrolled key, or the signature was not raw r||s of 64 bytes. A session challenge is used up by the attempt.
- Status
- 401
- Meaning
- The device session is missing, unknown or expired. Sessions last fifteen minutes and are not refreshed.
- Status
- 403
- Meaning
- RSX ID reports the account is suspended, terminated or no longer exists, so it cannot approve devices and its devices cannot sign in.
- Status
- 403
- Meaning
- The device has been revoked by its owner. Its sessions stopped working at the moment of revocation, and it can obtain no new ones.
- Status
- 403
- Meaning
- The person asked to approve this device denied it.
- Status
- 404
- Meaning
- No device with that id belongs to your account. A device on someone else's account gets this same answer, so an id cannot be used to learn whether a device exists.
- Status
- 404
- Meaning
- No enrolment matches this id and secret, or this code. Every mismatch gets this same answer, so it cannot be used to find out which part was wrong.
- Status
- 409
- Meaning
- The account already has the most active devices it may have.
- Status
- 409
- Meaning
- This enrolment has already created a device. One enrolment makes one device.
- Status
- 409
- Meaning
- The enrolment was approved or denied by someone else, or changed state while this decision was being made.
- Status
- 409
- Meaning
- The enrolment has not been approved yet, so there is no challenge to prove against.
- Status
- 409
- Meaning
- This public key already belongs to an active device. A key can be one device only.
- Status
- 409
- Meaning
- This public key belonged to a device that was revoked. A revoked key can never be enrolled again.
- Status
- 410
- Meaning
- The enrolment was cancelled by its agent, or after five proofs failed to verify. It cannot be revived.
- Status
- 410
- Meaning
- The enrolment ran out of time: ten minutes to be approved, then five to be completed. An expired enrolment cannot be revived.
- Status
- 503
- Meaning
- RSX Link could not confirm the account's standing with RSX ID, and does not guess. Nothing was changed.
Dashboard 5
Internal. admin.rsx.group answers these to operators; no third-party caller reaches them.
| Status | Error | Meaning |
|---|---|---|
| 400 | invalid-dimension | The requested grouping is not one the traffic views support. The detail lists the dimensions that are accepted. |
| 400 | invalid-filter | A traffic filter was not a value this view accepts, or was longer than the maximum filter length. The detail says which. |
| 400 | invalid-range | The requested time window is not one the traffic views support. The detail lists the values that are accepted. |
| 401 | invalid-access-token | The Cloudflare Access assertion was missing, failed verification against the team's keys, or was issued for a different application. |
| 403 | access-not-configured | The dashboard requires Cloudflare Access and is missing the settings it needs to verify a session, so it refuses every request rather than serving an unauthenticated admin surface. |
Dashboard errors
- Status
- 400
- Meaning
- The requested grouping is not one the traffic views support. The detail lists the dimensions that are accepted.
- Status
- 400
- Meaning
- A traffic filter was not a value this view accepts, or was longer than the maximum filter length. The detail says which.
- Status
- 400
- Meaning
- The requested time window is not one the traffic views support. The detail lists the values that are accepted.
- Status
- 401
- Meaning
- The Cloudflare Access assertion was missing, failed verification against the team's keys, or was issued for a different application.
- Status
- 403
- Meaning
- The dashboard requires Cloudflare Access and is missing the settings it needs to verify a session, so it refuses every request rather than serving an unauthenticated admin surface.
AI portal 14
Internal. ai.rsx.group answers these to staff; no third-party caller reaches them.
| Status | Error | Meaning |
|---|---|---|
| 400 | bad-artifact-key | The artifact key was empty or contained path traversal. Keys are checked before they reach storage, so a malformed one is refused rather than resolved. |
| 400 | bad-modality | The modality filter was neither 'text' nor 'image'. |
| 400 | bad-share-kind | A share was requested for something that is neither a conversation nor a generation. |
| 400 | bad-status | The status filter was not one of the states a generation can be in. |
| 400 | missing-message | A chat request arrived with no message to send. |
| 400 | missing-model | A generation request named no model to run. |
| 400 | missing-prompt | An image request arrived with no prompt. |
| 400 | missing-target | A share was requested without saying what to share. |
| 400 | not-shareable | Only an image generation with a stored artifact can be shared on its own. A text generation has no standalone page. |
| 400 | unknown-model | The model id is not in the portal's registry, or is registered but disabled. The allowlist is what stops a typo becoming a call to an arbitrary model on the account. |
| 404 | artifact-not-found | No stored artifact exists at that key. A generation that failed or was blocked records a row but produces no bytes. |
| 404 | conversation-not-found | No conversation exists with that id, or it has been archived. Archiving hides a conversation without deleting it, so an archived id reads as missing on the routes that expect a live one. |
| 404 | generation-not-found | No generation exists with that id. |
| 404 | share-not-found | No live share exists with that token. Revoked shares are kept as a record of what was once public, but they stop resolving. |
AI portal errors
- Status
- 400
- Meaning
- The artifact key was empty or contained path traversal. Keys are checked before they reach storage, so a malformed one is refused rather than resolved.
- Status
- 400
- Meaning
- The modality filter was neither 'text' nor 'image'.
- Status
- 400
- Meaning
- A share was requested for something that is neither a conversation nor a generation.
- Status
- 400
- Meaning
- The status filter was not one of the states a generation can be in.
- Status
- 400
- Meaning
- A chat request arrived with no message to send.
- Status
- 400
- Meaning
- A generation request named no model to run.
- Status
- 400
- Meaning
- An image request arrived with no prompt.
- Status
- 400
- Meaning
- A share was requested without saying what to share.
- Status
- 400
- Meaning
- Only an image generation with a stored artifact can be shared on its own. A text generation has no standalone page.
- Status
- 400
- Meaning
- The model id is not in the portal's registry, or is registered but disabled. The allowlist is what stops a typo becoming a call to an arbitrary model on the account.
- Status
- 404
- Meaning
- No stored artifact exists at that key. A generation that failed or was blocked records a row but produces no bytes.
- Status
- 404
- Meaning
- No conversation exists with that id, or it has been archived. Archiving hides a conversation without deleting it, so an archived id reads as missing on the routes that expect a live one.
- Status
- 404
- Meaning
- No generation exists with that id.
- Status
- 404
- Meaning
- No live share exists with that token. Revoked shares are kept as a record of what was once public, but they stop resolving.
Example service 1
The deprecated reference service, kept as the template every real service was copied from.
| Status | Error | Meaning |
|---|---|---|
| 404 | widget-not-found | No widget exists with the requested id (example/v1, the reference service). |
Example service errors
- Status
- 404
- Meaning
- No widget exists with the requested id (example/v1, the reference service).
No error matches that.