- Verify once:
domains.createreturns DNS records; status moves fromNOT_STARTEDthroughVERIFIED(docs as of 2026-09-17). - Two patterns:
subdomains_enabledfor address space; register each subdomain for reputation isolation. - Bulk inboxes:
inboxes.createwithusernameanddomainon any verified domain or wildcard subdomain. - Tenants: Pods hold per-customer domains and scoped keys so one tenant cannot burn another.
- Limits: Free has 0 custom domains; Developer 10; Startup 150; PAYG +1 domain is $2/mo.
Manage custom domains for thousands of agent inboxes by treating each domain as an API resource. Call domains.create. Publish the returned SPF, DKIM, DMARC, and MX records. Wait until status is VERIFIED. Then create inboxes in bulk with inboxes.create(username=..., domain=...).
Use subdomains_enabled when you only need address space under one parent. Register separate domains when cold outreach and receipts must not share DKIM reputation. Put each customer in a Pod with its own domains when you sell agent email as a multi-tenant product.
As of 2026-09-17, AgentMail pricing includes custom domains on Developer (10) and Startup (150). Free has none. Pay as you go adds +1 custom domain for $2/mo on Developer or Startup (pay-as-you-go post). Cold-email stacks such as Mailforge, ScaledMail, Mailpool, and InboxKit own bulk domain warmup for outreach sequences. MailSlurp owns programmable test inboxes with custom domains. This page is the agent-fleet path: verify, choose isolation, provision, then Pod-bound tenants.
Why do agent fleets need their own domains?
Agent fleets need their own domains because each sending domain owns reputation, and a shared @agentmail.to address cannot isolate one agent's bounce rate from another's.
The default shared domain is fine for prototypes. Production agents need domains you control. Reputation lives at the domain, which is why fleet operators split risk across hosts they control.
One noisy outreach agent on the same domain as billing can drag placement for both.
Mailforge, ScaledMail, Mailpool, and InboxKit answer this for cold outreach. They buy domains, auto-publish SPF/DKIM/DMARC, warm mailboxes, and export to sequencers. MailSlurp answers it for tests and automation with API inboxes on your domain. AgentMail answers it when each agent is an inbox identity with threads, webhooks, and Pod isolation. Not only a sending mailbox.
| Vendor | Domain model | Best for |
|---|---|---|
| AgentMail | API verify, pods, agent inboxes | Agent fleets with isolation |
| Mailforge | Bulk domains, auto DNS, warm | Cold outreach volume |
| ScaledMail | White-glove Google or M365 | Managed sequencer inboxes |
| Mailpool | Buy domains, multi-provider | Agency inbox factories |
| InboxKit | Workspace mailboxes plus warmup | Outreach with InfraGuard |
| MailSlurp | API test and automation inboxes | CI, OTP, placement checks |
Last verified: 2026-09-17. Sources: agentmail.to/pricing, docs.agentmail.to/custom-domains, mailforge.ai, scaledmail.com, mailpool.ai, inboxkit.com, mailslurp.com.
How do I create and verify a domain over the API?
Create a domain with client.domains.create, publish every record in domain.records, then call client.domains.verify until status is VERIFIED.
The create call returns the domain object and the DNS records AgentMail expects. Status values are NOT_STARTED, PENDING, INVALID, FAILED, VERIFYING, and VERIFIED (API create, retrieved 2026-09-17).
Set subdomains_enabled=True when you want a wildcard MX. Then inboxes can live on any subdomain without registering each one.
https://docs.agentmail.to/custom-domains
from agentmail import AgentMail
client = AgentMail(api_key="YOUR_API_KEY")
domain = client.domains.create(
domain="agents.example.com",
subdomains_enabled=True,
)
print(domain.status)
print(len(domain.records))
# output: NOT_STARTED or PENDING, then N DNS records including wildcard MX
client.domains.verify(domain_id=domain.domain_id)
zone = client.domains.get_zone_file(domain_id=domain.domain_id)
# import zone into Cloudflare, Route 53, or PorkbunUpload the BIND zone file when your DNS host supports import. Route 53 TXT values over 255 characters must be split into adjacent quoted strings with no space between them, or DKIM fails.
DNS can take minutes to 48 hours to propagate. Poll domains.get and watch per-record status (MISSING, INVALID, VALID). Do not create production inboxes until the domain is VERIFIED.
When do subdomains give address space versus separate domains for reputation?
subdomains_enabled gives address space under one parent identity; registering each subdomain as its own domain gives separate DKIM and reputation.
With subdomains enabled, you publish one wildcard MX on the parent. Then inboxes.create(username="agent", domain="bot.example.com") works without registering bot.example.com.
Those inboxes send under the parent domain's DKIM. They share reputation with every other subdomain on that parent (managing domains, retrieved 2026-09-17).
Register billing.example.com and outreach.example.com as separate domains when risk profiles differ. Each gets its own DKIM. A cold sequence that burns outreach does not take billing with it.
Shared address space is cheap to operate at fleet scale. Isolated reputation costs more domain slots and more DNS work, and it is usually worth it when risk profiles diverge.
| Pattern | DNS cost | Reputation | Best for |
|---|---|---|---|
| Parent plus wildcard MX | One domain slot | Shared with parent | Many addresses, one risk |
| Register each subdomain | One slot per subdomain | Isolated DKIM | Mixed risk agents |
| Domain pool of roots | Many root domains | Rotated volume | Very high send volume |
Last verified: 2026-09-17. Source: docs.agentmail.to/managing-domains.
Enabling subdomains_enabled on an already-verified domain adds the wildcard MX and returns the domain to PENDING until that record verifies. Sending on existing inboxes is not interrupted while that happens.
How do I provision thousands of inboxes on verified domains?
Provision at scale by looping inboxes.create with a unique username and a verified domain, using client_id for idempotent retries.
Once the domain is VERIFIED, each create returns an inbox whose address is username@domain. For wildcard subdomains, pass the subdomain string as domain.
Creating a subdomain inbox when subdomains are disabled returns 422.
https://docs.agentmail.to/custom-domains
from agentmail import AgentMail
client = AgentMail(api_key="YOUR_API_KEY")
usernames = [f"agent-{i:04d}" for i in range(1, 101)]
inboxes = []
for name in usernames:
inbox = client.inboxes.create(
username=name,
domain="agents.example.com",
client_id=f"fleet-{name}-v1",
)
inboxes.append(inbox.inbox_id)
print(len(inboxes))
# output: 100 inbox ids such as agent-0001@agents.example.comPlan limits still apply. Developer includes 10 inboxes and 10 domains; Startup includes 150 of each as of 2026-09-17. Pay as you go adds capacity one unit at a time. Enterprise offers unlimited inboxes and custom domain counts. For fleet sizing patterns beyond domains, see AI agent fleets that need thousands of inboxes.
Rotate across a pool of verified root domains when daily volume on one domain would throttle. Keep the pool in your app and assign the next domain when you create the inbox.
How do I isolate tenants with Pods and per-pod domains?
Isolate tenants by creating a Pod per customer, attaching domains with pods.domains.create, then creating inboxes and API keys inside that Pod only.
A Pod is AgentMail's multi-tenancy boundary. It holds inboxes, domains, and scoped keys. The platform refuses to serve API reads or sends across that Pod boundary.
One customer's outreach cannot read another customer's mail. A leaked Pod key stays inside that tenant. The longer write-up is Pods: multi-tenant email infrastructure.
https://docs.agentmail.to/custom-domains
from agentmail import AgentMail
client = AgentMail(api_key="YOUR_API_KEY")
pod = client.pods.create(client_id="tenant-acme-v1")
domain = client.pods.domains.create(
pod.pod_id,
domain="mail.acme.example",
)
# publish domain.records, then:
client.pods.domains.verify(pod.pod_id, domain_id=domain.domain_id)
inbox = client.pods.inboxes.create(
pod.pod_id,
username="support",
domain="mail.acme.example",
)
key = client.pods.api_keys.create(pod.pod_id, name="acme-agent")
print(inbox.inbox_id)
# output: support@mail.acme.example inside the Acme Pod onlyGive high-risk tenants their own registered domains inside the Pod. Give low-risk tenants subdomain address space on a parent you already verified, only when shared reputation is acceptable.
Limitations: what AgentMail does not do for domain ops
AgentMail does not register domains for you, run a cold-email warmup network, or offer dedicated IPs below Enterprise.
You buy the domain at your registrar. You publish DNS. AgentMail returns the records and verifies them.
Free has zero custom domain slots. Domain work starts on Developer or above (pricing, retrieved 2026-09-17).
Warmup networks and pre-warmed Google or Microsoft mailboxes are the cold-email vendors' product. Use Mailforge, ScaledMail, Mailpool, or InboxKit when the job is sequencer outreach. Use AgentMail when agents need owned inboxes with threads, webhooks, and Pod isolation.
Dedicated IPs are Enterprise-only on the pricing page. Shared IPs are the default on Free through Startup. DMARC defaults to p=reject on domains AgentMail configures. Relax it in DNS only if you accept the tradeoff.
How much do custom domains cost at fleet scale?
Custom domains cost plan slots first, then $2/mo per extra domain on Developer or Startup via pay as you go.
As of 2026-09-17 on agentmail.to/pricing: Free includes 0 custom domains. Developer ($20/mo) includes 10. Startup ($200/mo) includes 150. Enterprise is custom.
The pay-as-you-go launch post prices +1 custom domain at $2/mo on Developer or Startup. The same unit price covers +1 inbox and +1,000 monthly sends.
Developer plus 5 extra domains is $20 + $10 = $30/mo. Startup stays at $200/mo while you stay inside 150 domains. Annual billing discounts plan and PAYG units by 20 percent per that post.
Inbox count is the other ceiling. Thousands of inboxes usually means Startup add-ons or Enterprise. Price domains and inboxes separately.
Mailforge, ScaledMail, and Mailpool price mailbox and domain bundles for outreach. Compare those when cold email is the product. Compare AgentMail when agents need durable inbox identity on domains you verify once and drive from code.
AgentMail gives your agents real inboxes. Create inboxes via API. Send and receive Emails with 0 complexity. Free to start.


