Introduction

Confirm.dev is the human-in-the-loop layer for AI agents: a hosted pause button your code calls before an agent does anything sensitive. The agent yields, a human decides, and a signed webhook resumes the run — with an immutable audit trail of the whole exchange.

Why this exists

Autonomous agents are good enough to act and not good enough to act unsupervised. The failure mode isn't hypothetical: a support agent refunds $10,000 instead of $10, a sales agent invents a funding round in a cold email, an ops agent drops a table that billing still reads. Teams either ship agents with no brakes, or bolt approval flows onto Slack threads and spreadsheets that satisfy no auditor.

Confirm gives you the brakes as infrastructure: one API to pause, one review surface for the human, one webhook to resume, one log for compliance.

The request lifecycle

  1. Create. Your code calls POST /v1/requests with a human-readable summary, the exact action payload, and who should approve it. The response is a PENDING request.
  2. Notify. The approver gets an email with a single-purpose magic link. No account, no app — the 256-bit token in the link is the credential.
  3. Decide. The approver sees the summary and payload, then approves, rejects, or edits the payload first. Identity, timestamp, IP, and note are recorded.
  4. Resume. We fire an HMAC-signed webhook to your endpoint. Your code executes effectivePayload — the human-edited version when one exists, otherwise the original.
  5. Expire. If nobody answers within the TTL, the request becomes EXPIRED and a webhook tells your system. Silence never becomes consent.

Request statuses

StatusMeaning
PENDINGWaiting on a human. The agent should stay paused.
APPROVEDA human said yes. Execute effectivePayload.
REJECTEDA human said no. Do not execute; the rejection note explains why.
EXPIREDThe TTL elapsed with no decision. Treat as a rejection.

PENDING is the only non-terminal state. Terminal states never change — a request can't be re-approved, un-rejected, or resurrected after expiry.

The quickstart takes you from zero to a resolved approval in about five minutes.