Skip to content

Error codes

Every API error response includes a stable code string alongside the human-readable message. Match on the code, not the message.

CodeHTTPMeaning / recovery
INVALID_SIGNATURE400Canonical bytes do not match the signature. Usually an SDK serialization mismatch, see FAQ.
NONCE_REPLAY409Submitted nonce ≤ highest known nonce for the signer. Fetch current and retry with +1.
EPOCH_MISMATCH409Signer is at a later epoch than the transaction is using. Rebuild with current epoch key.
DOMAIN_NOT_FOUND404Domain is not served by this node. Check SUPPORTED_DOMAINS configuration.
QUID_NOT_FOUND404Subject or signer quid is not registered.
TRUST_PATH_NOT_FOUND404No trust path within the configured depth. Raise maxDepth or declare a more direct edge.
GUARDIAN_QUORUM_INSUFFICIENT409Recovery init signed by fewer than M of N guardians.
GUARDIAN_NOT_CONSENTED409A signing guardian has not submitted their GuardianSetUpdate consent.
RECOVERY_IN_FLIGHT409A recovery is already in the time-lock window; veto or wait for commit.
RECOVERY_VETOED410The recovery has been vetoed by the subject during time-lock.
PAYLOAD_TOO_LARGE413Event payload exceeds 64 KB inline limit. Attach via IPFS CID.
RATE_LIMITED429Exceeded RATE_LIMIT_PER_MINUTE. Back off and retry.
NODE_AUTH_REQUIRED401Inter-node endpoint called without a valid HMAC when REQUIRE_NODE_AUTH=true.
BLOCK_ORPHANED410Your anchor referenced a block that was since orphaned by tiering.
FORK_NOT_ACTIVE409Feature requires a QDP that is not yet active at this block height.
  • Treat INVALID_SIGNATURE as a programming bug, not a transient error, don’t retry blindly.
  • Treat NONCE_REPLAY and EPOCH_MISMATCH as recoverable: fetch the signer’s current state, rebuild, resubmit.
  • Treat RATE_LIMITED with jitter + exponential back-off up to a cap.
  • When a GUARDIAN_* flow returns an error, prefer inspecting /api/v2/guardians/sets/{quidId} for the current state rather than guessing.
  • GET /api/info, node version, feature flags, supported domains.
  • GET /metrics, Prometheus. Look for quidnug_tx_rejected_total{code=…} counters broken down by the same codes as above.

For cross-SDK signature interop issues, run the harness at tests/interop/ make produce verify emits and verifies reference vectors.