Give your agent an email address, receive messages, and learn about reviewed sending setup.
Every workspace can receive email on its own subdomain of agentowl.dev. Mail is received by AgentOwl's SMTP server and checked for sender authentication. You can read it in the dashboard Inbox before connecting a runtime, or deliver new messages to your endpoint as events.
Outbound sending is a separate, reviewed pilot and is not generally available on Free today. If your account has been enabled, Overview shows the sending setup and status for its hosted address. You can then compose one-to-one email in the dashboard or create a key scoped to that exact address for your agent. Enabled Free accounts can submit to 10 recipients per account per UTC day; a rolling one-minute limit also applies. A receiving service accepting a message does not prove Inbox placement. See the Quickstart for the current receiving flow.
Addresses
Addresses take the form:
<name>@<workspace>.agentowl.devFor example, the workspace acme can use hello@acme.agentowl.dev, procurement@acme.agentowl.dev, and so on. Each address you want to receive mail on needs its own binding. Free workspaces can have up to 3 bindings.
Add an address
For the first address, create an agent identity with Email selected, then choose Activate email Inbox on Overview. This activates receiving without a webhook. To deliver new messages to your agent, use Connect runtime with a public HTTPS URL. For more addresses, use Webhooks → Create Binding with provider SMTP (Email), create a route to an endpoint, and activate routing; see the Quickstart.
With the CLI:
agentowl email bind acme procurement@acme.agentowl.dev --provider smtp
agentowl route create --tenant acme --binding <binding_id> --endpoint <endpoint_id>
agentowl config publish acmeMail to an address without an active binding, or before you activate receiving, isn't delivered. Inbox-only receiving does not run an agent or send replies. Connecting a runtime later affects new messages; earlier Inbox messages are not automatically replayed.
Custom domains
Reviewed pilot accounts can set up sending from their own domain through the dashboard. Prepare the domain, publish its ownership record, choose an exact From address, then publish the displayed SPF, DKIM, and DMARC records. AgentOwl checks DNS and finishes sending setup when the account is enabled. Your domain can remain with your current DNS provider. Sending-only setup does not move your existing MX or mailbox.
Receiving on your own domain is a separate setup. It requires an active exact address binding, a delivery route, and an MX change after recipient checks. It is not a domain-wide SMTP catch-all. Keep your existing MX if you only want AgentOwl to send.
Sending is separate from inbound webhooks; creating a workspace or endpoint does not automatically enable it. Follow Set up your email domain for the displayed records and verification steps. An older direct SMTP integration can still need operator-managed credentials.
AgentOwl operational routing
AgentOwl's own support address uses a platform-managed Cloudflare Email Routing rule. Tenant email bindings use the SMTP receiver; the API and CLI do not provision Cloudflare routing rules. Historical Cloudflare events use provider: "cloudflare" and provider_event_type: "email.received" so the inbound handler can continue to read them.
Hosted inbox page
Each workspace has an authenticated, read-only page at https://<workspace>.agentowl.dev/inbound/email that shows email received in the last 24 hours. Access requires operator credentials with permission for that workspace; the URL is not a public inbox. Use the dashboard Inbox for a browser-based test before your webhook is ready.
Event payload
Email events have channel: "email", provider: "smtp", and provider_event_type: "email.inbound". The message is in payload.inline:
{
"headers": {
"from": [{ "name": "Alice", "address": "alice@example.com" }],
"to": [{ "name": null, "address": "procurement@acme.agentowl.dev" }],
"subject": "Order 42",
"messageId": "<CAF...@mail.example.com>",
"date": "2026-10-05T14:03:11Z"
},
"body": {
"text": "Hi, can you confirm the delivery date for order 42?",
"html": "<p>Hi, can you confirm the delivery date for order 42?</p>",
"truncated": false
},
"attachments": [
{ "filename": "invoice.pdf", "content_type": "application/pdf", "size_bytes": 48211 }
],
"auth": {
"spf": "pass",
"dkim": "pass",
"dkimDomains": ["example.com"],
"dmarc": "pass",
"dmarcPolicy": "reject",
"trustLevel": "high"
},
"envelope": {
"mailFrom": "alice@example.com",
"rcptTo": ["procurement@acme.agentowl.dev"],
"helo": "mail.example.com"
}
}| Field | Description |
|---|---|
headers | Parsed from, to, subject, messageId, and date |
body.text, body.html | Message body. Either can be null. |
body.truncated | true if the text, HTML, or subject was cut to fit the limits below |
attachments | Name, type, and size of each attachment |
auth | Sender authentication results; see below |
envelope | SMTP envelope sender, recipients, and HELO name |
Attachments
The event lists attachments by name, content type, and size, up to 20 per message. Attachment contents are not included inline. Managed email attachment retrieval is available for participating agent-work endpoints with scoped credentials. Self-hosted deployments need the private storage configuration. See attachment access and retention. Baseline receivers should not assume attachment bytes are available through the API.
Sender authentication
AgentOwl checks every message with SPF, DKIM, and DMARC and reports the results in payload.inline.auth:
| Field | Values |
|---|---|
spf | pass, fail, softfail, neutral, none, temperror, permerror |
dkim | pass, fail, none, … |
dkimDomains | Domains with a valid DKIM signature |
dmarc | pass, fail, none |
dmarcPolicy | The sender domain's published policy: none, quarantine, reject |
trustLevel | AgentOwl's summary: high, medium, low, untrusted |
Messages are delivered whatever the result. Before your agent acts on an email, especially one asking it to send money, share data, or change settings, check trustLevel and dmarc. A From address alone proves nothing.
Limits
| Limit | Value |
|---|---|
| Inbound SMTP message size | 1 MB (1,000,000 bytes) for the complete MIME message, including headers and encoded attachments. Larger messages are rejected. |
| Recipients per message | 50 |
| Text body | 1 MB, then truncated |
| HTML body | 2 MB, then truncated |
| Subject | 1,000 characters, then truncated |
| Attachments listed | 20 |
| Messages per day | 100 on the Free plan |
October 16 email storage update
For messages accepted after the October 16, 2026 release, the complete inbound message limit is 1 MB (1,000,000 bytes). New stored email content and managed attachments expire after 30 days. Save content you need before its expiry. Expired content cannot be downloaded, replayed, or used as a reply source, even if background deletion is still pending.
Messages received before this rollout keep their existing storage rules. Earlier seven-day attachments or externalized payloads are not extended or restored. Operational delivery records, runtime work, logs, and backups follow separate schedules; this is not a universal 30-day deletion promise. Copies already downloaded, forwarded, or delivered to your receiver follow that recipient's policy.