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 SDK3. 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
| Resend | Stamp0 |
|---|---|
POST /emails, /emails/batch | Same, including hosted templates (template: { id, variables }) |
GET, PATCH /emails/:id, POST /emails/:id/cancel, /emails/:id/attachments | Same |
/emails/receiving (received emails, received_for, attachments) | Same |
/domains | Same, plus extra DNS records (see below) |
/api-keys (create, list, update, remove) | Same |
/webhooks, including signing-secret/rotate and /webhooks/:id/events | Same; 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 |
| Team | Organization |
| (none) | Project: one per product or environment |
| (none) | /inboxes, /connections, /deliverability, /events: see the API reference |
| Shared sending infrastructure | Amazon SES in your account |
/templates | Same; Stamp0 adds preheader. See Templates |
/contacts, /contact-properties | Same; Stamp0 adds boolean and date properties. See Contacts |
/broadcasts | Campaigns, on Resend's path and shapes. See Campaigns |
/topics | Public lists, shown in the preference center |
/segments, /audiences | Private lists; /segments also holds Stamp0's filter segments |
/automations | Sequences, with Stamp0's sequence shapes. See Sequences |
POST /events, /events/send | Custom contact events. See Events |
| Marketing in the Resend dashboard and SDK | Marketing in the Stamp0 dashboard, the API, @stamp0/sdk, the CLI and the MCP server. See Marketing |
What differs
Not supported yet
| Resend feature | What 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 events | Accepted on a webhook, not delivered |
| Webhook delivery attempts | GET /webhooks/:id/events/:eventId/attempts returns the latest attempt only |
Suppression source_id | Always null |
| Log bodies | GET /logs/:id returns request_body and response_body as null: bodies are never stored |
Behaves differently
- DNS records.
GET /domains/:iduses Resend's labels (DKIM,SPF,MX,Receiving,Tracking) and addsDMARC(a recommended policy) and, for some setups,VERIFICATION. Code that renders setup instructions should show unknown labels instead of skipping them. - Error statuses.
invalid_accessanswers 403 (Resend: 422) andsecurity_erroranswers 403 (Resend: 451).invalid_scheduled_at(422) is Stamp0's own name for ascheduled_atit cannot schedule. email.sent. Oneemail.sentper email, without arecipientfield. Delivery, bounce, complaint and delay events are per recipient, as in Resend.- AWS connections. API keys can read
/connectionsbut 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
reactfield. The Resend Node SDK renders it to HTML before sending when@react-email/renderis installed, soreact:keeps working from Node.
Quickstart
Connect your AWS account, verify a domain and send your first email through Amazon SES with the Resend SDK and base URL https://api.stamp0.com.
Connect AWS
Connect an AWS account to Stamp0 with a CloudFormation Quick Create link, verify it with the RoleArn output, and get your SES account out of the sandbox.