# The Refusal Record, as returned by GET /refusal/<businessTransactionId>:curl -X POST https://parmana-api-real.vercel.app/refusal/verify \ -H "Content-Type: application/json" \ --data @refusal-record.json
import { ParmanaClient } from "@parmana/sdk";
const client = new ParmanaClient({
endpoint: "https://parmana-api-real.vercel.app",
apiKey: process.env.PARMANA_API_KEY!,
});
const record = await client.refusalRecord(
"5f0c2a7e-3d7b-4d0e-9a55-2f6d8b1c4e90",
);
const valid = await client.verifyRefusalRecord(record);
console.log(valid);
import os
from parmana import ParmanaClient
client = ParmanaClient(
endpoint="https://parmana-api-real.vercel.app",
api_key=os.environ["PARMANA_API_KEY"],
)
record = client.refusal_record("5f0c2a7e-3d7b-4d0e-9a55-2f6d8b1c4e90")
valid = client.verify_refusal_record(record)
print(valid)
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.
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.
Cryptographic signature over the canonical Refusal Record, signed with the same key as ExecutionTrustRecord, one root of trust for both approvals and refusals.
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.
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.
Whether the signature verifies against Parmana's public key for the stated algorithm and key ID.
⌘I
cURL
# The Refusal Record, as returned by GET /refusal/<businessTransactionId>:curl -X POST https://parmana-api-real.vercel.app/refusal/verify \ -H "Content-Type: application/json" \ --data @refusal-record.json
import { ParmanaClient } from "@parmana/sdk";
const client = new ParmanaClient({
endpoint: "https://parmana-api-real.vercel.app",
apiKey: process.env.PARMANA_API_KEY!,
});
const record = await client.refusalRecord(
"5f0c2a7e-3d7b-4d0e-9a55-2f6d8b1c4e90",
);
const valid = await client.verifyRefusalRecord(record);
console.log(valid);
import os
from parmana import ParmanaClient
client = ParmanaClient(
endpoint="https://parmana-api-real.vercel.app",
api_key=os.environ["PARMANA_API_KEY"],
)
record = client.refusal_record("5f0c2a7e-3d7b-4d0e-9a55-2f6d8b1c4e90")
valid = client.verify_refusal_record(record)
print(valid)
{"docsConfig":{"theme":"maple","$schema":"https://mintlify.com/docs.json","name":"Parmana","description":"Parmana lets businesses set clear limits on what AI can do, checks every action against those limits, and keeps a record of each decision.","colors":{"primary":"#6366F1","light":"#6366F1","dark":"#4338CA"},"logo":{"light":"https://mintcdn.com/parmanasystems/3fc1F82PB1uU1_pD/logo/logo-light.svg?fit=max\u0026auto=format\u0026n=3fc1F82PB1uU1_pD\u0026q=85\u0026s=902f62a6181def8e3c6b5aa71a40d247","dark":"https://mintcdn.com/parmanasystems/3fc1F82PB1uU1_pD/logo/logo-dark.svg?fit=max\u0026auto=format\u0026n=3fc1F82PB1uU1_pD\u0026q=85\u0026s=dba61af5a5c9f7960dbd6051e4ec24fb"},"favicon":"https://mintcdn.com/parmanasystems/3fc1F82PB1uU1_pD/logo/seal.svg?fit=max\u0026auto=format\u0026n=3fc1F82PB1uU1_pD\u0026q=85\u0026s=9ede6c2634c534c1d4eadfd76a08d84b","api":{"examples":{"prefill":true}},"background":{"color":{"light":"#FFFFFF","dark":"#1A1A1A"}},"navbar":{"links":[{"href":"https://github.com/pavancharak/parmana-verifier","label":"GitHub"},{"href":"https://github.com/pavancharak/parmana-verifier/discussions","label":"Discussions"}]},"footer":{"socials":{"github":"https://github.com/pavancharak/parmana-verifier"},"links":[{"header":"Legal","items":[{"label":"License and evaluation","href":"/license"},{"label":"Security","href":"https://docs.parmanasystems.com/license"}]}]},"fonts":{"family":"Inter"},"banner":{"content":"The Parmana repository, including the server, the SDKs and the offline verifier, is licensed under the Apache License 2.0. [License](/license)","dismissible":false},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"parmanasystems","hasAudioNarration":false,"actualSubdomain":"parmanasystems","customDomains":["docs.parmanasystems.com"],"gitSource":{"type":"github","owner":"pavancharak","repo":"parmana-core","deployBranch":"main","contentDirectory":"docs/site","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aeb7a3f08d17703d20e664e","collectionId":"a084c277-8061-4643-9409-c9716b43e15d","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aeb7a3f08d17703d20e664e"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6aeb7a3f08d17703d20e664e","clientVersion":"0.0.4067","searchFilterCounts":[{"language":"default","tag":"API reference","count":171},{"language":"default","tag":"TypeScript SDK","count":135},{"language":"default","tag":"REST API","count":69},{"language":"default","tag":"Interfaces","count":63},{"language":"default","tag":"Python SDK","count":48},{"language":"default","tag":"Classes","count":32},{"language":"default","tag":"Handbook","count":27},{"language":"default","tag":"Build with Parmana","count":26},{"language":"default","tag":"The Parmana Handbook","count":24},{"language":"default","tag":"Concepts","count":22}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/endpoints/verify-refusal-record","slug":"/api-reference/endpoints/verify-refusal-record","pageMetadata":{"title":"Verify a Refusal Record's signature","description":"Checks a Refusal Record's signature.","openapi":"openapi.bundled.yaml POST /refusal/verify","href":"/api-reference/endpoints/verify-refusal-record"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Checks a Refusal Record’s signature.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Verify a Refusal Record's signature","description":"Checks a Refusal Record's signature.","openapi":"openapi.bundled.yaml POST /refusal/verify","href":"/api-reference/endpoints/verify-refusal-record"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Refusal Records"],"summary":"Verify a Refusal Record's signature","operationId":"verifyRefusalRecord","description":"Checks a Refusal Record's signature.","security":[],"requestBody":"e11091fb-1083-4325-acc1-f489d288d9c7","responses":{"200":"4e172eee-b4bb-4abd-92eb-da4f3eb65cf1","400":"9af1e9b4-302e-4024-aebc-c430d6a37c2b","429":"14451228-55c9-47c9-a1e5-97641d56a45b"},"x-codeSamples":[{"lang":"bash","label":"cURL","source":"# The Refusal Record, as returned by GET /refusal/\u003cbusinessTransactionId>:\ncurl -X POST https://parmana-api-real.vercel.app/refusal/verify \\\n -H \"Content-Type: application/json\" \\\n --data @refusal-record.json"},{"lang":"typescript","label":"TypeScript","source":"import { ParmanaClient } from \"@parmana/sdk\";\n\nconst client = new ParmanaClient({\n endpoint: \"https://parmana-api-real.vercel.app\",\n apiKey: process.env.PARMANA_API_KEY!,\n});\n\nconst record = await client.refusalRecord(\n \"5f0c2a7e-3d7b-4d0e-9a55-2f6d8b1c4e90\",\n);\nconst valid = await client.verifyRefusalRecord(record);\n\nconsole.log(valid);"},{"lang":"python","label":"Python","source":"import os\n\nfrom parmana import ParmanaClient\n\nclient = ParmanaClient(\n endpoint=\"https://parmana-api-real.vercel.app\",\n api_key=os.environ[\"PARMANA_API_KEY\"],\n)\n\nrecord = client.refusal_record(\"5f0c2a7e-3d7b-4d0e-9a55-2f6d8b1c4e90\")\nvalid = client.verify_refusal_record(record)\n\nprint(valid)"}],"method":"post","type":"path","servers":["ccbad58a-c6b7-4105-9b97-9f75bf5ac3e8","f8b42300-1978-4b73-8972-e40460cad714"],"path":"/refusal/verify","baseUrlOptions":["https://parmana-api-real.vercel.app","http://localhost:3000"],"title":"Verify a Refusal Record's signature","codeSamples":[{"label":"cURL","lang":"bash","source":"# The Refusal Record, as returned by GET /refusal/\u003cbusinessTransactionId>:\ncurl -X POST https://parmana-api-real.vercel.app/refusal/verify \\\n -H \"Content-Type: application/json\" \\\n --data @refusal-record.json"},{"label":"TypeScript","lang":"typescript","source":"import { ParmanaClient } from \"@parmana/sdk\";\n\nconst client = new ParmanaClient({\n endpoint: \"https://parmana-api-real.vercel.app\",\n apiKey: process.env.PARMANA_API_KEY!,\n});\n\nconst record = await client.refusalRecord(\n \"5f0c2a7e-3d7b-4d0e-9a55-2f6d8b1c4e90\",\n);\nconst valid = await client.verifyRefusalRecord(record);\n\nconsole.log(valid);"},{"label":"Python","lang":"python","source":"import os\n\nfrom parmana import ParmanaClient\n\nclient = ParmanaClient(\n endpoint=\"https://parmana-api-real.vercel.app\",\n api_key=os.environ[\"PARMANA_API_KEY\"],\n)\n\nrecord = client.refusal_record(\"5f0c2a7e-3d7b-4d0e-9a55-2f6d8b1c4e90\")\nvalid = client.verify_refusal_record(record)\n\nprint(valid)"}],"requiredOnlyExamples":false,"requestExampleType":"codeSamples","responseExampleType":"generated","prefillPlaygroundWithExample":true,"prefillPlaygroundExamples":[{"body.refusalRecordId":"eddc5dd1-a791-4470-9534-11b3fc573ab8","body.businessTransactionId":"353c73fb-5e87-4dbe-8bfc-c15c8f18d871","body.decision.decisionId":"3919f4b6-cbc8-44ec-a6a1-8887ee85f314","body.decision.intentId":"4ba6b14a-c593-4f5c-ab58-dcef38a29364","body.decision.policy.name":"vendor-payment","body.decision.policy.version":"2.0.0","body.decision.policy.schemaVersion":"1.0.0","body.decision.signals":{"vendorVerified":false,"invoiceVerified":true,"paymentApproved":true,"sufficientFunds":true,"paymentAmount":1000,"riskScore":5,"vendorId":"vendor://payments"},"body.decision.outcome":"REJECTED","body.decision.evaluatedAt":"2026-09-15T03:27:45.666Z","body.decision.reason":"Vendor payment rejected because the vendor has not been verified.","body.evaluatedIntent.target":"vendor://payments","body.evaluatedIntent.parameters":{"amount":1000,"currency":"USD"},"body.refusalRecordHash":"47d8200e839f9b4a1a53dba941e318553c9b024bc64d26c5b613e5ae2aeb65ca","body.signature.algorithm":"ed25519","body.signature.keyId":"default","body.signature.value":"tT32/iJ0bEDxjc+/KPeAegTBSrzpRFW14f9Vyv3Ykx+H/rLHcgd7SlFH/BAXut8sEH2mpo0smg82tSoXmZkpDQ==","body.signature.signedAt":"2026-09-15T03:27:45.668Z","body.createdAt":"2026-09-15T03:27:45.666Z"}]},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"title":"Refusal Verify Request","description":"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.","type":"object","additionalProperties":true,"required":["refusalRecordId","businessTransactionId","decision","evaluatedIntent","refusalRecordHash","signature","createdAt"],"properties":{"refusalRecordId":{"type":"string","description":"Unique Refusal Record identifier.","isRequired":true,"uniqueKey":"refusalRecordId","typeLabel":"string"},"businessTransactionId":{"type":"string","description":"Business Transaction this refusal is about.","isRequired":true,"uniqueKey":"businessTransactionId","typeLabel":"string"},"decision":{"title":"Decision","description":"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.","type":"object","additionalProperties":true,"required":["decisionId","intentId","policy","signals","outcome","evaluatedAt"],"properties":{"decisionId":{"type":"string","description":"Unique Decision identifier.","isRequired":true,"uniqueKey":"decision.decisionId","typeLabel":"string"},"intentId":{"type":"string","description":"Intent evaluated by this Decision.","isRequired":true,"uniqueKey":"decision.intentId","typeLabel":"string"},"policy":{"title":"Policy Reference","description":"Exact Policy to evaluate. The client explicitly supplies name, version, and schemaVersion; Parmana does not automatically discover or select a policy. If no matching policy file exists at policies/{name}/{version}/policy.json, the request fails with a 404 (policyId/policyVersion on POST /policies/validate) or a RUNTIME_ERROR (name/version elsewhere, from PolicyNotFoundError not otherwise mapped by the shared error handler in every route, see the error envelope note).","type":"object","additionalProperties":true,"required":["name","version","schemaVersion"],"properties":{"name":{"type":"string","description":"Policy name. Required and non-empty. Parmana rejects an empty name with a 400.","minLength":1,"isRequired":true,"uniqueKey":"decision.policy.name","typeLabel":"string"},"version":{"type":"string","description":"Business policy version. Required and non-empty. Parmana rejects an empty version with a 400.","minLength":1,"examples":["2.0.0","1.0.0"],"isRequired":true,"uniqueKey":"decision.policy.version","typeLabel":"string"},"schemaVersion":{"type":"string","description":"Signals schema version expected by the policy.","examples":["1.0.0"],"isRequired":true,"uniqueKey":"decision.policy.schemaVersion","typeLabel":"string"},"contentHash":{"type":"string","description":"sha256 of the canonicalized policy.json content actually loaded for this decision (G-24). Server-computed, never caller-settable; absent on a request-supplied PolicyReference and on a PolicyReference built before this field existed. Only present on the copy embedded in an Execution Trust Record's transaction.policy.","uniqueKey":"decision.policy.contentHash","typeLabel":"string"},"governanceAnchor":{"type":"object","description":"Whether the policy content above is traceable to a completed Policy Governance approval, resolved at decision time (G-45). Absent on a PolicyReference built before this field existed. Its presence does not imply POLICY_EXECUTION_VERIFICATION_ENFORCED is on -- only that the lookup ran and recorded what it found, which may honestly be \"no approval record exists for this policy yet.\"","additionalProperties":false,"required":["status"],"properties":{"status":{"type":"string","enum":["VERIFIED","NO_APPROVAL_RECORD","SIGNATURE_INVALID","CONTENT_MISMATCH"],"isRequired":true,"uniqueKey":"decision.policy.governanceAnchor.status","typeLabel":"enum\u003cstring>"},"approvalRecordId":{"type":"string","description":"The PolicyChangeApprovalRecord this anchor resolved against. Present only when a record was found at all -- absent for NO_APPROVAL_RECORD.","uniqueKey":"decision.policy.governanceAnchor.approvalRecordId","typeLabel":"string"}},"uniqueKey":"decision.policy.governanceAnchor","typeLabel":"object"}},"examples":[{"name":"vendor-payment","version":"2.0.0","schemaVersion":"1.0.0"},{"name":"vendor-payment","version":"2.0.0","schemaVersion":"1.0.0","contentHash":"3f2504e04f8964e7ad0dbb0cf7fea1b4e0e1e0a3a1e1a4b6c8e0d5f6a7b8c9d0","governanceAnchor":{"status":"NO_APPROVAL_RECORD"}}],"isRequired":true,"uniqueKey":"decision.policy","typeLabel":"Policy Reference · object"},"signals":{"title":"Signals","description":"Opaque runtime facts evaluated by the resolved Policy's rules. Parmana assigns no business meaning to these values and does not statically validate them beyond the Policy's own signalsSchema declaration (see policies/{name}/{version}/policy.json). Scaled integers, not floats, for numeric signals such as amounts (house convention across every reference policy).","type":"object","additionalProperties":true,"examples":[{"vendorVerified":true,"invoiceVerified":true,"paymentApproved":true,"sufficientFunds":true,"paymentAmount":4500,"riskScore":10}],"isRequired":true,"uniqueKey":"decision.signals","typeLabel":"Signals · object"},"outcome":{"type":"string","description":"Policy evaluation outcome. There are no intermediate states: a Decision is always exactly one of these two values.","enum":["APPROVED","REJECTED"],"isRequired":true,"uniqueKey":"decision.outcome","typeLabel":"enum\u003cstring>"},"evaluatedAt":{"type":"string","format":"date-time","description":"UTC timestamp when policy evaluation completed.","isRequired":true,"uniqueKey":"decision.evaluatedAt","typeLabel":"string\u003cdate-time>"},"reason":{"type":"string","description":"Human-readable explanation, taken from the matching Policy rule's outcome.reason.","uniqueKey":"decision.reason","typeLabel":"string"},"matchedRuleId":{"type":"string","description":"Identifier of the Policy rule that matched, or \"none\" when no rule matched. Absent on a Decision built before this field existed (docs/internal/VERIFICATION-GAPS.md G-44).","uniqueKey":"decision.matchedRuleId","typeLabel":"string"},"evaluatedRules":{"type":"integer","description":"Number of rules evaluated before reaching a match (or exhausting the rule list). Same optionality as matchedRuleId.","uniqueKey":"decision.evaluatedRules","typeLabel":"integer"},"matchedPath":{"type":"array","items":{"type":"string","uniqueKey":"decision.matchedPath.items.[INDEX]","typeLabel":"string"},"description":"Ordered rule-id trace evaluation walked to reach matchedRuleId. Same optionality as matchedRuleId.","uniqueKey":"decision.matchedPath","typeLabel":"string[]"},"assessment":{"type":"object","description":"Authority, business validation and, for a refusal, execution, each as its own status (RFC-0023). AUTHORIZED means the action type may be decided, not that this action is valid or was executed. Absent on decisions made before it existed.","required":["authority","businessValidation"],"properties":{"authority":{"type":"object","required":["status","reason"],"properties":{"status":{"type":"string","enum":["AUTHORIZED","NOT_AUTHORIZED","AUTHORITY_UNCLEAR","AUTHORITY_EXPIRED"],"isRequired":true,"uniqueKey":"decision.assessment.authority.status","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","isRequired":true,"uniqueKey":"decision.assessment.authority.reason","typeLabel":"string"}},"isRequired":true,"uniqueKey":"decision.assessment.authority","typeLabel":"object"},"businessValidation":{"type":"object","required":["status","reason"],"properties":{"status":{"type":"string","enum":["VALID","INVALID","MISSING_DATA","CONFLICTING_DATA","SOURCE_UNAVAILABLE","VALIDATION_EXPIRED","NOT_EVALUATED"],"isRequired":true,"uniqueKey":"decision.assessment.businessValidation.status","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","isRequired":true,"uniqueKey":"decision.assessment.businessValidation.reason","typeLabel":"string"},"signals":{"type":"array","description":"Trusted Signals: facts established by their sources for this exact business object and action.","items":{"type":"object","uniqueKey":"decision.assessment.businessValidation.signals.items.[INDEX]","typeLabel":"object"},"uniqueKey":"decision.assessment.businessValidation.signals","typeLabel":"object[]"},"failures":{"type":"array","description":"Why business validation did not pass, one entry per signal that failed.","items":{"type":"object","required":["signalKey","status","reason"],"properties":{"signalKey":{"type":"string","isRequired":true,"uniqueKey":"decision.assessment.businessValidation.failures.items.[INDEX].signalKey","typeLabel":"string"},"status":{"type":"string","enum":["VALID","INVALID","MISSING_DATA","CONFLICTING_DATA","SOURCE_UNAVAILABLE","VALIDATION_EXPIRED","NOT_EVALUATED"],"isRequired":true,"uniqueKey":"decision.assessment.businessValidation.failures.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","isRequired":true,"uniqueKey":"decision.assessment.businessValidation.failures.items.[INDEX].reason","typeLabel":"string"}},"uniqueKey":"decision.assessment.businessValidation.failures.items.[INDEX]","typeLabel":"object"},"uniqueKey":"decision.assessment.businessValidation.failures","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"decision.assessment.businessValidation","typeLabel":"object"},"execution":{"type":"object","required":["status","reason"],"properties":{"status":{"type":"string","enum":["EXECUTED","NOT_EXECUTED","EXECUTION_FAILED","EXECUTION_UNKNOWN"],"isRequired":true,"uniqueKey":"decision.assessment.execution.status","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","isRequired":true,"uniqueKey":"decision.assessment.execution.reason","typeLabel":"string"}},"uniqueKey":"decision.assessment.execution","typeLabel":"object"}},"uniqueKey":"decision.assessment","typeLabel":"object"}},"examples":[{"decisionId":"9d69dc0b-333a-4be3-b09f-358fece806f3","intentId":"ae5865f6-181b-409a-90ec-1b4b8b8414ba","policy":{"name":"vendor-payment","version":"2.0.0","schemaVersion":"1.0.0"},"signals":{"vendorVerified":true,"invoiceVerified":true,"paymentApproved":true,"sufficientFunds":true,"paymentAmount":4500,"riskScore":10},"outcome":"APPROVED","reason":"Vendor payment authorized. Vendor verification, invoice verification, payment approval, funding, and risk assessment requirements were satisfied.","matchedRuleId":"approve-payment","evaluatedRules":1,"matchedPath":["approve-payment"],"evaluatedAt":"2026-07-07T16:38:59.326Z"}],"isRequired":true,"uniqueKey":"decision","typeLabel":"Decision · object"},"evaluatedIntent":{"type":"object","description":"The Intent snapshot the signals were evaluated against: target and parameters only, present for every refusal, not only binding violations.","additionalProperties":true,"properties":{"target":{"type":"string","uniqueKey":"evaluatedIntent.target","typeLabel":"string"},"parameters":{"type":"object","additionalProperties":true,"uniqueKey":"evaluatedIntent.parameters","typeLabel":"object"}},"isRequired":true,"uniqueKey":"evaluatedIntent","typeLabel":"object"},"refusalRecordHash":{"type":"string","description":"Canonical hash of this Refusal Record, same convention as ExecutionTrustRecord.trustRecordHash.","isRequired":true,"uniqueKey":"refusalRecordHash","typeLabel":"string"},"signature":{"type":"object","description":"Cryptographic signature over the canonical Refusal Record, signed with the same key as ExecutionTrustRecord, one root of trust for both approvals and refusals.","additionalProperties":true,"required":["algorithm","keyId","value","signedAt"],"properties":{"algorithm":{"type":"string","examples":["ed25519"],"isRequired":true,"uniqueKey":"signature.algorithm","typeLabel":"string"},"keyId":{"type":"string","description":"Identifier of the signing key.","isRequired":true,"uniqueKey":"signature.keyId","typeLabel":"string"},"value":{"type":"string","description":"Base64-encoded signature value.","isRequired":true,"uniqueKey":"signature.value","typeLabel":"string"},"signedAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"signature.signedAt","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"signature","typeLabel":"object"},"createdAt":{"type":"string","format":"date-time","description":"UTC timestamp when this Refusal Record was created.","isRequired":true,"uniqueKey":"createdAt","typeLabel":"string\u003cdate-time>"},"bindingViolations":{"type":"array","description":"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.","items":{"type":"object","additionalProperties":true,"required":["signalKey","intentPath","signalValue","intentValue"],"properties":{"signalKey":{"type":"string","isRequired":true,"uniqueKey":"bindingViolations.items.[INDEX].signalKey","typeLabel":"string"},"intentPath":{"type":"string","isRequired":true,"uniqueKey":"bindingViolations.items.[INDEX].intentPath","typeLabel":"string"},"signalValue":{"oneOf":[{"isRequired":true}],"isRequired":true,"uniqueKey":"bindingViolations.items.[INDEX].signalValue","typeLabel":"any"},"intentValue":{"oneOf":[{"isRequired":true}],"isRequired":true,"uniqueKey":"bindingViolations.items.[INDEX].intentValue","typeLabel":"any"}},"uniqueKey":"bindingViolations.items.[INDEX]","typeLabel":"object"},"uniqueKey":"bindingViolations","typeLabel":"object[]"},"submittedBy":{"type":"string","description":"Authenticated caller who submitted the rejected request. Absent when caller authentication is disabled.","uniqueKey":"submittedBy","typeLabel":"string"},"policyContentHash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"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.","uniqueKey":"policyContentHash","typeLabel":"string"}},"examples":[{"refusalRecordId":"eddc5dd1-a791-4470-9534-11b3fc573ab8","businessTransactionId":"353c73fb-5e87-4dbe-8bfc-c15c8f18d871","decision":{"decisionId":"3919f4b6-cbc8-44ec-a6a1-8887ee85f314","intentId":"4ba6b14a-c593-4f5c-ab58-dcef38a29364","policy":{"name":"vendor-payment","version":"2.0.0","schemaVersion":"1.0.0"},"signals":{"vendorVerified":false,"invoiceVerified":true,"paymentApproved":true,"sufficientFunds":true,"paymentAmount":1000,"riskScore":5,"vendorId":"vendor://payments"},"outcome":"REJECTED","reason":"Vendor payment rejected because the vendor has not been verified.","evaluatedAt":"2026-09-15T03:27:45.666Z"},"evaluatedIntent":{"target":"vendor://payments","parameters":{"amount":1000,"currency":"USD"}},"createdAt":"2026-09-15T03:27:45.666Z","refusalRecordHash":"47d8200e839f9b4a1a53dba941e318553c9b024bc64d26c5b613e5ae2aeb65ca","signature":{"algorithm":"ed25519","keyId":"default","value":"tT32/iJ0bEDxjc+/KPeAegTBSrzpRFW14f9Vyv3Ykx+H/rLHcgd7SlFH/BAXut8sEH2mpo0smg82tSoXmZkpDQ==","signedAt":"2026-09-15T03:27:45.668Z"}}],"uniqueKey":"","typeLabel":"Refusal Verify Request · object"},"examples":{"Example":{"title":"Example","value":{"refusalRecordId":"eddc5dd1-a791-4470-9534-11b3fc573ab8","businessTransactionId":"353c73fb-5e87-4dbe-8bfc-c15c8f18d871","decision":{"decisionId":"3919f4b6-cbc8-44ec-a6a1-8887ee85f314","intentId":"4ba6b14a-c593-4f5c-ab58-dcef38a29364","policy":{"name":"vendor-payment","version":"2.0.0","schemaVersion":"1.0.0"},"signals":{"vendorVerified":false,"invoiceVerified":true,"paymentApproved":true,"sufficientFunds":true,"paymentAmount":1000,"riskScore":5,"vendorId":"vendor://payments"},"outcome":"REJECTED","reason":"Vendor payment rejected because the vendor has not been verified.","evaluatedAt":"2026-09-15T03:27:45.666Z"},"evaluatedIntent":{"target":"vendor://payments","parameters":{"amount":1000,"currency":"USD"}},"createdAt":"2026-09-15T03:27:45.666Z","refusalRecordHash":"47d8200e839f9b4a1a53dba941e318553c9b024bc64d26c5b613e5ae2aeb65ca","signature":{"algorithm":"ed25519","keyId":"default","value":"tT32/iJ0bEDxjc+/KPeAegTBSrzpRFW14f9Vyv3Ykx+H/rLHcgd7SlFH/BAXut8sEH2mpo0smg82tSoXmZkpDQ==","signedAt":"2026-09-15T03:27:45.668Z"}}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"4e172eee-b4bb-4abd-92eb-da4f3eb65cf1":{"description":"The check ran. Read `valid`. A `200` alone does not mean the signature verified.","content":{"application/json":{"schema":{"title":"Verify Result Response","description":"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.","type":"object","additionalProperties":false,"required":["valid"],"properties":{"valid":{"type":"boolean","description":"Whether the signature verifies against Parmana's public key for the stated algorithm and key ID.","isRequired":true,"uniqueKey":"valid","typeLabel":"boolean"}},"examples":[{"valid":true},{"valid":false}],"uniqueKey":"","typeLabel":"Verify Result Response · object"},"examples":{"valid":{"title":"valid","value":{"valid":true}}},"exampleType":"examples"}},"exampleType":"examples"},"9af1e9b4-302e-4024-aebc-c430d6a37c2b":{"description":"The body is not shaped like a Refusal Record.","content":{"application/json":{"schema":{"title":"Error Response","description":"Shared error envelope produced by packages/api/src/middleware/error-handler.ts and by every route's inline validation checks. error is always a plain human-readable string (never a nested object). code is present only when the failure was a RuntimeError subclass reaching the centralized error handler (VerificationFailedError, ReceiptGenerationError, or an uncategorized RuntimeError); it is absent from every inline route-level check (businessTransactionId format/required checks) and from BusinessTransactionValidationError, PolicyValidationError, SignalValidationError, PolicyNotFoundError, DuplicateBusinessTransactionError, and the generic 500 fallback. POST /policies/validate does NOT use this envelope at all. See its own response schema. For the triggering condition and recommended caller action behind any specific error/code/status combination, see the Error catalog at /api-reference/error-catalog.","type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable machine-readable error code. Only present for errors that reach the handler as a RuntimeError.","examples":["RUNTIME_ERROR","VERIFICATION_FAILED","RECEIPT_GENERATION_FAILED","POLICY_DENIED","CAPABILITY_NOT_ALLOWED","RATE_LIMITED","AUDIT_UNAVAILABLE","SIGNING_UNAVAILABLE","CONNECTOR_NOT_REGISTERED","EXECUTION_RECORD_INCOMPLETE","EXECUTION_INTENT_UNAVAILABLE","EXECUTION_INTENT_RESULT_NOT_RECORDED","EXECUTION_INTENT_NOT_FOUND","EXECUTION_INTENTS_NOT_ENABLED","EXECUTION_INTENT_NOT_RESOLVABLE","EXECUTION_INTENT_RESOLUTION_INVALID","NON_HUMAN_CALLER_DENIED","EXECUTION_OUTCOME_UNKNOWN","AUTHORIZATION_NO_LONGER_VALID"],"uniqueKey":"code","typeLabel":"string"},"executionStatus":{"type":"string","enum":["EXECUTION_UNKNOWN","NOT_EXECUTED"],"description":"RFC-0023 phase 4. EXECUTION_UNKNOWN with EXECUTION_OUTCOME_UNKNOWN: the action was released and the call failed, so whether it ran is unknown; never reported as failed, and the Execution Intent stays ERRORED until a person resolves it. NOT_EXECUTED with AUTHORIZATION_NO_LONGER_VALID: the release was refused because a business condition or the authority grant it rested on no longer held, and nothing was sent.","uniqueKey":"executionStatus","typeLabel":"enum\u003cstring>"}},"examples":[{"error":"businessTransactionId must be a valid UUID."},{"error":"Business Transaction 'eed2a972-1bf5-4166-8472-761f76fbf1b2' already exists."},{"error":"Execution rejected: Vendor payment rejected because the assessed payment risk exceeds the maximum permitted threshold.","code":"RUNTIME_ERROR"}],"uniqueKey":"","typeLabel":"Error Response · object"},"examples":{"malformed":{"title":"malformed","value":{"error":"Request body must be a Refusal Record (refusalRecordId, businessTransactionId, decision, refusalRecordHash, signature required)."}}},"exampleType":"examples"}},"exampleType":"examples"},"14451228-55c9-47c9-a1e5-97641d56a45b":{"description":"Too many requests from this caller on this route in the last minute. The default limits are 30 per caller per minute on `/execute`, 300 per IP address on `/health` and `/ready`, and 60 per IP address shared by the unauthenticated verification and handbook routes. The request never reached the handler, so nothing was recorded or executed. Wait the number of seconds in the `Retry-After` header, then retry.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"title":"Error Response","description":"Shared error envelope produced by packages/api/src/middleware/error-handler.ts and by every route's inline validation checks. error is always a plain human-readable string (never a nested object). code is present only when the failure was a RuntimeError subclass reaching the centralized error handler (VerificationFailedError, ReceiptGenerationError, or an uncategorized RuntimeError); it is absent from every inline route-level check (businessTransactionId format/required checks) and from BusinessTransactionValidationError, PolicyValidationError, SignalValidationError, PolicyNotFoundError, DuplicateBusinessTransactionError, and the generic 500 fallback. POST /policies/validate does NOT use this envelope at all. See its own response schema. For the triggering condition and recommended caller action behind any specific error/code/status combination, see the Error catalog at /api-reference/error-catalog.","type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable machine-readable error code. Only present for errors that reach the handler as a RuntimeError.","examples":["RUNTIME_ERROR","VERIFICATION_FAILED","RECEIPT_GENERATION_FAILED","POLICY_DENIED","CAPABILITY_NOT_ALLOWED","RATE_LIMITED","AUDIT_UNAVAILABLE","SIGNING_UNAVAILABLE","CONNECTOR_NOT_REGISTERED","EXECUTION_RECORD_INCOMPLETE","EXECUTION_INTENT_UNAVAILABLE","EXECUTION_INTENT_RESULT_NOT_RECORDED","EXECUTION_INTENT_NOT_FOUND","EXECUTION_INTENTS_NOT_ENABLED","EXECUTION_INTENT_NOT_RESOLVABLE","EXECUTION_INTENT_RESOLUTION_INVALID","NON_HUMAN_CALLER_DENIED","EXECUTION_OUTCOME_UNKNOWN","AUTHORIZATION_NO_LONGER_VALID"],"uniqueKey":"code","typeLabel":"string"},"executionStatus":{"type":"string","enum":["EXECUTION_UNKNOWN","NOT_EXECUTED"],"description":"RFC-0023 phase 4. EXECUTION_UNKNOWN with EXECUTION_OUTCOME_UNKNOWN: the action was released and the call failed, so whether it ran is unknown; never reported as failed, and the Execution Intent stays ERRORED until a person resolves it. NOT_EXECUTED with AUTHORIZATION_NO_LONGER_VALID: the release was refused because a business condition or the authority grant it rested on no longer held, and nothing was sent.","uniqueKey":"executionStatus","typeLabel":"enum\u003cstring>"}},"examples":[{"error":"businessTransactionId must be a valid UUID."},{"error":"Business Transaction 'eed2a972-1bf5-4166-8472-761f76fbf1b2' already exists."},{"error":"Execution rejected: Vendor payment rejected because the assessed payment risk exceeds the maximum permitted threshold.","code":"RUNTIME_ERROR"}],"uniqueKey":"","typeLabel":"Error Response · object"},"examples":{"rateLimited":{"title":"rateLimited","value":{"error":"Rate limit exceeded. Try again later.","code":"RATE_LIMITED"}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{},"servers":{"ccbad58a-c6b7-4105-9b97-9f75bf5ac3e8":{"url":"https://parmana-api-real.vercel.app","description":"Production. Needs a key issued by the operator."},"f8b42300-1978-4b73-8972-e40460cad714":{"url":"http://localhost:3000","description":"Local (packages/api, PORT env var, default 3000)"}}},"originalFileLocation":"openapi.bundled.yaml"},"subdomain":"parmanasystems","siteName":"Parmana","title":"Verify a Refusal Record's signature - Parmana","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-01T10:36:32.947Z","originalFileLocation":"api-reference/endpoints/verify-refusal-record.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Checks a Refusal Record\u0026#x27;s signature.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Parmana\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/parmanasystems/etjcJguz6BN6OG2a/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/parmanasystems/etjcJguz6BN6OG2a/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/parmanasystems/etjcJguz6BN6OG2a/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/parmanasystems/etjcJguz6BN6OG2a/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/parmanasystems/etjcJguz6BN6OG2a/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/parmanasystems/etjcJguz6BN6OG2a/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/parmanasystems/etjcJguz6BN6OG2a/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/parmanasystems/etjcJguz6BN6OG2a/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/parmanasystems/etjcJguz6BN6OG2a/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Verify a Refusal Record\u0026#x27;s signature - Parmana\">\u003cmeta data-mint-head property=\"og:description\" content=\"Checks a Refusal Record\u0026#x27;s signature.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Parmana\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.parmanasystems.com/api-reference/endpoints/verify-refusal-record\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://parmanasystems.mintlify.app/_mintlify/api/og/v2?division=Refusal+Records\u0026amp;title=Verify+a+Refusal+Record%27s+signature\u0026amp;description=Checks+a+Refusal+Record%27s+signature.\u0026amp;theme=330e7d48bcc953731fc52f38\u0026amp;signature=60e1a24274318b01b125d3fd16e2ed90abc301a0d4638e70705db72d475c9520\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Verify a Refusal Record\u0026#x27;s signature - Parmana\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Checks a Refusal Record\u0026#x27;s signature.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://parmanasystems.mintlify.app/_mintlify/api/og/v2?division=Refusal+Records\u0026amp;title=Verify+a+Refusal+Record%27s+signature\u0026amp;description=Checks+a+Refusal+Record%27s+signature.\u0026amp;theme=330e7d48bcc953731fc52f38\u0026amp;signature=60e1a24274318b01b125d3fd16e2ed90abc301a0d4638e70705db72d475c9520\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/parmanasystems/etjcJguz6BN6OG2a/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Parmana\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#6366F1\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.parmanasystems.com/api-reference/endpoints/verify-refusal-record\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/endpoints/verify-refusal-record.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.parmanasystems.com/#organization\",\"name\":\"Parmana\",\"url\":\"https://docs.parmanasystems.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/parmanasystems/3fc1F82PB1uU1_pD/logo/logo-light.svg?fit=max\u0026auto=format\u0026n=3fc1F82PB1uU1_pD\u0026q=85\u0026s=902f62a6181def8e3c6b5aa71a40d247\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.parmanasystems.com#website\",\"name\":\"Parmana\",\"url\":\"https://docs.parmanasystems.com\",\"publisher\":{\"@id\":\"https://docs.parmanasystems.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.parmanasystems.com/api-reference/endpoints/verify-refusal-record#webpage\",\"url\":\"https://docs.parmanasystems.com/api-reference/endpoints/verify-refusal-record\",\"name\":\"Verify a Refusal Record's signature\",\"description\":\"Checks a Refusal Record's signature.\",\"dateModified\":\"2026-10-01T10:36:32.947Z\",\"isPartOf\":{\"@id\":\"https://docs.parmanasystems.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.parmanasystems.com/api-reference/endpoints/verify-refusal-record#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.parmanasystems.com/api-reference/endpoints/verify-refusal-record#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Parmana\",\"item\":\"https://docs.parmanasystems.com\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Verify a Refusal Record's signature\",\"item\":\"https://docs.parmanasystems.com/api-reference/endpoints/verify-refusal-record\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.parmanasystems.com/api-reference/endpoints/verify-refusal-record#apireference\",\"headline\":\"Verify a Refusal Record's signature\",\"name\":\"Verify a Refusal Record's signature\",\"description\":\"Checks a Refusal Record's signature.\",\"url\":\"https://docs.parmanasystems.com/api-reference/endpoints/verify-refusal-record\",\"mainEntityOfPage\":{\"@id\":\"https://docs.parmanasystems.com/api-reference/endpoints/verify-refusal-record#webpage\"},\"dateModified\":\"2026-10-01T10:36:32.947Z\",\"publisher\":{\"@id\":\"https://docs.parmanasystems.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.parmanasystems.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Parmana\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Parmana","nav":{"global":null,"tabs":[{"tab":"Get started","pages":[{"title":"Get started","href":""}]},{"tab":"Concepts","pages":[{"title":"Concepts","href":"/concepts/policies-and-the-decision"}]},{"tab":"Guides","pages":[{"title":"Guides","href":"/guides/full-integration-overview"}]},{"tab":"TypeScript SDK","pages":[{"title":"TypeScript SDK","href":"/sdks/typescript"}]},{"tab":"Python SDK","pages":[{"title":"Python SDK","href":"/sdks/python"}]},{"tab":"Connector SDKs","pages":[{"title":"Connector SDKs","href":"/integrations/overview"}]},{"tab":"REST API","groups":[{"group":"REST API guide","pages":[{"title":"REST API Introduction","href":"/api-reference/introduction"},{"title":"Authentication","href":"/api-reference/authentication"},{"title":"Error Handling","href":"/api-reference/error-handling"},{"title":"Idempotency and Nonces","href":"/api-reference/idempotency-and-nonces"},{"title":"Error Catalog","href":"/api-reference/error-catalog"},{"title":"SDK coverage of the API","href":"/sdks/api-coverage"}]},{"group":"Execution","pages":[{"title":"Execute a Business Transaction","openapi":"openapi.bundled.yaml POST /execute","href":"/api-reference/endpoints/execute-transaction"}]},{"group":"Transactions","pages":[{"title":"List Business Transactions","openapi":"openapi.bundled.yaml GET /transactions","href":"/api-reference/endpoints/list-transactions"},{"title":"Create (execute) a Business Transaction","openapi":"openapi.bundled.yaml POST /transactions","href":"/api-reference/endpoints/create-transaction"},{"title":"Get Business Transaction","openapi":"openapi.bundled.yaml GET /transactions/{businessTransactionId}","href":"/api-reference/endpoints/get-transaction"}]},{"group":"Verification","pages":[{"title":"Verify an Execution Trust Record","openapi":"openapi.bundled.yaml POST /verify","href":"/api-reference/endpoints/verify-transaction"},{"title":"Get latest Verification","openapi":"openapi.bundled.yaml GET /verification/{businessTransactionId}","href":"/api-reference/endpoints/get-latest-verification"}]},{"group":"Receipts","pages":[{"title":"Generate a Receipt","openapi":"openapi.bundled.yaml POST /receipt","href":"/api-reference/endpoints/generate-receipt"},{"title":"Get latest Receipt","openapi":"openapi.bundled.yaml GET /receipt/latest/{businessTransactionId}","href":"/api-reference/endpoints/get-latest-receipt"}]},{"group":"Trust Records","pages":[{"title":"Bulk-export Execution Trust Records (compliance/audit)","openapi":"openapi.bundled.yaml GET /trust-records","href":"/api-reference/endpoints/list-trust-records"},{"title":"Get Execution Trust Record","openapi":"openapi.bundled.yaml GET /trust-records/{businessTransactionId}","href":"/api-reference/endpoints/get-trust-record"}]},{"group":"Replay","pages":[{"title":"Replay an Execution Trust Record","openapi":"openapi.bundled.yaml POST /replay","href":"/api-reference/endpoints/replay-transaction"}]},{"group":"Policies","pages":[{"title":"Get the policy a capability's requests must declare right now","openapi":"openapi.bundled.yaml GET /policies/in-effect","href":"/api-reference/endpoints/get-policy-in-effect"},{"title":"Validate that a Policy exists and is readable","openapi":"openapi.bundled.yaml POST /policies/validate","href":"/api-reference/endpoints/validate-policy"}]},{"group":"Policy Governance","pages":[{"title":"Propose a policy change (maker)","openapi":"openapi.bundled.yaml POST /policies/{name}/{version}/pending-changes","href":"/api-reference/endpoints/propose-policy-change"},{"title":"List pending policy changes (maker-checker)","openapi":"openapi.bundled.yaml GET /policies/pending-changes","href":"/api-reference/endpoints/list-pending-policy-changes"},{"title":"Approve a pending policy change (checker)","openapi":"openapi.bundled.yaml POST /policies/pending-changes/{id}/approve","href":"/api-reference/endpoints/approve-policy-change"},{"title":"Reject a pending policy change (checker)","openapi":"openapi.bundled.yaml POST /policies/pending-changes/{id}/reject","href":"/api-reference/endpoints/reject-policy-change"}]},{"group":"Approvers","pages":[{"title":"List approver keys","openapi":"openapi.bundled.yaml GET /approval-issuers","href":"/api-reference/endpoints/list-approval-issuers"},{"title":"List approver changes","openapi":"openapi.bundled.yaml GET /approval-issuers/changes","href":"/api-reference/endpoints/list-approval-issuer-changes"},{"title":"Propose adding or revoking an approver key","openapi":"openapi.bundled.yaml POST /approval-issuers/changes","href":"/api-reference/endpoints/propose-approval-issuer-change"},{"title":"Approve an approver change","openapi":"openapi.bundled.yaml POST /approval-issuers/changes/{id}/approve","href":"/api-reference/endpoints/approve-approval-issuer-change"},{"title":"Reject an approver change","openapi":"openapi.bundled.yaml POST /approval-issuers/changes/{id}/reject","href":"/api-reference/endpoints/reject-approval-issuer-change"}]},{"group":"External Connectors","pages":[{"title":"List external connectors","openapi":"openapi.bundled.yaml GET /external-connectors","href":"/api-reference/endpoints/list-external-connectors"},{"title":"List external connector changes","openapi":"openapi.bundled.yaml GET /external-connectors/changes","href":"/api-reference/endpoints/list-external-connector-changes"},{"title":"Propose registering or revoking an external connector","openapi":"openapi.bundled.yaml POST /external-connectors/changes","href":"/api-reference/endpoints/propose-external-connector-change"},{"title":"Approve an external connector change","openapi":"openapi.bundled.yaml POST /external-connectors/changes/{id}/approve","href":"/api-reference/endpoints/approve-external-connector-change"},{"title":"Reject an external connector change","openapi":"openapi.bundled.yaml POST /external-connectors/changes/{id}/reject","href":"/api-reference/endpoints/reject-external-connector-change"}]},{"group":"Business Signal Sources","pages":[{"title":"List business signal sources","openapi":"openapi.bundled.yaml GET /business-signal-sources","href":"/api-reference/endpoints/list-business-signal-sources"},{"title":"List business signal source changes","openapi":"openapi.bundled.yaml GET /business-signal-sources/changes","href":"/api-reference/endpoints/list-business-signal-source-changes"},{"title":"Propose registering or revoking a business signal source","openapi":"openapi.bundled.yaml POST /business-signal-sources/changes","href":"/api-reference/endpoints/propose-business-signal-source-change"},{"title":"Approve a business signal source change","openapi":"openapi.bundled.yaml POST /business-signal-sources/changes/{id}/approve","href":"/api-reference/endpoints/approve-business-signal-source-change"},{"title":"Reject a business signal source change","openapi":"openapi.bundled.yaml POST /business-signal-sources/changes/{id}/reject","href":"/api-reference/endpoints/reject-business-signal-source-change"}]},{"group":"Authority Grants","pages":[{"title":"List authority grants","openapi":"openapi.bundled.yaml GET /authority-grants","href":"/api-reference/endpoints/list-authority-grants"},{"title":"List authority grant changes","openapi":"openapi.bundled.yaml GET /authority-grants/changes","href":"/api-reference/endpoints/list-authority-grant-changes"},{"title":"Propose granting or revoking an agent's authority","openapi":"openapi.bundled.yaml POST /authority-grants/changes","href":"/api-reference/endpoints/propose-authority-grant-change"},{"title":"Approve an authority grant change","openapi":"openapi.bundled.yaml POST /authority-grants/changes/{id}/approve","href":"/api-reference/endpoints/approve-authority-grant-change"},{"title":"Reject an authority grant change","openapi":"openapi.bundled.yaml POST /authority-grants/changes/{id}/reject","href":"/api-reference/endpoints/reject-authority-grant-change"}]},{"group":"Sandbox","pages":[{"title":"Get a demo approval (sandbox only)","openapi":"openapi.bundled.yaml POST /sandbox/approvals","href":"/api-reference/endpoints/create-sandbox-approval"}]},{"group":"Kill Switch","pages":[{"title":"Trip the operator kill switch","openapi":"openapi.bundled.yaml POST /kill-switch/trip","href":"/api-reference/endpoints/trip-kill-switch"},{"title":"Reset the operator kill switch","openapi":"openapi.bundled.yaml POST /kill-switch/reset","href":"/api-reference/endpoints/reset-kill-switch"},{"title":"Read the kill switch state","openapi":"openapi.bundled.yaml GET /kill-switch/status","href":"/api-reference/endpoints/get-kill-switch-status"},{"title":"Record a kill switch probe result","description":"Records what a scheduler saw from a harmless authorization request.","openapi":"openapi.bundled.yaml POST /kill-switch/probes","href":"/api-reference/endpoints/record-kill-switch-probe"}]},{"group":"Refusal Records","pages":[{"title":"Verify a Refusal Record's signature","openapi":"openapi.bundled.yaml POST /refusal/verify","href":"/api-reference/endpoints/verify-refusal-record"},{"title":"Get a Refusal Record by transaction ID","description":"Returns the signed Refusal Record kept when a policy refused a transaction: the decision, the rule that refused, the facts it saw and the signature.","openapi":"openapi.bundled.yaml GET /refusal/{businessTransactionId}","href":"/api-reference/endpoints/get-refusal-record"}]},{"group":"Execution Intents","pages":[{"title":"Verify an Execution Intent's signature","openapi":"openapi.bundled.yaml POST /execution-intents/verify","href":"/api-reference/endpoints/verify-execution-intent"},{"title":"List Execution Intents that never reached a signed Trust Record","openapi":"openapi.bundled.yaml GET /execution-intents/unfinalized","href":"/api-reference/endpoints/list-unfinalized-execution-intents"},{"title":"Get an Execution Intent and its status","openapi":"openapi.bundled.yaml GET /execution-intents/{businessTransactionId}","href":"/api-reference/endpoints/get-execution-intent"},{"title":"Rebuild the signed Trust Record for a released action","openapi":"openapi.bundled.yaml POST /execution-intents/{businessTransactionId}/finalize","href":"/api-reference/endpoints/finalize-execution-intent"},{"title":"Close an intent you reconciled by hand","openapi":"openapi.bundled.yaml POST /execution-intents/{businessTransactionId}/resolve","href":"/api-reference/endpoints/resolve-execution-intent"}]},{"group":"Audit","pages":[{"title":"Verify a signed caller-authentication audit event","openapi":"openapi.bundled.yaml POST /audit/verify","href":"/api-reference/endpoints/verify-audit-event"}]},{"group":"System","pages":[{"title":"Root","openapi":"openapi.bundled.yaml GET /","href":"/api-reference/endpoints/get-root"},{"title":"Health check","openapi":"openapi.bundled.yaml GET /health","href":"/api-reference/endpoints/get-health"},{"title":"Readiness check","openapi":"openapi.bundled.yaml GET /ready","href":"/api-reference/endpoints/get-ready"},{"title":"Get the OpenAPI spec","openapi":"openapi.bundled.yaml GET /openapi.yaml","href":"/api-reference/endpoints/get-open-api-spec"},{"title":"Get the OpenAPI spec, as JSON","openapi":"openapi.bundled.yaml GET /openapi.json","href":"/api-reference/endpoints/get-open-api-spec-json"},{"title":"Machine-readable SDK and discovery manifest","openapi":"openapi.bundled.yaml GET /api-manifest.json","href":"/api-reference/endpoints/get-api-manifest"},{"title":"Service version","openapi":"openapi.bundled.yaml GET /version","href":"/api-reference/endpoints/get-version"},{"title":"Fetch a public signing key for independent, offline verification","openapi":"openapi.bundled.yaml GET /keys/{keyId}","href":"/api-reference/endpoints/get-key"},{"title":"List every public signing key this deployment can currently produce","openapi":"openapi.bundled.yaml GET /.well-known/jwks.json","href":"/api-reference/endpoints/get-jwks"},{"title":"Get the authenticated caller's identity and resolved scope","openapi":"openapi.bundled.yaml GET /callers/me","href":"/api-reference/endpoints/get-caller-me"}]},{"group":"Handbook","pages":[{"title":"Download the Parmana Handbook (PDF)","openapi":"openapi.bundled.yaml GET /parmana-handbook.pdf","href":"/api-reference/endpoints/get-handbook-pdf"},{"title":"Capture an email address, then redirect straight to the handbook PDF","openapi":"openapi.bundled.yaml GET /handbook/download-leads","href":"/api-reference/endpoints/get-handbook-download-lead"},{"title":"Capture an email address before unlocking the handbook PDF download","openapi":"openapi.bundled.yaml POST /handbook/download-leads","href":"/api-reference/endpoints/create-handbook-download-lead"}]}]},{"tab":"Deploy and operate","pages":[{"title":"Deploy and operate","href":"/self-hosted/overview"}]},{"tab":"Reference","pages":[{"title":"Reference","href":"/reference/shared"}]},{"tab":"Build book","pages":[{"title":"Build book","href":"/build-book/overview"}]},{"tab":"Handbook","pages":[{"title":"Handbook","href":"/handbook/overview"}]}]},"basePath":"","title":"Verify a Refusal Record's signature - Parmana","buildId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","deploymentId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","dynamics":["10e4515597","c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["BannerMarkdown-DicSZcaX.js","dist-CIQkMg3R.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-ClVdStUn.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","OpenApiReferenceProvider-DX1Meug0.js","utils-B_OMIQVC.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-ChxhRPMa.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-CuKvD8Iv.js","snippetPresets-C5d7p2hp.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","Page-BAvA99GL.js","ApiExamples-CfHcE8m4.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C1zZV314.js","shallow-CmQhqCJn.js","getApiPlaygroundDisplay-YRo9s1O7.js","CodeSnippet-RN1MTdfk.js","CodeSnippets-DKLPHxJA.js","getPastedJson-bz0M41mU.js","icon-CsmhpPrv.js","MethodPill-CNGsVE77.js","DuplicateIcon-DilfU_Z2.js","createIcon-BdsYzQck.js","DynamicMarkdown-CbqEDjbV.js","SectionHeading-O6hXpFCN.js","axios-vUo_bRtp.js","Markdown-nKm-uidQ.js","AssistantPageLink-ImrFS4Fy.js"]}