Error codes
Every API error carries a stable code, the HTTP status, whether retrying the
same request can succeed, and a link to its page here. Clients branch on the
code; the message is a default text that may change.
{ "ok": false, "error": { "code": "quota_exceeded", "message": "Storage quota exceeded." } }| Code | HTTP | Retryable | Meaning |
|---|---|---|---|
unauthenticated |
401 | no | Sign in required. |
session_unbound |
401 | no | Bind this browser session to its key first. |
session_already_bound |
409 | no | This session is already bound to a key. |
token_invalid |
401 | no | Invalid or expired access token. |
refresh_invalid |
401 | no | Invalid refresh token. |
refresh_reused |
401 | no | Refresh token reuse detected; this device was revoked. |
device_revoked |
401 | no | This device was revoked. |
device_suspended |
403 | no | This device is suspended. |
account_suspended |
403 | no | This account is suspended. |
dpop_invalid |
401 | no | Invalid proof of possession. |
dpop_nonce_required |
401 | yes | Retry with the server nonce. |
dpop_replay |
401 | no | Proof of possession was replayed. |
signature_invalid |
401 | no | Request signature is invalid. |
csrf_rejected |
403 | no | Cross-site request rejected. |
step_up_required |
403 | no | Sign in again to continue. |
forbidden |
403 | no | Not allowed. |
cli_auth_expired |
410 | no | This login request expired. |
cli_auth_denied |
403 | no | This login request was denied. |
cli_auth_code_mismatch |
403 | no | That code doesn’t match the one in your terminal. |
cli_auth_final |
409 | no | This login request was already handled. |
connect_token_invalid |
401 | no | This connect token is invalid, expired or already used. Create a new one on the web. |
pkce_invalid |
401 | no | PKCE verification failed. |
roster_exists |
409 | no | This account is already initialized. |
roster_missing |
409 | no | Finish account setup in the browser first. |
roster_conflict |
409 | yes | The roster changed; fetch it and retry. |
roster_invalid |
422 | no | Roster statement is malformed. |
member_inactive |
403 | no | The signing member is not an active member. |
key_gen_invalid |
422 | no | Invalid key generation. |
unlock_not_ready |
409 | no | Master-password unlock is not set up for this account yet. |
unlock_rate_limited |
429 | yes | Too many unlock attempts. Try again later or use your Recovery Key. |
unlock_grant_required |
403 | no | Prove the unlock secret first (master password or passkey). |
browser_trust_expired |
403 | no | This browser was not used for too long. Unlock it again. |
webauthn_invalid |
400 | no | The passkey response could not be verified. |
not_found |
404 | no | Not found. |
pouch_limit_reached |
403 | no | Pouch limit reached for your plan. |
pouch_read_only |
409 | no | This pouch is read-only. |
last_pouch |
409 | no | This is your only pouch; create another one before deleting it. |
pouch_locked |
409 | no | This pouch is locked because your plan includes fewer pouches. Choose the active pouch or upgrade on skillpouch.net. |
artifact_not_deleted |
409 | no | Delete the item first, then free its space. |
share_unavailable |
410 | no | This link expired, was revoked or was already used. |
quota_exceeded |
413 | no | Storage quota exceeded. |
precondition_failed |
412 | no | Base revision is out of date. |
epoch_mismatch |
409 | no | Server restored; rebase required. |
cursor_expired |
410 | no | History expired; rebase required. |
operation_id_reused |
409 | no | Operation ID reused with a different body. |
blob_missing |
422 | no | Referenced blob not uploaded. |
blob_too_large |
413 | no | Blob exceeds the size limit. |
ciphertext_hash_mismatch |
422 | yes | Upload corrupted in transit. |
envelope_invalid |
422 | no | Encrypted payload is malformed. |
snapshot_expired |
410 | no | Snapshot lease expired; start again. |
billing_unavailable |
503 | no | Billing is not configured. |
invoice_details_missing |
409 | no | Add your billing name and address in the billing portal to get an invoice. |
document_pending |
503 | yes | The document is still being prepared; try again in a few seconds. |
subscription_exists |
409 | no | You already have a subscription; switch plans instead of checking out again. |
plan_change_unavailable |
409 | no | Your subscription can’t switch plans right now. Open Manage subscription to check it. |
payment_failed |
402 | no | The payment didn’t go through. Update your payment method in Manage subscription and try again. |
upstream_unavailable |
502 | yes | An upstream service (e.g. GitHub) did not answer as expected. |
webhook_invalid |
401 | no | Webhook signature invalid. |
last_admin |
409 | no | The last admin cannot be demoted. |
validation_failed |
400 | no | Invalid request. |
payload_too_large |
413 | no | Request body too large. |
rate_limited |
429 | yes | Too many requests. |
server_busy |
503 | yes | The server is busy. Retrying shortly. |
maintenance_write_pause |
503 | yes | Brief maintenance, retrying. |
internal_error |
500 | yes | Something went wrong. |