EARLY PREVIEWa prototype: not certified, not an audit, not an official or authoritative registry. Demo data is throwaway.

Explained decisions · early preview

Why was it denied?

Every refusal carries a reason code. Each code below says what it means and how the agent or the site can fix it. Default deny never loosens: these hints tell you how to ask properly, not how to get around a rule. The same text is in the explain field of every refusal from /v1/verify and at /v1/explain.

action.forbiddenoperator can usually fix

Action explicitly forbidden

A forbid rule names this action.

If you are the agent
  • Choose a different action.
If you run the site
  • nothing to change on your side
action.not_allowedoperator can usually fix

Action not in the license

The license does not list this action.

If you are the agent
  • Ask for a license that includes this action.
If you run the site
  • If the action should be allowed, add it to the profile's allowed_actions.
agent.frozenoperator can usually fix

Passport frozen

The operator froze this agent. Nothing is allowed until it is unfrozen.

If you are the agent
  • Ask your operator to unfreeze the agent.
If you run the site
  • nothing to change on your side
agent.revokedoperator can usually fix

Passport revoked

This passport was revoked. The id is permanent and cannot be reused.

If you are the agent
  • Register a new agent; a revoked passport cannot be restored.
If you run the site
  • nothing to change on your side
agent.unknownagent can usually fix

Unknown agent

The Signature-Agent value does not match any registered passport.

If you are the agent
  • Register a passport first (POST /v1/agents) or check the Signature-Agent URL for typos.
If you run the site
  • nothing to change on your side
approval.action_mismatchhuman can usually fix

Approval is for a different action

An approval covers one exact action only.

If you are the agent
  • Get an approval for exactly this license, amount and counterparty.
If you run the site
  • nothing to change on your side
approval.always_for_actionshuman can usually fix

This action always needs approval

The rules list this action as always needing a person.

If you are the agent
  • Ask the owner to approve this exact action.
If you run the site
  • nothing to change on your side
approval.cumulative_abovehuman can usually fix

Running total needs approval

Purchases in the period add up to more than the approval line, so a person must approve.

If you are the agent
  • Ask the owner to approve this purchase.
If you run the site
  • Raise profile.approval.cumulative_above if it triggers too often.
approval.expiredhuman can usually fix

Approval expired

The approval window ended.

If you are the agent
  • Request a fresh approval.
If you run the site
  • nothing to change on your side
approval.invalidhuman can usually fix

Approval not valid

The approval was not signed by the operator's active key.

If you are the agent
  • Have the operator sign again.
If you run the site
  • nothing to change on your side
approval.lifetime_too_longhuman can usually fix

Approval window too long

Approvals may only live a short time.

If you are the agent
  • Sign with a shorter expiry (see max_age_s).
If you run the site
  • nothing to change on your side
approval.presence_requiredhuman can usually fix

Passkey presence required

This license or step-up needs a fresh passkey confirmation from the human.

If you are the agent
  • Complete the passkey presence flow and send its token with the approval.
If you run the site
  • nothing to change on your side
approval.replayedhuman can usually fix

Approval already used

Approvals are single use.

If you are the agent
  • Request a new approval.
If you run the site
  • nothing to change on your side
approval.require_presencehuman can usually fix

A person must be present

This action needs a fresh passkey presence check by the owner.

If you are the agent
  • Ask the owner to confirm with their passkey, then retry with the presence token.
If you run the site
  • Use profile.risk.require_presence only where you want that friction.
approval.requiredhuman can usually fix

A human must approve this

The amount or action crosses an approval threshold (or the risk engine asked for a step-up).

If you are the agent
  • Show the approval_request to your operator; send the signed approval back with the same request.
If you run the site
  • Lower or raise profile.approval.required_above to tune how often this happens.
approval.required_abovehuman can usually fix

Amount needs approval

The amount is above the line where a person must approve.

If you are the agent
  • Ask the owner to approve this exact action.
If you run the site
  • Raise profile.approval.required_above if it triggers too often.
audience.mismatchagent can usually fix

Wrong site

The request or license is for a different origin than the site that is checking it.

If you are the agent
  • Use a license issued for this site, and send the request to the origin it names.
If you run the site
  • nothing to change on your side
content_digest.body_invalidagent can usually fix

Body does not match its content-digest

The request body sent differs from the digest the agent signed.

If you are the agent
  • Compute Content-Digest over the exact bytes you send and sign it.
If you run the site
  • Pass the raw, unparsed body text to the checker.
content_digest.body_requiredsite can usually fix

Body not forwarded

The signature covers a digest but the site did not forward the body.

If you are the agent
  • nothing to change on your side
If you run the site
  • Pass the raw body text to the checker.
content_digest.mismatchagent can usually fix

Body changed in transit

The body the site received does not match the signed digest.

If you are the agent
  • Send the body you signed, byte for byte.
If you run the site
  • Check a proxy is not rewriting the body before the checker sees it.
content_digest.missingagent can usually fix

Body digest missing

A request with a body must carry a signed Content-Digest.

If you are the agent
  • Add Content-Digest (sha-256) and sign it.
If you run the site
  • nothing to change on your side
counterparties.allowoperator can usually fix

Counterparty not on the allow list

The license limits which merchants or counterparties the agent may deal with, and this one is not listed.

If you are the agent
  • Ask for a license that names this counterparty.
If you run the site
  • nothing to change on your side
counterparties.denyoperator can usually fix

Counterparty is blocked

The license or profile explicitly blocks this counterparty.

If you are the agent
  • Choose a different counterparty.
If you run the site
  • Remove it from the deny list only if that is intended.
counterparty.deniedoperator can usually fix

Counterparty blocked

The counterparty is on a deny list.

If you are the agent
  • Do not transact with that counterparty.
If you run the site
  • nothing to change on your side
counterparty.missingsite can usually fix

Counterparty missing

An allow list exists but the request names no counterparty.

If you are the agent
  • nothing to change on your side
If you run the site
  • Pass intent.counterparty.
counterparty.not_allowedoperator can usually fix

Counterparty not on the allow list

Only listed counterparties are permitted.

If you are the agent
  • Use an allowed counterparty or ask for a wider license.
If you run the site
  • nothing to change on your side
delegation.max_depthoperator can usually fix

Delegation too deep

The chain of sub-licenses is longer than the parent allows.

If you are the agent
  • Reduce the delegation depth.
If you run the site
  • nothing to change on your side
delegation.not_allowedoperator can usually fix

Delegation not allowed

The parent license forbids sub-licenses.

If you are the agent
  • Ask for a license with delegation enabled.
If you run the site
  • nothing to change on your side
environment.action.not_allowedsite can usually fix

Action not allowed by the site

The site's rule profile does not allow this action at all.

If you are the agent
  • This site does not offer that action to agents.
If you run the site
  • Add the action to profile.allowed_actions if you want to allow it.
environment.disabledsite can usually fix

Site switched off

The site owner turned the environment off (kill switch) or its ownership is contested.

If you are the agent
  • Retry later; nothing you can change on the agent side.
If you run the site
  • Re-enable with POST /v1/environments/:id/enable once it is safe.
environment.operator_level_insufficientoperator can usually fix

Owner not verified enough

This site requires a higher verified-owner level (L0 to L3) than your operator has.

If you are the agent
  • Raise the operator's owner level (domain proof for L1, identity check for L2, passkey for L3).
If you run the site
  • Lower profile.min_operator_level if that level is stricter than you need.
environment.ownership_lapsedsite can usually fix

Site ownership lapsed

The registry could not re-confirm that the site controls its origin, so it is suspended.

If you are the agent
  • Retry later.
If you run the site
  • Re-publish the ownership challenge and call recheck-ownership.
environment.ownership_unprovensite can usually fix

Site ownership not proven

The site has not yet proven control of its origin.

If you are the agent
  • Retry later.
If you run the site
  • Prove control with the DNS TXT record or the .well-known file, then re-check.
environment.spend.not_permittedsite can usually fix

Site permits no spending

The site's profile has no spend rule, so any amount is refused.

If you are the agent
  • This site does not accept agent payments.
If you run the site
  • Add profile.spend (currency, per_txn_max, period_max) to allow purchases.
environment.unregisteredsite can usually fix

Site not registered

This site has no registered environment, so default deny applies.

If you are the agent
  • Tell the site owner you need them to register an environment.
If you run the site
  • Register the site: POST /v1/environments with your origin and a rule profile.
geo.denyoperator can usually fix

Country is blocked

The request's country is on a deny list.

If you are the agent
  • Operate from a permitted country.
If you run the site
  • Adjust profile.geo.deny_countries if this is too broad.
geo.not_allowedoperator can usually fix

Country not allowed

The request's country is not permitted.

If you are the agent
  • Operate from an allowed country or ask for a license that includes it.
If you run the site
  • Adjust profile.geo if this country should be allowed.
geo.unknownsite can usually fix

Country not provided

A country rule exists but the site did not say where the request came from.

If you are the agent
  • nothing to change on your side
If you run the site
  • Pass intent.country (for example from your CDN geo header).
intent.invalidsite can usually fix

Intent invalid

The intent object was malformed.

If you are the agent
  • nothing to change on your side
If you run the site
  • Send intent {action, resource, amount?, country?, counterparty?}.
kb.aud_mismatchagent can usually fix

Binding for another site

The key-binding token names a different site.

If you are the agent
  • Create the key-binding token for this request's origin.
If you run the site
  • nothing to change on your side
kb.expiredagent can usually fix

Key-binding token too old

The key-binding token is older than two minutes.

If you are the agent
  • Create it fresh for each request.
If you run the site
  • nothing to change on your side
kb.invalidagent can usually fix

Key-binding token invalid

The key-binding token's signature did not verify.

If you are the agent
  • Sign it with the presentation key that the license is bound to.
If you run the site
  • nothing to change on your side
kb.missingagent can usually fix

Key-binding token missing

A license must be presented with a fresh key-binding token proving possession.

If you are the agent
  • Append ~<kb-jwt> to the license; the SDK does this for you.
If you run the site
  • nothing to change on your side
kb.nonce_mismatchagent can usually fix

Binding for another request

The key-binding token's nonce does not match the request signature nonce.

If you are the agent
  • Use the same nonce in the signature and in the key-binding token.
If you run the site
  • nothing to change on your side
kb.sd_hash_mismatchagent can usually fix

Binding for another license

The key-binding token does not cover this license.

If you are the agent
  • Hash the exact license text you present.
If you run the site
  • nothing to change on your side
key.expiredoperator can usually fix

Key expired

The signing key's grace window ended.

If you are the agent
  • Sign with the current key.
If you run the site
  • nothing to change on your side
key.revokedoperator can usually fix

Key revoked

The signing key was revoked.

If you are the agent
  • Rotate to a new key and sign with it.
If you run the site
  • nothing to change on your side
key.unknownagent can usually fix

Key not recognised

The signing key is not registered for this agent.

If you are the agent
  • Register the key or sign with a key listed on the passport.
If you run the site
  • nothing to change on your side
license.environment_mismatchoperator can usually fix

License is for another site

A license only works at the environment it was issued for.

If you are the agent
  • Request a license for this site's environment id.
If you run the site
  • nothing to change on your side
license.expiredoperator can usually fix

License expired

The license is past its expiry.

If you are the agent
  • Ask your operator for a renewed license (a new version; the passport stays the same).
If you run the site
  • nothing to change on your side
license.key_mismatchoperator can usually fix

License key mismatch

The key bound in the license is not an active presentation key of this agent.

If you are the agent
  • Ask for a license bound to your current presentation key (it may have been rotated).
If you run the site
  • nothing to change on your side
license.malformedagent can usually fix

Malformed license

The Agent-License value could not be parsed.

If you are the agent
  • Send <license>~<key-binding JWT> exactly as issued.
If you run the site
  • nothing to change on your side
license.missingoperator can usually fix

No license presented

Your passport proves who you are, but a passport alone permits nothing here. No Agent-License header came with the request.

If you are the agent
  • Ask your operator for a license for this exact site (environment).
  • Send it in the Agent-License header, bound to this request with a fresh key-binding token.
If you run the site
  • If this agent should be allowed, tell its operator which environment id to request a license for.
license.not_yet_validagent can usually fix

License not valid yet

The license has a start time in the future.

If you are the agent
  • Wait until the license's not-before time or request one that starts now.
If you run the site
  • nothing to change on your side
license.revokedoperator can usually fix

License revoked

The operator revoked this license.

If you are the agent
  • Ask for a new license if access should continue.
If you run the site
  • nothing to change on your side
license.subject_mismatchagent can usually fix

License belongs to another agent

The license names a different agent than the one signing.

If you are the agent
  • Use the license that was issued to this passport.
If you run the site
  • nothing to change on your side
license.suspendedoperator can usually fix

License suspended

The license is paused.

If you are the agent
  • Ask the operator to resume it.
If you run the site
  • nothing to change on your side
license.unknownoperator can usually fix

License not registered

This license id is not in the registry.

If you are the agent
  • Register the license (POST /v1/licenses) before presenting it.
If you run the site
  • nothing to change on your side
license.unregistered_variantagent can usually fix

License variant not registered

The presented license text differs from the registered one.

If you are the agent
  • Present the license exactly as registered.
If you run the site
  • nothing to change on your side
nonce.replayedagent can usually fix

Replay refused

This exact signed request was already seen.

If you are the agent
  • Use a new random nonce for every request. Never resend a signed request.
If you run the site
  • nothing to change on your side
operator.suspendedoperator can usually fix

Operator suspended

The accountable operator used the panic switch or was suspended; every agent under it is refused.

If you are the agent
  • Ask the operator to resume once the incident is resolved.
If you run the site
  • nothing to change on your side
owner.level_insufficientoperator can usually fix

License needs a higher owner level

The license itself demands a verified-owner level the operator does not have.

If you are the agent
  • Verify the owner to the level the license names, or ask for a license without that requirement.
If you run the site
  • nothing to change on your side
region.outside_licenseoperator can usually fix

Outside the license's regions

The license is only valid in other regions.

If you are the agent
  • Ask for a license that covers this region.
If you run the site
  • nothing to change on your side
region.unknownsite can usually fix

Region unknown

The license is limited to regions and the site did not state its region.

If you are the agent
  • nothing to change on your side
If you run the site
  • Set profile.region or pass intent.country.
resource.missingsite can usually fix

Resource missing

The check needs the target URL.

If you are the agent
  • nothing to change on your side
If you run the site
  • Include intent.resource when calling /v1/verify.
resource.not_allowedoperator can usually fix

Resource outside scope

The URL is outside the allowed resource patterns.

If you are the agent
  • Stay inside the patterns the license lists.
If you run the site
  • Widen profile.resources if the path should be reachable.
risk.suspendedoperator can usually fix

Temporarily held by the risk engine

Unusual activity (bursts, probing, a sudden spend spike or a new region) paused this agent at this site for a short time.

If you are the agent
  • Stop the burst, check the agent for loops or compromise, and retry after the hold ends.
If you run the site
  • Review the signals at /v1/environments/:id/risk; release the hold early if it was a false alarm.
signature.alg_unsupportedagent can usually fix

Unsupported algorithm

Only ed25519 request signatures are accepted.

If you are the agent
  • Use an Ed25519 request key.
If you run the site
  • nothing to change on your side
signature.components_missingagent can usually fix

Signature does not cover enough

The signature must cover @authority, @method, @path, signature-agent (and the license and body digest when present).

If you are the agent
  • Add the missing components to Signature-Input.
If you run the site
  • nothing to change on your side
signature.expiredagent can usually fix

Signature expired

The signature's expiry time has passed.

If you are the agent
  • Sign right before sending; keep the lifetime at 60 seconds or less.
If you run the site
  • nothing to change on your side
signature.invalidagent can usually fix

Signature did not verify

The signature does not match the request or the agent's registered key.

If you are the agent
  • Check you sign the exact method, authority, path and query you send; check the key was not rotated.
If you run the site
  • nothing to change on your side
signature.lifetime_invalidagent can usually fix

Signature lifetime too long

Signatures may live at most 60 seconds.

If you are the agent
  • Set expires = created + 60 or less.
If you run the site
  • nothing to change on your side
signature.malformedagent can usually fix

Malformed signature headers

The signature headers could not be parsed.

If you are the agent
  • Follow RFC 9421 structured field syntax.
If you run the site
  • nothing to change on your side
signature.missingagent can usually fix

No request signature

The request carries no Web Bot Auth signature.

If you are the agent
  • Sign the request (RFC 9421) with Signature-Agent, Signature-Input and Signature headers; the SDK does this.
If you run the site
  • nothing to change on your side
signature.not_yet_validagent can usually fix

Signature from the future

The created time is ahead of the registry clock.

If you are the agent
  • Fix the agent's clock.
If you run the site
  • nothing to change on your side
signature.params_missingagent can usually fix

Signature parameters missing

created, expires, keyid and nonce are all required.

If you are the agent
  • Include all four parameters.
If you run the site
  • nothing to change on your side
signature_agent.missingagent can usually fix

Signature-Agent missing

The Signature-Agent header (your passport URL) is required.

If you are the agent
  • Send Signature-Agent: "https://<registry>/agents/<id>".
If you run the site
  • nothing to change on your side
spend.amount_requiredagent can usually fix

Amount required

Payment actions must state an amount.

If you are the agent
  • Add intent.amount for pay: actions.
If you run the site
  • Always send intent.amount for payment actions.
spend.cap_exceededagent can usually fix

Budget cap hit

A parallel purchase used the remaining budget first.

If you are the agent
  • Retry after other reservations settle or roll back.
If you run the site
  • nothing to change on your side
spend.currencyoperator can usually fix

Narrowed license changes currency

A delegated license may not switch currency.

If you are the agent
  • Keep the parent's currency when delegating.
If you run the site
  • nothing to change on your side
spend.currency_mismatchagent can usually fix

Wrong currency

The amount's currency differs from the permitted one.

If you are the agent
  • Use the currency the license names.
If you run the site
  • nothing to change on your side
spend.invalid_amountagent can usually fix

Invalid amount

The amount must be a positive decimal string with at most 2 decimals.

If you are the agent
  • Send amounts like "20.00".
If you run the site
  • nothing to change on your side
spend.not_granted_by_parentoperator can usually fix

Parent license grants no spending

A child license cannot spend if its parent could not.

If you are the agent
  • Ask for a parent license that includes spending.
If you run the site
  • nothing to change on your side
spend.not_permittedoperator can usually fix

Spending not permitted

The license or the site's profile allows no spending.

If you are the agent
  • Ask for a license with a spend limit.
If you run the site
  • Add profile.spend if spending should be possible here.
spend.per_txn_maxoperator can usually fix

Delegated purchase limit is higher than the parent

A delegated license can only narrow limits, never widen them.

If you are the agent
  • Set a per-purchase limit at or below the parent's.
If you run the site
  • nothing to change on your side
spend.per_txn_max_exceededoperator can usually fix

Amount over the per-purchase limit

A single purchase may not exceed the limit.

If you are the agent
  • Reduce the amount or request a higher per-purchase limit.
If you run the site
  • Raise profile.spend.per_txn_max if it is too low.
spend.period_maxoperator can usually fix

Delegated period limit is higher than the parent

A delegated license can only narrow limits.

If you are the agent
  • Set a period limit at or below the parent's.
If you run the site
  • nothing to change on your side
spend.period_max_exceededagent can usually fix

Daily or period limit reached

The agent has spent its limit for this period.

If you are the agent
  • Wait until the period resets, or ask for a higher limit.
If you run the site
  • nothing to change on your side
spend.total_maxoperator can usually fix

Delegated total budget is higher than the parent

A delegated license can only narrow limits.

If you are the agent
  • Set a total budget at or below the parent's.
If you run the site
  • nothing to change on your side
spend.total_max_exceededoperator can usually fix

Lifetime budget used up

The license's total budget is exhausted.

If you are the agent
  • Ask for a new license with a fresh budget.
If you run the site
  • nothing to change on your side
spend.total_max_exceeds_remainingoperator can usually fix

Delegated budget exceeds what remains

The parent license does not have that much budget left.

If you are the agent
  • Delegate no more than the parent's remaining budget.
If you run the site
  • nothing to change on your side
window.closedoperator can usually fix

Time window closed

The permitted period has ended.

If you are the agent
  • Ask for a license or profile window that is still open.
If you run the site
  • Extend profile.window.not_after.
window.day_not_allowedagent can usually fix

Not allowed on this day

The action is outside the permitted days.

If you are the agent
  • Retry on an allowed day.
If you run the site
  • Adjust profile.window.days.
window.daysagent can usually fix

Not an allowed day

The license only works on certain days of the week.

If you are the agent
  • Retry on an allowed day.
If you run the site
  • nothing to change on your side
window.hours_localagent can usually fix

Outside allowed hours

The license only works during certain local hours.

If you are the agent
  • Retry during the allowed hours.
If you run the site
  • nothing to change on your side
window.hours_not_allowedagent can usually fix

Outside allowed hours

The action is outside the permitted hours.

If you are the agent
  • Retry inside the allowed hours.
If you run the site
  • Adjust profile.window.hours_local if the hours are wrong.
window.invalid_tzsite can usually fix

Bad time zone

The window names a time zone that cannot be read.

If you are the agent
  • nothing to change on your side
If you run the site
  • Use an IANA name like America/Los_Angeles.
window.not_afteroperator can usually fix

Window has ended

The license validity window is over.

If you are the agent
  • Ask for a new license.
If you run the site
  • nothing to change on your side
window.not_beforeagent can usually fix

Window has not started

The license is not valid yet.

If you are the agent
  • Retry after the license start time.
If you run the site
  • nothing to change on your side
window.not_yet_openagent can usually fix

Time window not open yet

The permitted period has not started.

If you are the agent
  • Retry after the window opens.
If you run the site
  • nothing to change on your side