Resend Email
Send, schedule and track transactional email through Resend: one-off messages or batches of up to 100, scheduled sends you can still cancel, delivery status per email, and the verified sender domains, published templates and contacts behind them.
Connect this API to an AI agent Browse all specs
What you can do with Resend Email via MCP
Every endpoint below becomes a governed tool your AI agent (Claude, ChatGPT, or a customer-facing VX agent) can call — with scoped permissions, sandbox testing, and audit logs.
| Method | Path | Operation | Description |
|---|---|---|---|
| GET | /domains |
listDomains | List sender domains and whether each one is verified |
| GET | /domains/{domain_id} |
getDomain | Get a domain's status, region and DNS records |
| GET | /templates |
listTemplates | List email templates |
| GET | /templates/{id} |
getTemplate | Get a template's subject, HTML and variables |
| GET | /emails |
listEmails | List recently sent emails |
| POST | /emails |
sendEmail | Send or schedule one email |
| GET | /emails/{email_id} |
getEmail | Get one email and its latest delivery event |
| POST | /emails/batch |
sendBatchEmails | Send up to 100 different emails in one request |
| POST | /emails/{email_id}/cancel |
cancelScheduledEmail | Cancel an email that is scheduled but not yet sent |
| GET | /contacts |
listContacts | List contacts |
| POST | /contacts |
createContact | Add a contact with name and subscription status |
| GET | /contacts/{id} |
getContact | Get a contact by id or email address |
Authentication
bearerAuth
Bearer token — sent as Authorization: Bearer <token>
Resend API key, sent as Authorization: Bearer re_....
How to get a credential
- Sign in to the Resend dashboard and open API Keys.
- Click Create API Key, give it a name and pick a permission.
- Choose Full access to use every operation here, or Sending access (optionally limited to one domain) if the agent only sends email.
- Copy the key (starts with
re_); it is shown only once.
Permissions used
| Key permission | Operations |
|---|---|
| Sending access | sendEmail, sendBatchEmails |
| Full access | listEmails, getEmail, cancelScheduledEmail, listDomains, getDomain, listTemplates, getTemplate, listContacts, getContact, createContact (and the sending operations) |
Common errors
| Status | Meaning | Fix |
|---|---|---|
| 401 | API key missing or malformed | Send Authorization: Bearer re_... with the full key |
| 403 | Key not allowed for this call, or from domain not verified |
Use a Full access key; send from a domain that listDomains shows as verified |
| 400 / 422 | Invalid field (bad address, both html and template, missing subject) | Fix the body; validation errors name the field |
| 429 | Rate limit (default 10 requests per second per team) or daily quota | Wait and retry; use sendBatchEmails for many messages |
Store the key as a VX Agents credential (bearer token) so it is never pasted into chats or prompts.
Usage guide
Setup
- Credential: a Resend API key (
re_...). A Full access key covers every operation; a Sending access key only covers sendEmail and sendBatchEmails. Store it as a VX Agents bearer credential. - Call
listDomainsfirst and pin the verified domain to use infrom(e.g.Acme <[email protected]>).
Send an email
listDomains→ pick a domain with statusverified;frommust use it.- Optional:
listTemplates/getTemplateto reuse a published template and see its variables. - Draft the message:
to(up to 50 addresses),subject,htmlortext, optionalreply_to,cc,bcc,tags. - Show the sender, recipients, subject and body to the user and get confirmation.
sendEmail(addscheduled_atas an ISO 8601 time to schedule it). Keep the returnedid.getEmailwith that id to checklast_event(sent, delivered, bounced, complained...).- Changed plans?
cancelScheduledEmailworks only while the email is still scheduled.
Contacts
listContacts / getContact (id or email) to look someone up; createContact with email, first_name, last_name, unsubscribed. Confirm before adding people.
Good to know
sendBatchEmailssends up to 100 different emails in one call; it does not support attachments yet. To send one message to many people, prefer separate emails over a longtolist so recipients do not see each other.- Send an
Idempotency-Keyheader value when retrying a send so a timeout does not deliver twice. - Default rate limit is 10 requests per second per team, shared by all keys; back off on 429.
listEmailsreturns recent sent emails with cursor pagination (limit,after).- Audiences are deprecated in the Resend docs; contacts are now global, so this spec uses
/contacts.
Source: Resend API reference (https://resend.com/docs/api-reference/introduction), checked 2026-10-16.
How to use this spec
- Create a free VX Agents account (sandbox tools included).
- Open the marketplace and connect “Resend Email” to an agent.
- Expose it as an MCP server for Claude/ChatGPT, or chat with it directly.