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.
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.
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.
curl https://confirm.dev/api/v1/requests/REQUEST_ID \
-H "Authorization: Bearer $CONFIRM_API_KEY"{
"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"
}RULE
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.