Check a signed intent without acting
const url = 'http://127.0.0.1:8080/v1/intents/verify';const options = { method: 'POST', headers: { 'Deedglass-Version': '2026-10-01', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: '{"tool":"stripe.refund","args":{"charge":"ch_3QxZ8f2L","amount":1200}}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url http://127.0.0.1:8080/v1/intents/verify \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'Deedglass-Version: 2026-10-01' \ --data '{ "tool": "stripe.refund", "args": { "charge": "ch_3QxZ8f2L", "amount": 1200 } }'A conformance check for SDK authors. It checks the Deedglass-Intent header in every intent mode (off included) exactly as the Gate will, consumes the nonce, and never acts: no tool is called. Without the header the answer is 422 validation_failed (“Send a Deedglass-Intent header to check.”), except for an agent in required mode, which gets 403 intent_required. Refusals are 403 permission_error with code intent_invalid (param names the field), intent_replay or intent_required; never 401. Idempotency-Key is ignored. An agent key with actions:execute.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”The API version (YYYY-MM-DD). Leave it out to use your org’s pinned version (public routes use the latest). An unknown version is 400 api_version_invalid.
A signed intent: base64url of the intent’s JCS bytes, ., and base64url of the 64-byte Ed25519 signature. The intent follows the schema deedglass.intent/1; the signature input is "deedglass/intent/v1\n" followed by the intent_hash. Clocks may differ by up to 60 s either way, and an intent lives at most 5 minutes. See docs/INTENTS.md.
The end user the agent acts for, in your own ids. At most once; a malformed or repeated header is 422 validation_failed.
The conversation or session the call belongs to, in your own ids. At most once; a malformed or repeated header is 422 validation_failed.
Request Bodyrequired
Section titled “Request Bodyrequired”object
The tool the intent names, as <connector>.<tool>.
The arguments, any JSON value (use {} for none; at most 256 KiB).
Example
{ "tool": "stripe.refund", "args": { "charge": "ch_3QxZ8f2L", "amount": 1200 }}Responses
Section titled “Responses”The intent passed every check, and its nonce is consumed.
What the Gate would see for this call. signed is false when no intent was sent (possible in off and optional mode); the intent fields are then null.
object
The SHA-256 of the arguments’ JCS bytes (RFC 8785).
Example
{ "object": "intent_check", "signed": true, "intent_hash": "sha256:87c73e450a53f0269e33f7adb8430a6f89714606f9aae38bc732536fef7e3089", "kid": "21fe31dfa154a261626bf854046fd227", "agent": "agt_01k633rrmh3bcz2p39gg4vp46q", "tool": "stripe.refund", "args_digest": "sha256:f7411a7cf4706333c9ba80c85aab7d8b92363ad3077a288dadc26bef42d89d36", "on_behalf_of": "usr_ext_4821", "session": "conv_9f2c", "expires_at": "2026-10-03T09:31:00.000Z", "nonce_consumed": true, "intent_mode": "optional"}Headers
Section titled “Headers”This request’s id. Quote it to support; it matches error.request_id.
The intent was refused: intent_invalid (param names the field), intent_replay or intent_required.
object
object
One or more calm sentences with the next step.
The request field, query parameter or header the error is about.
On policy_invalid only. Each problem with its line, code and hint.
One finding about a policy file, with its position and the next step. Codes are stable and listed in docs/POLICY_ERRORS.md. In the policy_invalid error envelope each diagnostic also carries object: policy_diagnostic. The full PolicyDiagnostic schema is in openapi.yaml.
object
One agent action. Its sections mirror the deed’s. status is the one field an agent needs; state is the exact lifecycle state (docs/GATE.md). The Gate’s own responses (POST /v1/actions and its result report) add execution.result and witness.reasons; lists leave both out. The full Action schema is in openapi.yaml.
object
On undo_unavailable only. Every check of the undo, each with its fix. Additive (S23).
One of the twelve safety checks (S23 §3.3). Available means no check failed. The full UndoCheck schema is in openapi.yaml.
object
Examples
The nonce was already used
{ "error": { "type": "permission_error", "code": "intent_replay", "message": "This signed intent was already used at 09:30:02 UTC. Sign a new intent, with a fresh nonce, for every call.", "param": "nonce", "request_id": "req_01j9zr3m5k8q2w7x4t6v0b1c9d", "doc_url": "https://docs.deedglass.com/errors/intent_replay" }}The arguments differ from the signed ones
{ "error": { "type": "permission_error", "code": "intent_invalid", "message": "The signed intent's args_digest doesn't match the arguments sent. Sign the exact arguments you send, canonicalized with RFC 8785.", "param": "args_digest", "request_id": "req_01j9zr3m5k8q2w7x4t6v0b1c9d", "doc_url": "https://docs.deedglass.com/errors/intent_invalid" }}Headers
Section titled “Headers”This request’s id. Quote it to support; it matches error.request_id.
default
Section titled “default”An error. Every error has this envelope; doc_url explains the code.
object
object
One or more calm sentences with the next step.
The request field, query parameter or header the error is about.
On policy_invalid only. Each problem with its line, code and hint.
One finding about a policy file, with its position and the next step. Codes are stable and listed in docs/POLICY_ERRORS.md. In the policy_invalid error envelope each diagnostic also carries object: policy_diagnostic. The full PolicyDiagnostic schema is in openapi.yaml.
object
One agent action. Its sections mirror the deed’s. status is the one field an agent needs; state is the exact lifecycle state (docs/GATE.md). The Gate’s own responses (POST /v1/actions and its result report) add execution.result and witness.reasons; lists leave both out. The full Action schema is in openapi.yaml.
object
On undo_unavailable only. Every check of the undo, each with its fix. Additive (S23).
One of the twelve safety checks (S23 §3.3). Available means no check failed. The full UndoCheck schema is in openapi.yaml.
object
Example
{ "error": { "type": "invalid_request_error", "code": "not_found", "message": "There's no endpoint at GET /v1/helth. Did you mean /v1/health?", "param": null, "request_id": "req_01j9zr3m5k8q2w7x4t6v0b1c9d", "doc_url": "https://docs.deedglass.com/errors/not_found" }}Headers
Section titled “Headers”This request’s id. Quote it to support; it matches error.request_id.
The API version this response follows.