Can an AI agent use Resend?
As of 6 Oct 2026, an AI agent can't use Resend on its own: Sign-up fails with a generic error, no reason given.
- Find: Docs for agents: llms.txt, an OpenAPI and an MCP server.
- Access: Can't sign up.
- Use: Work not reached.
- Pay: Payment not reached.
- Leave: Leaving not reached.
To reach L2 · Gets in: let an agent sign up on its own.
With an account set up by a person: not measured yet.
What the levels meanDriven 6 Oct 2026Same level in 4 drives in a rowRules of 15 Oct 2026Claim this page
Written and checked by our agents from this drive's record. How we write.
Who gets in
- Agents on a serverTurned away when they send the sign-up form.
- Signed agentsThe sign-up page opens. The check on the form still applies.
- Agents in a person's browserNot measured yet.
Sign-up page checked 12 Oct 2026. Signed agents: the ones Cloudflare verifies. Where agents come from
What an agent can do in Resend.
On its own
- Read all the documentation, including machine-readable versions
- Find the service's technical entry points (API spec, chat-assistant server, command-line tool)
What it can't, and why
- Create an accountThe sign-up page gave a vague error with no explanation each time it tried
- Send any email, manage contacts, or anything else the service offersNo account means no access key to do any of it
- Cancel a plan or delete an account on its ownThose actions only exist in the website's dashboard
Can an AI agent sign up for Resend on its own?
No. Sign-up: blocked. No headless route (auth.md: 'Resend does not support agentic registration today'). The browser form was submitted twice and both times gave the generic server error 'Something went wrong while processing your request. Please try again later.' No visible challenge; the page loads hCaptcha (passive, via a Stripe Radar session) and Fingerprint visitor data, which the sign-up action sends along.
Does Resend have an MCP server, and can an agent connect to it?
Yes. Resend has an official MCP server.
A new agent can't get in on its own: in the drive of 6 Oct 2026, our agent stopped at sign up (it was blocked). Through the MCP server, 0 of our agent's 1 attempt worked.
What the drive found
APIOpenAPIMCP · officialCLISDKllms.txtWebhooks–SandboxNot reached in this drive: the API key, deleting the account and paying. Every checkpoint, in detail
For the team behind Resend.
Where agents stop in Resend today, and the fixes that get them further, highest impact first.
The fixes, highest impact first
- Let verified agents create an accountStep-by-step guide
- Return a specific sign-up rejection error
- Add device-flow login to the CLIStep-by-step guide
2 more fixes
- Align MCP server card and PRM Step-by-step guide
- Add team delete and cancel to API
- Claim it free and reply next to the result.
- A Drive, $49: your private report, with where agents stop, the evidence and the fixes that move your level.
- Fixed something? Order a Drive ($49) any time, or the Monthly drive ($29/month).
Details
Your API, MCP server or CLI is the product? An Audit ($299) also checks every documented route, MCP tool and CLI command against your docs. Compare plans.
Already claimed it? Open it in your dashboard.
Rather not be driven? Block AgentDrivesAgent in robots.txt or write to us. We stop driving it ourselves; this page stays, with its date.
Embed the badge on your site
Behind the level.
Our agent couldn't get into Resend, so the work, its reliability and the crash test aren't measured. The part scores are what it could judge from the outside.
Part scores · level history
Part scores
Agent-ready setup
- llms.txt: found
- OpenAPI: found
- MCP server: found
- CLI: found
Not measured in this drive: Holds up, Docs match (part of an Audit).
Level history
- 1 Oct 20263 drivesL1Needs a person
- 6 Oct 2026L1Needs a person
For agents and builders.
The drive as data, every checkpoint and all 57 attempts.
How an agent connects · 4 tips
/api/tools/resend.json/tools/resend.mdMCP get_tool {"slug":"resend"}
- Ask a human for RESEND_API_KEY; there is no agent sign-up (see https://resend.com/auth.md)
- Use the CLI with --json, or `resend commands` for the full command tree as JSON
- Append .md to any docs URL for markdown
- The remote MCP at mcp.resend.com/mcp needs OAuth (CIMD supported) or a key
Every checkpoint, in detail · 9 checkpoints
- DocsHeadlessllms.txt, docs/llms.txt, .md pages and Accept: text/markdown, OpenAPI 3.0.3, auth.md, agent-skills index
- Sign upBlockedNo headless route (auth.md: 'Resend does not support agentic registration today'). The browser form was submitted twice and both times gave the generic server error 'Something went wrong while processing your request. Please try again later.' No visible challenge; the page loads hCaptcha (passive, via a Stripe Radar session) and Fingerprint visitor data, which the sign-up action sends along.
- VerifyNot reachedNo verification mail; sign-up did not complete
- KeyNot reachedAPI keys come only from the dashboard; OAuth (code+PKCE, CIMD or DCR) needs a signed-in user
- First callNot reachedNo key; unauthenticated calls give a clear 401 missing_api_key
- First actionNot reachedNo credentials
- PayNot reachedFree plan: 3,000 emails/mo, 100/day. Upgrades happen on the dashboard Billing page with a card (docs). No 402, x402, MPP or UCP; not listed in the x402 Bazaar or mpp.dev. The page sits behind the sign-up that rejected us, so the grade comes from the docs only.
- CancelNot reachedNo plan started. Docs: Billing page > Cancel Subscription, web UI only
- DeleteNot reachedNo account was created. Docs: Team Settings > Delete Team, web UI only; no API or CLI route
The attempt log · 57 attempts
| Capability | Route | Result | Evidence |
|---|---|---|---|
| llms.txt: Fetch /llms.txt | api | done ✓ | https://resend.com/llms.txt 200: H1 Resend, links to CLI, MCP, skills, OpenAPI, docs/llms.txt, auth.md |
| robots/aipref: Fetch robots.txt | api | done ✓ | robots.txt: 'User-agent: * / Allow: /' and 'Content-Signal: ai-train=yes, search=yes, ai-input=yes' (Cloudflare Content-signal scheme, parses: lowercase terms, yes values). No aipref Content-Usage line or header. |
| markdown: Accept: text/markdown on docs page and .md URL | api | done ✓ | GET /docs/api-reference/emails/send-email with Accept: text/markdown -> 200 content-type text/markdown, vary: Accept; the .md URL -> 200 text/markdown |
| openapi: Fetch OpenAPI | api | done ✓ | https://resend.com/openapi.json declares openapi 3.0.3; 47 paths, 83 operations; no x-payment-info/x-service-info |
| mcp cards: Server card / AI catalog / A2A card | api | done ✓ | <mcp>/server-card 404; /.well-known/ai-catalog.json 404 (HTML); /.well-known/agent-card.json 404; /.well-known/agent.json 404; /.well-known/mcp/server-card.json 200 JSON (older draft location); /.well-known/mcp.json 200 JSON; /.well-known/agent-skills/index.json 200 JSON |
| mcp server/discover: POST server/discover 2026-07-28 to https://mcp.resend.com/mcp | mcp | partial ✓ | 401 www-authenticate: Bearer resource_metadata=https://mcp.resend.com/.well-known/oauth-protected-resource; body JSON-RPC -32000 Unauthorized. initialize unauthenticated: same 401. Retry with key later. |
| oauth metadata: PRM + AS metadata | api | done ✓ | api PRM 200 (scopes full_access, emails:send); mcp PRM at root 200 (resource https://mcp.resend.com), path-suffixed /mcp variant 404; AS metadata at resend.com/.well-known/oauth-authorization-server: client_id_metadata_document_supported true, registration_endpoint (DCR), S256, iss param supported; no device_authorization_endpoint; no agent_auth block |
| auth.md: GET /auth.md | api | done ✓ | 200 text/markdown: 'Resend does not support agentic registration today. Credentials are issued by the user out of band' |
| pay step probes: 402/x402/MPP/UCP probes | api | done ✓ | api.resend.com/emails unauth -> 401 missing_api_key (no 402); x402./mpp./agents.resend.com do not resolve; /.well-known/ucp 404; OpenAPI no x-payment-info; not in x402 Bazaar or mpp.dev/api/services; pricing.md: Free $0 3,000 emails/mo, 100/day; Pro $20/mo |
| docs: Find docs and API reference | api | done ✓ | llms.txt, docs/llms.txt (422 lines, .md pages), OpenAPI 3.0.3 JSON/YAML, auth.md, agent-skills index, CLI install.sh, MCP discovery JSON |
| sign up: Find a headless sign-up route | none | blocked ✓ | auth.md: 'Resend does not support agentic registration today.' AS metadata has no agent_auth block; no device flow; CLI `resend login` needs an existing key or opens a browser. Sign-up is web form only (email+password, Google, GitHub). |
| sign up: Create account in browser at https://resend.com/signup (the agent's inbox, generated password) | browser | blocked | Submitted form twice (first try + one retry). Both: server action POST https://resend.com/signup -> 200, toast 'Something went wrong while processing your request. Please try again later.' No visible challenge (visible_challenge false). Page loads hCaptcha, Stripe Radar session with passive hCaptcha (api.hcaptcha.com/getcaptcha, attach_hcaptcha_token) and Fingerprint visitor data (fp.resend.com) that the sign-up action sends as payload. No verification mail arrived (inbox checked at ~+1 and ~+5 min). |
| verify email: Read verification mail | none | blocked | No mail arrived at the agent's inbox; sign-up did not complete |
| api key: Get an API key | none | blocked | No account. Only credentials: API key from dashboard (auth.md) or OAuth authorization_code+PKCE (AS metadata: CIMD supported, DCR registration_endpoint) which needs a signed-in user to consent |
| first call: First authenticated API/MCP call | api | blocked | Without a key: api.resend.com/emails 401 {'message':'Missing API Key','name':'missing_api_key'}; bad key 401 {'message':'API key is invalid','name':'validation_error','statusCode':401} (application/json, not problem+json); MCP 401 with resource_metadata |
| first action: Create something | none | blocked | No credentials |
| pay step: Find an agent purchase route | none | done ✓ | No 402/x402/MPP/UCP; billing only on dashboard Billing page (docs/dashboard/settings/billing.md: upgrade/downgrade, card); free plan exists (pricing.md). Not reachable: no account. |
| cancel: Cancel plan | none | skipped | No plan started. Docs: cancel via Billing page three-dots menu > Cancel Subscription (web UI only) |
| delete: Delete account/team | none | skipped | No account was created. Docs (knowledge-base/how-can-i-delete-my-team.md): Team Settings > Delete Team in the web UI; no API/CLI route in OpenAPI or CLI command tree |
| Send a transactional email: Send a transactional email | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /emails", "mcp": "send-email", "cli": "resend emails send", "ui": "Dashboard > Emails"} |
| Send batch emails in one call: Send batch emails in one call | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /emails/batch", "mcp": null, "cli": "resend emails batch", "ui": null} |
| Schedule an email for later: Schedule an email for later | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /emails (scheduled_at)", "mcp": "send-email", "cli": "resend emails send --scheduled-at", "ui": "Dashboard > Emails"} |
| Update or cancel a scheduled email: Update or cancel a scheduled email | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "PATCH /emails/{id}; POST /emails/{id}/cancel", "mcp": null, "cli": "resend emails update <id>; resend emails cancel <id>", "ui": "Dashboard > Emails"} |
| Receive inbound emails to a domain: Receive inbound emails to a domain | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "GET /emails/receiving/{id}", "mcp": null, "cli": "resend emails receiving get <id>", "ui": "Dashboard > Receiving"} |
| Create and send a marketing broadcast: Create and send a marketing broadcast | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /broadcasts; POST /broadcasts/{id}/send", "mcp": "send-broadcast", "cli": "resend broadcasts create --send; resend broadcasts send <id>", "ui": "Dashboard > Broadcasts editor"} |
| Cancel a queued or scheduled broadcast: Cancel a queued or scheduled broadcast | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /broadcasts/{id}/cancel", "mcp": null, "cli": null, "ui": "Dashboard > Broadcasts"} |
| Build an automation workflow from custom events: Build an automation workflow from custom events | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /automations", "mcp": null, "cli": null, "ui": "Dashboard > Automations editor"} |
| Trigger an automation via a custom event: Trigger an automation via a custom event | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /events", "mcp": null, "cli": null, "ui": "Dashboard > Automations > Custom Events"} |
| Add and verify a sending domain: Add and verify a sending domain | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /domains; POST /domains/{id}/verify", "mcp": "create-domain", "cli": "resend domains create; resend domains verify <id>", "ui": "Dashboard > Domains"} |
| Create a reusable email template: Create a reusable email template | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /templates", "mcp": null, "cli": null, "ui": "Dashboard > Templates editor"} |
| Send an email using a template with variables: Send an email using a template with variables | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /emails (template, variables)", "mcp": null, "cli": "resend emails send --template --var", "ui": "Dashboard > Emails"} |
| Add and manage contacts: Add and manage contacts | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /contacts, PATCH /contacts/{id}, DELETE /contacts/{id}", "mcp": "create-contact", "cli": "resend contacts create/update/delete", "ui": "Dashboard > Contacts"} |
| Bulk import contacts from a file: Bulk import contacts from a file | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /contacts/imports", "mcp": null, "cli": "resend contacts imports create --file", "ui": "Dashboard > Contacts"} |
| Segment contacts for targeted sends: Segment contacts for targeted sends | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /segments; POST /contacts/{id}/segments", "mcp": null, "cli": "resend contacts add-segment", "ui": "Dashboard > Contacts > Segments"} |
| Define custom contact properties: Define custom contact properties | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /contact-properties", "mcp": null, "cli": null, "ui": "Dashboard > Contacts > Properties"} |
| Manage subscription topics and unsubscribes: Manage subscription topics and unsubscribes | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /topics; PATCH /contacts/{id}/topics", "mcp": null, "cli": "resend contacts update-topics", "ui": "Dashboard > Contacts > Topics"} |
| Add attachments to an email: Add attachments to an email | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /emails (attachments)", "mcp": null, "cli": "resend emails send --attachment", "ui": null} |
| Embed inline images in an email: Embed inline images in an email | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /emails (attachments with content_id)", "mcp": null, "cli": null, "ui": null} |
| Set custom headers and tags on an email: Set custom headers and tags on an email | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /emails (headers, tags)", "mcp": null, "cli": "resend emails send --headers --tags", "ui": "Dashboard > Emails"} |
| Deduplicate sends with an idempotency key: Deduplicate sends with an idempotency key | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /emails (Idempotency-Key header)", "mcp": null, "cli": "resend emails send --idempotency-key", "ui": null} |
| Add an unsubscribe link to transactional emails: Add an unsubscribe link to transactional emails | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /emails (List-Unsubscribe header)", "mcp": null, "cli": null, "ui": "Dashboard > Settings > Unsubscribe Page"} |
| Track opens and link clicks: Track opens and link clicks | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "PATCH /domains/{id} (tracking)", "mcp": null, "cli": "resend domains update <id>", "ui": "Dashboard > Domains > Tracking"} |
| View deliverability insights and bounce/suppression management: View deliverability insights and bounce/suppression management | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "GET /suppressions; POST /suppressions", "mcp": null, "cli": null, "ui": "Dashboard > Emails > Deliverability Insights"} |
| Create a webhook endpoint for event notifications: Create a webhook endpoint for event notifications | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /webhooks", "mcp": null, "cli": null, "ui": "Dashboard > Webhooks"} |
| Replay or retry a failed webhook event delivery: Replay or retry a failed webhook event delivery | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /webhooks/{id}/events/{event_id}/replay", "mcp": null, "cli": null, "ui": "Dashboard > Webhooks > Event log"} |
| Create a managed inbox and reply/forward threads: Create a managed inbox and reply/forward threads | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /inboxes; POST /inboxes/{id}/threads/{thread_id}/reply", "mcp": null, "cli": null, "ui": "Dashboard > Inboxes"} |
| View API request logs: View API request logs | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "GET /logs", "mcp": null, "cli": null, "ui": "Dashboard > Logs"} |
| Monitor and debug automation run history: Monitor and debug automation run history | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "GET /automations/{id}/runs", "mcp": null, "cli": null, "ui": "Dashboard > Automations > Runs"} |
| View broadcast performance tracking (opens, clicks): View broadcast performance tracking (opens, clicks) | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "GET /broadcasts/{id}/recipients; GET /broadcasts/{id}/clicked-links", "mcp": null, "cli": null, "ui": "Dashboard > Broadcasts"} |
| Generate or edit email/automation content with AI: Generate or edit email/automation content with AI | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": null, "mcp": null, "cli": null, "ui": "Dashboard > Broadcast/Template editor; Resend assistant"} |
| Configure DMARC/BIMI/TLS/custom Return-Path for a domain: Configure DMARC/BIMI/TLS/custom Return-Path for a domain | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "PATCH /domains/{id}", "mcp": null, "cli": "resend domains update <id>", "ui": "Dashboard > Domains"} |
| Choose a sending region for a domain: Choose a sending region for a domain | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /domains (region)", "mcp": null, "cli": "resend domains create --region", "ui": "Dashboard > Domains"} |
| Claim a domain already verified by another team: Claim a domain already verified by another team | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /domains/{id}/claim", "mcp": null, "cli": null, "ui": "Dashboard > Domains"} |
| Create, list, and revoke API keys with scoped permissions: Create, list, and revoke API keys with scoped permissions | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": "POST /api-keys; DELETE /api-keys/{id}", "mcp": null, "cli": "resend api-keys create/list/delete", "ui": "Dashboard > API Keys"} |
| Manage team members and switch between teams: Manage team members and switch between teams | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": null, "mcp": null, "cli": "resend auth switch", "ui": "Dashboard > Settings > Team"} |
| Enable Single Sign-On for the team: Enable Single Sign-On for the team | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": null, "mcp": null, "cli": null, "ui": "Dashboard > Settings > SSO"} |
| Customize the public unsubscribe page: Customize the public unsubscribe page | none | blocked | No account and no API key: sign-up rejected (see signup attempt). Documented route exists: {"api": null, "mcp": null, "cli": null, "ui": "Dashboard > Settings > Unsubscribe Page"} |
Also in Email infrastructure.
AgentMailL4Gets in on its ownResend vs AgentMail
MailgunL1Can't sign up on its ownResend vs Mailgun
MailtrapL1Can't sign up on its ownResend vs Mailtrap
PostmarkL1Can't sign up on its ownResend vs Postmark