Migrate from Resend

Move from Resend to Amazon SES in your own AWS account without changing code. Keep the Resend SDK, set the base URL to https://api.stamp0.com and verify your domain.

Stamp0 serves the Resend REST API on the same paths, with the same request and response bodies and the same error format for the resources it has. The official Resend SDKs work by pointing them at https://api.stamp0.com. That includes templates, contacts, broadcasts, topics and segments: see Resend aliases for how they map to Stamp0's marketing resources. Read what differs before you switch.

1. Connect AWS and verify your domain

Follow the quickstart to connect an AWS account and add your sending domain. Your DKIM records change, because mail is now signed by SES in your account. Leave the Resend records in place until you have switched traffic.

2. Change two settings

RESEND_API_KEY=s0_…                     # a Stamp0 API key
RESEND_BASE_URL=https://api.stamp0.com  # Node SDK
RESEND_API_URL=https://api.stamp0.com   # Python SDK

3. Recreate webhooks

Create webhooks with the same endpoint URLs. email.* and domain.* event names and payloads follow Resend, and deliveries are signed with Standard Webhooks headers, so resend.webhooks.verify and the standardwebhooks libraries both work with the new signing secret. A webhook may still list Resend's contact.created, contact.updated, contact.deleted, contact.topics.updated, topic.* and suppression.* events: they are accepted so the configuration saves, but not delivered yet. Unsubscribes arrive as Stamp0's own contact.unsubscribed event.

What maps where

ResendStamp0
POST /emails, /emails/batchSame, including hosted templates (template: { id, variables })
GET, PATCH /emails/:id, POST /emails/:id/cancel, /emails/:id/attachmentsSame
/emails/receiving (received emails, received_for, attachments)Same
/domainsSame, plus extra DNS records (see below)
/api-keys (create, list, update, remove)Same
/webhooks, including signing-secret/rotate and /webhooks/:id/eventsSame; the attempts list holds only the latest attempt
/suppressions (add, get, list, remove, batch)Same shapes (origin, source_id); see Suppressions for which list a project sees
/logs (list, get)Same shapes; request_body and response_body are always null
TeamOrganization
(none)Project: one per product or environment
(none)/inboxes, /connections, /deliverability, /events: see the API reference
Shared sending infrastructureAmazon SES in your account
/templatesSame; Stamp0 adds preheader. See Templates
/contacts, /contact-propertiesSame; Stamp0 adds boolean and date properties. See Contacts
/broadcastsCampaigns, on Resend's path and shapes. See Campaigns
/topicsPublic lists, shown in the preference center
/segments, /audiencesPrivate lists; /segments also holds Stamp0's filter segments
/automationsSequences, with Stamp0's sequence shapes. See Sequences
POST /events, /events/sendCustom contact events. See Events
Marketing in the Resend dashboard and SDKMarketing in the Stamp0 dashboard, the API, @stamp0/sdk, the CLI and the MCP server. See Marketing

What differs

Not supported yet

Resend featureWhat happens on Stamp0
Resend automation bodies, /automations/:id/runs, /stop, /duplicate/automations speaks Stamp0's sequence shapes; the Resend-specific endpoints answer 404
Event definitions (POST /events with a schema, GET, PATCH, DELETE /events/:id)Not served: POST /events records an event, and GET /events is the email-event log
contact.created, contact.updated, contact.deleted, contact.topics.updated, topic.*, suppression.* webhook eventsAccepted on a webhook, not delivered
Webhook delivery attemptsGET /webhooks/:id/events/:eventId/attempts returns the latest attempt only
Suppression source_idAlways null
Log bodiesGET /logs/:id returns request_body and response_body as null: bodies are never stored

Behaves differently

  • DNS records. GET /domains/:id uses Resend's labels (DKIM, SPF, MX, Receiving, Tracking) and adds DMARC (a recommended policy) and, for some setups, VERIFICATION. Code that renders setup instructions should show unknown labels instead of skipping them.
  • Error statuses. invalid_access answers 403 (Resend: 422) and security_error answers 403 (Resend: 451). invalid_scheduled_at (422) is Stamp0's own name for a scheduled_at it cannot schedule.
  • email.sent. One email.sent per email, without a recipient field. Delivery, bounce, complaint and delay events are per recipient, as in Resend.
  • AWS connections. API keys can read /connections but not create or change them; that happens in the dashboard.
  • Sandbox. A new SES account can only send to verified recipients until AWS grants production access. Check your connection status before switching production traffic.
  • IDs. Stamp0 IDs are prefixed (em_…, dom_…, key_…) rather than UUIDs. Treat them as opaque strings.
  • Suppressions. Recipients on your SES account's suppression list are left out of a send. SES can also refuse a message outright (for example a virus), reported as email.rejected.
  • React. The API does not accept a react field. The Resend Node SDK renders it to HTML before sending when @react-email/render is installed, so react: keeps working from Node.

On this page