Execution grants

Verify an execution grant without consuming it

Deprecated

POST
/v1/execution/verify-token

Deprecated alias of GET /v1/authority/grants/{grantId}: the same handler, fed the token and the full intent from a body.

Verifies the Ed25519 signature, issuer, audience, lifetime, action, actor, tenant, and exact intent hash. This endpoint does not authorize execution by itself because it does not atomically consume the grant.

Authorization

ApiKeyAuth
AuthorizationBearer <token>

An organization API key. Its scopes decide what it may call; decision:shadow is the narrowest: SHADOW evaluations through POST /v1/authority/grants or its alias POST /v1/authority/enforce-and-bind only (DECISION_SHADOW_MODE_DENIED in any other mode; DECISION_SHADOW_FIELD_DENIED for a body carrying context.decionis_policy, evidence or escalation), with no integration dispatch. A key whose only scope is decision:shadow (an AgentSafe hosted gateway's) reaches exactly those two, POST /v1/auth/credential-context, POST /v1/hosted-gateway/keys/confirm and POST /v1/hosted-gateway/keys/revoke-self; every other route answers 403 HOSTED_GATEWAY_KEY_PATH_DENIED. decision:enforce is an enforced hosted gateway's key: evaluations in SHADOW or ENFORCEMENT through POST /v1/authority/grants or its alias (400 DECISION_ENFORCE_FIELD_DENIED for a body carrying context.decionis_policy; it never holds policy:write), and the grants and managed escalations they bind. A key whose scopes are decision:enforce (with or without decision:shadow) reaches exactly POST /v1/authority/enforce-and-bind, POST /v1/authority/grants, GET /v1/authority/grants/{grant_id}, POST /v1/authority/grants/{grant_id}/claims, POST /v1/authority/grants/{grant_id}/receipts, POST /v1/authority/grants/{grant_id}/reconciliations, POST /v1/execution/verify-token, POST /v1/execution/claim-token, POST /v1/execution/consume-token, POST /v1/execution/finalize-token, GET /v1/authority/escalations/{escalation_id}, DELETE /v1/authority/escalations/{escalation_id}, POST /v1/auth/credential-context, POST /v1/hosted-gateway/keys/confirm and POST /v1/hosted-gateway/keys/revoke-self, each id a UUID; every other route answers 403 HOSTED_GATEWAY_KEY_PATH_DENIED.

In: header

Request Body

application/json

execution_token*string
Length1 <= length <= 20000
intent_hash*string
Match^sha256:[0-9a-f]{64}$
intent*
evidence?

Action-bound authority evidence presented again at the claim boundary. Required when the bound policy requires Presence. An attested approval is recorded in the signed binding and is not presented again; the claim re-checks that the attesting key is still registered and active. A signed signal is recorded the same way; the claim re-checks its key and that it has not expired.

consumed_by?string
Length1 <= length <= 200
commit_correlation_id?string
Length1 <= length <= 200

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/execution/verify-token" \  -H "Content-Type: application/json" \  -d '{    "execution_token": "string",    "intent_hash": "string",    "intent": {      "protocol_version": "agent-safe.intent/1",      "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",      "intent_id": "05704cef-194d-4987-b2cb-c2c20c9cd88a",      "captured_at": "2019-08-24T14:15:22Z",      "expires_at": "2019-08-24T14:15:22Z",      "actor": {        "id": "string",        "type": "string"      },      "action": {        "type": "string",        "resource": "string",        "parameters": {}      },      "context": {},      "downstream_target": {        "system": "string",        "operation": "string"      }    }  }'
{  "valid": true,  "should_execute": true,  "would_block": true,  "verdict": "APPROVE",  "reason_codes": [    "string"  ],  "claims": {    "iss": "string",    "sub": "string",    "aud": "string",    "org_id": "a40f5d1f-d889-42e9-94ea-b9b33585fc6b",    "dossier_id": "string",    "decision_id": "string",    "chain_id": "string",    "action": "string",    "decision": "allow",    "scope": "execute",    "binding": {      "intent_hash": "string",      "execution_binding_digest": "string",      "execution_payload_digest": "string",      "execution_payload_canonicalization_profile": "string",      "execution_nonce": "string",      "execution_correlation_id": "string",      "expected_effect_digest": "string",      "expected_state_version": "string",      "authority_protocol_version": "1.0"    },    "jti": "string",    "iat": 0,    "nbf": 0,    "exp": 0  },  "claim_token": "string",  "claim_validated_at": "2019-08-24T14:15:22Z",  "claim_lease_expires_at": "2019-08-24T14:15:22Z",  "claim_attestation": "string",  "evidence": {},  "evidence_durably_queued": true,  "decision_chain_evidence_recorded": true}

Report how an INDETERMINATE execution of this grant resolved POST

An executor holding the grant reports, from its own downstream reconciliation, whether an INDETERMINATE execution COMMITTED or FAILED. The nonce stays burned and the action is never retried: the resolution is an append-only record with digest-bound effect evidence, and its commit evidence goes to the Decision Chain. The same evidence rules as the platform operator's reconciliation apply. The execution token (accepted after its expiry, as at finalization) must verify, its `jti` must be `{grantId}` (otherwise 409 `GRANT_ID_MISMATCH`), its correlation must be `commit_correlation_id`, and `claim_token` must be the token of the grant's claim (otherwise 409 `CLAIM_TOKEN_MISMATCH`). The caller needs `decision:write`, `decision:*` or `org:*` in the grant's organisation. The authenticated principal is the reconciler and the only trusted observer of the effect evidence; it is never named in the body. An organisation API key reconciles only when it is on the trusted effect-observer allow-list; any other caller is answered 409 `EFFECT_OBSERVER_PROVENANCE_UNAVAILABLE`. A claim that is not INDETERMINATE answers 409 `CLAIM_NOT_INDETERMINATE`. Evidence bound to the grant that names an observed effect other than the expected one cannot resolve the claim (409 `EFFECT_EVIDENCE_INSUFFICIENT_FOR_RECONCILIATION`, the claim stays INDETERMINATE) and opens an assumption breach in the grant's action and target (`RECONCILIATION_CONTRADICTION`), reported as `assumption_breach`.

Compatibility alias for pre-commit claim and revalidation POST

Deprecated alias of `POST /v1/authority/grants/{grantId}/claims`: the same handler. The same handler as `/v1/execution/claim-token`, with the same body and responses. New adapters should use the explicit claim route and must finalize the claim before `claim_lease_expires_at`.