Skip to content

Blog · Published 2026-10-21 · AgentiSend team

An agent that signs itself up

An AI agent signs itself up for AgentiSend with POST /agent/sign-up. The key emails only that human until POST /agent/verify.

Filed under Agents

An AI agent signs itself up for AgentiSend with POST /agent/sign-up. The key emails only that one human until POST /agent/verify.

The call takes an agent name and one human's email, and it takes no key. The response is a key that can email only that address until the human confirms. An agent may ask a person for an account. It may not start mailing anyone else first.

The call

POST /agent/sign-up answers with the key once, the account id, the human's email, and a limit of 10 sends a day to that address only. A repeat of the same name and email returns the same key prefix with the key set to null, and says the key was shown once. Store the key on the first response. There is no second copy.

The same address that already has an account is refused. The fix says to sign in and mint a key. Temporary and placeholder addresses are refused. A network can start 5 sign-ups an hour, and one address can start 3 a day.

curl -sS -X POST https://api.agentisend.com/agent/sign-up \
  -H "Authorization: Bearer $AGENTISEND_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"agent_name":"example","human_email":"example"}'
200
{
  "account_id": "9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42",
  "api_key": "example",
  "human_email": "example",
  "key_prefix": "example",
  "limits": {
    "per_day": -9007199254740991,
    "recipients": []
  },
  "next": "example"
}
Response

The same call from the CLI is agentisend agent sign-up --name <name> --human <email>. The human you name is the person who will run the account.

Until the human confirms

Every send whose recipient is not that human is refused with agent_unconfirmed. The fix names POST /agent/verify. POST /emails, a batch, and send_email over the agent connection all hit that same check. There is no flag that skips it.

{
  "error": {
    "code": "agent_unconfirmed",
    "message": "This key can email only the human who has not confirmed it yet.",
    "fix": "POST /agent/verify with the 6-digit code the human received. Until then every recipient has to be that address.",
    "docs_url": "https://agentisend.com/docs/errors#agent_unconfirmed",
    "retryable": false
  }
}

The human gets an email whose subject says the agent asked to send email on their behalf, with the agent name and the key prefix. The code lasts 24 hours. 10 wrong attempts lock it until it expires. agent_signup_code_rejected says so, and the response names when the lock ends. Asking for a new code is another POST /agent/sign-up after the old one expires.

The email links to the console. After the human signs in with that address, the account is already theirs. The console shows the agent name and the code entry on the same screen. The agent can submit the code once the human has handed it over, with POST /agent/verify or agentisend agent verify --code <code>. The key from sign-up is the credential on that call.

curl -sS -X POST https://api.agentisend.com/agent/verify \
  -H "Authorization: Bearer $AGENTISEND_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"code":"123456"}'
200
{
  "confirmed": true,
  "per_day": -9007199254740991,
  "status": "sandboxed"
}
Response

Until the code is accepted, the key is a way to reach the one person who can turn it into a sending key. Treating agent_unconfirmed as a temporary error and retrying other recipients returns the same refusal. The human's own address still sends, up to 10 times that day, which is how the agent can tell that person the account is waiting. A send to anyone else does not become a queued message. It is refused before it is stored as mail.

After they confirm

The key's daily budget rises to the free plan's 100 a day. For 7 days a recipient ramp applies: 3 distinct recipients in the first hour, 5 in the first day, and 10 in the first week. A send past the step in force is recipient_ramp, and the fix states when the next slot opens. Sending again to someone already reached does not take a slot.

{
  "error": {
    "code": "recipient_ramp",
    "message": "This key has reached its recipient ramp.",
    "fix": "The next recipient slot opens at the time named in this response. POST /emails again after that. Until then, send only to recipients this key has already reached.",
    "docs_url": "https://agentisend.com/docs/errors#recipient_ramp",
    "retryable": false
  }
}

The ramp is the no-cold-outreach rule on a new account: unsolicited sending is refused, and new recipients open in those steps rather than all at once. Confirming the code does not verify a domain and does not raise the plan. The account's standing still follows the signup check, so a risky address stays limited to its own verified domains. The calls are also on Agents.