Transactional email API.
The reliable way to reach inboxes instead of spam folders. Send transactional and marketing email at scale, with a message log you can read and refusals that name the fix. Built so an agent can send on your behalf without ever exceeding a budget.
- Free plan, no card
- 1,000 emails a month
- no card required
- test sends never count





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.
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 →Every email, and why
Twelve statuses, each filterable, each row opening the delivery reason and the raw MIME behind it.

A budget per sender
Each key gets a daily ceiling and a rate limit; one button pauses every key at once, with no redeploy.

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.
- 9:14aminvoice-bot sends its 200th email today
Receipts, password resets, invoices — all fine, all delivered.
- 9:14amIt asks to send one more
You had capped it at 200 a day. This is number 201.
- 9:14amWe stop it. The email never leaves
No partial send, no queue to clean up. Nothing reached anyone.
- 9:14amThe bot is told how to fix it. You get an email
Your other two bots keep sending. Only invoice-bot is paused.
Your console, right now
9:14amLimit reached — sending paused.
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, days before anything is throttled.

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.

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

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 check yours every day and tell you what to fix.
How yourapp.com is doing
Needs a lookOne that didn’t arrive
Gone for goodThis mailbox doesn’t exist any more — the person has probably left the company.
their mail server said: 550 5.1.1 user unknown
“Sent” and “read” are not the same thing. We show you the gap.
Some things should wait for a human.
Bulk sends, domain changes, clearing a do-not-send list. You choose which actions a bot may never take alone. Those wait in a queue until someone answers.
Waiting on you
1 pendingIf something goes wrong
We never cut you off without warning. It goes in this order, every time:
- 1A webhook event fires at 80% of a key budget and at 80% of the plan inclusion.
- 2If delivery starts going wrong, we slow the bot down.
- 3If it keeps going, we pause it — and tell you exactly why.
- 4Nothing 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 the stop button that no one else ships.
| What matters | AgentiSend | Resend |
|---|---|---|
| A spending limit per bot | Every key carries a cap and a speed limit, enforced as the email goes out | Keys grant access, not limits — nothing caps what one can spend |
| Stop everything at once | One click pauses every key on the account | Delete keys one at a time |
| A retry never sends twice | Works on every action that changes something, remembered for 7 days | Only on the send call |
| One bad address never kills the batch | 499 go out, 1 comes back with the reason it did not | The whole batch is rejected |
| Search what you have sent | By status, sender, recipient, domain, which bot, and date | A list of recent sends, without those filters |
| Errors that say how to fix them | Every refusal names the exact call that repairs it | A code and a message |
Rows summarize documented behavior as of Aug 2026; full compare page with sources:/vs/resend
Developer experience
First email in under a minute
import { AgentiSend } from "agentisend";
const as = new AgentiSend(process.env.AGENTISEND_API_KEY);
const r = await as.emails.send({
from: "hello@yourapp.com",
to: "user@example.com",
subject: "Welcome",
html: "<p>You're in.</p>",
}, { idempotencyKey: "welcome-v1" });
console.log(r.id); // -> GET /emails/:id for the event logThe Node sample runs in CI against the real API with the fake transport. The Python and curl samples are the same request, and CI posts those bodies too.
For agents: one line
claude mcp add agentisend \
--env AGENTISEND_API_KEY=as_… \
-- npx @agentisend/mcp-serverMCP + 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”. Sending pauses at the inclusion. Pro and Scale sell larger volumes on the same plan, each cheaper per 1,000 than the one below. Roughly 35–40% below Resend at each level, and the same table is published at /pricing.json.
Free
- Up to 100 a day
- Up to 1 sending domains
- 1 seats, owner/admin/viewer, never billed per seat
- History kept 7 days
- Sending pauses at 1,000. No extra charge.
- Unlimited keys with budgets
- Webhooks + replay/DLQ
- Approval queues
- No card, no expiry
Starter
- No daily limit — send them when you need to
- Up to 3 sending domains
- 3 seats, owner/admin/viewer, never billed per seat
- History kept 30 days
- Sending pauses at 30,000. No extra charge.
- Everything in Free
- No daily cap
- 3 sending domains, 3 seats
Pro
- No daily limit — send them when you need to
- Up to 10 sending domains
- 10 seats, owner/admin/viewer, never billed per seat
- History kept 90 days
- Sending pauses at 100,000. No extra charge.
- 250,000 a month for $45250,000 a month for $36 a month, billed yearly
- 500,000 a month for $79500,000 a month for $63.20 a month, billed yearly
- 1,000,000 a month for $1391,000,000 a month for $111.20 a month, billed yearly
- Everything in Starter
- Deliverability panel: bounce and complaint rates per domain
Scale
- No daily limit — send them when you need to
- Up to 1,000 sending domains
- 100 seats, owner/admin/viewer, never billed per seat
- History kept 180 days
- Sending pauses at 100,000. No extra charge.
- 250,000 a month for $95250,000 a month for $76 a month, billed yearly
- 500,000 a month for $149500,000 a month for $119.20 a month, billed yearly
- 1,000,000 a month for $2491,000,000 a month for $199.20 a month, billed yearly
- 2,500,000 a month for $5752,500,000 a month for $460 a month, billed yearly
- Everything in Pro
- Dedicated IP eligible (~$30/mo, warmup bundled)
- Slack support
FAQ
Questions people ask before they switch
AgentiSend is a transactional email API for AI agents and the products they run inside: 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 that matches a policy 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.
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.
- Free plan: 1,000 emails a month, no card, no expiry
- No card required
- Test sends never count