Human approval, delivered to any inbox.

An open source API that adds a human checkpoint to any automation, AI agent, or script. One API call sends the approval email, and your code waits for the decision. Self-host it or try the demo.

mail.google.com
S
approvals@shonin.devjust now

⚠️ DESTRUCTIVE — git push origin main --force

Will overwrite upstream commits · Approve or reject…

DESTRUCTIVE · This action cannot be undone

  • • Will overwrite upstream commits
  • • Bypasses branch protection rules

Command

git push origin main --force

Why the agent wants this

The remote has diverged after a rebase. Force push is needed to sync the branch.

Files (2)

app/api/deploy/route.tsMODIFIED
scripts/force-deploy.shNEW

+ export async function POST(req) {

+ await deploy({ force: true })

- // force deploy disabled

… View full diff →

Reject

Why it exists

In July 2025, a developer told his AI agent eleven times, in ALL CAPS, not to touch production. It deleted the database anyway.

Instructions are only suggestions to an agent. A human gate that lives outside the model is not.

Read the full story

Developer first

Integrate in minutes

deploy.tsTypeScript
const res = await fetch("https://shonin.dev/api/v1/approvals", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
action: "Deploy to production",
approver_email: "cto@company.com",
context: "PR #247 merged, 3 files changed",
}),
});
 
const { id } = await res.json();
// Then poll GET /api/v1/approvals/:id, or pass a webhook_url
Works with any frameworkNo SDK requiredApprover needs no account

Simple by design

How it works

01

Your code calls the API

POST to /v1/approvals with the action description, approver email, and optional context. You get back an approval ID immediately.

02

Approver gets an email

A clean, branded email arrives with Approve and Reject buttons. No login required. No account. One click.

03

Your code continues

Poll the approval by ID or receive a webhook the instant a decision is made. Act on the result however you like.

Built to be trusted

A gate the agent cannot talk its way past

The agent cannot approve itself

The approve and reject links go only to the person you name. The API never hands them back to your code.

Opening a link decides nothing

Mail scanners and previews open every link in an email. A decision takes one deliberate click on a confirm page.

Open source, self-hostable

MIT licensed. Run it on your own Supabase and Resend, with no limits and your data in your hands.

Put a human in the loop in two minutes.