Migrate from Resend
Step-by-step guide to switch from Resend to Postkit
Resend and Postkit have very similar REST APIs, making migration straightforward. Both offer a clean developer experience for transactional email -- the main differences are in URL structure, API key format, and webhook header naming. This guide maps Resend concepts to Postkit equivalents and walks you through the switch.
Key differences
| Feature | Resend | Postkit |
|---|---|---|
| API key prefix | re_ | pk_live_ (production) / pk_test_ (sandbox) |
| Base URL | https://api.resend.com | https://api.postkit.eu/v1 |
| Webhook signing headers | svix-id, svix-timestamp, svix-signature | webhook-id, webhook-timestamp, webhook-signature |
| Rate limit | 5 req/sec | 10 req/sec |
| Test/sandbox mode | No dedicated test key prefix | pk_test_ keys simulate without delivering |
| Data residency | US-based (no EU guarantee) | EU-only (all data stays in EU) |
Endpoint mapping
| Operation | Resend | Postkit |
|---|---|---|
| Send email | POST /emails | POST /v1/emails |
| Send batch | POST /emails/batch | POST /v1/emails/batch |
| Create domain | POST /domains | POST /v1/domains |
| Verify domain | POST /domains/{id}/verify | POST /v1/domains/{id}/verify |
| Create webhook | POST /webhooks | POST /v1/webhooks |
| List templates | GET /templates | GET /v1/templates |
| Get email | GET /emails/{id} | GET /v1/emails/{id} |
Step-by-step migration
Get your Postkit API key
Sign up at app.postkit.eu and create an API key in Settings > API Keys. Production keys start with pk_live_. For testing the migration without sending real emails, create a sandbox key starting with pk_test_.
Update your base URL
Change all API calls from Resend's base URL to Postkit's. The path structure is nearly identical -- just add the /v1 version prefix.
Before (Resend):
curl -X POST https://api.resend.com/emails \
-H "Authorization: Bearer re_abc123..."After (Postkit):
curl -X POST https://api.postkit.eu/v1/emails \
-H "Authorization: Bearer pk_live_abc123..."Update authentication
Replace your Resend API key with your Postkit key. Both use the same Authorization: Bearer header format -- only the key value changes.
# Before
-H "Authorization: Bearer re_abc123..."
# After
-H "Authorization: Bearer pk_live_abc123..."Update webhook verification
Both Resend and Postkit use the Standard Webhooks specification (HMAC-SHA256), so the signing algorithm is identical. The only change is the header names.
| Resend header | Postkit header |
|---|---|
svix-id | webhook-id |
svix-timestamp | webhook-timestamp |
svix-signature | webhook-signature |
Update your webhook handler to read from the new header names. The signature computation and verification logic stays the same.
// Before (Resend)
const msgId = headers['svix-id'];
const timestamp = headers['svix-timestamp'];
const signature = headers['svix-signature'];
// After (Postkit)
const msgId = headers['webhook-id'];
const timestamp = headers['webhook-timestamp'];
const signature = headers['webhook-signature'];See the Webhooks guide for complete verification examples in multiple languages.
Verify your domain
Add your sending domain in Postkit and configure the DNS records (DKIM, SPF, DMARC). The process is similar to Resend's domain verification.
See the Domain Setup guide for step-by-step DNS configuration instructions.
Test with sandbox keys
Use a pk_test_ key to verify your integration end-to-end without delivering actual emails. Once everything works as expected, switch to your pk_live_ key for production.
What's next?
- Quickstart -- send your first email with Postkit
- Domain Setup -- configure DNS records for production sending
- Webhooks -- set up webhook endpoints and signature verification