Skip to main content
POST
cURL

Body

application/json

Request body for POST /refusal/verify: the Refusal Record itself, not a lookup by ID. Checked structurally on the server (refusalRecordId, businessTransactionId, decision, refusalRecordHash, signature required) before signature verification runs.

refusalRecordId
string
required

Unique Refusal Record identifier.

businessTransactionId
string
required

Business Transaction this refusal is about.

decision
Decision · object
required

Immutable result of evaluating an Intent against a Policy. Decision does not create authority, grant authorization, or modify Intent; it only records the outcome of deterministic Policy evaluation.

Example:
evaluatedIntent
object
required

The Intent snapshot the signals were evaluated against: target and parameters only, present for every refusal, not only binding violations.

refusalRecordHash
string
required

Canonical hash of this Refusal Record, same convention as ExecutionTrustRecord.trustRecordHash.

signature
object
required

Cryptographic signature over the canonical Refusal Record, signed with the same key as ExecutionTrustRecord, one root of trust for both approvals and refusals.

createdAt
string<date-time>
required

UTC timestamp when this Refusal Record was created.

bindingViolations
object[]

Present only when the rejection came from SignalIntentBinder. Absent (not an empty array) for an ordinary PolicyEngine.evaluate REJECT that never reached binding-violation logic at all.

submittedBy
string

Authenticated caller who submitted the rejected request. Absent when caller authentication is disabled.

policyContentHash
string

SHA-256 hash of the policy content that decided the refusal, the same value an Execution Trust Record carries in transaction.policy.contentHash. Inside the signed record. Absent on Refusal Records written before 2026-10-06.

Pattern: ^[0-9a-f]{64}$

Response

The check ran. Read valid. A 200 alone does not mean the signature verified.

Response shared by POST /refusal/verify and POST /audit/verify: a bare signature-validity result, no wrapper, no partial-failure detail. Both routes verify a signature over bytes with no database lookup, so there is nothing more specific to report than valid or not.

valid
boolean
required

Whether the signature verifies against Parmana's public key for the stated algorithm and key ID.