The integration is two calls and one rule.

Your agent proposes an action. Humsana binds the authority to that exact action. Immediately before the action runs, your executor asks the same question again, against the parameters it is about to send, and the call proceeds only if the answer still matches. Without a valid binding, the action does not run.

How a caller uses it.

01

Register the action class

Registration names the bound values, the consequence and any human step, for classes like payments.release, filing.submit, access.revoke or records.delete.

02

Authorize the exact action

POST /v1/authorize/verify with the principal, the action and its parameters.

03

Confirm where required

The principal's identity system authenticates the human. Humsana signs the approval over the digest.

04

Check before acting

POST /v1/authorize/effectuate with the receipt and the action about to run.

05

Keep the record

It carries what was authorized and presented, both digests and the policy version.

What the boundary answers with.

DecisionWhat it means
ALLOWThe action proceeds.
ALLOW_WITH_LIMITSIt proceeds with the limits applied.
VERIFYSomething is verified first.
HUMAN_CONFIRMAn authenticated human approves this exact action.
HOLDIt waits until something changes.
DENYIt does not proceed.

The grant is single use: the check that passes spends it.

The check runs before the action.

Humsana checks at the seam the integrating party controls.

POST /v1/authorize/effectuate
{
  "receipt_id": "rcpt_8f21c0",
  "binding_digest": "sha256:9c1f...",
  "final_action": { "name": "payments.release",
                    "parameters": { "payee_account": "GB00SUPPLIER00004821", "amount_gbp": "1800" } }
}

// 200 MATCHED
{ "code": "MATCHED",
  "decision": "ALLOW",
  "matched": true,
  "consumed": true,
  "grant_id": "grant_v2RT39_NY3B84w_oZ4OMA-s9_Y_YvM7b",
  "confirmed_by": { "subject": "reviewer@northwind.example",
                    "adapter": "reference", "method": "hmac-sha256" } }

// 200
{ "code": "GRANT_DOES_NOT_COVER_THIS_ACTION",
  "decision": "DENY",
  "matched": false,
  "consumed": false,
  "policy_version": 1,
  "drift": [ { "field": "parameters.payee_account",
               "authorized": "GB00SUPPLIER00004821",
               "final": "GB00SUPPLIER00009137",
               "rule": "MAY_NOT_CHANGE" } ] }

What the service exposes.

EndpointPurpose
POST /v1/authorize/verifyPropose an action, receive a decision and a binding.
POST /v1/authorize/effectuatePresent the action at execution.
POST /v1/authorize/confirmRecord the confirmation, bound to the digest.
POST /v1/authorize/challengeAsk for the challenge.
POST /v1/authorize/confirm/requestRequest the confirmation step.
GET /v1/healthThe service summary: policy version, confirmation mode, and the limits a caller is held to. Send a key for the running configuration: detector, detector version, gates, queue depth.

Bearer key authentication, except for GET /v1/health, which answers without one.

python3 -m receipt.verify record.receipt.json --key key.pub.json

The integration guide is available on request.