Every agent has a cryptographic identity. The email address is how that identity participates in services built for humans — account creation, verification flows, correspondence, anything that expects an address in a form field.
barry.alice@agents.arclabs.it
The format is {agentName}.{username}@agents.arclabs.it. It's stable across
redeployments, persists across version updates, and is tied to the agent's keypair —
the same identity expressed in a form that human-built services understand.
In the environment
The address is available as AXON_AGENT_EMAIL. Tools and scripts read it directly:
const agentEmail = process.env.AXON_AGENT_EMAIL
// → "barry.alice@agents.arclabs.it"
No import, no configuration object. If you're writing a tool that needs to register an account somewhere, this is the address to use.
The inbox
Mail sent to the agent's address arrives in an inbox. The @axon/email module exposes it:
import { email } from "@axon/email"
email.address // → "barry.alice@agents.arclabs.it"
const message = await email.inbox.waitFor({
from: "noreply@github.com",
subject: /please verify/i,
timeout: 60_000,
})
waitFor blocks until a matching message arrives or the timeout expires. It returns the
full parsed message — text, HTML, headers — so the agent can extract links or read the
content directly.
Verification flows
The pattern that makes the email address useful: trigger a flow, wait for the confirmation, extract the link, continue. It appears constantly — any service that confirms accounts by email.
// src/scripts/create-github-account.ts
import { email } from "@axon/email"
import { browser } from "@axon/browser"
const page = await browser.open("https://github.com/signup")
await page.fill('[name="user[email]"]', email.address)
await page.fill('[name="user[login]"]', "barry-arclabs")
await page.fill('[name="user[password]"]', process.env.GITHUB_INITIAL_PASSWORD)
await page.click('[type="submit"]')
const message = await email.inbox.waitFor({
from: "noreply@github.com",
subject: /verify your email address/i,
timeout: 120_000,
})
const match = message.text.match(/https:\/\/github\.com\/users\/activate\?[^\s]+/)
if (!match) throw new Error("No activation link in confirmation email")
await browser.open(match[0])
After this completes, the agent has a verified GitHub account it owns. The OAuth token that comes out of that account is the agent's — not borrowed from a human, not tied to anyone's employment.
Sending
Agents send mail as themselves:
await email.send({
to: "alice@example.com",
subject: "Deploy complete",
text: "The v2.3.1 deploy finished without errors. 14 tests passed.",
})
Outbound limit: 100 messages per day.
Oversight
The inbox is shared — the agent and the human read the same messages. From outside the agent, via the AxonCloud client:
const messages = await client.identity.inbox.list(agentId)
Every message the agent receives is visible. Every verification flow it's in the middle of is inspectable. Nothing happens in the background you can't see.
Signing — the keypair that the email address is an alias for. What it proves and how verification works.