live·action

Proof of Action

Get a person's signed yes before anything irreversible happens.

Proof of Action is live today, one of 4 live proofs. Each answer is a signed proof anyone can check, even offline.

Proof Holdingsproof.holdings · verification api
ApprovalNº 2026-0087
requestfinance-bot requests sign-off — “Wire €12,400 to team.management?”
channelTelegram · encrypted end-to-end by Proof Holdings
verdictApproved14:02 UTC — the decision itself is signed
Minted· approved
action · ES256 ✓

What it proves

Proof of Action puts a human decision in front of any irreversible step. An agent or system requests approval, the designated person approves or denies on their own device — end-to-end encrypted — and the decision is recorded as a signed proof token: who approved what, when, over which channel.

Without Proof of Action

“OK, send it” in a WhatsApp thread — sign-off nobody can prove later.

With Proof of Action

Before an irreversible step — a payment, a deploy, a deletion — your system or AI agent asks a named person to approve it in Telegram or WhatsApp, or any other channel on request. Their yes or no is recorded as a signed proof.

How it works

  1. 1Set up an approval: who approves, and on which channel.
  2. 2Before the action runs, your code asks for approval.
  3. 3The person approves or denies — the decision itself is a signed proof.
See what the approver receives →

Start in minutes

import { Proof } from '@proof-holdings/sdk';

const proof = new Proof('pk_live_...');

// A HITL config created in the dashboard, which also generates its keypair
const hitlId = 'YOUR_HITL_CONFIG_ID';

// createAndWait encrypts the sentence for the config's key before sending it:
// the server stores ciphertext, the human decrypts in their browser. It builds a v1
// (owner-only) envelope — a config with enrolled approvers needs a v2 one, via
// encryptMessageV2 + getApproverKeys, or the call is refused.
const decision = await proof.confirmations.createAndWait(
  hitlId,
  'Deploy v2.1.0 to production?',
  { throwOnDenial: false },
);

// Human taps Approve or Deny — the decision is a signed proof token

Endpoints

POST/api/v1/hitl— Create HITL config
GET/api/v1/hitl— List HITL configs
GET/api/v1/hitl/:id— Get a HITL config
PATCH/api/v1/hitl/:id— Update a HITL config
DELETE/api/v1/hitl/:id— Archive a HITL config
POST/api/v1/confirmations— Request human approval
GET/api/v1/confirmations/:id— Get approval status
GET/api/v1/confirmations— List confirmations
POST/api/v1/authorizations— Ask a person to allow approval requests on their channel
GET/api/v1/authorizations— List authorizations
GET/api/v1/authorizations/:id— Get an authorization
DELETE/api/v1/authorizations/:id— Revoke an authorization