Compare
AgentiSend and Resend
Pick Resend if React Email is how your team writes mail and the first ten minutes matter more than the four-hundredth day; pick us if an agent holds the API key, because the budget, the approval queue, the kill switch and a published enforcement ladder with a 24-hour appeal are the product here rather than a roadmap item. The figures below are from Resend’s published OpenAPI (1.5.0, captured 14 August 2026, re-checked against 1.5.1 on 18 September 2026), their pricing page, their legal index and their own status page. Ours are from this product’s OpenAPI, error catalogue, send path, pricing document and enforcement policy. Rows we cannot source on both sides are not on this page.
Moving across? How a migration from Resend actually goes.
| What matters | AgentiSend | Resend |
|---|---|---|
| A spending limit per key | Every key is created with a send budget. The send path refuses with agent_budget_exceeded when it is spent. The account plan inclusion is a second ceiling (plan_limit_reached). | API keys carry a permission (full or sending). No per-key send budget is in the published API. |
| Stop every sender at once | POST /limits/kill-all pauses every key. Sends then return kill_switch_active. POST /limits/resume-all turns it off. Both write an audit row. | No account-wide pause in the published API. Keys are deleted one at a time. |
| A retry never sends twice | Idempotency-Key is accepted on every mutating endpoint and remembered for 7 days. | Idempotency-Key is supported on POST /emails and POST /emails/batch only, remembered for 24 hours. |
| One bad address in a batch | POST /emails/batch accepts or refuses each item on its own. One malformed address does not lose the rest. | One invalid address fails the whole batch. No per-item error array. |
| What a refusal tells you | Every refused request carries code, message, fix (the call that repairs it) and docs_url. | A name and a message. No fix field. |
| Trying it before paying | A 14-day Pro trial, once per account, no card: up to 3,000 emails, with no separate daily cap. Then plans from $9 a month (Starter, 30,000 emails), or 55% off paid yearly. There is no free plan. | Their free plan does not expire: 3,000 emails a month and 100 a day. |
| Written uptime commitment | 99.9% monthly uptime on the Scale plan, measured on GET /status. Credits are Scale-only and applied after you write to support. | No SLA document in the public legal index. Their own status page reported 99.77% on Email Sending for July to August 2026, which is about 99 minutes a month. |
| What happens before an account is stopped | The ladder is published before anyone hits it: warn at 2% bounce or 0.05% complaints, pause at 4% or 0.08%, over a rolling 7 days and never below 100 delivered-or-bounced sends. A pause emails the owners the metric, the value, the line and the remediation list. | The acceptable-use policy states the same reputation lines and says an account "may be shutdown without warning". The terms reserve suspension "WITHOUT PRIOR NOTICE" at sole discretion. |
| Asking a human to look again | POST /trust/appeal files an appeal. The reason is recorded verbatim and a person answers within 24 hours; the deadline comes back on GET /trust/standing. | No appeal endpoint and no reinstatement document. Their knowledge-base page on account suspension returns 404. |
| How long the log keeps a message | 30 days on Starter, 90 on Pro and during the 14-day trial, 180 on Scale. It is part of the plan and there is no add-on to buy. | 30 days on every tier, free through Scale. |
| DKIM key length | 2048-bit RSA. The key is generated when the domain is added and the TXT record the console shows is that key. | 1024-bit. The DKIM record their domain screen publishes is a 1024-bit public key. |
| Changing a template without breaking last week | Templates are versioned. Publishing freezes a version, GET returns the list, and a rollback creates a new version pointing at the one it restored. A diff shows what moved between two. | A template carries a current_version_id, but no endpoint lists versions, diffs them or rolls one back. Only published templates can be sent. |
| What a dedicated IP does in its first month | The ramp is published as numbers: 20% of volume to day 7, 40% to day 14, 60% to day 21, 80% to day 28, then all of it. GET /dedicated-ips/ramp returns that curve and GET /dedicated-ips returns where yours is on it today. | Dedicated IPs are offered on Scale. No warmup curve is published, so there is no figure to check the ramp against. |
| Knowing how close you are to a rate limit | ratelimit-limit, ratelimit-remaining and ratelimit-reset on every response, plus x-request-id. | 10 requests a second for the whole team, shared across keys. No rate-limit headers and no error responses are declared in the spec, and their SDK issues ask for the headers to be surfaced. |
| A webhook endpoint that was down for an hour | POST /webhooks/{id}/replay re-sends a range you name by time, event type or event id. Deliveries that ran out of retries are listed as dead_lettered rather than dropped. | A headless webhook API added in September 2026 lists attempts and replays a delivery. No dead-letter queue is documented, so a delivery that exhausts its retries has no list of its own. |
| Finding out who is sending as you | GET /deliverability/dmarc returns aligned and failing volume per day for each of your domains, and every address sending as you, with the ones that are not ours listed first. | Deliverability Insights checks a message for link-domain match, a DMARC record, a plain-text part and body size. It does not report per-day authentication volume or the addresses sending as you. |
Sources
- A spending limit per key. Ours: POST /limits/keys, PATCH /limits/keys/{id}, error catalogue. Resend: OpenAPI 1.5.0 API Keys (captured 14 Aug 2026).
- Stop every sender at once. Ours: POST /limits/kill-all and POST /limits/resume-all in the published OpenAPI. Resend OpenAPI 1.5.0 has neither (captured 14 Aug 2026).
- A retry never sends twice. Ours: every mutating route in the published OpenAPI. Resend OpenAPI 1.5.1, Idempotency section (re-checked 18 Sep 2026; unchanged at 2 endpoints).
- One bad address in a batch. Ours: POST /emails/batch. Resend OpenAPI 1.5.0 batch send (captured 14 Aug 2026).
- What a refusal tells you. Ours: error catalogue at /docs/errors. Resend OpenAPI 1.5.0 error list (captured 14 Aug 2026).
- Trying it before paying. Ours: /pricing.json trial, tiers and terms_on_sale (18 Sep 2026). Resend published free-plan quotas, resend.com/pricing (captured 14 Aug 2026).
- Written uptime commitment. Ours: /status and /sla.json (Scale plan). Resend legal index at resend.com/legal and statuspage.incident.io/resend (both captured 14 Aug 2026).
- What happens before an account is stopped. Ours: /policy/enforcement and GET /trust/thresholds. Resend: resend.com/legal/acceptable-use and terms of service §22 (both captured 14 Aug 2026).
- Asking a human to look again. Ours: POST /trust/appeal and GET /trust/standing in the published OpenAPI. Resend: resend.com/docs/knowledge-base/why-was-my-account-suspended returned 404 on 14 Aug 2026.
- How long the log keeps a message. Ours: /pricing.json retention_days per tier. Resend pricing page, resend.com/pricing (captured 14 Aug 2026). The 1-day and 3-day retention figures repeated elsewhere online are wrong.
- DKIM key length. Ours: the DKIM record on GET /domains/{id}, generated at 2048 bits. Resend: the DKIM row of their own domain DNS screen (captured 14 Aug 2026).
- Changing a template without breaking last week. Ours: the template version endpoints in the published OpenAPI and /docs/guides/templates. Resend OpenAPI 1.5.0 Templates section (captured 14 Aug 2026).
- What a dedicated IP does in its first month. Ours: GET /dedicated-ips/ramp in the published OpenAPI. Resend pricing and dedicated-IP docs, resend.com/docs (captured 14 Aug 2026).
- Knowing how close you are to a rate limit. Ours: the response headers on any call to api.agentisend.com. Resend OpenAPI 1.5.1 declares neither (re-checked 18 Sep 2026); resend.com/docs/api-reference/rate-limit (captured 14 Aug 2026).
- A webhook endpoint that was down for an hour. Ours: POST /webhooks/{id}/replay and the delivery list in the published OpenAPI. Resend changelog and OpenAPI 1.5.1 Headless Webhook API (re-checked 18 Sep 2026).
- Finding out who is sending as you. Ours: GET /deliverability/dmarc in the published OpenAPI and /docs/guides/deliverability. Resend Deliverability Insights docs, resend.com/docs (captured 14 Aug 2026).