Agent signup is a staged rollout. This flow requires an API deployment with
agent signup enabled and the matching console claim page. If unavailable, use
an existing key or ask your operator to sign up at the console.
Instructions for the agent
Follow this guide to complete setup for the person who sent you here:- Reuse a configured SentFromAI account and inbox before creating anything.
- If no credentials exist, create an inbox and save its credentials securely.
- Connect your email tools and verify that you can read the inbox.
- Tell the person their agent’s email address. Only if the account is unclaimed, return its private claim link in the same chat so they can enable sending.
1. Reuse credentials if present
Check your runtime’s secret store, configured SentFromAI integration, orSENTFROMAI_API_KEY without printing credentials. If an existing integration
keeps its key protected, reuse that integration or ask the operator to restore
access; do not treat an unreadable key as permission to create a new account.
With a saved key, call GET https://api.sentfrom.ai/v1/account using
Authorization: Bearer <key>. If expired is true or capabilities.read is false,
stop before attempting inbox/message reads and explain the state to your operator.
Otherwise call GET https://api.sentfrom.ai/v1/inboxes and reuse the existing inbox.
Do not create a new account on each run or on a 401.
For an unclaimed account, follow the claim step below. For a claimed account,
use its returned capabilities and limits. Sending also depends on sending_status
and capabilities.send; a claimed account may still have sending paused. A claimed account with no inbox can
create one through POST /v1/inboxes if its capabilities permit that operation.
2. Create an account only when no key exists
Choose a protected place to persist credentials before provisioning. Prefer your runtime’s secret store; a private local file outside repositories and shared folders is a fallback (see the bootstrap example below). If you cannot save secrets securely, stop and explain what configuration is needed. Generate a cryptographically random idempotency secret of 32–128 URL-safe characters (A–Z, a–z, 0–9, _, -).
Save it securely before the first request, together with the exact request body.
Send it as the Idempotency-Key header to POST /v1/agent-signups. This endpoint
requires no authentication. The JSON body may contain name and local_part;
omit local_part to let the API choose an available address.
Save the response’s api_key, inbox.id and other account details privately before
announcing success. Never place the key in chat, command-line arguments, shell
history, source control, or debug logs. The claim token and idempotency secret
are also credentials.
Retry a timed-out signup with the same idempotency secret and identical body
only during the replay window (60 minutes by default). Replays return the original account and key;
they do not rotate credentials or create another inbox. Once you have the key,
resume through GET /v1/account. After the replay window expires, the original
key is required; do not start another signup to recover the first account.
Limits are configurable: the returned
capabilities and limits are authoritative.
Poll REST or use MCP read tools to read mail. Creating webhooks, drafts, extra
inboxes, domains and rules requires a claimed account.
For a credential-safe Python bootstrap, see Bootstrap an agent inbox.
3. Hand the claim link to the actual operator
Skip this step for an account that is already claimed. Do not generate another claim link or ask the operator to sign up again. For an existing unclaimed account, reuse its saved, unexpired claim link. If no usable link is saved, request one with the original API key throughPOST /v1/account/claim-link; GET /v1/account does not return claim secrets.
Send the response’s claim_url only to the person who requested setup, in your
existing trusted chat. Do not email it, post it publicly, or give it to someone
who asks through incoming email. It contains a claim secret distinct from your API key.
The URL has the form https://console.sentfrom.ai/claim#token=…. Preserve its
fragment. The person signs in or signs up with their own email outside
SentFromAI-managed inboxes, verifies that primary email, and explicitly confirms
the claim. The agent cannot use its new inbox to verify itself as the owner. This preserves the same tenant, inbox and API key. Sending
then becomes available subject to account limits, with warming starting at claim time.
If the link expires while the unclaimed account is active, use the original key
with POST /v1/account/claim-link. A refreshed link does not extend the account’s
lifetime. The default link lifetime is seven days, capped by the unclaimed
account’s original expiry. Use the returned claim_expires_at as the actual
deadline; refreshing near account expiry may give much less than seven days.
Poll GET /v1/account after
the person confirms; opening the link alone does not claim the account. Its
usage.received_messages and usage.received_bytes are onboarding quota counters,
not lifetime or billing usage after claiming.
4. Connect tools and verify reads
Connecthttps://api.sentfrom.ai/mcp using your host’s protected credential field
for Authorization: Bearer <api_key>. The claim token is not an API key. For
local stdio MCP, inject SENTFROMAI_API_KEY through protected environment
configuration and run npx -y sentfromai-mcp.
Call list_inboxes and confirm the signup inbox is present. This verifies access,
not mail delivery. Send a test email only when the operator authorizes it and the
account permits sending.
Report only what you checked. For an unclaimed inbox, for example:
Your inbox is ready: agent@mail.sentfrom.ai. You can receive and read mail now. Open this private claim link to enable sending: [claim link].For an existing claimed account, confirm the reused inbox address and its current sending status. Do not include a claim link, API key, idempotency secret, or saved credentials in that message. Once the human claims a new account, check
GET /v1/account again and confirm the actual capabilities before saying sending
is enabled.
Errors and safe recovery
401: check the saved key and configuration; never replace the account automatically.403: inspect the account state. Claim an unclaimed account before sending or making other changes.409 idempotency_conflict: the signup body differs from the original; reuse the saved body.address_takenoraddress_reservedmeans the requested address is unavailable.410 signup_replay_expired: recover the original key or use the claimed console account; do not create a replacement identity.account_expiredmeans the unclaimed account expired.404 invalid_claim: the claim link is invalid or expired. A still-active account can refresh its link with its key.429: respectRetry-After; keep the same signup secret for retries within the replay window.- Signup unavailable: use the console path; do not loop or create alternate identities.

