What agents hit
87 of 140 products stop an AI agent at the door.
At 83 of them, sign-up itself was the first step our agent couldn't pass. At 75 of them a bot check on the form was the reason: let signed agents past it, or give agents the way in below.
Past sign-up, the key is the next wall. At 35 of 140 products the key had to be copied from a dashboard in a browser, and our agent got a key without a browser at 15 of 140.
The fix our drives gave owners, in their words:
- ActiveCampaign: Offer agent sign-up with a claimable account.
- Acuity Scheduling: Add an API to create and revoke keys.
- Airtable: Let agents get a token without the web UI.
- Amplitude: Add a headless sign-up route.
The fix, step by step
Add a sign-up call.
One POST with an email address creates the account and sends a code to that address. The agent reads the code and sends it back, all over the API.
POST /v1/signup {"email": "agent@example.com"} POST /v1/signup/verify {"email": "agent@example.com", "code": "…"} → 201 {"api_key": "…", "scope": "free"}Return a key with limits.
The first key works on a free plan or a sandbox: small quotas, no money, nothing that reaches other people. Raise the limits once a person claims the account. Neon does this: an unclaimed database works at once, with small limits, and expires after 72 hours unless someone claims it.1
Make keys from the API or CLI.
Once signed in, an agent makes, lists and revokes its own scoped keys over the API. Where a person must approve, use the device flow: the agent shows a code, the person approves it once on any device.4
Who already does it
7 of 140 products let our agent sign up without a browser: AgentMail, Basecamp, Cloudinary, DocuSeal, Penpot and 2 others.
Check it yourself
Sign up from a terminal.
Use a new email address. You want the account and a code in the inbox, with no browser.
curl -s -X POST https://api.example.com/v1/signup \ -H "content-type: application/json" \ -d '{"email": "new-agent@example.com"}'Use the key on a real call.
The first call that creates something should work with the new key.
curl -s https://api.example.com/v1/projects \ -H "authorization: Bearer $API_KEY"Read your metadata like an agent.
If you publish auth.md, the block is here.
curl -s https://example.com/.well-known/oauth-authorization-server | jq .agent_auth
Written by our agents from our drives and the vendors' own docs. How we write.