Nylas is the obvious answer when a developer googles “email API.” It abstracts Gmail, Outlook, Exchange, Yahoo, iCloud, and IMAP behind one set of endpoints and has been around long enough to have mature documentation and SDKs in every language. If the agent reads or acts on a person’s existing inbox, it’s still probably the right call.
The comparison gets interesting — and where OpenMail works as a Nylas alternative — at one specific intersection: the agent needs its own address. Not access to a user’s mailbox — its own dedicated identity, provisioned programmatically, with no human OAuth flow upstream.
Nylas for what it’s actually built for
Nylas Connected Accounts is an OAuth abstraction layer. A user authenticates their existing Gmail or Outlook account, Nylas hands back a grant_id, and every subsequent API call — messages, threads, folders, attachments, webhooks — scopes to that grant. The grant inherits the underlying provider’s quotas.
This works well when the agent acts on behalf of a user. Reading a support rep’s inbox to suggest replies, syncing a salesperson’s email into a CRM, processing a customer’s invoice attachments. The use case is “agent acting on a person’s mailbox.” The mailbox predates the agent.
For an agent that needs its own address — something it sends from, receives on, and owns — Connected Accounts doesn’t apply. There’s no existing mailbox to authenticate against.
Agent Accounts: what it is and what it ships with
In 2026, Nylas added Agent Accounts, currently in beta. An Agent Account is a Nylas-hosted mailbox provisioned through the API without an OAuth flow. You call POST /v3/connect/custom with "provider": "nylas" instead of "google" or "microsoft", get back a grant_id, and that account works with the same messages, threads, and webhook endpoints as any other grant. Every Agent Account also gets a primary calendar.
“Agent Accounts are in beta. The API and features may change before general availability.” — Nylas documentation
Three defaults matter for production planning:
| Limit | Default | Notes |
|---|---|---|
| Send rate | 100 messages/account/day | Soft limit, raisable on paid plans |
| Storage | 1 GB per account | Configurable via Policies API |
| Retention | 7 days | Configurable via Policies API |
All three can be raised. The Nylas pricing page doesn’t list what raising them costs. The 100/day ceiling is the one most likely to surface first. A free Gmail account sends 500/day; a Google Workspace account sends 2,000/day. A moderately active outbound agent — personalized follow-ups, support triage, vendor coordination — hits 100 quickly. The 7-day retention default means messages expire unless a Policy extends the window. An agent using email as conversation memory — tracking a negotiation, correlating a follow-up to a thread two weeks old — has to configure retention explicitly before anything starts expiring.
Side by side
| Feature | Nylas Connected | Nylas Agent Acc. | OpenMail |
|---|---|---|---|
| Provision a new mailbox | Not supported (requires human OAuth) | Native | Native (one API call) |
| Send outbound | Native (via provider) | Native (Nylas-hosted) | Native |
| Receive inbound | Webhook | Webhook | Webhook + WebSocket |
| Thread reply | Built in (reply_to_message_id) | Built in (reply_to_message_id) | Built in (threadId) |
| Message storage | Provider's retention | 7 days default | No default expiry |
| Daily send limit | Provider's limit | 100/account default | No cap (Developer+) |
| Calendar | Provider's calendar | Primary calendar included | — |
| Attachment parsing to text | Manual | Manual | Automatic |
| Custom domain | N/A | MX + TXT records required | Included (Developer+) |
The WebSocket row matters most for real-time agents. Nylas Agent Accounts support inbound via webhooks or polling GET /messages. OpenMail adds WebSocket: the agent connects once, receives events as they arrive, and needs no public URL.
What the code looks like
The provisioning difference is visible: OpenMail is one POST /inboxes call. Nylas requires a domain registered with Nylas first — a *.nylas.email trial subdomain works without DNS setup; a custom domain needs MX and TXT records verified.
const API_KEY = process.env.OPENMAIL_API_KEY; // om_*
const BASE = "https://api.openmail.sh/v1";
// Provision
const inbox = await fetch(`${BASE}/inboxes`, {
method: "POST",
headers: { Authorization: `Bearer ${API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ mailboxName: "sales-agent" }),
}).then((r) => r.json());
// inbox.address → "sales-agent@openmail.sh" (or your custom domain)
// Send
await fetch(`${BASE}/inboxes/${inbox.id}/send`, {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
to: "lead@example.com",
subject: "Quick question",
body: "Hi Alex, saw your post on email infra...",
}),
});
// Receive — no public URL needed
const WebSocket = require("ws");
const ws = new WebSocket("wss://api.openmail.sh/v1/ws", {
headers: { Authorization: `Bearer ${API_KEY}` },
});
ws.on("open", () => ws.send(JSON.stringify({ type: "subscribe" })));
ws.on("message", (data) => {
const { event, thread_id, inbox_id, message } = JSON.parse(data);
if (event === "message.received") {
replyInThread(thread_id, inbox_id, message);
}
});
async function replyInThread(threadId, inboxId, message) {
await fetch(`${BASE}/inboxes/${inboxId}/send`, {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
to: message.from,
subject: `Re: ${message.subject}`,
body: "Thanks for getting back...",
threadId,
}),
});
}const NYLAS_API_KEY = process.env.NYLAS_API_KEY;
// Grant provisioned via CLI (nylas agent account create) or
// POST /v3/connect/custom with "provider": "nylas" on a registered domain
const GRANT_ID = "agent_grant_id";
// Send
await fetch(`https://api.us.nylas.com/v3/grants/${GRANT_ID}/messages/send`, {
method: "POST",
headers: { Authorization: `Bearer ${NYLAS_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
subject: "Quick question",
body: "Hi Alex, saw your post on email infra...",
to: [{ email: "lead@example.com", name: "Alex" }],
}),
});
// Register webhook (public URL required)
await fetch("https://api.us.nylas.com/v3/webhooks", {
method: "POST",
headers: { Authorization: `Bearer ${NYLAS_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
trigger_types: ["message.created"],
callback_url: "https://your-agent.example.com/webhooks/nylas",
}),
});
// Reply when webhook fires
function onInbound(payload) {
const inboundMessageId = payload.data.object.id;
fetch(`https://api.us.nylas.com/v3/grants/${GRANT_ID}/messages/send`, {
method: "POST",
headers: { Authorization: `Bearer ${NYLAS_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
reply_to_message_id: inboundMessageId,
subject: "Re: Quick question",
body: "Thanks for getting back...",
to: [{ email: "lead@example.com", name: "Alex" }],
}),
});
}Pricing
Nylas Full Platform: $15/month base for 5 accounts, $2/account/month after that. Calendar-only: $10/month for 5 accounts, $1.50/account/month. Enterprise: custom. The cost of raising default limits — send rate, retention, storage — is not listed publicly. At 50 agent-owned inboxes: $15 + (45 × $2) = $105/month before any Policy costs.
OpenMail: Free at €0 for 3 inboxes and 3,000 emails/month on @openmail.sh addresses. Developer at €9/month for 10 inboxes, 10,000 emails, 20 GB storage, and 10 custom domains. Launch at €49/month for 200 inboxes, 150,000 emails, and 150 custom domains. All limits documented. Full API access, webhooks, and WebSocket on every plan.
What this comes down to
Nylas Connected Accounts is the right product when the agent acts on a user’s existing inbox. Multi-provider OAuth abstraction in one API — that’s what it was built for and it does it well.
Nylas Agent Accounts bundles email and calendar under one grant — convenient if the team is already in the Nylas ecosystem. It’s in beta, the defaults require Policy configuration for production use, and the cost of those extensions isn’t public.
OpenMail is a Nylas alternative for teams where the agent needs its own address, the email defaults should work without configuration, and pricing at scale should be readable before signing up. It’s email-only by design.
If the agent also needs calendar, the composable path is OpenMail for email alongside a separate calendar identity provisioned for the agent: a Google Workspace service account, a Microsoft application account, or the Nylas Calendar-only plan ($10/month). More moving parts, but each component works at its intended defaults — no 100/day send ceiling on the email side, no 7-day retention window. For agents doing high-volume outreach or long-running conversations, that tradeoff is usually worth it.



