Transactional email service By the authors of React Email; Amazon SES sits in the delivery path
Resend logo

Resend API + MCP (2026): dev-first REST, OAuth 2.1 and hosted MCP

Last verified Aug 27, 2026

Resend ships one of the tightest developer stories in the ESP market: a single JSON REST base at api.resend.com, 10 first-party SDKs kept on the same release cadence, and a first-party remote MCP server at mcp.resend.com/mcp that installs into Claude, Cursor, Codex and GitHub Copilot in one click. If your evaluation shortlist includes Postmark, Mailgun or Amazon SES, Resend is the option that treats the API and the AI-agent surface as the primary product rather than a bolt-on.

This tab is the API and MCP reference for buyers, platform engineers and AI-agent integrators. It covers the authentication model (Bearer plus OAuth 2.1 with PKCE), the 10 requests/second per-team rate limit, the 19 documented endpoint groups, the official SDK matrix, canonical Python and Node snippets, five gotchas Resend teams hit in production, and the recent changelog events that actually change how you integrate.

At a glance

v1 unversioned
API version
Calendar-based header versioning planned; today one live surface

10 official
SDKs maintained
Node, Python, PHP, Laravel, Ruby, Go, Java, Rust, .NET, Chat SDK

MCP: official
Hosted at mcp.resend.com/mcp
OAuth 2.1 + PKCE, one-click install in Claude / Cursor / Codex

MCP integration in 2026

Resend is one of the very few transactional ESPs that treats Model Context Protocol as a first-party surface rather than a community experiment. The hosted server exposes almost the entire REST API to any MCP client, and the same code ships as an open-source npm package for teams that need to run it inside their own VPC.

Official MCP server: shipped and hosted

Resend hosts a first-party remote MCP server at https://mcp.resend.com/mcp. Since August 6, 2026 the endpoint supports the stateless MCP protocol, and since August 13, 2026 Resend implements the Agent Plugins Standard for one-click install. Authentication uses OAuth 2.1 with PKCE or a raw re_ API key. Compare to Amazon SES and Mailgun, which still have no first-party MCP server as of August 2026.

Available MCP servers

Two official surfaces (hosted and self-run), one containerized distribution in the Docker MCP Catalog, and a small community layer.

Why buyers should care. Two things stand out. First, the Resend MCP surface exposes almost the same resources as the REST API, so any AI agent can compose a broadcast, verify a domain or read webhooks without a custom wrapper. Second, OAuth 2.1 with PKCE and Agent Plugins Standard support mean you can grant scoped access to a Claude or Cursor session without minting long-lived re_ keys, a real security posture upgrade over API-key-only providers.

Resend API essentials

The Resend REST API is a single, unversioned surface today. Every path lives under one base URL, every response is JSON, and Resend has publicly committed to calendar-based header versioning rather than URL path bumps, so integration code written today should not break at the next major release.

Base URLhttps://api.resend.com
Response formatJSON only; no XML or form-encoded surface
VersioningUnversioned URL today. Calendar-based header versioning planned
AuthenticationBearer re_ API key, or OAuth 2.1 + PKCE
PaginationCursor-based on list endpoints: limit + after / before
Batch sendUp to 100 emails per POST /emails/batch call
Message size cap40 MB total, including Base64-encoded attachments
Recipients per emailUp to 50 addresses in the to field
OpenAPI specPublished at resend.com/docs/api-reference

The API is organized around 19 resource groups covering transactional email, batch send, inbound routing, broadcasts, contacts, segments, topics, templates, domain verification, API keys, suppressions, webhooks, request logs and OAuth. That coverage is comparable to Postmark‘s server-oriented surface while pulling in marketing primitives (segments, topics, broadcasts) that are typically split between two products at legacy vendors.

Authentication methods

Resend offers two authentication modes. Bearer tokens are the default for server-to-server integrations; OAuth 2.1 with PKCE is the newer flow purpose-built for third-party apps and AI agents that must not hold static credentials.

Bearer API key

Every API request must carry an Authorization: Bearer re_xxxxxxxxx header. API keys are created under Settings › API Keys, are scoped to a single team, and support two permission tiers: Full access and Sending access (send-only, no key/domain management). Keys are shown once at creation and never again, store them in a secret manager immediately.

curl https://api.resend.com/emails 
  -H "Authorization: Bearer re_xxxxxxxxx" 
  -H "Content-Type: application/json" 
  -d '{
    "from": "Acme <onboarding@resend.dev>",
    "to": ["delivered@resend.dev"],
    "subject": "Hello from Resend",
    "html": "<strong>It works</strong>"
  }'

OAuth 2.1 with PKCE

Since July 13, 2026 Resend supports OAuth 2.1 + PKCE with dynamic client registration, exposed under /oauth/*. This is the recommended path when a third-party app, an AI agent, or a Claude MCP connector needs delegated access to a Resend team without long-lived API keys. The flow follows the standard: register a client, redirect the user to Resend for consent, exchange the code + PKCE verifier for a scoped access token, and refresh silently.

Scope caveat. OAuth scopes are coarser than API-key permission tiers today, expect the granularity to expand through 2026. If you need tight resource-level scoping (send-only, domain-read-only, etc.), issue a scoped Sending access API key from your own backend rather than passing the OAuth token straight through to a client.

Rate limits

Resend publishes a single per-team default with headroom available on request. The cap is enforced at the team level, not per API key, which is a common surprise for teams that assume sharding keys will multiply throughput.

LimitDefaultNotes
API requests per team10 req/sec (600 rpm)Shared across every API key on the team; higher limits on request
Batch send size100 emails per callVia POST /emails/batch
Recipients per email50 addressesIn the to field per single email
Message payload40 MBTotal request size, including Base64-encoded attachments
Deliverability floorsBounce < 4%, spam < 0.08%Exceeding either triggers throttling and account review
Free plan quota100/day, 3,000/monthBoth caps enforced in parallel
Paid overage cap5x monthly quotaHard ceiling on soft overage

Workaround pattern. Every response carries ratelimit-remaining and retry-after headers. The standard shape is a client-side queue (Cloudflare Queues, Upstash QStash, Trigger.dev, Inngest) that dispatches sends at a steady 8-9 req/sec, catches 429s and backs off with jitter. Batch sends via /emails/batch collapse 100 sends into a single request and are the fastest way to stay under the ceiling for bulk workloads. If you need a per-hour ceiling higher than 36,000 theoretical calls, open a support request. Resend does raise the cap for verified teams.

Official SDKs

Resend maintains 10 first-party SDKs under the github.com/resend org, all versioned in lock-step with the REST API. The Node.js SDK is the primary reference; Laravel and the Vercel AI Chat SDK adapter deserve special mention because they wire Resend into the framework’s own abstractions (mail transport and streaming chat, respectively) rather than exposing a raw client.

LanguagePackageInstallRepository
Node.js / TypeScriptresendnpm install resendresend/resend-node
Pythonresendpip install resendresend/resend-python
PHPresend/resend-phpcomposer require resend/resend-phpresend/resend-php
Laravelresend/resend-laravelcomposer require resend/resend-laravelresend/resend-laravel
Rubyresendgem install resendresend/resend-ruby
Gogithub.com/resend/resend-go/v2go get github.com/resend/resend-go/v2resend/resend-go
Javacom.resend:resend-javaAdd to Maven / Gradleresend/resend-java
Rustresend-rscargo add resend-rsresend/resend-rust
.NET / C#Resenddotnet add package Resendresend/resend-dotnet
Chat SDK adapterresend-chat-sdknpm install resend-chat-sdkresend/resend-chat-sdk

React Email pairing. Resend’s sister project React Email is the reason many teams pick Resend in the first place: author templates as React components, preview locally, and pass them straight into resend.emails.send({ react: <Welcome /> }). No JSON-in-a-string template DSL, no separate template repository to keep in sync. It is the closest thing to a modern, framework-native templating story any transactional ESP ships today.

Notable community SDKs

Because Resend publishes a machine-readable OpenAPI spec, community SDKs auto-generate cleanly. Search for resend- on npm, PyPI and crates.io. Notable third-party wrappers include Deno-first HTTP clients, Elixir libraries, and Cloudflare Workers helpers. When picking a community SDK, verify the last commit is within 90 days and that it tracks the current OpenAPI hash, stale wrappers often miss the newer /broadcasts, /segments, /topics and /contact-properties resources.

Endpoints reference

The full REST surface exposes 19 resource groups. Reference paths are relative to the base URL https://api.resend.com. The canonical documentation lives at resend.com/docs/api-reference.

ResourceMethodsDescription
Emails /emailsPOST, GETSend a transactional email or list previously sent emails.
Emails (single) /emails/{id}GET, PATCH, DELETERetrieve, reschedule, or cancel a specific email.
Batch emails /emails/batchPOSTSend up to 100 emails in a single request.
Email attachments /emails/{id}/attachmentsGETList or fetch attachments for a previously sent email.
Email metrics /emails/metricsGETAccount-level delivery, bounce, complaint and engagement metrics.
Received emails /emails/receivedGETList and fetch inbound emails and their attachments.
Broadcasts /broadcastsPOST, GETCreate and list broadcast campaigns.
Broadcasts (single) /broadcasts/{id}GET, PATCH, DELETERead, update or delete a broadcast; sub-resources for send, cancel, recipients and links.
Templates /templatesPOST, GETCreate and list reusable email templates.
Contacts /contactsPOST, GETManage contacts within an audience.
Contact properties /contact-propertiesPOST, GETDefine custom contact properties for personalization tokens.
Segments /segmentsPOST, GET, DELETECreate and manage dynamic audience segments.
Topics /topicsPOST, GETManage subscription topics and recipient preferences.
Domains /domainsPOST, GETAdd, verify and manage sending domains.
API keys /api-keysPOST, GET, DELETECreate and revoke API keys programmatically.
Suppressions /suppressionsPOST, GET, DELETEManage suppressed addresses (single or batch).
Webhooks /webhooksPOST, GET, PATCH, DELETEConfigure webhook endpoints and inspect delivered events.
Logs /logsGETInspect API request logs, payloads and latency for debugging.
OAuth /oauth/*POST, GETOAuth 2.1 + PKCE flow for third-party Resend apps and agents.

Code examples

Two canonical snippets: send a transactional email and add a contact to an audience. Both patterns transfer directly to the other 10 official SDKs; only the client instantiation differs.

Python (resend package)

# pip install resend
import os
import resend

resend.api_key = os.environ["RESEND_API_KEY"]

# 1) Send a transactional email
params: resend.Emails.SendParams = {
    "from": "Acme <onboarding@resend.dev>",
    "to": ["delivered@resend.dev"],
    "subject": "Hello from Resend",
    "html": "<strong>It works</strong>",
}
email = resend.Emails.send(params)
print("sent:", email["id"])

# 2) Add a contact to an audience
contact = resend.Contacts.create({
    "audience_id": "aud_xxxxxxxx",
    "email": "reader@example.com",
    "first_name": "Alaa",
    "unsubscribed": False,
})
print("contact:", contact["id"])

Node.js / TypeScript (resend package)

// npm install resend
import { Resend } from 'resend';

const resend = new Resend(process.env.RESEND_API_KEY);

async function main() {
  // 1) Send an email
  const { data, error } = await resend.emails.send({
    from: 'Acme <onboarding@resend.dev>',
    to: ['delivered@resend.dev'],
    subject: 'Hello from Resend',
    html: '<strong>It works</strong>',
  });
  if (error) return console.error(error);
  console.log('sent id:', data.id);

  // 2) Create a contact
  const contact = await resend.contacts.create({
    audienceId: 'aud_xxxxxxxx',
    email: 'reader@example.com',
    firstName: 'Alaa',
    unsubscribed: false,
  });
  console.log('contact id:', contact.data?.id);
}

main();

Common gotchas

SMTP username is literally the string resend

Unlike most providers, the SMTP username is not your email or account ID, it is the fixed string resend. The password is your API key (re_...). New users often paste their email into the username field and get authentication failures that read as bad credentials rather than as a misconfiguration.

Rate limit is 10 req/sec per team, not per API key

The 10 req/sec cap is applied at the team level and shared across every API key. Splitting keys will not raise your ceiling, you need to open a support request. Integrate the ratelimit-remaining and retry-after headers and queue with exponential backoff. Cloudflare Queues, Upstash QStash, Trigger.dev and Inngest are all common patterns.

Free plan enforces both 100/day and 3,000/month caps

Both quotas run in parallel on the free tier, sending 100 emails/day for 30 days will still trip the 3,000/month ceiling. The free plan also limits you to 1 verified domain, so multi-tenant setups need the $20 Pro plan (10 domains) at minimum. Compare to Mailgun‘s and SendGrid‘s pay-as-you-go pricing.

Bounce > 4% or spam > 0.08% pauses your account

Resend enforces deliverability floors: bounce rate must stay under 4% and complaint (spam) rate under 0.08%. Because Resend rides on Amazon SES infrastructure, exceeding either metric triggers throttling and can lead to account review or suspension, clean lists and double opt-in are not optional at scale. See our Amazon SES guide for the underlying reputation model.

40 MB email cap includes Base64-encoded attachments

The 40 MB size limit is measured AFTER Base64 encoding, which inflates raw bytes by ~33%. Effective safe payload is roughly 28-30 MB of raw attachment content. For larger files, host the asset and send a signed URL instead of embedding it.

Deprecations and changelog

Resend maintains a public, dated changelog. The events below materially change how you integrate as of August 2026.

  • August 18, 2026-Broadcasts API adds a cancel endpoint. Scheduled or queued broadcasts can now be cancelled directly via the API instead of only through the dashboard.
  • August 13, 2026-Resend adopts the Agent Plugins Standard, streamlining one-click MCP install across Claude, Cursor, Codex, Devin and GitHub Copilot.
  • August 6, 2026-The remote MCP server at mcp.resend.com/mcp now supports the stateless MCP protocol.
  • July 16, 2026-Automatic secret scanning: exposed re_ API keys committed to GitHub are detected, revoked and reported to the owning team.
  • July 13, 2026OAuth 2.1 with PKCE released for building authenticated third-party Resend apps.
  • July 11, 2026-One-click Resend connector added to the Claude connector directory.

Full history at resend.com/changelog.

Frequently asked questions

What is the Resend API base URL and how do I authenticate?

The base URL is https://api.resend.com. Authenticate with a Bearer token: Authorization: Bearer re_xxxxxxxxx. For third-party apps, Resend also supports OAuth 2.1 with PKCE and dynamic client registration since July 2026.

Which official SDKs does Resend maintain?

Resend ships 10 first-party SDKs: Node.js/TypeScript, Python, PHP, a Laravel mail transport, Ruby, Go (v2), Java, Rust (resend-rs), .NET/C#, and a Vercel AI Chat SDK adapter. All are hosted under the github.com/resend org and are actively maintained.

How do I send a batch of emails with the Resend API?

POST /emails/batch accepts up to 100 emails per call. Each item in the array is a full email payload (from, to, subject, html or react). The endpoint returns per-email IDs and does not fail the whole batch if a single item errors.

How do I manage contacts, audiences and segments via API?

Use /contacts to add or update contacts, /contact-properties to define custom fields for personalization, /segments to build dynamic audiences, and /topics to give recipients granular subscription preferences. All four resources plug into the Broadcasts API for campaign sends.

Does Resend offer an official MCP server for AI agents?

Yes. Resend hosts a first-party remote MCP server at https://mcp.resend.com/mcp (OAuth 2.1 + PKCE and API-key auth) and publishes the same code as resend-mcp on npm. It exposes emails, contacts, broadcasts, domains, segments, topics, contact properties, API keys and webhooks; one-click install is available for Claude, Cursor, Codex, Devin and GitHub Copilot.

How do webhooks and API request logs work in Resend?

/webhooks lets you register signed HTTPS endpoints for delivery, bounce, complaint, open, click and inbound events. Every API call is captured under /logs with the request payload, response, latency and rate-limit headers, useful for debugging integrations without redeploying instrumentation.

Changelog (recent)

  • 2026-08-19 API + MCP tab published for Resend on smtpedia.com.
  • 2026-08-18 Broadcasts API adds a cancel endpoint: scheduled or queued broadcasts can be cancelled directly via the API.
  • 2026-08-13 Resend adopts the Agent Plugins Standard, streamlining one-click install across MCP-compatible AI clients.
AAlaa Touil RRabeb How we test →

This review follows our email infrastructure testing methodology. We disclose affiliate relationships in our editorial independence policy.