Quick Migration Steps
1
Change the endpoint URL
- SES v1
- SES v2
- From:
https://email.{region}.amazonaws.com/ - To:
https://api.sendpost.io/api/v1/subaccount/email/ses/v1
2
Update authentication
- From: AWS Signature Version 4 (complex signing with access/secret keys)
- To:
X-SubAccount-ApiKey: YOUR_SENDPOST_API_KEYheader
3
Keep your request body
Use the exact same SES v1 or v2 JSON request format - no changes needed!
4
Optional: Add SendPostOptions
Optionally add
SendPostOptions to leverage SendPost-specific features like IP Pool routingSES v1 Migration Example
- Before (Amazon SES v1)
- After (SendPost SES v1)
SES v2 Migration Example
- Before (Amazon SES v2)
- After (SendPost SES v2)
Field Mappings
SES v1 → SendPost
| SES v1 Field | SendPost Field | Notes |
|---|---|---|
Source | From.Email, From.Name | Supports “Name <email>” format |
Destination.ToAddresses[] | To[].Email | Direct mapping |
Destination.CcAddresses[] | To[].Cc[] | Direct mapping |
Destination.BccAddresses[] | To[].Bcc[] | Direct mapping |
Message.Subject.Data | Subject | Direct mapping |
Message.Body.Text.Data | TextBody | Direct mapping |
Message.Body.Html.Data | HtmlBody | Direct mapping |
ReplyToAddresses[] | ReplyTo.Email | First address only |
Tags[] | Groups[] | Formatted as “Name:Value” |
ConfigurationSetName | Headers["X-SES-CONFIGURATION-SET"] | Stored as header |
SendPostOptions.IPPool | IPPool | SendPost extension |
SendPostOptions.TrackOpens | TrackOpens | SendPost extension |
SendPostOptions.TrackClicks | TrackClicks | SendPost extension |
SendPostOptions.WebhookEndpoint | WebhookEndpoint | SendPost extension |
SES v2 → SendPost
| SES v2 Field | SendPost Field | Notes |
|---|---|---|
FromEmailAddress | From.Email, From.Name | Supports “Name <email>” format |
Destination.ToAddresses[] | To[].Email | Direct mapping |
Destination.CcAddresses[] | To[].Cc[] | Direct mapping |
Destination.BccAddresses[] | To[].Bcc[] | Direct mapping |
Content.Simple.Subject.Data | Subject | Only Simple content type supported |
Content.Simple.Body.Text.Data | TextBody | Direct mapping |
Content.Simple.Body.Html.Data | HtmlBody | Direct mapping |
ReplyToAddresses[] | ReplyTo.Email | First address only |
EmailTags[] | Groups[] | Formatted as “Name:Value” |
ConfigurationSetName | Headers["X-SES-CONFIGURATION-SET"] | Stored as header |
SendPostOptions.IPPool | IPPool | SendPost extension |
SendPostOptions.TrackOpens | TrackOpens | SendPost extension |
SendPostOptions.TrackClicks | TrackClicks | SendPost extension |
SendPostOptions.WebhookEndpoint | WebhookEndpoint | SendPost extension |
SendPostOptions Extension
SendPost offers optional extensions through theSendPostOptions field that are not available in the standard SES API:
Note: Open and click tracking are automatically enabled in the SES configuration set. The
TrackOpens and TrackClicks options in SendPostOptions are optional and can be used for additional control.Supported SES Features
| Feature | SES v1 | SES v2 | Notes |
|---|---|---|---|
Source / FromEmailAddress | ✅ | ✅ | Supports “Name <email>” format |
Destination.ToAddresses | ✅ | ✅ | Direct mapping |
Destination.CcAddresses | ✅ | ✅ | Direct mapping |
Destination.BccAddresses | ✅ | ✅ | Direct mapping |
Message.Subject / Content.Simple.Subject | ✅ | ✅ | Direct mapping |
Message.Body.Text / Content.Simple.Body.Text | ✅ | ✅ | Direct mapping |
Message.Body.Html / Content.Simple.Body.Html | ✅ | ✅ | Direct mapping |
ReplyToAddresses | ✅ | ✅ | First address only |
Tags / EmailTags | ✅ | ✅ | Mapped to Groups as “Name:Value” |
ConfigurationSetName | ✅ | ✅ | Stored as header |
SendPostOptions | ✅ | ✅ | SendPost extension |
Unsupported SES Features
| Feature | Alternative |
|---|---|
RawMessage (v1) | Use Message with Subject and Body instead |
Content.Raw (v2) | Use Content.Simple instead |
Template, TemplateData, TemplateArn (v1) | Use SendPost’s native template API or include content directly |
Content.Template (v2) | Use SendPost’s native template API or include content directly |
SourceArn, ReturnPath, ReturnPathArn (v1) | Handled automatically by SendPost |
FromEmailAddressIdentityArn (v2) | Not needed with SendPost |
FeedbackForwardingEmailAddress (v2) | Handled automatically by SendPost |
ListManagementOptions (v2) | Use SendPost’s {{unsubscribe}} template variable |
Response Format
Success Response (HTTP 200)
Error Response (HTTP 400/403/413/429/500)
Error Types
| Error Type | HTTP Status | Description |
|---|---|---|
ValidationException | 400 | Invalid request format or missing required fields |
AccessDeniedException | 403 | Invalid or missing API key |
MessageRejected | 400 | Email rejected (e.g., domain not verified) |
MailFromDomainNotVerifiedException | 400 | Domain not verified in SendPost |
MessageTooLarge | 413 | Payload exceeds 10MB limit |
TooManyRequestsException | 429 | Rate limit exceeded |
ServiceException | 500 | Internal server error |
Key Differences: SES v1 vs v2
| Feature | SES v1 | SES v2 |
|---|---|---|
| Source field | Source | FromEmailAddress |
| Subject | Message.Subject | Content.Simple.Subject |
| Body | Message.Body | Content.Simple.Body |
| Tags | Tags[] | EmailTags[] |
| Content types | Simple only | Simple, Raw, Template (only Simple supported) |
IP Pool Routing
When using the Amazon SES Compatible API, you can specify an IP Pool throughSendPostOptions.IPPool. This IP Pool must be configured in SendPost to route traffic to your Amazon SES provider.
Important: The IP Pool specified in
SendPostOptions.IPPool must exist in SendPost and be configured to route to your Amazon SES provider. If not specified, the default IP Pool will be used.Next Steps
- Understand event types for tracking email status
- View analytics for your Amazon SES emails
- Troubleshoot issues with the compatible API