Ajar Protocol
Reference

Error Code Registry v1

Normative source: docs/03-PROTOCOL-SPEC.md sections 2, 3, 6, 7, 8, and 10.

Normative source: docs/03-PROTOCOL-SPEC.md sections 2, 3, 6, 7, 8, and 10.

Ajar errors use RFC 9457 application/problem+json and include:

  • type: stable URI for the class of error
  • title: short human-readable label
  • status: HTTP status
  • detail: implementation-specific explanation
  • ajar_error_code: stable code from this registry
  • spec_section: optional spec pointer

Servers SHOULD also send the Ajar-Error-Code HTTP header with the same value.

Most codes are returned by Sites in Problem responses and the Ajar-Error-Code header. Some codes are emitted by the client Kernel in local logs/receipts and never appear on the wire from a site; version/extension negotiation codes may be emitted by either side.

CodeStatusMeaning
AJAR-SCHEMA-INVALID400Object fails schema validation
AJAR-VERIFY-BAD-SIGNATURE401Signature is absent, malformed, or does not verify
AJAR-VERIFY-UNKNOWN-KID401Referenced key id cannot be resolved
AJAR-VERIFY-DOMAIN-BINDING401Owner key is not bound to the requested domain
AJAR-VERIFY-EXPIRED401Manifest, mandate, offer, or key is expired
AJAR-VERIFY-ROLLBACK409Manifest sequence is lower than last accepted sequence
AJAR-MANIFEST-LOCATION409Manifest served from a path other than /.well-known/ajar.json
AJAR-POLICY-TIER-REQUIRED403Required audience tier is not met
AJAR-POLICY-DENIED403Owner policy denies this URL, View, or Action
AJAR-POLICY-RATE-LIMITED429Owner policy rate limit exceeded
AJAR-MANDATE-MISSING403Required mandate was not provided
AJAR-MANDATE-SCOPE403Mandate scopes do not cover the requested action
AJAR-MANDATE-CAP403Resolved cost or count exceeds mandate caps
AJAR-MANDATE-REVOKED403Mandate is revoked, or no revocation status fresh within cached_ttl could be obtained
AJAR-ACTION-RISK-FLOOR409Action attempts to lower required ceremony below risk floor
AJAR-SIMULATE-REQUIRED409Required SIMULATE step is missing
AJAR-SIMULATE-DIVERGED409Offer materially diverges from the simulation result; see spec §6
AJAR-VERSION-BREAKING409Breaking change did not bump the major version (site or kernel emitted)
AJAR-AEP-REQUIRED409Interoperability-affecting public extension did not follow the AEP process (site or kernel emitted)
AJAR-OFFER-NOT-FOUND404Offer id was never issued or is not visible to caller
AJAR-OFFER-EXPIRED409Commit attempted after offer expiry
AJAR-OFFER-REPLAY409Offer has already been committed or aborted
AJAR-COMMIT-BAD-BINDING401Commit signature does not bind offer and mandate hashes
AJAR-CLIENT-PROVENANCE409Client failed to preserve provenance-tagged inert View chunks (kernel emitted)
AJAR-METERING-PAYMENT-REQUIRED402Payment or settlement proof is required
AJAR-METERING-SETTLEMENT-FAILED402Settlement adapter rejected the proof
AJAR-FALLBACK-HUMAN-REQUIRED409Manifest-less R2/R3-equivalent operation requires explicit human confirmation (kernel emitted)

Problem Example

{
  "type": "https://spec.ajarprotocol.org/problems/mandate-cap",
  "title": "Mandate cap exceeded",
  "status": 403,
  "detail": "Offer total INR 250000 exceeds mandate per_tx cap INR 100000.",
  "ajar_error_code": "AJAR-MANDATE-CAP",
  "spec_section": "8.1"
}

On this page