Skip to content

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.