Skip to main content
If you’re currently using Amazon SES and want to migrate to SendPost, we offer Amazon SES Compatible APIs (v1 and v2) that minimize code changes. You only need to change the endpoint URL and replace AWS Signature authentication with a simple API key header.

Quick Migration Steps

1

Change the endpoint URL

  • 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_KEY header
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 routing

SES v1 Migration Example

curl -X POST "https://email.us-east-1.amazonaws.com/" \
  -H "Authorization: AWS4-HMAC-SHA256 Credential=..." \
  -H "Content-Type: application/x-amz-json-1.0" \
  -d '{
    "Source": "[email protected]",
    "Destination": {
      "ToAddresses": ["[email protected]"]
    },
    "Message": {
      "Subject": {
        "Data": "Hello World",
        "Charset": "UTF-8"
      },
      "Body": {
        "Text": {
          "Data": "Hello!",
          "Charset": "UTF-8"
        },
        "Html": {
          "Data": "<p>Hello!</p>",
          "Charset": "UTF-8"
        }
      }
    }
  }'

SES v2 Migration Example

curl -X POST "https://email.us-east-1.amazonaws.com/v2/email/outbound-emails" \
  -H "Authorization: AWS4-HMAC-SHA256 Credential=..." \
  -H "Content-Type: application/x-amz-json-1.0" \
  -d '{
    "FromEmailAddress": "[email protected]",
    "Destination": {
      "ToAddresses": ["[email protected]"]
    },
    "Content": {
      "Simple": {
        "Subject": {
          "Data": "Hello World",
          "Charset": "UTF-8"
        },
        "Body": {
          "Text": {
            "Data": "Hello!",
            "Charset": "UTF-8"
          },
          "Html": {
            "Data": "<p>Hello!</p>",
            "Charset": "UTF-8"
          }
        }
      }
    }
  }'

Field Mappings

SES v1 → SendPost

SES v1 FieldSendPost FieldNotes
SourceFrom.Email, From.NameSupports “Name <email>” format
Destination.ToAddresses[]To[].EmailDirect mapping
Destination.CcAddresses[]To[].Cc[]Direct mapping
Destination.BccAddresses[]To[].Bcc[]Direct mapping
Message.Subject.DataSubjectDirect mapping
Message.Body.Text.DataTextBodyDirect mapping
Message.Body.Html.DataHtmlBodyDirect mapping
ReplyToAddresses[]ReplyTo.EmailFirst address only
Tags[]Groups[]Formatted as “Name:Value”
ConfigurationSetNameHeaders["X-SES-CONFIGURATION-SET"]Stored as header
SendPostOptions.IPPoolIPPoolSendPost extension
SendPostOptions.TrackOpensTrackOpensSendPost extension
SendPostOptions.TrackClicksTrackClicksSendPost extension
SendPostOptions.WebhookEndpointWebhookEndpointSendPost extension

SES v2 → SendPost

SES v2 FieldSendPost FieldNotes
FromEmailAddressFrom.Email, From.NameSupports “Name <email>” format
Destination.ToAddresses[]To[].EmailDirect mapping
Destination.CcAddresses[]To[].Cc[]Direct mapping
Destination.BccAddresses[]To[].Bcc[]Direct mapping
Content.Simple.Subject.DataSubjectOnly Simple content type supported
Content.Simple.Body.Text.DataTextBodyDirect mapping
Content.Simple.Body.Html.DataHtmlBodyDirect mapping
ReplyToAddresses[]ReplyTo.EmailFirst address only
EmailTags[]Groups[]Formatted as “Name:Value”
ConfigurationSetNameHeaders["X-SES-CONFIGURATION-SET"]Stored as header
SendPostOptions.IPPoolIPPoolSendPost extension
SendPostOptions.TrackOpensTrackOpensSendPost extension
SendPostOptions.TrackClicksTrackClicksSendPost extension
SendPostOptions.WebhookEndpointWebhookEndpointSendPost extension

SendPostOptions Extension

SendPost offers optional extensions through the SendPostOptions field that are not available in the standard SES API:
{
  "SendPostOptions": {
    "IPPool": "ses-pool",              // IP pool name for routing
    "TrackOpens": true,                 // Enable open tracking
    "TrackClicks": true,                // Enable click tracking
    "WebhookEndpoint": "https://..."    // Webhook URL for events
  }
}
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

FeatureSES v1SES v2Notes
Source / FromEmailAddressSupports “Name <email>” format
Destination.ToAddressesDirect mapping
Destination.CcAddressesDirect mapping
Destination.BccAddressesDirect mapping
Message.Subject / Content.Simple.SubjectDirect mapping
Message.Body.Text / Content.Simple.Body.TextDirect mapping
Message.Body.Html / Content.Simple.Body.HtmlDirect mapping
ReplyToAddressesFirst address only
Tags / EmailTagsMapped to Groups as “Name:Value”
ConfigurationSetNameStored as header
SendPostOptionsSendPost extension

Unsupported SES Features

The following SES features are not supported and will return a ValidationException error if present:
FeatureAlternative
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
Error Response for Unsupported Fields:
{
  "__type": "ValidationException",
  "message": "Field 'RawMessage' is not supported. Please use Message with Subject and Body instead."
}

Response Format

Success Response (HTTP 200)

{
  "MessageId": "550e8400-e29b-41d4-a716-446655440000"
}

Error Response (HTTP 400/403/413/429/500)

{
  "__type": "ValidationException",
  "message": "1 validation error detected: Value at 'Source' failed to satisfy constraint: Member must satisfy regular expression pattern: [\\u0020-\\u007E]+"
}

Error Types

Error TypeHTTP StatusDescription
ValidationException400Invalid request format or missing required fields
AccessDeniedException403Invalid or missing API key
MessageRejected400Email rejected (e.g., domain not verified)
MailFromDomainNotVerifiedException400Domain not verified in SendPost
MessageTooLarge413Payload exceeds 10MB limit
TooManyRequestsException429Rate limit exceeded
ServiceException500Internal server error

Key Differences: SES v1 vs v2

FeatureSES v1SES v2
Source fieldSourceFromEmailAddress
SubjectMessage.SubjectContent.Simple.Subject
BodyMessage.BodyContent.Simple.Body
TagsTags[]EmailTags[]
Content typesSimple onlySimple, Raw, Template (only Simple supported)

IP Pool Routing

When using the Amazon SES Compatible API, you can specify an IP Pool through SendPostOptions.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