Skip to content

Transactional email API.

The reliable way to reach inboxes instead of spam folders. Send transactional and marketing email with a message log you can read, Resend-compatible requests, and guardrails strict enough that an AI agent can hold a key: a budget on every key, a kill switch, refusals that name the fix.

Open console →
or continue with
  • Free plan, no card
  • 5,000 emails a month
  • no expiry
  • test sends never count
Emails list with the bounced invoice open in the peek: sender, recipient, the key that sent it, and events that end with the receiving server’s answer — 550 5.1.1 user unknown.
Example data

Every send, every status. The bounced invoice carries its reason.

Audience, Broadcasts and Automations are in the console too: contacts, segments and topics, broadcasts, automations.

Open the live demo →

For agent builders

Run it from Claude Code, Cursor, or any MCP client. Budgets are on before the first send.

Agents →

For product teams

Node, Python, REST. Every email's story in the console, every filter in the API.

Quickstart →

For platforms

Per-key budgets and a kill switch per sender; the trust ladder pauses a sender that hurts shared reputation.

Enforcement →

Every email, and why

Twelve statuses, each filterable, each row opening the delivery reason and the raw MIME behind it.

Emails list with the bounced invoice open in the peek: sender, recipient, the key that sent it, and events that end with the receiving server’s answer — 550 5.1.1 user unknown.
Example data

A budget per sender

Each key gets a budget (monthly by default, or hourly or daily) and a per-minute ceiling. One button pauses every key at once.

The Agents fleet: one row per sending key with its budget meter, rate ceiling, loop state and kill switch. invoice-bot is paused at 200 of 200 messages for the day.
Example data

Your bot asked to send one email too many.

A bot stuck in a loop can send ten thousand emails before anyone notices. Here is one that tried.

  1. 9:14aminvoice-bot sends its 200th email this month

    Receipts, password resets, invoices — all fine, all delivered.

  2. 9:14amIt asks to send one more

    You had capped it at 200 this month. This is number 201.

  3. 9:14amWe stop it. The email never leaves

    No partial send, no queue to clean up. Nothing reached anyone.

  4. 9:14amThe bot is told to stop and wait. You get an email

    Your other two bots keep sending. invoice-bot has hit its ceiling.

Your console, right now

9:14am
Emails invoice-bot sent this month200 / 200

Limit reached. The next send is refused.

invoice-botAt its ceiling
signup-flowSending
receiptsSending

One click. Every bot stops sending until you say otherwise.

Warned before enforced

A warning names the domain, the measured rate and the threshold it crossed, before anything is paused.

Deliverability for acme.dev: a 4.6% bounce rate against the published 4% limit, the 7-day trend, and the bounce classes behind it, starting with hard bounces and their fix.
Example data

DNS you can copy

Every record with a copy button and the state of the last check, so a failed verification says which record is wrong.

The Domains screen with acme.dev open: every DNS record to copy, the state of each one after checking, and what to do about the one that failed.
Example data

Failed deliveries, replayable

Each attempt logged with the response your endpoint returned, and a dead letter you can replay once it is healthy.

The Webhooks screen with a dead-lettered event open: the fix — repair the endpoint, then replay the stored payload — and the first two of its ten delivery attempts, 5 seconds apart, each with the payload sent and the endpoint’s HTTP 500.
Example data

When an email doesn’t arrive, we tell you why.

Sending is easy. Landing in the inbox instead of the spam folder is the hard part. We recompute yours on every visit and recheck your DNS every 6 hours.

How yourapp.com is doing

Needs a look
Emails that never arrivedthis week2.1%
People who marked you as spamthis week0.02%
On a published blocklist?not checked automatically—
Landing in the inbox, not spam91% → 84%
we step in at 80%two weeks agotoday

One that didn’t arrive

Gone for good
m---iriam@old-corp.example

This mailbox doesn’t exist any more — the person has probably left the company.

their mail server said: 550 5.1.1 user unknown

What we already did. Stopped sending to this address, so you never hit it again. 36 other addresses at old-corp.example look the same — worth cleaning that list before your next send. One click does it.

“Sent” and “read” are not the same thing. We show you the gap.

Some things should wait for a human.

Repeats the loop guard catches, and any send an agent asks about first, wait in a queue until someone answers.

Waiting on you

2 pending
4th near-identical send to one address this hour
loop guard · held for a person
Waiting for you
A send an agent asked about first
request_approval · held before it was sent
Waiting for you

If something goes wrong

Every step is published and emailed, with the numbers.

  1. 1A webhook event fires at 80% of a key budget and at 80% of the plan inclusion.
  2. 2If it keeps going, we pause it — and tell you exactly why.
  3. 3Nothing starts again on its own. You decide.

Every pause names its reason and how to appeal it. That policy is published, and we hold ourselves to it.

Why not just Resend?

The same email API, with brakes.

Everything you expect from an email API. Plus the limits, the approval queue, and a stop button for every key at once.

What mattersAgentiSendResend
A spending limit per botEvery key carries a cap and a speed limit, enforced as the email goes outKeys grant access, not limits — nothing caps what one can spend
Stop everything at onceOne click pauses every key on the accountDelete keys one at a time
A retry never sends twiceWorks on every action that changes something, remembered for 7 daysOnly on the send call
One bad address never kills the batch499 go out, 1 comes back with the reason it did notStrict by default; per-item errors only if you opt in
Search what you have sentBy status, sender, recipient, domain, which bot, and dateA list of recent sends, without those filters
Errors that say how to fix themEvery refusal names the exact call that repairs itA code and a message
What mattersAgentiSendAgentMail
What it is forSending email, with brakes your bots cannot removeGiving agents an inbox, so they can read and reply
Keeping you out of spamBounce and complaint rates per domain over a rolling 7 days, and the fix to runNot what they set out to build
How you payA Free plan with no card and no expiry (5,000 emails a month), then from $9 a month; sending pauses at the inclusion unless an owner turns overage on. The table is on /pricingPer inbox
What mattersAgentiSendsending it yourself
Getting the first email outThree lines of code; we write the DNS records for youWire up permissions, config sets and tenants yourself first
Somewhere to look when it breaksMessages, what happened to them, and your health — one screenSeparate consoles for mail, logs and DNS
When an address bouncesSorted, added to the do-not-send list, and explainedA raw notification you have to decode yourself
Who actually delivers itOur own mail transfer nodes, on IPs we warm, in the US today. EU sending is on the roadmap.Whoever you wired up

The sourced rows, with the page each figure came from, are on the full compare page:/vs/resend

Developer experience

First email in under a minute

import { AgentiSend } from "agentisend";

const as = new AgentiSend(process.env.AGENTISEND_API_KEY);
const userId = "usr_42"; // the account you are welcoming

const r = await as.emails.send({
  from: "hello@yourapp.com",
  to: "user@example.com",
  subject: "Welcome",
  html: "<p>You are in.</p>",
}, { idempotencyKey: "welcome-email/" + userId });

console.log(r.id); // -> GET /emails/:id for the event log

The Node sample and the Python sample are run by the test suite against a local AgentiSend server. The curl sample sends the same request, and the suite posts that body too.

For agents: one line

claude mcp add agentisend \
  --env AGENTISEND_API_KEY=as_… \
  -- npx @agentisend/mcp-server

MCP + Skills surfaces built in; the agent gets the same error contract you do, including the fix field.

Machine-readable docs

llms.txt and an OpenAPI spec generated from the same schemas that validate requests, so they cannot drift.

Per-page .md twins ship. Asking the HTML URL for Markdown waits on the edge config.

Pricing

Every tier, every limit, on the page.

Every price and every limit is on this page — there is no “contact us to find out what it costs”. Paid plans start at $9 a month. Pro and Scale sell larger volumes on the same plan, each cheaper per 1,000 than the one below, and the same table is published at /pricing.json.

Billing term

Free

$0$0per month
No card, no expiry
5,000 emails a month
  • Up to 170 a day
  • Up to 3 sending domains
  • 1 seat (the owner)
  • History kept 7 days
  • Sending pauses at 5,000. No extra charge.
  • Unlimited keys with budgets
  • Webhooks with replay
  • Approval queues
  • Deliverability panel: bounce and complaint rates per domain

Starter

$9$5.40per month
Billed monthly$64.80 billed yearly · 40% off
30,000 emails a month
  • No plan daily cap; delivery paced per inbox provider
  • Up to 3 sending domains
  • 3 seats, owner/admin/viewer, never billed per seat
  • History kept 30 days
  • Past 30,000: pauses, or $0.75 per 1,000 extra if you turn overage on
  • Everything in Free
Our lowest price for 50k a month

Pro

$16$9.60per month
Billed monthly$115.20 billed yearly · 40% off
50,000 emails a month
Pro: emails a month
  • No plan daily cap; delivery paced per inbox provider
  • Up to 10 sending domains
  • 10 seats, owner/admin/viewer, never billed per seat
  • History kept 90 days
  • Past 50,000: pauses, or $0.72 per 1,000 extra if you turn overage on
  • Everything in Starter

Scale

$72$43.20per month
Billed monthly$518.40 billed yearly · 40% off
100,000 emails a month
Scale: emails a month
  • No plan daily cap; delivery paced per inbox provider
  • Up to 1,000 sending domains
  • 100 seats, owner/admin/viewer, never billed per seat
  • History kept 180 days
  • Past 100,000: pauses, or $0.60 per 1,000 extra if you turn overage on
  • Everything in Pro
  • Dedicated IP on request
  • Support first reply within 4 business hours

Lifetime plans

Lifetime 250k

$49once
Paid once · nothing renews
250,000 emails, never expire
  • Up to 25,000 a month: 10 months at the maximum
  • Up to 3 sending domains
  • 3 seats, owner/admin/viewer, never billed per seat
  • History kept 30 days
  • Past 25,000 a month: pauses until the period resets. No overage.
  • Starter’s domains, seats and history

Lifetime 600k

$99once
Paid once · nothing renews
600,000 emails, never expire
  • Up to 50,000 a month: 12 months at the maximum
  • Up to 10 sending domains
  • 10 seats, owner/admin/viewer, never billed per seat
  • History kept 90 days
  • Past 50,000 a month: pauses until the period resets. No overage.
  • Pro’s domains, seats and history

Lifetime 1.5M

$199once
Paid once · nothing renews
1,500,000 emails, never expire
  • Up to 100,000 a month: 15 months at the maximum
  • Up to 10 sending domains
  • 10 seats, owner/admin/viewer, never billed per seat
  • History kept 90 days
  • Past 100,000 a month: pauses until the period resets. No overage.
  • Pro’s domains, seats and history

Lifetime 3M

$349once
Paid once · nothing renews
3,000,000 emails, never expire
  • Up to 100,000 a month: 30 months at the maximum
  • Up to 10 sending domains
  • 10 seats, owner/admin/viewer, never billed per seat
  • History kept 90 days
  • Past 100,000 a month: pauses until the period resets. No overage.
  • Pro’s domains, seats and history

One payment for emails that never expire, sent at up to a monthly maximum. When the emails are used up, sending stops until you buy a monthly or yearly plan. A larger lifetime plan costs the difference. Refunded in full if you ask before any email is sent on the plan. Once one is sent, it is not refundable.

About Free. Every new account is on Free, with no card and no expiry: 5,000 emails a month, up to 170 a day, on 3 verified domains. Test sends never count toward it. Each To, CC and BCC recipient counts as one email. At either cap sending pauses until the day or the period resets; nothing is deleted. No plan daily cap; delivery paced per inbox provider. We keep a history of what you sent for 7 days on Free, 30 days on Starter, 90 days on Pro, 180 days on Scale. We do not currently sell a longer add-on. On a paid plan, sending pauses at the inclusion unless an owner turns overage on, up to a ceiling they set.

Compare every plan and limit →

FAQ

Questions people ask before they switch

AgentiSend is a transactional email API for applications and AI agents: verify a domain, create a key with a budget, send over REST or MCP, and read a log that says what happened to every message. Every key carries a send budget, a send the loop guard flags waits for a person, and one request pauses every sender. The docs are at https://agentisend.com/docs and the API contract at https://agentisend.com/openapi.json.

Every sender you set up has a sending limit and a speed limit. By default the limit counts per month and matches the emails your plan includes; you can lower it, or count it per hour or per day instead. We check it as each email goes out, so even a bot firing thousands of requests at once cannot slip past the number you set. When it hits the limit, sending stops and the bot is told exactly how to ask for more. A send the loop guard flags, or one an agent asks about first with request_approval, waits for a person. Approval rules you define yourself are not available yet. The same checks, written as the checklist people usually build themselves, are at https://agentisend.com/agent-email-guardrails.

No. Every automatic step is published: we warn you at 2% bounces / 0.05% complaints and pause at 4% / 0.08%, each by email with the numbers. If the rate keeps climbing, the pause can come soon after the warning. A paused account starts sending again after you appeal and a person reviews it. Abuse of the acceptable-use policy is stopped first and explained right after.

No. AgentiSend is for email people are expecting from you — receipts, alerts, resets, invoices. Sending to strangers who never asked breaks our rules and gets accounts paused, and we deliberately do not build the features that would make it easier.

Sending stops cleanly. Nothing goes out half-finished — each email is either accepted or refused, never something in between. The refusal tells your software how many it has sent, what the limit was, and how to carry on once the limit resets or you raise it.

One at a time. If you send to 500 people and one address is malformed, the other 499 go out and that one comes back with the reason. You never lose a whole batch to a single bad address.

You pick the part of the world your email is handled in, per domain, when you set it up — we never quietly choose for you.

Free keeps 7 days, Starter 30, Pro 90, Scale 180. Searchable from your account. Export before the window ends. We do not currently sell a longer add-on.

There is a written guide, not a wizard: it covers re-checking your domains, bringing across do-not-send lists, and where our API matches theirs. Most apps need only small changes. Where we are stricter, we warn rather than break. Plan for an afternoon, not a project. The guide is at /docs/guides/migrating-from-resend.

In the United States. Each sending domain records a region, US or EU; today mail for both is sent from our US nodes, and EU domains move to EU sending automatically when it ships. Account data and message history live with the product in one place; they are not copied to a second site for failover.

Yes — a public status page, with uptime figures measured once a minute by the same probe that writes the status history. Written uptime guarantees and service credits come with the Scale plan.

Yes. Every account starts on the Free plan: 5,000 emails a month, up to 170 a day, on 3 verified domains, with no card and no expiry. Paid plans start at $9 a month and have no daily cap. Every tier is at https://agentisend.com/pricing.

Yes. It is at https://api.agentisend.com/mcp over streamable HTTP, with a bearer key or OAuth 2.1, and it exposes the same operations as the REST API under the same limits and the same budget. One-line install for Claude Code, Cursor, Codex, Gemini CLI, VS Code, Windsurf and OpenCode is at https://agentisend.com/docs/guides/mcp.

Any language that can make an HTTPS request; there is a Node SDK on npm, and the quickstart shows Node, Python and curl. Guides with code that is run by the test suite against a local AgentiSend server exist for Next.js, Supabase, Better Auth, Auth.js, Hono, Express and SvelteKit, starting at https://agentisend.com/docs/guides/quickstart.

Resend is the better-known API, with React Email and a tier that costs nothing. AgentiSend adds the control plane an autonomous sender needs: a budget on every key, an approval queue, an account-wide kill switch, idempotency on every mutating endpoint, per-item batch results and an enforcement ladder published with its numbers. The sourced comparison is at https://agentisend.com/vs/resend.

Yes, to people who asked for them: broadcasts to a segment, topics each contact can opt out of, and one-click unsubscribe headers are part of the API. Cold outreach is not, and the product refuses sends that look like it.

One request. POST /limits/kill-all pauses every key on the account, every send then answers kill_switch_active, and POST /limits/resume-all turns sending back on; both write an audit row. To stop one key, POST /limits/keys/{id}/kill.

A code, a message, a fix naming the call that repairs it, and a docs_url, on every refusal. An agent that spends its budget reads agent_budget_exceeded with the period and the endpoint that raises the ceiling, and the key that asked cannot raise its own.

Nothing goes out twice. Every mutating endpoint accepts an Idempotency-Key header and remembers it, so a retry after a timeout replays the first result instead of mailing the same person again. Derive the key from the thing being done, never from the moment.

Let them send. Keep the brakes.

Connect a domain, give each sender a limit, and see on one screen where every email landed. If it turns out not to fit, you have sent nothing you cannot account for.

Open console →
  • Free plan: 5,000 emails a month, no card, no expiry
  • No card required
  • Test sends never count