postkit
Guides

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

FeatureResendPostkit
API key prefixre_pk_live_ (production) / pk_test_ (sandbox)
Base URLhttps://api.resend.comhttps://api.postkit.eu/v1
Webhook signing headerssvix-id, svix-timestamp, svix-signaturewebhook-id, webhook-timestamp, webhook-signature
Rate limit5 req/sec10 req/sec
Test/sandbox modeNo dedicated test key prefixpk_test_ keys simulate without delivering
Data residencyUS-based (no EU guarantee)EU-only (all data stays in EU)

Endpoint mapping

OperationResendPostkit
Send emailPOST /emailsPOST /v1/emails
Send batchPOST /emails/batchPOST /v1/emails/batch
Create domainPOST /domainsPOST /v1/domains
Verify domainPOST /domains/{id}/verifyPOST /v1/domains/{id}/verify
Create webhookPOST /webhooksPOST /v1/webhooks
List templatesGET /templatesGET /v1/templates
Get emailGET /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 headerPostkit header
svix-idwebhook-id
svix-timestampwebhook-timestamp
svix-signaturewebhook-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