Quickstart

From zero to a human-approved agent action in five minutes. All you need is an account and a terminal.

1. Get an API key

Sign in — your first login creates a workspace — then open Dashboard → API Keys and create a key. Copy it immediately; keys are stored hashed and shown exactly once.

.env
CONFIRM_API_KEY=cfm_live_...

2. Create an approval request

Call the API at the moment your agent is about to do something a human should see. Use your own email as notify so you receive the approval link.

terminal
curl -X POST https://confirm.dev/api/v1/requests \
  -H "Authorization: Bearer $CONFIRM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "summary": "Refund $10,000 to customer #4821",
    "payload": { "action": "refund", "amount": 10000, "customerId": "4821" },
    "notify": "you@yourcompany.com",
    "agentName": "SupportBot"
  }'

The response is the full request object with "status": "PENDING" and an id like clx…. Your agent should stop here.

3. Decide as the approver

Check the inbox you passed in notify and open the review link. You'll see the summary and payload with three choices: Approve, Reject, or Edit payload first — try editing the amount to 10.00 before approving to see how corrections flow back.

4. Read the verdict

Poll the request — or skip polling entirely by registering a webhook in step 5.

terminal
curl https://confirm.dev/api/v1/requests/REQUEST_ID \
  -H "Authorization: Bearer $CONFIRM_API_KEY"
response (abridged)
{
  "id": "clx…",
  "status": "APPROVED",
  "payload":          { "action": "refund", "amount": 10000, "customerId": "4821" },
  "modifiedPayload":  { "action": "refund", "amount": 10.00, "customerId": "4821" },
  "effectivePayload": { "action": "refund", "amount": 10.00, "customerId": "4821" },
  "resolvedByEmail": "you@yourcompany.com",
  "resolvedAt": "2026-07-15T20:05:00.000Z"
}
Always execute effectivePayload, never payload. It resolves to the human's edited version when one exists — that's the entire "fix the hallucination" feature in one field.

5. Go event-driven

Add an endpoint under Dashboard → Webhooks and we'll POST you request.approved / request.rejected / request.expired the instant a decision lands — no polling loop. See Webhooks for the payload shape and the six-line signature check.