Skip to main content

Native API problem codes

Jiandu request failures normally use RFC 9457 application/problem+json. Branch on the stable code, not title: the title is human-facing and may be localized. Retain the requestId for operator correlation and accept unknown future codes without losing the HTTP status.

{
"type": "https://jiandu.org/docs/references/problem-codes?code=documents.stale-revision",
"title": "The document changed after you opened it.",
"status": 412,
"instance": "urn:uuid:0f2c9d24-6a6b-4f8b-9f5b-1a2c3d4e5f60",
"code": "documents.stale_revision",
"requestId": "0f2c9d24-6a6b-4f8b-9f5b-1a2c3d4e5f60",
"retry": "do_not_retry"
}

Each type URI dereferences to this public catalog with its rendered code in the query string. Dots stay dots and underscores become hyphens in type; code remains the exact machine value to search on this page. do_not_retry means do not repeat the unchanged request. retry_with_backoff means use bounded exponential backoff with jitter and honor Retry-After when present. For idempotent intake, reuse the same key only with identical semantic input.

:::caution Current contract boundary This field guide records problem codes reachable in the current source by API family. The generated OpenAPI operation pages describe response envelopes and common statuses, but do not yet associate every code with every operation. Transport middleware, timeouts, method mismatches, and asynchronous task or batch-item failures may use other response shapes. Generate clients from the contract shipped with the running Jiandu version and retain a safe unknown-error branch. :::

Shared and system

CodeHTTP / retryMeaning and safe action
authentication_required401 / do not retryA credential is absent, ambiguous, expired, revoked, or invalid. Reauthenticate and send exactly one supported credential.
permission_denied403 / do not retryThe principal lacks the required permission. Use an authorized member or adjust RBAC.
personal_access_scope_insufficient403 / do not retryThe PAT lacks the required scope, or this credential-management route rejects PATs. Issue an appropriate PAT or use an ordinary session.
not_found404 / do not retryThe resource is absent or intentionally hidden by household or document scope. Verify the scoped identifier and access.
origin_forbidden403 / do not retryA mutation failed same-origin checks. Correct Origin and Fetch Metadata and use the configured Jiandu origin.
ingress_not_allowed421 / do not retryHost authority or direct peer is outside the ingress boundary. Correct proxy, public-origin, Host, or trusted-peer configuration.
auth_unavailable503 / backoffAn authentication dependency failed. Check health and retry later.
clock_unavailable503 / backoffSystem time could not be represented safely. Repair the host clock or time configuration.
database_unavailable503 / backoffDatabase readiness failed. Check the configured database and its TLS path.
blob_storage_unavailable503 / backoffBlob-storage readiness failed. Check the configured backend.
integrity_check_in_progress429 / backoffAnother bounded integrity check owns the slot. Honor Retry-After.
integrity_check_unavailable503 / backoffThe integrity diagnostic failed operationally. Check health and logs.
invalid_frontend_diagnostics400 or 413 / do not retryThe diagnostic batch violates its closed schema or request-size bound. Correct and bound the body.
frontend_diagnostics_busy429 / backoffDiagnostic capacity is occupied. Retry later.

Sessions, setup, and membership

CodeHTTP / retryMeaning and safe action
invalid_session_request400 or 413 / do not retrySession JSON is malformed or oversized. Correct and bound the body.
account_conflict409 / do not retryA username or account identifier already exists. Choose another or use the existing account.
owner_recovery_required403 / do not retryOnly the installation Owner may perform the requested credential recovery.
installation_setup_already_claimed409 / do not retrySetup was already claimed. Continue through normal administration.
installation_setup_claim_not_allowed403 / do not retryUse an eligible ordinary browser session to claim setup.
invalid_installation_setup_claim400 or 413 / do not retrySetup-claim JSON or token shape is invalid or oversized.
installation_setup_token_invalid401 / do not retryThe setup token was not accepted. Obtain the current protected token.
invalid_local_account_request400 or 413 / do not retryUsername, password, display name, role, or body size is invalid.
invalid_personal_access_token_request400 or 413 / do not retryPAT label, scopes, expiry, or body size is invalid.
invalid_membership_invitation_request400, 413, 415, or 422 / do not retryInvitation JSON, content type, lifetime, role, or restrictions are invalid.
membership_invitation_role_not_found422 / do not retryThe requested role does not exist. Select a current role.
membership_invitation_capacity_exceeded422 / do not retryThe household invitation limit is reached. Revoke or consume invitations first.
membership_invitation_not_found404 / do not retryThe invitation is absent or outside scope.
membership_invitation_consumed409 / do not retryA consumed invitation cannot be revoked.
membership_invitation_unavailable503 / backoffInvitation persistence, entropy, or clock dependency failed.

Authorization administration

CodeHTTP / retryMeaning and safe action
invalid_authorization_request400, 413, 415, or 422 / do not retryJSON, content type, identifiers, permissions, or another bounded field is invalid.
authorization_role_not_found404 / do not retryThe role does not exist in this household.
authorization_group_not_found404 / do not retryThe group does not exist in this household.
authorization_member_not_found404 / do not retryThe member does not exist in this household.
authorization_capacity_exceeded422 / do not retryA role, group, or membership limit is reached. Remove unused objects first.
owner_membership_protected403 / do not retryOwner membership state is immutable through this endpoint.
owner_role_protected403 / do not retryThe built-in Owner role cannot be removed from the Owner.
authorization_unavailable503 / backoffAuthorization state is temporarily unavailable.

OIDC, LDAP, trusted proxy, and linked identities

CodeHTTP / retryMeaning and safe action
invalid_oidc_request400 or 413 / do not retryOIDC start or link input is malformed or oversized.
oidc_disabled404 / do not retryThe provider is not enabled. Use another method or update operator configuration.
oidc_invalid_callback400 / do not retryThe callback is invalid or expired. Restart sign-in rather than replaying it.
oidc_start_limited429 / backoffOIDC-start capacity is occupied. Retry with bounded backoff.
oidc_admission_denied403 / do not retryThe identity is not admitted. Correct the invitation or provider admission policy.
oidc_identity_conflict409 / do not retryThe identity or provider is already linked. Reconcile the existing link.
oidc_unavailable503 / backoffThe OIDC or provider dependency failed.
invalid_ldap_request400 or 413 / do not retryLDAP credential or link JSON is malformed or oversized.
ldap_disabled404 / do not retryThe LDAP provider is disabled.
ldap_invalid_credential401 / do not retryDirectory credentials were not accepted. Reauthenticate.
ldap_admission_denied403 / do not retryThe directory identity is not admitted. Correct the configured policy.
ldap_identity_conflict409 / do not retryThe directory identity or provider is already linked.
ldap_unavailable503 / backoffDirectory authentication is unavailable or misconfigured. Inspect configuration before repeated retries.
invalid_trusted_proxy_request400 or 413 / do not retryTrusted-proxy request input is malformed or oversized.
trusted_proxy_disabled404 / do not retryThe trusted-proxy provider is disabled.
trusted_proxy_invalid_assertion401 / do not retryThe proxy assertion or protected header is invalid. Correct the trusted proxy chain.
trusted_proxy_admission_denied403 / do not retryThe asserted identity is not admitted.
trusted_proxy_identity_conflict409 / do not retryThe proxy identity or provider is already linked.
trusted_proxy_unavailable503 / backoffA trusted-proxy authentication dependency failed.
recent_sign_in_required409 / do not retryReauthenticate interactively before changing a linked identity.
identity_invalid_credential401 / do not retryThe linked-identity operation requires a valid ordinary session.
identity_admission_denied403 / do not retryThe external identity is not admitted.
identity_account_conflict409 / do not retryThe identity or provider is already linked.
identity_not_found404 / do not retryThe requested identity link does not exist.
identity_last_credential409 / do not retryAdd another interactive sign-in method before unlinking this one.
identity_unavailable503 / backoffExternal identity management is unavailable.

Passkeys

The current contract contains two legacy naming forms. Treat each literal code as distinct until a future compatibility migration publishes aliases.

CodeHTTP / retryMeaning and safe action
passkey_invalid_request400 or 413 / do not retryTransport-level passkey JSON is malformed or oversized.
passkey.invalid_request400 / do not retryWebAuthn semantic input is invalid. Restart the ceremony.
passkeys_disabled404 / do not retryPasskeys are not enabled.
passkey.invalid_credential401 / do not retryThe credential or assertion was not accepted. Restart authentication.
passkey.recent_sign_in_required409 / do not retrySign in again before changing passkeys.
passkey.account_conflict409 / do not retryThe account identifier or passkey already exists.
passkey.credential_not_found404 / do not retryThe passkey does not exist.
passkey.last_credential409 / do not retryAdd another interactive credential before removal.
passkey.capacity_exceeded429 / backoffPasskey or ceremony capacity is reached. Back off; if persistent, remove an unused passkey.
passkey.admission_denied403 / do not retryThe invitation cannot admit this passkey registration.
passkey.unavailable503 / backoffThe passkey service or persistence layer is unavailable.
passkey_unavailable503 / backoffThe API adapter could not issue or serialize the passkey session.

Intake and resumable uploads

CodeHTTP / retryMeaning and safe action
intake.invalid_multipart400 / do not retrySend exactly one file and one allowDuplicate field.
intake.invalid_batch_multipart400 / do not retrySend two through one hundred files fields only.
intake.invalid_idempotency_key400 / do not retrySupply exactly one bounded valid key.
intake.invalid_request422 / do not retryIntake semantics are invalid. Correct the request.
intake.invalid_filename422 / do not retryThe filename is empty, unsafe, controlled, or too long.
intake.parse_budget_exceeded422 / do not retryThe file exceeded the safe parser budget. Repair or simplify the source.
intake.request_too_large413 / do not retryThe aggregate multipart request exceeds the configured bound.
intake.size_limit_exceeded413 / do not retryThe document exceeds the configured per-file limit.
intake.unsupported_original415 or 422 / do not retryDeclared or terminally inspected content is unsupported. Convert to an advertised input type.
intake.duplicate409 / do not retryMatching content exists. Use it or explicitly allow a duplicate.
intake.idempotency_conflict409 / do not retryThe key was used with different input. Reuse it only with identical input.
intake.batch_item_conflict409 / do not retryA batch item already has a different durable result. Read current batch state.
intake.upload_not_accepted409 / do not retryTransfer ended without document acceptance. Read upload status.
intake.source_changed422 / do not retrySource bytes or metadata changed during transfer. Restart from a stable source.
intake.parser_busy503 / backoffThe bounded parser is occupied. Retry later.
intake.finalization_pending503 / backoffThe original is durable and still finalizing. Retry with the same key and identical input.
intake.finalization_failed503 / backoffThe durable original could not yet finalize. Retry with the same key.
storage_unavailable503 / backoffOriginal storage failed. Check storage health.
persistence_unavailable503 / backoffDocument, task, or batch state is unavailable.
intake.invalid_resumable_upload400 / do not retryTUS headers, metadata, or length are invalid.
intake.invalid_upload_content_type415 / do not retryPATCH must use application/offset+octet-stream.
intake.tus_version_required412 / do not retrySupply Tus-Resumable: 1.0.0.
intake.upload_not_found404 / do not retryThe upload does not exist or is outside the authenticated intake scope.
intake.upload_state_conflict409 / do not retryThe upload is no longer in a compatible state. Read its status.
intake.upload_offset_conflict409 / do not retryOffset differs from durable state. Use HEAD or GET, then resume there.
intake.upload_chunk_too_large413 / do not retrySplit the transfer into smaller chunks.
intake.upload_checksum_mismatch460 / do not retryRe-read offset and resend corrected bytes and checksum.
intake.upload_unavailable503 / backoffThe resumable spool or storage dependency is unavailable.

Documents and explicit access

CodeHTTP / retryMeaning and safe action
documents.invalid_query400 / do not retryCorrect query parameters.
documents.invalid_search400 / do not retryCorrect search-expression syntax.
documents.invalid_cursor400 / do not retryThe cursor is invalid or mismatched. Restart pagination without it.
documents.invalid_json400 or 413 / do not retryMutation JSON is malformed or oversized.
documents.invalid_request422 / do not retryDocument mutation semantics are invalid.
documents.invalid_idempotency_key400 / do not retrySupply one bounded key for reprocessing.
documents.precondition_required428 / do not retrySupply the current strong revision in If-Match.
documents.invalid_precondition400 / do not retryIf-Match is not exactly one strong document revision.
documents.stale_revision412 / do not retryReload the document and ETag, reconcile, and retry deliberately.
documents.not_ready409 / do not retryA published result does not exist yet. Poll task or document state.
documents.invalid_lifecycle_transition409 / do not retryReload and choose an action valid for the current lifecycle.
documents.deletion_blocked409 / do not retryDerived references still depend on the document. Remove or wait for them.
documents.reprocessing_idempotency_conflict409 / do not retryThe reprocessing key was used for different input.
documents.reprocessing_invalid_state409 / do not retryThe current lifecycle cannot be reprocessed.
documents.reprocessing_conflict409 / backoffIncompatible reprocessing is active. Poll and retry later.
documents.search_not_failed409 / do not retryThe search projection is not terminally failed, so retry is inapplicable.
document_unavailable503 / backoffDocument projection, storage, or persistence is unavailable.
document_access.invalid_query400 / do not retryCorrect grant or access query parameters.
document_access.invalid_json400 or 413 / do not retryAccess-policy or grant JSON is malformed or oversized.
document_access.invalid_request422 / do not retryAccess-request semantics are invalid.
document_access.policy_not_restricted409 / do not retrySet policy to restricted before managing explicit grants.
document_access_unavailable503 / backoffAccess-policy persistence is unavailable.

Learning and notifications

CodeHTTP / retryMeaning and safe action
learning.invalid_json400 or 413 / do not retryLearning-command JSON is malformed or oversized.
learning.invalid_request422 / do not retryThe command is semantically invalid.
learning.precondition_required428 / do not retrySupply the current aggregate revision.
learning.invalid_precondition400 / do not retrySupply exactly one strong revision.
learning.stale_revision412 / do not retryReload the snapshot and retry against its revision.
learning.conflict409 / do not retrySuggestion or rule state changed. Reload before choosing an action.
learning.unavailable503 / backoffLearning state is unavailable.
notifications.invalid_query400 / do not retryCorrect inbox or change-feed filters.
notifications.invalid_cursor400 / do not retryThe cursor is invalid or mismatched. Restart from a valid cursor or full resync.
notifications.invalid_stream_cursor400 / do not retrySupply at most one bounded SSE cursor.
notifications.invalid_json400 or 413 / do not retryNotification-command JSON is malformed or oversized.
notifications.invalid_request422 / do not retryA bulk or item command is invalid.
notifications.precondition_required428 / do not retrySupply the current preference revision.
notifications.invalid_precondition400 / do not retrySupply exactly one strong preference revision.
notifications.stale_preferences412 / do not retryReload preferences and retry against the current revision.
notifications.unsupported_channel422 / do not retrySelect a channel supported by this deployment profile.
notifications.stream_capacity_exhausted429 / backoffUse bounded polling and retry SSE later.
notifications.unavailable503 / backoffNotification persistence is unavailable.

Email connectors and capture

CodeHTTP / retryMeaning and safe action
connectors.invalid400 / do not retryConnector configuration or request input is invalid.
connectors.not_found404 / do not retryThe connector is absent or outside household scope.
connectors.conflict409 / do not retryConnector revision or authorization state changed. Reload it.
connectors.oauth_unconfigured503 / backoff in current APIOAuth installation configuration is missing. Operator configuration is required; blind retries will not repair it.
connectors.oauth_unavailable503 / backoffMailbox authorization could not start. Check provider and configuration.
connectors.unavailable503 / backoffConnector persistence or provider work failed.
capture.invalid_request400 / do not retryJSON, identifiers, revision, lease, settings, or upload metadata are invalid.
capture.invalid_upload_content_type415 / do not retryA capture-agent chunk must use application/offset+octet-stream.
capture.state_conflict409 / do not retryConnector, job, or lease state changed. Reload or claim a fresh lease.
capture.canceled409 / do not retryThe job was canceled. Stop work; create a new job only if intended.
capture.agent_credential_invalid401 / do not retryThe agent credential is missing, invalid, or revoked. Re-enroll or replace it.
capture.unavailable503 / backoff in current APICapture is unavailable or not configured. Inspect operator configuration before retrying.

Capture-agent uploads can also return the intake.* resumable-upload codes above.

Paperless migration and plugins

CodeHTTP / retryMeaning and safe action
paperless.backend_unavailable501 / do not retryThe selected persistence backend does not implement this importer. Use the supported profile.
paperless.invalid_request400 or 413 / do not retryImport-creation JSON is malformed or oversized.
paperless.invalid_upload400 / do not retryExport-file metadata, ordinal, or workflow state is invalid.
paperless.invalid_chunk_content_type415 / do not retryThe chunk must use application/offset+octet-stream.
paperless.not_found404 / do not retryThe import is absent or outside household scope.
paperless.state_conflict409 / backoffImport state or offset changed. Read current status before retrying.
paperless.chunk_too_large413 / do not retrySplit the file into smaller chunks.
paperless.checksum_mismatch460 / backoff in current APIRe-read the offset and resend corrected bytes and checksum.
paperless.unavailable503 / backoffMigration persistence or service is unavailable.
plugins.invalid_json400 or 413 / do not retryPlugin request JSON is malformed or oversized.
plugins.invalid_request422 / do not retrySettings or command input does not match the installed descriptor.
plugins.invalid_idempotency_key400 / do not retrySupply one bounded command idempotency key.
plugins.precondition_required428 / do not retrySupply the current settings ETag.
plugins.invalid_precondition400 / do not retryIf-Match is not one strong settings revision.
plugins.stale_revision412 / do not retryReload settings and ETag, then reapply the intended change.
plugins.command_conflict409 / do not retryCommand state or idempotency input conflicts. Read the existing run.
plugins.unavailable503 / backoffPlugin catalog or state is unavailable.

Client decision pattern

  1. Handle the HTTP status as the coarse transport class.
  2. If the media type is application/problem+json, branch on code and treat title as display text.
  3. For a known code, follow its precondition, state-refresh, or operator action before retrying.
  4. For an unknown code, follow retry conservatively, retain requestId, and preserve the response for diagnosis without logging secrets.
  5. Treat a 200 or 202 task, batch, upload, or capture-job payload as its own state machine; request success does not guarantee asynchronous processing success.

See the native API quickstart for a complete request flow and the generated operation reference for current schemas.