Error Reference Index
This section provides a comprehensive reference for all error responses returned by the AnkaSecure API. Each error includes a unique URI, HTTP status code, and detailed resolution guidance.
This reference covers API errors returned to a caller: every problem+json body whose type member is a https://docs.ankatech.co/errors/<slug> URI. It does not cover deployment and operational failures — script exit codes, bootstrap and environment-creation faults, container startup problems, and errors raised by Docker Swarm, PostgreSQL, Redis, OpenSearch, TLS or the edge NGINX. Those live in the Error Catalog*, which is the operational companion to this page. The two do not overlap: no exit code is documented here, and no type URI is documented there.
Many pages below send you to the Developer Hub for the schema and an executable example of the operation that failed. If that surface is new to you, The Developer Hub explains what it is, how to get access, and which of the platform's documentation surfaces answers which kind of question.
Quick Reference Table
This table is complete: every published error page appears in it exactly once, with the status its own page declares. The only pages deliberately absent are the three that are not a single type URI — Unknown Error Type, S2S Relay Envelope and Federated Login Errors — which the navigation groups under Cross-Cutting Surfaces for that reason. The per-status sections further down are a curated reading order, not an inventory; use this table to look a type up.
| HTTP Code | Error Type | URI |
|---|---|---|
| 400 | Administrator Credential Not Admitted | https://docs.ankatech.co/errors/administrator-credential-not-admitted |
| 400 | Algorithm Not Admitted | https://docs.ankatech.co/errors/algorithm-not-admitted |
| 400 | Backend Endpoint Refused | https://docs.ankatech.co/errors/backend-endpoint-refused |
| 400 | Bad Request | https://docs.ankatech.co/errors/bad-request |
| 400 | Credential Required for Endpoint Change | https://docs.ankatech.co/errors/credential-required-for-endpoint-change |
| 400 | Empty Secret Value | https://docs.ankatech.co/errors/empty-secret-value |
| 400 | Federated Attribute Invalid | https://docs.ankatech.co/errors/federated-attribute-invalid |
| 400 | Instance Claim Code Invalid | https://docs.ankatech.co/errors/instance-claim-code-invalid |
| 400 | Invalid Date Range | https://docs.ankatech.co/errors/invalid-date-range |
| 400 | Invalid DPoP Proof | https://docs.ankatech.co/errors/invalid_dpop_proof |
| 400 | Invalid Grant | https://docs.ankatech.co/errors/invalid_grant |
| 400 | Invalid Input | https://docs.ankatech.co/errors/invalid-input |
| 400 | Invalid Operation Name | https://docs.ankatech.co/errors/invalid-operation-name |
| 400 | Invalid PKCS#7 Structure | https://docs.ankatech.co/errors/invalid-pkcs7 |
| 400 | Invalid Request Parameters | https://docs.ankatech.co/errors/invalid-request-parameters |
| 400 | Invalid Request | https://docs.ankatech.co/errors/invalid_request |
| 400 | Invalid Scope | https://docs.ankatech.co/errors/invalid_scope |
| 400 | Invalid Secret Value | https://docs.ankatech.co/errors/invalid-secret-value |
| 400 | Invalid Session | https://docs.ankatech.co/errors/invalid_session |
| 400 | Invalid Token | https://docs.ankatech.co/errors/invalid-token |
| 400 | Invalid Transport Configuration | https://docs.ankatech.co/errors/invalid-transport-config |
| 400 | Key Operation Incompatible | https://docs.ankatech.co/errors/key-operation-incompatible |
| 400 | Key-Protection Declaration Not Valid For This Driver | https://docs.ankatech.co/errors/key-backend-declaration-invalid |
| 400 | Keystore Derivation Budget Exceeded | https://docs.ankatech.co/errors/keystore-derivation-budget-exceeded |
| 400 | Keystore Private Key Without Certificate Chain | https://docs.ankatech.co/errors/keystore-private-key-without-chain |
| 400 | Keystore Secret-Key Entry | https://docs.ankatech.co/errors/keystore-secret-key-entry |
| 400 | Missing Request Part | https://docs.ankatech.co/errors/missing-request-part |
| 400 | Multipart Part Count Exceeded | https://docs.ankatech.co/errors/multipart-part-count-exceeded |
| 400 | Multipart Parts Out Of Order | https://docs.ankatech.co/errors/multipart-part-order |
| 400 | Observability Backend Request Invalid | https://docs.ankatech.co/errors/observability-backend-invalid |
| 400 | Observability Signal Not Permitted | https://docs.ankatech.co/errors/observability-signal-not-permitted |
| 400 | Passkey Registration Refused | https://docs.ankatech.co/errors/passkey-registration-refused |
| 400 | Password Policy Violation | https://docs.ankatech.co/errors/password-policy-violation |
| 400 | Password Reused | https://docs.ankatech.co/errors/password-reused |
| 400 | PQC Transport Not Available for Streaming | https://docs.ankatech.co/errors/pqc-transport-not-available-for-streaming |
| 400 | Query Range Exceeded | https://docs.ankatech.co/errors/query-range-exceeded |
| 400 | Repeated Query Parameter | https://docs.ankatech.co/errors/repeated-query-parameter |
| 400 | Rotation Interval Below The Deployment Floor | https://docs.ankatech.co/errors/rotation-interval-below-floor |
| 400 | Serialization Incompatible With Timestamp | https://docs.ankatech.co/errors/serialization-incompatible-with-timestamp |
| 400 | Signature Mismatch | https://docs.ankatech.co/errors/signature-mismatch |
| 400 | Trust Anchor Rejected | https://docs.ankatech.co/errors/trust-anchor-rejected |
| 400 | Trusted Issuer Not Admissible | https://docs.ankatech.co/errors/trusted-issuer-not-admissible |
| 400 | TSA Trust Anchor Selection Invalid | https://docs.ankatech.co/errors/tsa-trust-anchor-selection-invalid |
| 400 | Undecryptable PQC Transport Body | https://docs.ankatech.co/errors/pqc-transport-undecryptable |
| 400 | Unknown Query Parameter | https://docs.ankatech.co/errors/unknown-query-parameter |
| 400 | Unmeterable Usage Event | https://docs.ankatech.co/errors/unmeterable-usage-event |
| 400 | Unsupported Grant Type | https://docs.ankatech.co/errors/unsupported_grant_type |
| 400 | Unsupported Keystore Format | https://docs.ankatech.co/errors/unsupported-keystore-format |
| 400/402/404/409/422 | Upstream Rejected Request | https://docs.ankatech.co/errors/upstream-rejected-request |
| 400 | Validation Error | https://docs.ankatech.co/errors/validation |
| 4xx | Client Error | https://docs.ankatech.co/errors/client-error |
| 401 | Federated Login Failed | https://docs.ankatech.co/errors/federation-callback-invalid |
| 401 | Invalid Client | https://docs.ankatech.co/errors/invalid_client |
| 401 | Reauthentication Required | https://docs.ankatech.co/errors/reauthentication-required |
| 401 | Unauthorized | https://docs.ankatech.co/errors/unauthorized |
| 402 | Deployment License Expired | https://docs.ankatech.co/errors/deployment-license-expired |
| 402 | Payment Required | https://docs.ankatech.co/errors/payment-required |
| 403 | Admission Denied | https://docs.ankatech.co/errors/admission-denied |
| 403 | Break-Glass Session Cannot Acknowledge | https://docs.ankatech.co/errors/break-glass-session-cannot-acknowledge |
| 403 | Break-Glass Session Cannot Change Designation | https://docs.ankatech.co/errors/break-glass-session-cannot-change-designation |
| 403 | Break-Glass Session Cannot Recover Identity | https://docs.ankatech.co/errors/break-glass-session-cannot-recover-identity |
| 403 | Compliance Pack Not Licensed | https://docs.ankatech.co/errors/compliance-pack-not-licensed |
| 403 | Conferring Authority Required | https://docs.ankatech.co/errors/conferring-authority-required |
| 403 | Custody Operation Not On This Plane | https://docs.ankatech.co/errors/custody-move-not-on-this-plane |
| 403 | Delivery Providers Not Included In This Edition | https://docs.ankatech.co/errors/notification-not-entitled |
| 403 | Deployment Not Supported | https://docs.ankatech.co/errors/deployment-not-supported |
| 403 | Deployment Policy Is Compliance-Immutable | https://docs.ankatech.co/errors/deployment-policy-immutable |
| 403 | Detective Alert Authority Required | https://docs.ankatech.co/errors/detective-alert-authority-required |
| 403 | Federation Not Included In This Edition | https://docs.ankatech.co/errors/federation-not-entitled |
| 403 | Forbidden Origin | https://docs.ankatech.co/errors/forbidden-origin |
| 403 | Forbidden | https://docs.ankatech.co/errors/forbidden |
| 403 | Key Below Security-Strength Floor | https://docs.ankatech.co/errors/key-below-security-strength-floor |
| 403 | Not an Eligible Quorum Approver | https://docs.ankatech.co/errors/quorum-approver-not-eligible |
| 403 | Observability Export Not Entitled | https://docs.ankatech.co/errors/observability-not-entitled |
| 403 | Only the Requester Can Cancel | https://docs.ankatech.co/errors/quorum-cancel-not-requester |
| 403 | Operation Not Available While Impersonating | https://docs.ankatech.co/errors/impersonation-operation-forbidden |
| 403 | Principal Not Eligible | https://docs.ankatech.co/errors/principal-not-eligible |
| 403 | Quorum Requester No Longer Authorized | https://docs.ankatech.co/errors/quorum-requester-not-authorized |
| 403 | Requester Cannot Decide Own Request | https://docs.ankatech.co/errors/quorum-self-approval-forbidden |
| 403 | SaaS-Only Feature | https://docs.ankatech.co/errors/saas-only-feature |
| 403 | Scope Subset Rule Violation | https://docs.ankatech.co/errors/scope-subset-violation |
| 403 | Security Alert Acknowledgment Not Permitted | https://docs.ankatech.co/errors/security-alert-acknowledgment-not-permitted |
| 403 | Security Alert Destination Required | https://docs.ankatech.co/errors/security-alert-destination-required |
| 403 | Tenant Not Addressable | https://docs.ankatech.co/errors/tenant-not-addressable |
| 403 | Trust Anchors Are Platform-Plane Only | https://docs.ankatech.co/errors/trust-anchor-platform-plane-only |
| 403 | Unsupported Principal Type | https://docs.ankatech.co/errors/unsupported-principal-type |
| 403 | Workload Identity Federation Is Not Included In This Edition | https://docs.ankatech.co/errors/workload-identity-not-entitled |
| 403 | Workload Self-Modification Forbidden | https://docs.ankatech.co/errors/workload-self-modification-forbidden |
| 404 | Actor Issuer Binding Not Found | https://docs.ankatech.co/errors/actor-issuer-binding-not-found |
| 404 | Compliance Pack Not Found | https://docs.ankatech.co/errors/compliance-pack-not-found |
| 404 | Cryptographic Actor Not Found | https://docs.ankatech.co/errors/bindable-actor-not-found |
| 404 | Deployment Secret Not Configured | https://docs.ankatech.co/errors/deployment-secret-not-configured |
| 404 | Material Version Not Found | https://docs.ankatech.co/errors/material-version-not-found |
| 404 | Observability Backend Not Found | https://docs.ankatech.co/errors/observability-backend-not-found |
| 404 | Projection Re-Drive Pass Not Found | https://docs.ankatech.co/errors/projection-republish-pass-not-found |
| 404 | Projection Signing Key Not Published | https://docs.ankatech.co/errors/projection-signing-key-not-published |
| 404 | Resource Not Found | https://docs.ankatech.co/errors/not-found |
| 404 | Token Signing Key Not Published | https://docs.ankatech.co/errors/token-signing-key-not-published |
| 404 | Trusted Issuer Not Found | https://docs.ankatech.co/errors/trusted-issuer-not-found |
| 404 | TSA Trust Anchor Not Found | https://docs.ankatech.co/errors/tsa-trust-anchor-not-found |
| 404 | Unknown Integration | https://docs.ankatech.co/errors/unknown-integration |
| 405 | Method Not Allowed | https://docs.ankatech.co/errors/method-not-allowed |
| 408 | Stream Read Budget Exceeded | https://docs.ankatech.co/errors/stream-read-budget-exceeded |
| 409 | Account Already Bound | https://docs.ankatech.co/errors/federated-link-target-already-bound |
| 409 | Activation Not Cancellable | https://docs.ankatech.co/errors/activation-not-cancellable |
| 409 | Actor Issuer Binding Already Exists | https://docs.ankatech.co/errors/actor-issuer-binding-already-exists |
| 409 | Assisted Recovery In Progress | https://docs.ankatech.co/errors/assisted-recovery-in-progress |
| 409 | Authenticator Removal Would Lock Out | https://docs.ankatech.co/errors/authenticator-removal-would-lock-out |
| 409 | Bootstrap Workload Exists | https://docs.ankatech.co/errors/bootstrap-workload-exists |
| 409 | Bulk Write Gated by Quorum | https://docs.ankatech.co/errors/quorum-bulk-write-gated |
| 409 | Capability Grant Dimensions Conflict | https://docs.ankatech.co/errors/capability-grant-dimensions-conflict |
| 409 | Cascade Subset Violation | https://docs.ankatech.co/errors/cascade-subset-violation |
| 409 | Compliance Remediation Basis Changed | https://docs.ankatech.co/errors/compliance-remediation-basis-changed |
| 409 | Compliance Remediation Conflict Unacknowledged | https://docs.ankatech.co/errors/compliance-remediation-conflict-unacknowledged |
| 409 | Compliance Remediation Execution In Progress | https://docs.ankatech.co/errors/compliance-remediation-execution-in-progress |
| 409 | Concurrent Modification | https://docs.ankatech.co/errors/concurrent-modification |
| 409 | Conflict | https://docs.ankatech.co/errors/conflict |
| 409 | Counterparty Type Still Referenced | https://docs.ankatech.co/errors/counterparty-type-referenced |
| 409 | Credential Endpoint Changed | https://docs.ankatech.co/errors/credential-endpoint-changed |
| 409 | Credential Install Not Recorded For The Current Declaration | https://docs.ankatech.co/errors/host-credential-install-declaration-mismatch |
| 409 | Custody Destination Is The Source | https://docs.ankatech.co/errors/custody-move-destination-is-source |
| 409 | Custody Lineage Not Current | https://docs.ankatech.co/errors/custody-lineage-not-current |
| 409 | Custody Material Unreadable | https://docs.ankatech.co/errors/custody-material-unreadable |
| 409 | Custody Move Awaits Tenant Consent | https://docs.ankatech.co/errors/custody-move-awaits-tenant-consent |
| 409 | Custody Move In Progress | https://docs.ankatech.co/errors/custody-move-in-progress |
| 409 | Custody Move In Progress (Key-Encryption Key Destruction) | https://docs.ankatech.co/errors/kek-destruction-custody-move-open |
| 409 | Custody Move Past Its Swap | https://docs.ankatech.co/errors/custody-move-forward-only |
| 409 | Custody Move State Conflict | https://docs.ankatech.co/errors/custody-move-state-conflict |
| 409 | Custody Roll Back Unavailable | https://docs.ankatech.co/errors/custody-rollback-unavailable |
| 409 | Custody Rollback Conflict | https://docs.ankatech.co/errors/custody-rollback-conflict |
| 409 | Custody Stage Not Verified | https://docs.ankatech.co/errors/custody-stage-not-verified |
| 409 | Custody Swap Incomplete | https://docs.ankatech.co/errors/custody-swap-incomplete |
| 409 | Custody Write Conflict | https://docs.ankatech.co/errors/custody-write-conflict |
| 409 | Data Integrity Error | https://docs.ankatech.co/errors/data-integrity |
| 409 | Deployment Backend Changed During The Write | https://docs.ankatech.co/errors/deployment-backend-changed-during-write |
| 409 | Deployment Backend Declaration Retired Shape | https://docs.ankatech.co/errors/key-backend-descriptor-retired-shape |
| 409 | Deployment Backend Not Configured | https://docs.ankatech.co/errors/deployment-backend-not-configured |
| 409 | Duplicate KID | https://docs.ankatech.co/errors/duplicate-kid |
| 409 | Edition Set By Marketplace Plan | https://docs.ankatech.co/errors/edition-set-by-marketplace-plan |
| 409 | Email Verification Trust Declaration Required | https://docs.ankatech.co/errors/federation-email-verification-trust-required |
| 409 | Federated Credential Recovery | https://docs.ankatech.co/errors/federated-credential-recovery |
| 409 | Federated Email Already Owned | https://docs.ankatech.co/errors/federated-email-conflict |
| 409 | Federation Domain Verification Required | https://docs.ankatech.co/errors/federation-domain-verification-required |
| 409 | Foreign Environment Claim | https://docs.ankatech.co/errors/foreign-environment-claim |
| 409 | Idempotency Key In Progress | https://docs.ankatech.co/errors/idempotency-key-in-progress |
| 409 | Impersonation Session Already Live | https://docs.ankatech.co/errors/impersonation-session-already-live |
| 409 | Instance Already Claimed | https://docs.ankatech.co/errors/instance-already-claimed |
| 409 | Instance Not Claimed | https://docs.ankatech.co/errors/instance-not-claimed |
| 409 | Invalid Key State | https://docs.ankatech.co/errors/invalid-key-state |
| 409 | Issuer Subject Already Bound | https://docs.ankatech.co/errors/issuer-subject-already-bound |
| 409 | Key ID Retired | https://docs.ankatech.co/errors/key-id-retired |
| 409 | Key Object Not Resolved | https://docs.ankatech.co/errors/kek-destruction-object-unresolved |
| 409 | Key Object Still In Use | https://docs.ankatech.co/errors/kek-destruction-key-object-in-use |
| 409 | Key-Encryption Key Already Destroyed | https://docs.ankatech.co/errors/kek-destruction-already-destroyed |
| 409 | Key-Encryption Key Carrier Not Bound | https://docs.ankatech.co/errors/kek-destruction-carrier-not-bound |
| 409 | Key-Encryption Key Destruction Already Requested | https://docs.ankatech.co/errors/kek-destruction-already-requested |
| 409 | Key-Encryption Key Destruction In Flight | https://docs.ankatech.co/errors/kek-destruction-in-flight |
| 409 | Key-Encryption Key Destruction Not Pending | https://docs.ankatech.co/errors/kek-destruction-not-pending |
| 409 | Key-Encryption Key Not Retired | https://docs.ankatech.co/errors/kek-destruction-not-retired |
| 409 | Key-Encryption Key Still Retained | https://docs.ankatech.co/errors/kek-destruction-retained |
| 409 | Key-Encryption Key Still Wraps Key Material | https://docs.ankatech.co/errors/kek-destruction-wraps-material |
| 409 | Key Material Expired | https://docs.ankatech.co/errors/key-material-expired |
| 409 | Key Material Usage Exhausted | https://docs.ankatech.co/errors/key-material-usage-exhausted |
| 409 | Key-Protection Backend Activation In Progress | https://docs.ankatech.co/errors/backend-activation-in-progress |
| 409 | Key-Protection Backend Activation Window Lost | https://docs.ankatech.co/errors/backend-activation-window-lost |
| 409 | Key Protection Backend Already Bound | https://docs.ankatech.co/errors/backend-already-bound |
| 409 | Key Protection Backend Bind Contradicted | https://docs.ankatech.co/errors/key-protection-backend-bind-contradicted |
| 409 | Key Protection Backend Not Configured | https://docs.ankatech.co/errors/key-protection-backend-not-configured |
| 409 | Key Protection Limit Reached | https://docs.ankatech.co/errors/key-protection-limit-reached |
| 409 | Key Material Without Operations | https://docs.ankatech.co/errors/key-material-without-operations |
| 409 | Last Platform Super Administrator | https://docs.ankatech.co/errors/last-platform-super-admin-would-lock-out |
| 409 | License Already Imported | https://docs.ankatech.co/errors/license-already-imported |
| 409 | License Installation Identity Unavailable | https://docs.ankatech.co/errors/license-installation-identity-unavailable |
| 409 | Link Authorization Already Outstanding | https://docs.ankatech.co/errors/federated-link-intent-already-declared |
| 409 | Managed Backend Tier Key Material Present | https://docs.ankatech.co/errors/managed-tier-key-material-bound |
| 409 | Managed Backend Tier Reconfiguration In Progress | https://docs.ankatech.co/errors/managed-tier-binding-in-progress |
| 409 | Managed Tier Key Capacity Exhausted | https://docs.ankatech.co/errors/managed-tier-key-capacity-exhausted |
| 409 | Marketplace Bootstrap In Progress | https://docs.ankatech.co/errors/marketplace-bootstrap-in-progress |
| 409 | Marketplace Edition Unavailable | https://docs.ankatech.co/errors/marketplace-edition-unavailable |
| 409 | Material Version Moved | https://docs.ankatech.co/errors/material-version-moved |
| 409 | Next Projection Signing Key Not Yet Propagated | https://docs.ankatech.co/errors/projection-signing-key-next-not-propagated |
| 409 | Next Signing Key Not Yet Propagated | https://docs.ankatech.co/errors/next-key-not-propagated |
| 409 | Not Applicable For Deployment Type | https://docs.ankatech.co/errors/not-applicable-for-deployment-type |
| 409 | Observability Backend Cap Exceeded | https://docs.ankatech.co/errors/observability-backend-cap-exceeded |
| 409 | Observability Backend Duplicate Name | https://docs.ankatech.co/errors/observability-backend-duplicate-name |
| 409 | Ownership Recovery Identity Ineligible | https://docs.ankatech.co/errors/ownership-recovery-identity-ineligible |
| 409 | Passkey Unavailable On Origin | https://docs.ankatech.co/errors/passkey-unavailable-on-origin |
| 409 | Platform Federated Entry Would Lock Out | https://docs.ankatech.co/errors/platform-federated-entry-would-lock-out |
| 409 | Platform Super Administrator Role Immutable | https://docs.ankatech.co/errors/platform-super-admin-role-immutable |
| 409 | Projection Re-Drive Already In Progress | https://docs.ankatech.co/errors/projection-redrive-in-flight |
| 409 | Projection Signing Key State Changed | https://docs.ankatech.co/errors/projection-signing-key-state-changed |
| 409 | Projection Signing Key Transition In Progress | https://docs.ankatech.co/errors/projection-signing-key-transition-in-progress |
| 409 | Provider Permission Missing | https://docs.ankatech.co/errors/kek-destruction-permission-missing |
| 409 | Quorum Decision Already Recorded | https://docs.ankatech.co/errors/quorum-approval-already-recorded |
| 409 | Quorum Policy Not Degraded | https://docs.ankatech.co/errors/quorum-policy-not-degraded |
| 409 | Quorum Request Already Pending | https://docs.ankatech.co/errors/quorum-request-already-pending |
| 409 | Quorum Request Not Pending | https://docs.ankatech.co/errors/quorum-request-not-pending |
| 409 | Quorum Request Target Changed | https://docs.ankatech.co/errors/quorum-target-changed |
| 409 | Recovery Entry Unreachable | https://docs.ankatech.co/errors/recovery-entry-unreachable |
| 409 | Root Membership Exclusive | https://docs.ankatech.co/errors/root-membership-exclusive |
| 409 | Security Alert Already Acknowledged | https://docs.ankatech.co/errors/security-alert-already-acknowledged |
| 409 | Self-Test Superseded | https://docs.ankatech.co/errors/self-test-superseded |
| 409 | Session Not Identified | https://docs.ankatech.co/errors/session-not-identified |
| 409 | Stateful Key Busy | https://docs.ankatech.co/errors/stateful-key-busy |
| 409 | Stateful Key Exhausted | https://docs.ankatech.co/errors/stateful-key-exhausted |
| 409 | Support Access Already Authorised | https://docs.ankatech.co/errors/support-access-grant-already-declared |
| 409 | Tenant Backend Already Bound | https://docs.ankatech.co/errors/tenant-backend-already-bound |
| 409 | Tenant Not Eligible For A Custody Move | https://docs.ankatech.co/errors/custody-move-tenant-not-eligible |
| 409 | Tenant Recovery Request Required | https://docs.ankatech.co/errors/tenant-recovery-request-required |
| 409 | Token Already Used | https://docs.ankatech.co/errors/token-already-used |
| 409 | Token Serial Not Reported By The Declared Backend | https://docs.ankatech.co/errors/token-serial-not-reported |
| 409 | Token Signing Key State Changed | https://docs.ankatech.co/errors/token-signing-key-state-changed |
| 409 | Token Signing Key Transition In Progress | https://docs.ankatech.co/errors/transition-in-progress |
| 409 | Too Many Active Anchors | https://docs.ankatech.co/errors/too-many-active-anchors |
| 409 | Trusted Issuer Already Declared | https://docs.ankatech.co/errors/trusted-issuer-already-declared |
| 409 | Trusted Issuer Already Trusted On Another Plane | https://docs.ankatech.co/errors/trusted-issuer-cross-plane-conflict |
| 409 | Trusted Issuer Still Has Bindings | https://docs.ankatech.co/errors/trusted-issuer-in-use |
| 409 | Trusted Issuer URL Is Immutable | https://docs.ankatech.co/errors/trusted-issuer-url-immutable |
| 409 | TSA Trust Anchor Duplicate | https://docs.ankatech.co/errors/tsa-trust-anchor-duplicate |
| 409 | TSA Trust Anchor Not Active | https://docs.ankatech.co/errors/tsa-trust-anchor-not-active |
| 409 | TSA Trust Anchor Not Retired | https://docs.ankatech.co/errors/tsa-trust-anchor-not-retired |
| 409 | Unfit Key Material Object | https://docs.ankatech.co/errors/unfit-key-material-object |
| 409 | Usage Export Concurrency Limit | https://docs.ankatech.co/errors/usage-export-concurrency-limit |
| 409 | Usage Statement Already Issued | https://docs.ankatech.co/errors/usage-statement-already-issued |
| 409 | Usage Statement Already Superseded | https://docs.ankatech.co/errors/usage-statement-already-superseded |
| 409 | Usage Statement Coverage Unverifiable | https://docs.ankatech.co/errors/usage-statement-coverage-unverifiable |
| 409 | Usage Statement Not Finalizable | https://docs.ankatech.co/errors/usage-statement-not-finalizable |
| 409 | Workload Credential Conflict | https://docs.ankatech.co/errors/workload-credential-conflict |
| 409 | Workload Credential Not Active | https://docs.ankatech.co/errors/workload-credential-not-active |
| 409 | Workload Name Conflict | https://docs.ankatech.co/errors/workload-name-conflict |
| 409 | Workload Revoked | https://docs.ankatech.co/errors/workload-revoked |
| 410 | Token Expired | https://docs.ankatech.co/errors/token-expired |
| 411 | Length Required | https://docs.ankatech.co/errors/length-required |
| 412 | Precondition Failed | https://docs.ankatech.co/errors/precondition-failed |
| 413 | License Artifact Too Large | https://docs.ankatech.co/errors/license-artifact-too-large |
| 413 | Multipart Part Too Large | https://docs.ankatech.co/errors/multipart-part-too-large |
| 413 | Payload Too Large | https://docs.ankatech.co/errors/payload-too-large |
| 413 | Request Parameters Too Large | https://docs.ankatech.co/errors/request-parameters-too-large |
| 413 | Trust Anchor Too Large | https://docs.ankatech.co/errors/trust-anchor-too-large |
| 413 | WebAuthn Metadata Too Large | https://docs.ankatech.co/errors/webauthn-metadata-too-large |
| 415 | Unsupported Media Type | https://docs.ankatech.co/errors/unsupported-media-type |
| 421 | Misdirected Request | https://docs.ankatech.co/errors/misdirected-request |
| 422 | Account Not Active | https://docs.ankatech.co/errors/federated-link-target-not-active |
| 422 | Actor Not Active | https://docs.ankatech.co/errors/actor-not-active |
| 422 | Actor Owned By Use Case | https://docs.ankatech.co/errors/actor-owned-by-use-case |
| 422 | Alert Bounds Out Of Order | https://docs.ankatech.co/errors/alert-bounds-out-of-order |
| 422 | Algorithm Not Permitted for Operation | https://docs.ankatech.co/errors/algorithm-not-permitted-for-operation |
| 422 | Allowlist Change Affects Declared Backends | https://docs.ankatech.co/errors/key-backend-allowlist-affects-tenants |
| 422 | Asset Key Not Resolvable | https://docs.ankatech.co/errors/asset-key-not-resolvable |
| 422 | Authentication Posture Not Admissible | https://docs.ankatech.co/errors/authentication-posture-not-admissible |
| 422 | Backend Endpoint Requirement Not Satisfied | https://docs.ankatech.co/errors/byok-endpoint-requirement |
| 422 | Backend Key Coordinate Requirement Not Satisfied | https://docs.ankatech.co/errors/deployment-backend-key-id-requirement |
| 422 | Backend Key Provisioning Failed | https://docs.ankatech.co/errors/backend-kek-provisioning-failed |
| 422 | Backend Self-Test Failed | https://docs.ankatech.co/errors/backend-selftest-failed |
| 422 | Backup Run Not Recorded | https://docs.ankatech.co/errors/backup-run-not-recorded |
| 422 | Bootstrap Key-Encryption Key Belongs To A Different Backend | https://docs.ankatech.co/errors/deployment-backend-kek-provider-mismatch |
| 422 | Bootstrap Tenant Uses Deployment Custody | https://docs.ankatech.co/errors/bootstrap-tenant-deployment-custody |
| 422 | Break-Glass Designation Ineligible | https://docs.ankatech.co/errors/break-glass-designation-ineligible |
| 422 | BYOK Credential Self-Test Failed | https://docs.ankatech.co/errors/byok-credential-self-test-failed |
| 422 | BYOK Declared Key Unusable | https://docs.ankatech.co/errors/byok-declared-key-unusable |
| 422 | Certificate Expired | https://docs.ankatech.co/errors/certificate-expired |
| 422 | Compliance Attestation Not Applicable | https://docs.ankatech.co/errors/compliance-attestation-not-applicable |
| 422 | Compliance Evidence Too Large | https://docs.ankatech.co/errors/compliance-evidence-too-large |
| 422 | Compliance Remediation Step Not Applicable | https://docs.ankatech.co/errors/compliance-remediation-step-not-applicable |
| 422 | Compliance Remediation Rotation Admissible | https://docs.ankatech.co/errors/compliance-remediation-rotation-admissible |
| 422 | Composite Component Algorithm Mismatch | https://docs.ankatech.co/errors/composite-component-algorithm-mismatch |
| 422 | Composite KDF Mismatch | https://docs.ankatech.co/errors/composite-kdf-mismatch |
| 422 | Composite Wire Shape Mismatch | https://docs.ankatech.co/errors/composite-wire-shape-mismatch |
| 422 | Composite-Pair Operation Not Supported | https://docs.ankatech.co/errors/composite-pair-operation-requires-multi-key-use-case-not-yet-supported |
| 422 | Credential Rotation Not Applicable | https://docs.ankatech.co/errors/credential-rotation-not-applicable |
| 422 | Cross-Kid Arity Violation | https://docs.ankatech.co/errors/cross-kid-arity-violation |
| 422 | Custody Destination Invalid | https://docs.ankatech.co/errors/custody-destination-invalid |
| 422 | Custody Destination Unsupported | https://docs.ankatech.co/errors/custody-destination-unsupported |
| 422 | Custody Source KEK Required | https://docs.ankatech.co/errors/custody-source-kek-required |
| 422 | Declared Backend Cannot Be Changed In Place | https://docs.ankatech.co/errors/deployment-backend-token-change-refused |
| 422 | Decryption Failed | https://docs.ankatech.co/errors/decryption-failed |
| 422 | Deployment Backend Restore Unavailable | https://docs.ankatech.co/errors/deployment-backend-restore-unavailable |
| 422 | Dual Not Applicable | https://docs.ankatech.co/errors/dual-not-applicable |
| 422 | Earlier Start Reason Required | https://docs.ankatech.co/errors/custody-move-earlier-start-reason-required |
| 422 | Email Address Does Not Match | https://docs.ankatech.co/errors/federated-link-claim-mismatch |
| 422 | Endpoint Not Permitted | https://docs.ankatech.co/errors/alert-destination-endpoint-rejected |
| 422 | Exchange Not Activatable | https://docs.ankatech.co/errors/exchange-not-activatable |
| 422 | Exchange Not Editable | https://docs.ankatech.co/errors/exchange-not-editable |
| 422 | Federated Email Not Verified | https://docs.ankatech.co/errors/federated-email-not-verified |
| 422 | Federated Role Is Service-To-Service Only | https://docs.ankatech.co/errors/federated-role-s2s-only |
| 422 | Federated Role Not Assignable | https://docs.ankatech.co/errors/federated-role-not-assignable |
| 422 | Federated Role Not Found | https://docs.ankatech.co/errors/federated-role-not-found |
| 422 | Heartbeat Destination Shape | https://docs.ankatech.co/errors/alert-heartbeat-destination-shape |
| 422 | Idempotency Key Reused | https://docs.ankatech.co/errors/idempotency-key-reused |
| 422 | Identity Provider Email Unverified | https://docs.ankatech.co/errors/identity-provider-email-unverified |
| 422 | Identity Provider Not Eligible | https://docs.ankatech.co/errors/federated-link-provider-not-eligible |
| 422 | Import Operation Not Orchestrable | https://docs.ankatech.co/errors/import-operation-not-orchestrable-by-use-case |
| 422 | Invalid Certificate | https://docs.ankatech.co/errors/invalid-certificate |
| 422 | Invalid Delivery Provider Target | https://docs.ankatech.co/errors/invalid-notification-target |
| 422 | Invalid Material Transition | https://docs.ankatech.co/errors/material-status-invalid-transition |
| 422 | Invalid Proof Material | https://docs.ankatech.co/errors/invalid-proof-material |
| 422 | Invalid State Transition | https://docs.ankatech.co/errors/invalid-state-transition |
| 422 | Invalid Tenant Custody Scope | https://docs.ankatech.co/errors/invalid-tenant-custody-scope |
| 422 | Invalid Trusted Issuer Target | https://docs.ankatech.co/errors/invalid-trusted-issuer-target |
| 422 | Key Algorithm Incompatible | https://docs.ankatech.co/errors/key-algorithm-incompatible |
| 422 | Key Backend Not Admissible | https://docs.ankatech.co/errors/key-backend-not-admissible |
| 422 | Key Backend Not Offered | https://docs.ankatech.co/errors/key-backend-not-offered |
| 422 | Key Coordinate Not Valid For Backend | https://docs.ankatech.co/errors/key-backend-coordinate-malformed |
| 422 | Key Held On The Deployment Backend | https://docs.ankatech.co/errors/kek-destruction-deployment-backend |
| 422 | Key-Protection Property Not Stored On This Plane | https://docs.ankatech.co/errors/key-backend-property-not-stored |
| 422 | Key Operations Narrowing Forbidden | https://docs.ankatech.co/errors/key-ops-narrowing-forbidden |
| 422 | Key-Material Backend Bind Verification Failed | https://docs.ankatech.co/errors/tenant-backend-bind-selftest-failed |
| 422 | Key Purpose Incompatible | https://docs.ankatech.co/errors/key-purpose-incompatible |
| 422 | Key Reference Required | https://docs.ankatech.co/errors/key-reference-required |
| 422 | Key State Not Admissible | https://docs.ankatech.co/errors/key-state-not-admissible |
| 422 | License Artifact Invalid | https://docs.ankatech.co/errors/license-artifact-invalid |
| 422 | License Expired | https://docs.ankatech.co/errors/license-expired |
| 422 | License Installation Mismatch | https://docs.ankatech.co/errors/license-installation-mismatch |
| 422 | License Notice Not Dismissible | https://docs.ankatech.co/errors/license-notice-not-dismissible |
| 422 | License Schema Version Unsupported | https://docs.ankatech.co/errors/license-schema-version-unsupported |
| 422 | License Signing Key Unknown | https://docs.ankatech.co/errors/license-signing-key-unknown |
| 422 | Lifecycle Policy Subset Violation | https://docs.ankatech.co/errors/lifecycle-policy-subset-violation |
| 422 | Missing Key for a PKCS#7 Signer or Recipient | https://docs.ankatech.co/errors/missing-private-key |
| 422 | Not Enough Quorum Approvers | https://docs.ankatech.co/errors/quorum-insufficient-approvers |
| 422 | Passkey Property Not Established | https://docs.ankatech.co/errors/passkey-property-not-established |
| 422 | Purpose Mismatch | https://docs.ankatech.co/errors/purpose-mismatch |
| 422 | Purpose Required | https://docs.ankatech.co/errors/purpose-required |
| 422 | Rotation Execution Mismatch | https://docs.ankatech.co/errors/rotation-execution-mismatch |
| 422 | Rotation Interval Exceeds Its Ceiling | https://docs.ankatech.co/errors/rotation-interval-exceeds-ceiling |
| 422 | Rotation Purpose Violation | https://docs.ankatech.co/errors/rotation-purpose-violation |
| 422 | Rotation Schedule Without Cadence | https://docs.ankatech.co/errors/rotation-schedule-without-cadence |
| 422 | Tenant Holds The Deployment Key | https://docs.ankatech.co/errors/kek-destruction-deployment-kek-tenant |
| 422 | Tenant's Own Key Not Destroyed | https://docs.ankatech.co/errors/kek-destruction-tenant-own-key |
| 422 | Usage Rotation Without Soft Limit | https://docs.ankatech.co/errors/usage-rotation-without-soft-limit |
| 422 | Usage Rotation Without Usage Limit | https://docs.ankatech.co/errors/usage-rotation-without-usage-limit |
| 422 | Rotation Security Downgrade | https://docs.ankatech.co/errors/rotate-security-downgrade |
| 422 | Tenant Name Confirmation Required | https://docs.ankatech.co/errors/custody-move-confirmation-required |
| 422 | Tenant Policy Subset Violation | https://docs.ankatech.co/errors/tenant-policy-subset-violation |
| 422 | Tenant Type Restriction | https://docs.ankatech.co/errors/tenant-type-restriction |
| 422 | Terminal Actor State | https://docs.ankatech.co/errors/terminal-actor-state |
| 422 | Tier Assurance Downgrade Requires Confirmation | https://docs.ankatech.co/errors/tier-assurance-downgrade-unconfirmed |
| 422 | Tier Bind Self-Test Failed | https://docs.ankatech.co/errors/tier-bind-self-test-failed |
| 422 | Tier Credential Restore Unavailable | https://docs.ankatech.co/errors/tier-credential-restore-unavailable |
| 422 | Tier Credential Self-Test Failed | https://docs.ankatech.co/errors/tier-credential-self-test-failed |
| 422 | Timestamping Cannot Be Required | https://docs.ankatech.co/errors/tsa-cannot-be-required |
| 422 | Unprocessable Entity | https://docs.ankatech.co/errors/unprocessable-entity |
| 422 | Unsupported PKCS#7 Format | https://docs.ankatech.co/errors/unsupported-pkcs7-format |
| 422 | Usage Statement Period Not Covered | https://docs.ankatech.co/errors/usage-statement-period-not-covered |
| 422 | WebAuthn Metadata Refused | https://docs.ankatech.co/errors/webauthn-metadata-refused |
| 422 | Workload Scope Not Admissible | https://docs.ankatech.co/errors/workload-scope-not-admissible |
| 428 | Precondition Required | https://docs.ankatech.co/errors/precondition-required |
| 429 | Alert Test Rate Limited | https://docs.ankatech.co/errors/alert-test-rate-limited |
| 429 | Key Protection Rate Limited | https://docs.ankatech.co/errors/key-protection-rate-limited |
| 429 | Log Fingerprint Rate Limited | https://docs.ankatech.co/errors/log-fingerprint-rate-limited |
| 429 | Log Search Rate Limited | https://docs.ankatech.co/errors/log-search-rate-limited |
| 429 | Refresh Cooldown Active | https://docs.ankatech.co/errors/refresh-cooldown |
| 429 | Streaming Concurrency Limit | https://docs.ankatech.co/errors/streaming-concurrency-limit |
| 429 | Too Many Requests | https://docs.ankatech.co/errors/too-many-requests |
| 500 | Admin Operation Failed | https://docs.ankatech.co/errors/admin-operation |
| 500 | Cryptographic Error | https://docs.ankatech.co/errors/crypto |
| 500 | Data Access Error | https://docs.ankatech.co/errors/data-access |
| 500 | Internal Server Error | https://docs.ankatech.co/errors/internal |
| 500 | Keystore Error | https://docs.ankatech.co/errors/keystore |
| 500 | Probe Address Not Resolvable | https://docs.ankatech.co/errors/probe-address-not-resolvable |
| 500 | Projection Signing Key Set Unreadable | https://docs.ankatech.co/errors/projection-signing-key-set-unreadable |
| 500 | Projection Signing Key Transition Refused | https://docs.ankatech.co/errors/projection-signing-key-transition-refused |
| 500 | Repository Error | https://docs.ankatech.co/errors/repository |
| 500 | Token Signing Key Set Unreadable | https://docs.ankatech.co/errors/token-signing-key-set-unreadable |
| 500 | Token Signing Key Transition Refused | https://docs.ankatech.co/errors/token-signing-key-transition-refused |
| 501 | Not Implemented | https://docs.ankatech.co/errors/not-implemented |
| 502 | Federated Login Internal Error | https://docs.ankatech.co/errors/federation-internal-error |
| 502 | Key-Encryption Key Provider Failed | https://docs.ankatech.co/errors/kek-destruction-provider-failed |
| 502 | Log Store Unavailable | https://docs.ankatech.co/errors/log-store-unavailable |
| 502 | Upstream Service Unavailable | https://docs.ankatech.co/errors/upstream-unavailable |
| 502 | Usage Telemetry Unresolved | https://docs.ankatech.co/errors/usage-telemetry-unresolved |
| 503 | Alert Test Unavailable | https://docs.ankatech.co/errors/alert-test-unavailable |
| 503 | Async Not Usable | https://docs.ankatech.co/errors/async-not-usable |
| 503 | Authentication Policy Unreadable | https://docs.ankatech.co/errors/authentication-policy-unreadable |
| 503 | BYOK Credential Self-Test Unavailable | https://docs.ankatech.co/errors/byok-credential-self-test-unavailable |
| 503 | Compliance Evidence Package Busy | https://docs.ankatech.co/errors/compliance-evidence-package-busy |
| 503 | Data Source Unavailable | https://docs.ankatech.co/errors/data-source-unavailable |
| 503 | Dependency Not Ready | https://docs.ankatech.co/problems/dependency-not-ready |
| 503 | Dependency Not Ready | https://docs.ankatech.co/errors/dependency-not-ready |
| 503 | Deployment Backend Custody Unavailable | https://docs.ankatech.co/errors/deployment-backend-custody-unavailable |
| 503 | Deployment Backend Unreachable | https://docs.ankatech.co/errors/deployment-backend-unreachable |
| 503 | Identity Provider Not Active | https://docs.ankatech.co/errors/idp-not-bound |
| 503 | Identity Provider Unavailable | https://docs.ankatech.co/errors/idp-unavailable |
| 503 | Key Protection Backend Misconfigured | https://docs.ankatech.co/errors/key-protection-backend-misconfigured |
| 503 | Key Protection Backend Not Bound | https://docs.ankatech.co/errors/backend-not-bound |
| 503 | Key Protection Backend Unavailable | https://docs.ankatech.co/errors/key-protection-backend-unavailable |
| 503 | Key-Backend Connection Test Unavailable | https://docs.ankatech.co/errors/key-backend-reachability-busy |
| 503 | Backend Key Provisioning Unavailable | https://docs.ankatech.co/errors/backend-kek-provisioning-unavailable |
| 503 | Backend Self-Test Unavailable | https://docs.ankatech.co/errors/backend-selftest-unavailable |
| 503 | Tier Bind Self-Test Unavailable | https://docs.ankatech.co/errors/tier-bind-self-test-unavailable |
| 503 | Key-Material Backend Bind Verification Unavailable | https://docs.ankatech.co/errors/tenant-backend-bind-selftest-unavailable |
| 503 | Key-Material Backend State Unverifiable | https://docs.ankatech.co/errors/tenant-backend-immutability-unverifiable |
| 503 | Log Fingerprint Audit Unavailable | https://docs.ankatech.co/errors/log-fingerprint-audit-unavailable |
| 503 | Log Fingerprint Rate Bound Unavailable | https://docs.ankatech.co/errors/log-fingerprint-rate-unavailable |
| 503 | Log Search Audit Unavailable | https://docs.ankatech.co/errors/log-search-audit-unavailable |
| 503 | Managed Backend Tier Configuration Unreadable | https://docs.ankatech.co/errors/managed-backend-tier-unreadable |
| 503 | Marketplace Credential Unavailable | https://docs.ankatech.co/errors/marketplace-credential-unavailable |
| 503 | Marketplace Temporarily Disabled | https://docs.ankatech.co/errors/marketplace-temporarily-disabled |
| 503 | Keystore Load Busy | https://docs.ankatech.co/errors/keystore-load-busy |
| 503 | Policy Lock Timeout | https://docs.ankatech.co/errors/policy-lock-timeout |
| 503 | PQC Session Capacity Reached | https://docs.ankatech.co/errors/pqc-session-capacity |
| 503 | Probe Capacity Exhausted | https://docs.ankatech.co/errors/probe-capacity-exhausted |
| 503 | Projection Re-Drive Unavailable | https://docs.ankatech.co/errors/projection-redrive-unavailable |
| 503 | Projection Signing Key Custody Unavailable | https://docs.ankatech.co/errors/projection-signing-key-custody-unavailable |
| 503 | Projection Signing Key Set Not Initialized | https://docs.ankatech.co/errors/projection-signing-key-set-not-initialized |
| 503 | Rotation Policy Unresolvable | https://docs.ankatech.co/errors/rotation-policy-unresolvable |
| 503 | Secret Custody Unavailable | https://docs.ankatech.co/errors/secret-custody-unavailable |
| 503 | Serialised Operation Timed Out | https://docs.ankatech.co/errors/serialised-operation-timeout |
| 503 | Usage Accounting Unavailable | https://docs.ankatech.co/errors/usage-accounting-unavailable |
| 503 | Service Unavailable | https://docs.ankatech.co/errors/service-unavailable |
| 503 | Setup Not Complete | https://docs.ankatech.co/errors/setup-not-complete |
| 503 | Snapshot Stale | https://docs.ankatech.co/errors/snapshot-stale |
| 503 | Stats Snapshot Unavailable | https://docs.ankatech.co/errors/stats-snapshot-unavailable |
| 503 | Support Session Revocation Unavailable | https://docs.ankatech.co/errors/impersonation-session-revocation-unavailable |
| 503 | Temporarily Unavailable | https://docs.ankatech.co/errors/temporarily_unavailable |
| 503 | Tenant In Maintenance | https://docs.ankatech.co/errors/tenant-in-maintenance |
| 503 | Tenant Key Encryption Key Unavailable | https://docs.ankatech.co/errors/tenant-kek-unavailable |
| 503 | Tier Credential Custody Unavailable | https://docs.ankatech.co/errors/tier-credential-custody-unavailable |
| 503 | Time-stamping Authority Unavailable | https://docs.ankatech.co/errors/tsa-unavailable |
| 503 | Token Signing Key Custody Unavailable | https://docs.ankatech.co/errors/token-signing-key-custody-unavailable |
| 503 | Token Signing Key Set Not Initialized | https://docs.ankatech.co/errors/token-signing-key-set-not-initialized |
| 503 | Token Signing Unavailable | https://docs.ankatech.co/errors/token-signing-unavailable |
| 504 | Gateway Timeout | https://docs.ankatech.co/errors/gateway-timeout |
| 504 | Rotation Outcome Unknown | https://docs.ankatech.co/errors/rotation-outcome-unknown |
| 504 | Upstream Service Timeout | https://docs.ankatech.co/errors/upstream-timeout |
Error Response Format
All API errors follow the RFC 9457 Problem Details standard and are returned with Content-Type: application/problem+json. RFC 9457 obsoleted RFC 7807 in July 2023; the application/problem+json media type and the five defined members are unchanged, so a client written against RFC 7807 needs no change. The body is a flat JSON object — there is no nested error envelope:
{
"type": "https://docs.ankatech.co/errors/error-type",
"title": "Human-readable error title",
"status": 422,
"detail": "Additional context about the error",
"instance": "/api/v3/migration/convert-pkcs7-to-jose",
"correlationId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": 1730000000
}
The core fields are defined by RFC 9457:
type- URI identifying the error category (links to the matching page in this reference)title- Short, human-readable summary of the error typestatus- HTTP status code, repeated in the body for conveniencedetail- Human-readable explanation specific to this occurrenceinstance- The request path that produced the error
Two platform extensions accompany the standard fields:
correlationId- Request correlation identifier, for correlation with server-side logstimestamp- Epoch-seconds timestamp of when the error was produced
Some errors add further extensions (for example, PKCS#7 conversion errors include an errorCode, and a missing-key refusal lists every unresolved signer and recipient; OAuth 2.0 errors mirror the RFC 6749 error/error_description fields). See the individual error pages for details.
OAuth 2.0 token-endpoint errors (invalid_request, invalid_client, invalid_grant, unsupported_grant_type and invalid_scope), and the invalid_session of the console sign-in endpoint, use an underscore type suffix so the RFC 9457 type matches the OAuth 2.0 error code exactly.
Where extension members live depends on which service answered
RFC 9457 — and RFC 7807 before it — define extension members as top-level members of the problem object. This platform does not place them uniformly, so a client must know which service produced the body before it reads a non-RFC member. Reading the wrong one returns undefined, and that is the single most common cause of a client falling back to parsing detail.
What is uniform: the five RFC-defined members — type, title, status, detail, instance — are top-level in every service, exactly as the specification requires, and timestamp is top-level everywhere it is emitted, even though by the RFC's definition it too is an extension member.
What moves is the correlation identifier:
| Service | Correlation member | Where to read it |
|---|---|---|
| Core API, PQC Handshake API | correlationId | top-level — response.correlationId |
| Admin API, Audit API | requestId | nested — response.extensions.requestId |
| Auth API | none in the body | the X-Correlation-Id response header |
The License Server serves no client directly: its refusals reach a client relayed by the Admin API, whose body carries extensions.requestId.
The X-Correlation-Id and X-Request-Id response headers are set by every service, so a client that does not want to branch on the service can correlate from the headers alone.
Core API / PQC Handshake API shape — correlationId is a first-class top-level member (this is the canonical example at the top of this page). extensions carries only the additional per-error members, such as the PKCS#7 conversion errorCode:
{
"type": "https://docs.ankatech.co/errors/unsupported-pkcs7-format",
"title": "Unsupported PKCS#7 Format",
"status": 422,
"detail": "The requested target format is not compatible with the parsed structure.",
"instance": "/api/v3/migration/convert-pkcs7-to-jose",
"correlationId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": 1751500800,
"extensions": {
"errorCode": "INCOMPATIBLE_TARGET_FORMAT"
}
}
Admin API / Audit API shape — there is no top-level correlationId. The correlation identity is extensions.requestId, so a client must read response.extensions.requestId, not response.requestId. Every other extension member on these two services is likewise nested:
{
"type": "https://docs.ankatech.co/errors/invalid-input",
"title": "Invalid Input",
"status": 400,
"detail": "Field 'algorithm' is required and must be one of the catalog values.",
"instance": "/api/v3/admin/tenants/2f1c9d84-6b2e-4d3a-9f57-0a1b2c3d4e5f/keys",
"timestamp": 1751500800,
"extensions": {
"requestId": "550e8400-e29b-41d4-a716-446655440000"
}
}
extensions is absent when an error carries none, so read it defensively on every service. Two bodies are produced by a different mapper and carry no extensions and no timestamp at all — the 502 Upstream Service Unavailable and the 504 Upstream Service Timeout.
Dispatch on type — not on errorCode, and never on detail
type is the primary identifier of a problem. RFC 9457 §3.1.1 defines it that way, every distinct condition in this platform has its own dedicated slug, and — decisively — type is the only discriminator that survives every path a response can take to you.
Some Core API and PQC Handshake API bodies additionally carry extensions.errorCode, a stable machine-readable string. It is convenient for a direct integration, but it is not a substitute for type, because it is dropped when the Admin API relays a Core API refusal: the relay's problem view is a closed four-member record — type, title, status, detail — so no extension member of the originating service crosses that boundary. A consumer keyed on errorCode therefore works against the Core API directly and silently stops discriminating on the relayed path.
type crosses it unchanged. So:
- Branch on
type. It is stable, it is documented on the page eachtypeURI names, and it is identical on the direct and the relayed path. - Use
errorCodeonly as a refinement, when it is present, and only where two conditions genuinely share onetype. Never as the primary key, and never assume it is present. - Never parse
detail. It is prose written for a human, it is localized, and it is the one member whose exact wording carries no compatibility promise. If you find yourself matching on its text, the discriminator you actually need is atype— please report it so a dedicated one can be published.
// Correct: the type URI is the contract.
switch (problemDetails.getType().toString()) {
case "https://docs.ankatech.co/errors/key-ops-narrowing-forbidden": widenKeyOpsAndResubmit(); break;
case "https://docs.ankatech.co/errors/purpose-required": declarePurposeAndResubmit(); break;
default: logAndSurface(problemDetails);
}
detail is a sentence, never a document
detail is always a single human-readable sentence. It is never a nested JSON document, and it is never an error body from another service folded into a string. This holds even when the rejection was detected by an internal service that the one you called forwarded your request to — see S2S Relay Envelope for exactly which members come from where in that case. Where a rejection carries per-item detail, that detail is published as a named extension member (for example extensions.failedEntries), not as text inside detail.
406 Not Acceptable carries no body
Content negotiation is the one deliberate exception to "every error is a problem document". When your Accept header excludes every media type an endpoint can produce, the response is a bare 406 Not Acceptable: status line only, Content-Length: 0, and no Content-Type header.
There is no type slug for it, and it is absent from the table above by design. RFC 9110 §15.5.7 explicitly permits a 406 with no representation, and an empty body is the only response that is representable under every Accept value — including the value that caused the condition. Sending a application/problem+json body to a client that has just declared it cannot accept that type would be self-contradictory.
Practically, for a strict JSON client:
Accept: application/jsonon an error-only endpoint returns the endpoint's normal status, not a 406.Accept: application/xml(or any value the endpoint cannot satisfy) returns the empty 406.- A malformed
Acceptvalue also returns the empty406, not a400: an unparseable header makes the mapping fail to match on its producible types, which is the same condition as an unsatisfiable one. */*and an absentAcceptheader behave exactly as before.
Treat a 406 as a client-side content-negotiation bug: correct the Accept header and retry. Do not attempt to parse the response.
The Browser-Redirect Error Surface
Three external identity-federation legs are top-level browser navigations, not API calls. When one of them fails, the browser is redirected to the console login screen carrying ?error=<code>&ref=<uuid> — there is no response body, and therefore no type, no detail and no correlationId (the correlation identifier is ref). See Federated Login Errors for the seven codes and their remedies.
This is a second error representation, not an exception to the RFC 9457 guarantee above. A surface may use it if and only if all three of the following hold:
- the request is a top-level browser navigation that the browser renders as a document;
- the caller therefore cannot read a response body, so an interposing CDN or proxy may replace it;
- an equivalent typed RFC 9457 refusal remains available on a non-navigation surface for programmatic consumers.
Every non-navigation surface — fetch/XHR, the SDKs, the CLIs and service-to-service calls — returns RFC 9457 Problem Details unconditionally. No error type documented on the pages below is retired, renumbered or made unavailable to a programmatic caller by the redirect projection.
Client Errors (4xx)
Client errors indicate that the request contains incorrect syntax or cannot be fulfilled due to client-side issues.
400 Bad Request
- Invalid Input - Request contains syntactically invalid data or malformed JSON
- Credential Required for Endpoint Change - An update moved the endpoint of a destination holding a sealed credential without supplying a credential for the new endpoint;
extensions.fieldnames the credential member, and nothing was written - Algorithm Not Admitted - The tenant's algorithm policy does not admit the algorithm of a key create, rotation or import;
extensions.algorithmandextensions.refusedByname the algorithm and the refusing check - Invalid Date Range - A usage-telemetry or usage-export date range is wider than its grain's maximum span
- Invalid PKCS#7 Structure - Provided file is not a valid PKCS#7/CMS structure
- Invalid Request Parameters - The query string or form body could not be decoded (for example an invalid
%encoding) - Missing Request Part - Required multipart form data or request parameters are missing
- Multipart Parts Out Of Order - The payload part arrived before the small part describing it, and a streaming endpoint cannot rewind
- Validation Error - Request passed JSON parsing but failed field validation rules
- Unsupported Keystore Format - Uploaded keystore is in a format the platform does not support
- Keystore Derivation Budget Exceeded - A keystore declares more password-based key derivations than one import may run; split it
- Keystore Secret-Key Entry - A keystore holds a secret-key entry, which an import never keeps
- Keystore Private Key Without Certificate Chain - A keystore holds a private-key entry with no certificate chain
- Key Operation Incompatible - Re-encrypt or re-sign named a symmetric key and an asymmetric (SIMPLE or composite) key
- Key-Protection Declaration Not Valid For This Driver - A key-protection declaration in the driver form was refused by the declared driver's descriptor;
extensionsname themember, thefieldand thereason, never a value, and nothing was written or contacted - Invalid Operation Name - Supplied operation name is not a recognized cryptographic operation
- Signature Mismatch - An audit record tamper-evidence signature did not verify
- Query Range Exceeded - Audit query time range or result window exceeds the maximum allowed
- Rotation Interval Below The Deployment Floor - A rotation-schedule interval is shorter than the shortest interval the deployment admits (
P1Dunless a development deployment lowers it);extensions.floorstates it and nothing was stored - Observability Signal Not Permitted - A tenant observability destination subscribed to
LOGS, which only platform backends export; nothing was saved - Invalid Request - OAuth 2.0: OAuth 2.0 token request is malformed or missing a required parameter
- Invalid Grant - OAuth 2.0: OAuth 2.0 authorization grant or refresh token is invalid, expired, or revoked
- Unsupported Grant Type - OAuth 2.0: OAuth 2.0 grant type is not supported by the authorization server
- Invalid Scope - OAuth 2.0: OAuth 2.0 requested scope is unknown, malformed, or exceeds the permitted scope
- Administrator Credential Not Admitted - A tenant provisioning carried
adminPasswordorrequirePasswordChangefrom a caller that may not choose the first administrator's credential; only a platform workload on a development deployment may,extensions.membernames the member, and nothing is created - Invalid DPoP Proof - OAuth 2.0 (RFC 9449): an administrative workload's DPoP proof is missing, repeated, malformed, stale, already used or does not bind the request;
400at the token endpoint,401withWWW-Authenticate: DPoP error="invalid_dpop_proof"at the Admin API - Instance Claim Code Invalid - The claim code entered on the console's claim screen does not redeem (none minted, wrong, replaced, expired, invalidated, the redeemed code with another address, or any code once the instance is claimed); one body for every case, nothing created
- Invalid Session - OAuth 2.0: the
auth_sessionof a console sign-in step is unknown, already answered or expired; start the sign-in again - Passkey Registration Refused - A passkey registration response did not verify (origin, RP ID, challenge, user verification or a credential already registered); nothing is stored
- Password Policy Violation - A chosen password breaks the password policy;
extensions.rulenames the rule
401 Unauthorized
- Unauthorized - Missing or invalid authentication credentials
- Invalid Client - OAuth 2.0: OAuth 2.0 client authentication failed
- Reauthentication Required - The operation requires a recent proof of the person's identity and the token's last authentication is older than the reauthentication window; the session is valid, reauthenticate and retry (RFC 9470)
Every 401 carries WWW-Authenticate: Bearer
A 401 from a bearer-protected endpoint states the scheme it refused under, per RFC 6750 §3. The challenge carries the scheme and nothing else — no realm, no error code, no scope list, none of which may describe a protected resource to a caller who has not authenticated.
The one exception is Reauthentication Required: the caller IS authenticated, and its token's last authentication is older than the operation allows. That challenge carries error="insufficient_user_authentication", error_description and max_age (RFC 9470 §3), which depend only on the caller's own token. Read it before treating a 401 as an expired session.
A 403 never carries the challenge: you ARE authenticated, and presenting the same scheme again cannot change the outcome.
A token is only a credential for the audience it was issued to
Audience is part of authentication, not authorization. A token minted for one service is not a credential at another, so the second service answers 401, not 403 — no scope check is ever reached. Actor tokens from the client_credentials grant target the Core API; presenting one to the Admin or Audit API is an unauthenticated request, however many scopes it carries.
402 Payment Required
- Deployment License Expired - The deployment's license has lapsed and it has entered cryptographic read-only mode; operations that create new protection or new key material are refused, while decrypt, verify and reads continue
- Payment Required - A usage or plan-limit refusal. Deployment-license expiry is a different problem with a different
type— see the entry above
403 Forbidden
- Deployment Policy Is Compliance-Immutable - The deployment was created for a regulated compliance region, so its deployment policies are locked for the lifetime of the deployment; not an authorization refusal, and no scope admits the write
- Forbidden - Authenticated but lacking permission for the requested operation
- Key Below Security-Strength Floor - An encryption or signature named a key whose security strength is below the tenant's minimum;
extensions.securityStrengthBitsandextensions.minSecurityStrengthBitsname both. Decrypting, verifying and moving data off the key stay admitted - SaaS-Only Feature - Feature is available only in the ANKASecure SaaS deployment
- Unsupported Principal Type - Authenticated principal type is not supported for the operation
- Scope Subset Rule Violation - The request would confer on somebody else an authority the caller does not itself hold
- Operation Not Available While Impersonating - The route is withheld from a support-access impersonation session
- Break-Glass Session Cannot Acknowledge - A security alert was acknowledged from a break-glass session; sign in normally to acknowledge it
- Break-Glass Session Cannot Change Designation - A break-glass designation was set or cleared, or a designated member removed, from a break-glass session; sign in normally to change it
- Break-Glass Session Cannot Recover Identity - An assisted identity recovery was requested from a break-glass session; sign in normally to perform it
- Security Alert Acknowledgment Not Permitted - A tenant's security alert was acknowledged on the platform plane, which reads tenant alerts but never acknowledges them
- Compliance Pack Not Licensed - A catalogued compliance pack is locked because the deployment licence does not entitle it: its live evaluation (on either plane, and of one tenant in it), the remediation update, preview, execution and attestation, and both evidence exports are refused, while its stored history, plan, executions and attestations stay readable
- Custody Operation Not On This Plane - A key custody operation was sent to the plane that does not decide it for this tenant on this deployment (on SaaS, a tenant's own key management service is its tenant administrator's, and moves between managed tiers follow the platform administrator's Edition change); the scope is present and nothing was written
- Workload Self-Modification Forbidden - An administrative workload addressed itself in a write (its status, name, keys, bindings or scopes); nothing changed
A 403 means your permissions were established and found insufficient
When the platform cannot ESTABLISH your permissions — because a service it consults to expand your roles is unreachable — it answers 503 with dependency-not-ready, not 403. The two are deliberately distinct: a 403 is a statement about your request and retrying it will not help, whereas the 503 is transient and carries Retry-After.
So a 403 from this API is always a real denial. If you are handling both, branch on the type member and treat only the 503 as retryable.
404 Not Found
- Resource Not Found - The requested resource, key, or endpoint does not exist
- Material Version Not Found - The referenced key material version does not exist
- Compliance Pack Not Found - A well-formed compliance pack identifier names no pack of the running release
A cross-tenant read of a per-tenant admin resource answers 404, not 403
When a tenant-scoped caller addresses a per-tenant resource owned by a DIFFERENT tenant, the Admin API answers 404 with not-found — the same type, title and shape as a genuine not-found, and a detail naming no tenant.
This is deliberate. A 403 would confirm the addressed resource is real and merely withheld, which is enough to enumerate a deployment's tenant, actor and key identifiers by reading status codes. The refusal is decided before any lookup runs, so the response cannot vary with whether the other tenant exists.
Two consequences for a client:
- Do NOT branch on
403to detect "wrong tenant" — you will never see one for that case. instanceon this response is the route TEMPLATE, not your request path, because the path you sent is itself the identifier that must not be echoed back.
A 403 from the Admin API on a tenant-scoped path therefore means a missing scope, or a SaaS platform administrator reading another tenant's data — both statements about your permissions, not about which tenant you asked for. The deployment-model refusal is about another tenant only: a platform administrator addressing its own tenant is admitted on every deployment model, so that path never carries it. The refusal that does carry it reads "Access denied: Platform administrators cannot access another tenant's data in SaaS deployments".
405 Method Not Allowed
- Method Not Allowed - The HTTP method is not supported for the endpoint
409 Conflict
- Conflict - The generic conflict: what you receive when the server has nothing narrower to say (a concurrent modification that lost the race, an absent precondition, or an upstream conflict that classified nothing at all). A duplicate identifier is not this type — it carries
duplicate-kid - Credential Endpoint Changed - A credential-only write carried the
endpointFingerprintof an endpoint that is no longer the one bound; the endpoint moved after the read, and nothing was sealed - Invalid Key State - Key exists but is in an invalid lifecycle state for the requested operation
- Key Material Expired - An encryption or signature (or the target of a re-encryption or re-signature) named a key whose current material is past its expiry, or whose expiry cannot be read. Nothing produced, the key unchanged, no
Retry-After; it still decrypts and verifies, and rotating it restores protection. A key both expired and exhausted is answered with this type - Key Material Usage Exhausted - An encryption or signature named a key whose current material has used up its usage limit, a budget of protection operations that decrypt and verify never spend. Nothing produced or counted, the key unchanged, no
Retry-After; rotating it restores protection - Key Protection Limit Reached - A key-metadata update set or cleared
expiresAton a key whose expiry is reached, ormaxUsageLimiton a key whose usage limit is used up. A reached limit is final; nothing is written, and rotation is the remedy - Key Material Without Operations - A key import re-imported an existing key whose stored current material declares no permitted operation (an empty
key_ops, which only an earlier release could store). Nothing is written, noRetry-After; rotate or recreate the key - Stateful Key Exhausted - An XMSS, XMSS^MT, LMS or HSS key can produce no further signature: every one-time index is used, or the key existed in a database that was later restored. Nothing signed, no
Retry-After; rotate the key, and its earlier signatures still verify - Stateful Key Busy - Another request was reserving the same stateful key's next one-time signature and this one did not get the reservation within its bound. Nothing signed, no index spent; carries
Retry-Afterand is safe to retry - Concurrent Modification - Resource was modified by another request between read and write
- Root Membership Exclusive - A membership would put a platform administrator's identity in a tenant, or a tenant member's identity in the platform tenant; platform administrators reach a tenant only through consented support access. Nothing is written, and the
detailis one fixed sentence that names no address - Session Not Identified - Ending every other session was asked with an access token that names no session (no
sidclaim), so the calling session cannot be told from the others. Nothing changes; sign in again and repeat the request - Data Integrity Error - Request violates a data integrity constraint
- Key ID Retired - The requested kid belonged to a key this tenant destroyed; a Key ID is never reused within its tenant. Raised on key creation and import on both planes with the same
type; a keystore import reports the entry among itsfailureswith reasonKEY_ID_RETIREDand imports the rest - Duplicate KID - A key that still exists already holds the requested kid for the tenant, in any lifecycle status; a destroyed key's kid is retired instead (Key ID Retired). Raised by the Core API key plane and relayed unchanged by the Admin API tenant-in-path create, which re-presents this same
type, so you can branch on it on either plane; that create answers the genericConflictonly on its degenerate arm, when the upstream refusal identified nothing at all - Cascade Subset Violation - A cascading change would leave dependent policies outside the allowed subset
- Counterparty Type Still Referenced - Counterparty type is still referenced and cannot be deleted
- Credential Install Not Recorded For The Current Declaration - The environment host reported installing a PKCS#11 partition credential for a backend the deployment no longer declares; the report is audited and not recorded, and the host activation stops before the bind
- Token Serial Not Reported By The Declared Backend - Selecting the PKCS#11 token by serial was requested while the declared or configured backend's module reports no token serial (AWS CloudHSM) — on the selector's settings write, the configuration, the declaration or the activation; nothing was written or contacted, and the remedy is to select the token by label
- Key-Protection Backend Activation In Progress - A second activation, a declaration, a withdrawal, a descriptor configuration or a credential replacement was attempted while a deployment backend activation is in flight; nothing was changed or contacted, and the request is retried once that activation ends (a window that has made no progress for 15 minutes is treated as abandoned)
- Key-Protection Backend Activation Window Lost - An activation stopped without recording the bind because its activation window was no longer its own, or the configuration, credential or declaration it read changed while it ran; a re-run reads the configuration that stands now, keeps the keys already recorded for the backend and creates or resolves the missing ones
- Deployment Backend Changed During The Write - A credential replacement was proved, and the configuration, the credential in effect or the declaration had changed by the time it would have been put into effect; nothing was promoted and the credential in effect is unchanged — re-read and retry
- Key Protection Backend Not Configured - The key-protection backend setup has not been completed; carries
setupState, noRetry-After - Marketplace Bootstrap In Progress - Marketplace bootstrap is in progress for the tenant
- Marketplace Edition Unavailable - The Edition a RapidAPI subscription plan maps to cannot be delivered (its managed key-protection tier is not active, or its backend has no room);
extensions.editionandextensions.reasonname which and why, nothing was created or changed, and the same request answers the same refusal until the Edition can be delivered - Edition Set By Marketplace Plan - A write would set the Edition or key custody of a RapidAPI marketplace tenant (an Edition assign or clear, a tenant-plane custody move write, a BYOK declare or bind), whose Edition only its subscription plan sets; nothing was written
- Deployment Backend Declaration Is In A Retired Shape - The stored deployment key-protection declaration predates a descriptor collapse and no longer deserializes; carries
backendTypeand no coordinate, and noRetry-After - Managed Tier Key Capacity Exhausted - Establishing per-tenant key custody would take the Edition tier's carrier past the backend's published key-object ceiling; names the tier and the object counts, and nothing was written
- Unfit Key Material Object - The object under a tenant's key-encryption-key label is not a sensitive, non-extractable AES-256 key, so it is refused rather than adopted; nothing created and nothing adopted. PKCS#11 only
- Foreign Environment Claim - The PKCS#11 security domain carries another environment's claim, or holds bootstrap-labelled key-encryption keys under no claim at all; nothing created and nothing adopted. Names neither environment and neither fingerprint. PKCS#11 only — the Cloud KMS families carry no claim marker
- License Already Imported - A license with the artifact's
licenseIdhas already been imported into this installation; exactly one is stored, and a renewal is a new license - License Installation Identity Unavailable - The licence server cannot establish which installation it is (the trial sentinel is missing, unreadable, fails its integrity check, or carries no canonical installation ID); license import, the activation request, statement reads and signed compliance evidence are refused until the sentinel is restored
- Usage Statement Already Issued - A usage statement was asked for a month that already has one in this scope and the request names nothing to supersede; the detail names the month, and the remedy is a correction naming the current statement
- Usage Statement Already Superseded - A usage-statement correction names a statement another retained statement already supersedes; the chain is kept linear so the month keeps one current statement, and the detail names the leaf to correct instead
- Usage Statement Coverage Unverifiable - A usage statement was asked for while the deployment's installation cannot be vouched for (the trial sentinel is missing or invalid); no statement can bound its completeness, and every month is refused until the sentinel is restored
- Usage Statement Period Not Covered - A usage statement was asked for a month that ends before the first day whose rows this deployment's usage store holds (the later of the installation day and the oldest retained day); the detail names that day, and the month never becomes issuable
- Usage Statement Not Finalizable - A usage statement was asked for a month that is not yet
FINAL; the detail names the month and whether it isOPENorPROVISIONAL, and the request succeeds unchanged once the month finalizes - Usage Export Concurrency Limit - A usage export was started while the per-actor or per-plane-and-tenant-scope cap on in-flight exports was already reached; nothing is created, the detail names the cap, and the remedy is to wait for an export to finish. A
409and not a429, because a429would reach the caller through the Admin API relay as a502 - Compliance Remediation Basis Changed - A compliance remediation step was confirmed with a
basisthat no longer matches the keys or the evaluation; nothing ran, and the remedy is to preview again - Compliance Remediation Conflict Unacknowledged - The chosen remediation targets would newly fail items of another licensed pack that the request did not acknowledge; the conflicts are listed and nothing ran
- Compliance Remediation Execution In Progress - A compliance remediation action was confirmed under a new
Idempotency-Keywhile another execution of the same action is still running; one action runs at most once at a time, nothing ran, and the remedy is to wait for the running execution and preview again - Idempotency Key In Progress - A request was retried with the same
Idempotency-Keyand body while the first one is still running; nothing ran, and the retry succeeds with the stored result once the first finishes - Material Version Moved - A key rotation found the key at another material version than the one it advances from, because another rotation advanced it first; nothing was changed, and a resend under the same
Idempotency-Keyrepeats the refusal - Bootstrap Workload Exists - The first platform workload was asked for from the environment host while a platform workload that is not
REVOKEDexists (aSUSPENDEDone included); nothing registered - Issuer Subject Already Bound - The trusted issuer and subject are already bound to an administrative workload or a cryptographic actor of the tenant
- Workload Credential Conflict - The public key is already registered on a workload of the deployment
- Workload Credential Not Active - A workload key that is rotating out or revoked cannot be rotated
- Workload Name Conflict - A live administrative workload of the tenant already uses the name
- Workload Revoked - The administrative workload is revoked, which is terminal; it cannot be changed or reactivated
- Authenticator Removal Would Lock Out - Removing one of your own authenticators, or your password, would leave a membership with no way to sign in
- Last Platform Super Administrator - The change would leave no active
PLATFORM_SUPER_ADMINable to sign in by an ordinary route (password + TOTP, a usable passkey or an approved platform identity provider); the break-glass entry does not count, and nothing is changed - Platform Super Administrator Role Immutable -
PLATFORM_SUPER_ADMINis never edited or deleted: its scopes are the platform catalogue's - Federated Credential Recovery - An identity federated through OIDC or SAML is recovered by its identity provider, not by assisted recovery
- Recovery Entry Unreachable - An identity holding no active membership is not recovered: its enrolment could never be completed. A person who never activated is re-sent the activation link instead
- Tenant Recovery Request Required - On a deployment ANKA operates, an identity of a customer tenant is recovered only to answer a pending request one of its tenants filed; nothing was changed, and the refusal is audited
DENIED - Security Alert Already Acknowledged - The security alert was already acknowledged; the first acknowledgment is kept
- Ownership Recovery Identity Ineligible - Deployment-ownership recovery named an identity that holds a tenant membership, or holds no platform membership or one it has not accepted
- Instance Not Claimed - Deployment-ownership recovery ran on an environment nobody has claimed yet; the first platform administrator is created by the instance claim
- Instance Already Claimed -
envctl.sh <env> claim-coderan on an environment that already has its first platform administrator; no claim code is minted. A claim start on a claimed environment answers Instance Claim Code Invalid instead - Passkey Unavailable On Origin - A passkey ceremony was asked for while the console is open on an address that is not the Management host name (such as the host's IP address); no
Retry-After
Key custody moves. A key custody move re-wraps every key of a tenant under another key-encryption key. Its operations answer these types, and each one is raised before anything is written:
- Custody Move In Progress - The tenant already has a scheduled or running custody move, so a second move, a BYOK change, an Edition change or a lifecycle verb on a tenant in
MAINTENANCEis refused until it ends - Custody Move State Conflict - The move is not in a state the operation applies to (for example a cancel of a move that already started)
- Custody Destination Is The Source - A move started, or its destination chosen, names the key protection the tenant's keys are already on: its managed tier, the deployment backend it inherits, or the own key it is bound to
- Custody Move Past Its Swap - An abort of a window whose keys are already live on the destination, or of an online move; it only completes, and a roll back returns to the key it left
- Custody Roll Back Unavailable - The key-encryption key a roll back would return to is past its 30-day retention or was retired by a compromise re-key
- Custody Move Awaits Tenant Consent - On SaaS, a downgrade off a tenant's own key management service is scheduled by its tenant administrator, not by the platform administrator
- Tenant Not Eligible For A Custody Move - The tenant is suspended or closed; its custody does not move
The key service answers the administration service with its own types while a move runs. They never reach a client, and an operator sees their effect on the move's state: Custody Swap Incomplete, Custody Write Conflict, Custody Stage Not Verified, Custody Lineage Not Current, Custody Material Unreadable and Custody Rollback Conflict.
Key-encryption key destruction. A platform administrator destroys a tenant's retired key-encryption key at its provider or HSM, and may cancel the destruction while it is pending. Each refusal leaves the key in the status it had, and none changes anything at the provider:
- Key-Encryption Key Not Retired - A destruction was asked for a key-encryption key that is not retired
- Key-Encryption Key Destruction Already Requested - The key-encryption key is already pending destruction, or already destroyed
- Key-Encryption Key Still Retained - The key-encryption key is still inside the 30-day retention a roll back may return to it in
- Key-Encryption Key Still Wraps Key Material - A recount found key material that is, or may be, wrapped under the key-encryption key
- Key Object Still In Use - Another lineage entry of the tenant that is not retired names the same key object
- Custody Move In Progress - A key custody move of the tenant is open, so none of its key-encryption keys is destroyed
- Key-Encryption Key Carrier Not Bound - The managed tier holding the key-encryption key is bound to another key management service now
- Key Object Not Resolved - The HSM holds more than one object under the key-encryption key's recorded label, or one carrying another identifier
- Provider Permission Missing - The managed tier's credential lacks the permissions to destroy a key, or to cancel its destruction;
extensions.step = PROVIDER_DESTRUCTION - Key-Encryption Key Destruction Not Pending - A cancel was asked for a key-encryption key whose destruction is not pending
- Key-Encryption Key Destruction In Flight - A cancel was asked while the destruction request may still be waiting for its provider
- Key-Encryption Key Already Destroyed - The provider has already destroyed the key-encryption key, so its destruction cannot be cancelled
412 Precondition Failed
- Precondition Failed - A request precondition was not satisfied
413 Payload Too Large
- Payload Too Large - A JSON request body exceeds the ceiling of the route it targets (a per-service ceiling, or one derived from the operator setting that bounds the payload); refused before it is read, after authentication and authorization
- Request Parameters Too Large - A form body exceeds the size the server parses into parameters
- License Artifact Too Large - License artifact exceeds the maximum accepted size
- WebAuthn Metadata Too Large - An uploaded FIDO metadata file exceeds 32 MiB; the loaded metadata is unchanged
415 Unsupported Media Type
- Unsupported Media Type - Request Content-Type is not supported by the endpoint
421 Misdirected Request
- Misdirected Request - The request reached a Core API deployment role that does not serve its route, and was refused before any processing: no handler ran, no usage was counted, no audit event was recorded. A request through the platform's edge is routed to the right role and never receives it; no
Retry-After
422 Unprocessable Entity
- Unprocessable Entity - Semantically incorrect content (malformed JWE/JWS, header validation failures, and value-level rules a well-formed body cannot satisfy — an inverted
validFrom/validUntilwindow, or a negativemaxUsage/rateLimitPerMinuteon a constraint policy) - Unsupported PKCS#7 Format - Valid PKCS#7 structure that cannot be converted as requested (
COMPACTfor several actors, more actors than one conversion accepts, an unsupported identifier, recipient type or algorithm) - Missing Key for a PKCS#7 Signer or Recipient - One or more signers or recipients of a PKCS#7 conversion have no tenant key admissible for their role (a certificate imported alone only verifies);
extensions.unresolvedActorsnames every one - Decryption Failed - Supplied key could not decrypt the PKCS#7 content (wrong recipient key or corrupted ciphertext)
- Purpose Required - Key purpose could not be inferred and must be declared explicitly
- Tenant's Own Key Not Destroyed - The key-encryption key is the tenant's own key at its key management service, which the platform never destroys
- Tenant Holds The Deployment Key - The tenant is a bootstrap tenant, whose key-encryption keys are the deployment's own
- Key Held On The Deployment Backend - The key-encryption key is on a Cloud KMS deployment backend, in the customer's account
- Rotation Purpose Violation - Rotation cannot change the key purpose
- Key Operations Narrowing Forbidden - Rotation may only preserve or widen the current material's
key_ops, never narrow it - Rotation Security Downgrade - Rotation target is a security downgrade from the current key
- Dual Not Applicable - Dual projection is not applicable to a single-purpose key
- Composite Wire Shape Mismatch - Composite message wire shape does not match the key definition
- Composite Component Algorithm Mismatch - Composite component algorithm does not match the key definition
- Composite KDF Mismatch - The composite JWE's protected
anka_kdfis absent, unknown, or not the KDF the key material records - Invalid State Transition - Requested lifecycle state change is not permitted from the current state
- Invalid Material Transition - Requested key material status change is not allowed from its current status
- Purpose Mismatch - Key purpose does not match the purpose required by the operation
- Algorithm Not Permitted for Operation - Key algorithm is not permitted for the operation under the active policy
- Tenant Type Restriction - Operation is not allowed for this tenant's type
- Tenant Policy Subset Violation - Tenant policy is not a subset of the parent policy
- Lifecycle Policy Subset Violation - Lifecycle policy is not a subset of the inherited policy
- Import Operation Not Orchestrable - Import operation cannot be orchestrated under the requested use case
- Composite-Pair Operation Not Supported - Composite-pair operation requires a multi-key use case that is not yet supported
- License Artifact Invalid - License artifact failed validation: it is malformed, its signature could not be verified, or it names a compliance pack the running release does not define
- License Schema Version Unsupported - License artifact declares a payload schema version this deployment does not support
- License Signing Key Unknown - License artifact names, in
signature.kid, a signing key the running release does not trust; refused before the signature is checked, and the remedy is a re-issue under a trusted key or an upgrade to a release that trusts it - License Installation Mismatch - License artifact is authentic but was issued for a different installation (its signed
installationIdis not this installation's); the remedy is a license issued from this installation's activation request - License Expired - License artifact has passed its validity period
- Compliance Evidence Too Large - The signed compliance evidence document of a pack would exceed its 16 MiB bound, so nothing was signed
- Key Coordinate Is Not Valid For This Backend - The submitted
keyIddoes not parse under the declared backend family's own grammar; carriesfieldandbackendType, and never the submitted value - Custody Destination Unsupported - A key custody move names a destination the platform cannot move the tenant's keys to, or a key-encryption key rotation or rotation period is asked of a carrier whose key its provider or its owner rotates
- Earlier Start Reason Required - On SaaS, a custody window for an Edition change scheduled earlier than the platform's default notice carries no
earlierStartReason - Tenant Name Confirmation Required - A move back to the deployment's key protection backend without the tenant's name typed exactly in
confirmTenantName - Custody Destination Invalid and Custody Source KEK Required - answered by the key service to the administration service during a custody move, never to a client; the window reopens the tenant on its source
- Key-Protection Property Not Stored On This Plane - A key-protection declaration in the driver form carries a property the driver accepts and the plane has no place to keep;
extensions.fieldnames it and nothing was written - Backend Endpoint Requirement Not Satisfied - The declared backend requires a connection endpoint and none was supplied, accepts none and one was, or the endpoint's host is not a host of the backend's vendor; carries
fieldand never the submitted value - BYOK Credential Self-Test Failed - A new BYOK access credential did not pass verification against the declared key, so it was not stored and the credential in force remains; carries
reasonandcheck, sends noRetry-After - Key-Material Backend Bind Verification Failed - A BYOK bind's self-test reached the declared backend and its answer is durable (refused credential or operation, round-trip mismatch, missing key, unusable declaration); the
reasonextension names it and waiting will not change it - Bootstrap Tenant Uses Deployment Custody - A bootstrap tenant other than the platform tenant was named as the target of an Edition assignment or clear, or of a BYOK declare, bind, credential rotation or revert; its keys are held by the deployment's backend; nothing was read or contacted, and the one write is a
FAILUREaudit row - BYOK Declared Key Unusable - A new BYOK access credential could not find or address the declared key (
KEY_ABSENT,DESCRIPTOR_INVALID,SECURITY_DOMAIN_ABSENT), so it was not stored and the credential in force remains; carriesreasonandcheck, sends noRetry-After - Backend Key Coordinate Requirement Not Satisfied - The declared DEPLOYMENT backend requires a key coordinate and none was supplied, or accepts none and one was; carries
fieldand never the submitted value. Not abyok-type: the refusal cannot occur on the per-tenant plane, where every family requires a coordinate - Timestamping Cannot Be Required - A configuration write would leave tenants required to timestamp over a connection that cannot produce one; platform writes carry
affectedTenantCountanddeploymentDefaultAffectedand can be repeated with?acknowledgeAffectedTenants=<count>, the tenant write carries neither and has no acknowledgement - Alert Bounds Out Of Order - A platform settings write or reset would leave
ALERT_SIGNIN_FAILURES_CRITICAL_PER_HOURbelowALERT_SIGNIN_FAILURES_WARNING_PER_HOUR; carriesfieldandrelatedField, never a value, and cannot be acknowledged - Backup Run Not Recorded - An off-host copy was declared with an archive SHA-256 that is not the archive of any successful backup run the platform recorded; nothing is recorded and the refusal is audited
- Compliance Remediation Step Not Applicable - The confirmed step is not one the compliance remediation action offers; nothing ran
- Compliance Remediation Rotation Admissible - A successor key was confirmed for a key that can be rotated under the same Key ID; nothing ran
- Compliance Attestation Not Applicable - An attestation named an item the platform measures, or one that is not in the pack; only customer-attested and unverified items are attestable, and nothing was stored
- Idempotency Key Reused - An
Idempotency-Keywas reused with a different request; nothing ran - Rotation Execution Mismatch - The key service's execution identifier for a rotation already names a different rotation; nothing was written. A platform defect when seen on the Admin API, never a defect of the request
- Rotation Interval Exceeds Its Ceiling - A rotation-schedule interval is longer than the deployment maximum, the maximum cryptoperiod of the entitled compliance packs, or the default of a compliance-locked deployment;
extensions.ceilingnames the bound and nothing was stored - Rotation Schedule Without Cadence - Automatic rotation was enabled on a key to which no rotation interval applies and with no usage option on; nothing was stored
- Usage Rotation Without Soft Limit -
rotateOnSoftUsageLimitwas turned on for a key with no soft usage limit; nothing was stored - Usage Rotation Without Usage Limit -
rotateOnUsageExhaustionwas turned on for a key with no maximum usage limit; nothing was stored - Workload Scope Not Admissible - A scope an administrative workload of that tenant may never hold;
extensions.inadmissibleScopesnames every one and nothing is stored - Authentication Posture Not Admissible - A tenant authentication posture the deployment does not allow, or that no member could satisfy;
extensions.fieldnames the member - Break-Glass Designation Ineligible - A membership that cannot be a break-glass identity was designated, or a designated one was linked to an identity provider or restricted to it
- Passkey Property Not Established - A tenant requires an attested, hardware-backed or device-bound passkey and the registration could not establish it;
extensions.reasonsays why - WebAuthn Metadata Refused - An uploaded FIDO metadata file was not admitted;
extensions.reasonnames the failed check
428 Precondition Required
- Precondition Required - The write carried no precondition against a resource that already has a stored value, so it was refused rather than allowed to overwrite it; the remedy is to read the current
versionand send it back, never to re-read after a change nobody made
429 Too Many Requests
- Too Many Requests - Request rate limit exceeded for the endpoint
- Refresh Cooldown Active - A snapshot refresh cooldown is still active
- Key Protection Rate Limited - Too many key-protection operations; retryable after the
Retry-Afterinterval - Log Fingerprint Rate Limited - 10 log fingerprint computations by this caller in the current minute or 200 in the current day; nothing was computed or recorded, retry after
Retry-After - Log Search Rate Limited - 30 platform log searches by this caller in the last minute; nothing was searched or recorded, retry after
Retry-After
4xx Generic
- Client Error - General client error fallback for unspecified 4xx status codes
Federated-login refusals
Two refusals are specific to identity federation, and they are separate types because the remedies belong to different people.
409 federation-domain-verification-required
Enabling an identity provider was refused because the applicable verified email-domain set is empty. The provider is fine; the deployment has not yet declared which email domains it federates, and a provider enabled in that state would refuse every sign-in it received.
extensions.prerequisite carries VERIFIED_DOMAIN_REQUIRED.
Remedy: declare at least one email domain, then enable again. On a customer-operated deployment declaring is verifying — there is no DNS challenge.
This is deliberately a different type from the other 409 the same operation can return (a provider with no passing self-test): "run a self-test" and "declare a domain" are different actions performed by potentially different people, and collapsing them would force the caller to read the detail to find out which.
403 federation-not-entitled
The tenant's licensed edition does not include tenant-configured identity federation.
This is not an authorization problem, and the detail deliberately contains none of "permission", "not authorized", "forbidden" or "scope". The caller is inside their tenant boundary and holds the right scope; what is missing is commercial. Reading it as an RBAC failure sends a tenant administrator to audit their own roles for a problem that is not there, and they will not find it.
Remedy: contact your account manager. A tenant that cannot configure its own provider is still able to sign in through the identity provider configured for the deployment — this refusal is not "single sign-on is unavailable to you".
The detail never discloses whether a licence read failed. The entitlement read (GET /api/v3/admin/tenants/{tenantId}/idp/entitlement) does report that, as resolution: FLOORED, because it answers an already-scoped administrator asking about their own tenant rather than an attempted write. The asymmetry is intentional.
Server Errors (5xx)
Server errors indicate that the server failed to fulfill a valid request.
500 Internal Server Error
A 500 means the platform could not attribute the failure to your request. It is a server fault, and it is not retryable — a transient condition is reported as a 503 with Retry-After, never as a 500. A condition that has an owning error type is reported as that type, with its own status.
- Internal Server Error - Unexpected server-side error occurred
- Cryptographic Error - Internal cryptographic operation failure
- Repository Error - Database or storage layer operation failed
- Admin Operation Failed - An administrative operation failed on the server
- Keystore Error - A keystore operation failed on the server
- Data Access Error - A database or storage operation failed while handling the request
501 Not Implemented
- Not Implemented - Requested functionality is not yet implemented
502 Bad Gateway
- Upstream Service Unavailable - An internal upstream dependency failed or is unreachable; retryable, honor Retry-After when present
- Log Store Unavailable - A platform log search got no usable answer from the log store (unreachable, TLS verification failed, a non-200 status, no answer in 10 seconds, or more than 8 MiB); no line returned, the search still recorded
- Usage Telemetry Unresolved - A metered-consumption, export or statement read could not be obtained from the licence server; never a report of zero usage
- Key-Encryption Key Provider Failed - The provider or HSM holding the key-encryption key refused a destruction before changing anything, or refused or gave no usable answer to a cancel;
extensions.providernames it by role
503 Service Unavailable
- Service Unavailable - Service temporarily unavailable due to maintenance, overload, or dependency failures
- Async Not Usable - Asynchronous service temporarily unavailable or disabled
- Data Source Unavailable - A required data source is temporarily unavailable
- Dependency Not Ready - A backing dependency is unavailable, including the audit trail: a crypto operation, a login or token call, a PQC handshake or a platform-statistics refresh whose audit record cannot be confirmed is refused instead of answered; nothing was returned, retryable, sends
Retry-After - Marketplace Credential Unavailable - A marketplace request could not be judged because the RapidAPI gateway credential could not be read; not an authentication failure, sends
Retry-After: 30 - Marketplace Temporarily Disabled - The marketplace integration is temporarily disabled
- Policy Lock Timeout - A policy write could not take its lock on the deployment policy row within the five-second bounded wait because a concurrent deployment policy write held it; nothing was changed, retryable, sends
Retry-After: 5 - PQC Session Capacity Reached - The platform has temporarily reached its capacity for new PQC transport sessions; the handshake was refused before any key exchange, retry after
Retry-After - Snapshot Stale - The audit snapshot is stale and a fresh one is not yet available
- Stats Snapshot Unavailable - The statistics snapshot is not available yet
- Key Protection Backend Unavailable - The key-protection backend is bound but momentarily unreachable; retryable, sends
Retry-After - Key Protection Backend Misconfigured - The key-protection backend is not usable as configured; durable, deliberately sends NO
Retry-After - Backend Key Provisioning Unavailable - The per-tenant key-encryption-key phase got no usable answer in time from the deployment backend, or the backend asked it to slow down; keys created before it are kept and adopted, retry after
Retry-After - Backend Self-Test Unavailable - The deployment backend's self-test (activation or credential write) could not reach the backend in time, or the backend asked it to slow down; nothing was learned, retry after
Retry-After - Tier Bind Self-Test Unavailable - A managed tier's bind self-test could not reach the tier's backend in time, or the backend asked it to slow down; the tier is unchanged, retry after
Retry-After - Key-Material Backend Bind Verification Unavailable - A BYOK bind's self-test could not reach the declared backend in time, or the backend asked it to slow down; nothing was learned, retry after
Retry-After - BYOK Credential Self-Test Unavailable - The tenant's key service could not be reached to verify a new BYOK access credential; nothing was stored, retryable, sends
Retry-After - Tenant KEK Unavailable - A tenant's own key-encryption key could not be reached or provisioned on the declared backend, so the key operation is refused rather than deferred. Retryable, sends
Retry-After. Extension members:declaredBackend— the token the operator declared (luna,softhsm,aws-kms, …), never the provider scalar it strips to, so the refusal names what the operator chose rather than what the runtime dispatches on; andreason, the machine-readable cause.declaredBackendis omitted when no backend is declared at all. - Secret Custody Unavailable - A per-tenant secret-custody operation could not reach or provision that tenant's own custody key. Retryable, sends
Retry-After. Deliberately distinct frombackend-not-bound, which the deployment custody tier keeps unchanged: the two planes fail for different reasons and a client that needs to distinguish them cannot do so from one type. There is no fallback onto the deployment key — the refusal is terminal and the caller's transaction rolls back, leaving no partially sealed row. - Log Fingerprint Rate Bound Unavailable - The shared counter of the log fingerprint rate bound could not be read, so nothing was computed; sends
Retry-After - Log Fingerprint Audit Unavailable - A log fingerprint computation could not be recorded in the audit trail, so no fingerprint was returned; retryable
- Log Search Audit Unavailable - A platform log search could not be recorded in the audit trail, so no log line was returned; retryable
- Compliance Evidence Package Busy - The Admin API instance is already preparing a compliance evidence package, the one it prepares at a time; refused before the licence server is read, nothing issued or recorded, sends
Retry-After: 15 - Usage Accounting Unavailable - A protect use that reaches its key's soft or maximum usage limit could not record that crossing; nothing was counted or produced, retryable, sends
Retry-After: 5 - Authentication Policy Unreadable - A stored authentication posture holds a value the running release does not know, so the operation is refused rather than decided on a weaker policy; nothing was changed, no
Retry-After - Tenant In Maintenance - The caller's tenant is temporarily unavailable for cryptographic and key operations while a maintenance window moves its keys; nothing was executed, sends
Retry-After: 300, and is answered only to an authenticated caller of that tenant (any other caller gets its usual401or403). An availability refusal, not a denial: retry, do not re-authenticate
504 Gateway Timeout
- Upstream Service Timeout - An internal upstream dependency did not respond within the operation's deadline; retryable
- Rotation Outcome Unknown - A key rotation was sent to the key service and no answer arrived, so it may have been applied; names the rotation in
extensions.executionId, and a resend under the sameIdempotency-Keyreturns its outcome without rotating twice - Gateway Timeout - An upstream dependency did not respond within the operation's deadline; retryable
Error Handling Best Practices
Retry Strategy
- 4xx errors: Generally should NOT be retried without fixing the request
- 500 errors: NOT retryable. A
500is an unattributable server fault, not a transient one — the identical request produces the identical result. Record the correlation identifier and report it instead - 502/504 errors: Retryable - honor the
Retry-Afterheader when present (emitted while the circuit breaker toward the failing upstream is open), otherwise apply exponential backoff - 503 errors: Retryable when a
Retry-Afterheader is present — wait the stated delay. A503withoutRetry-Aftersignals a durable misconfiguration (for examplekey-protection-backend-misconfigured) and must not be retried: retrying re-presents the same bad configuration, and against a PKCS#11 token a repeated wrong PIN locks the token's user PIN - 429 errors: Honor the
Retry-Afterheader before retrying
Retrying a 503 is more aggressive than retrying a 500
In the AnkaSecure SDK and CLI, 502, 503 and 504 classify as a transient server error — three automatic retries, no prompt — while a 500 classifies as a plain server error with two retries behind a prompt. Several key-protection conditions surface as a 503 rather than a 500, which means they draw more automatic client traffic, not less. Honor Retry-After, and treat a 503 that carries no Retry-After as non-retryable.
Error Logging
Always log the following from error responses:
correlationId- For correlation with server-side logstimestamp- For temporal analysistype- For programmatic error handlingdetail- For debugging context
Programmatic Error Handling
This pattern applies to API errors — every response carrying an application/problem+json body. It does not apply to the browser-redirect error surface, which has no body and therefore no type to dispatch on; those failures are read from the error query parameter by the console, not by a programmatic client.
// Example: dispatch on the RFC 9457 `type` URI
switch (problemDetails.getType().toString()) {
case "https://docs.ankatech.co/errors/deployment-license-expired":
// Deployment-wide, not caller-specific. Reads still succeed; do not retry the write.
surfaceReadOnlyModeToOperator();
break;
case "https://docs.ankatech.co/errors/payment-required":
redirectToPaymentPortal();
break;
case "https://docs.ankatech.co/errors/validation":
displayFieldErrors(problemDetails.getDetail());
break;
case "https://docs.ankatech.co/errors/not-found":
handleMissingResource();
break;
default:
logErrorAndNotifyUser(problemDetails);
}
Rate Limiting
When encountering rate limit errors:
- Check the
X-RateLimit-Remainingheader - Respect the
X-RateLimit-Resettimestamp - Implement client-side throttling
- Consider upgrading your plan for higher limits
Additional Resources
- Developer Hub Reference - General error handling and endpoint documentation
- Authentication on the Developer Hub - Authentication and authorization
- Policy Cache Monitoring on the Developer Hub - Monitoring, observability, and rate limit information
- Error Catalog* - Deployment and operational errors: exit codes, bootstrap, runtime and infrastructure failures
- Support Portal - Contact support for persistent issues
Need Help?
If you encounter an error not documented here or need assistance resolving persistent errors:
- Check the
correlationIdfrom the error response - Review server status at status.ankatech.co
- Contact support with the error details and
correlationId - Consult the Developer Hub Reference for endpoint-specific requirements