Migrate from AWS SES
Replace AWS SES with Keplars: swap IAM credentials, migrate SNS topics to webhooks
Migrate from AWS SES
API Comparison
| AWS SES | Keplars | |
|---|---|---|
| Send method | SendEmail / SendRawMessage API | POST /api/v1/send-email/instant |
| Auth | IAM Access Key + Secret (SigV4) | Single API key in Authorization header |
| Bounce notifications | SNS topic subscription | email.bounced webhook |
| Complaint notifications | SNS topic subscription | email.complained webhook |
| Suppression list | SES account-level suppression | Keplars contact management |
| Sandbox mode | AWS SES sandbox (verified addresses only) | Keplars sandbox mode |
Migration Steps
Get your Keplars API key: go to dash.keplars.com → API Keys → Create Key. This replaces your IAM access key and secret.
Install the Keplars SDK:
# JavaScript / TypeScript
bun add @keplars/sdk
# Python
pip install keplarsVerify your domain: Dashboard → Custom Domains → Add Domain, then add the CNAME records to Route 53 (or your DNS provider). Your SES-verified domain identities do not carry over.
Swap the send call: replace ses.send(new SendEmailCommand(...)) with the Keplars SDK (see code below)
Migrate SNS bounce/complaint topics: remove the SNS subscriptions and configure a Keplars webhook pointing to your existing handler endpoint
Migrate suppression list: export your SES suppression list and import contacts into Keplars via the Contacts API
Code Comparison
Before (AWS SES, JavaScript):
import { SESClient, SendEmailCommand } from '@aws-sdk/client-ses';
const ses = new SESClient({ region: 'us-east-1' });
await ses.send(new SendEmailCommand({
Source: '[email protected]',
Destination: { ToAddresses: ['[email protected]'] },
Message: {
Subject: { Data: 'Welcome!' },
Body: { Html: { Data: '<h1>Welcome aboard</h1>' } },
},
}));After (Keplars, JavaScript):
import { Keplars } from '@keplars/sdk';
const keplars = new Keplars({ apiKey: process.env.KEPLARS_API_KEY });
await keplars.emails.sendInstant({
to: ['[email protected]'],
subject: 'Welcome!',
html: '<h1>Welcome aboard</h1>',
is_html: true,
});Before (AWS SES, Python):
import boto3
ses = boto3.client('ses', region_name='us-east-1')
ses.send_email(
Source='[email protected]',
Destination={'ToAddresses': ['[email protected]']},
Message={
'Subject': {'Data': 'Welcome!'},
'Body': {'Html': {'Data': '<h1>Welcome aboard</h1>'}},
},
)After (Keplars, Python):
from keplars import Keplars
keplars = Keplars(api_key=os.environ.get('KEPLARS_API_KEY'))
keplars.emails.send_instant(
to=['[email protected]'],
subject='Welcome!',
html='<h1>Welcome aboard</h1>',
is_html=True,
)SNS Topic → Keplars Webhook Mapping
| SES + SNS Notification | Keplars Webhook Event |
|---|---|
| Bounce notification | email.bounced |
| Complaint notification | email.complained |
| Delivery notification | email.delivered |
Instead of subscribing an SNS topic to your Lambda or HTTP endpoint, configure a single Keplars webhook URL in Dashboard → Webhooks. All event types are delivered to one endpoint with a consistent JSON shape.
Keplars pricing is straightforward per-email with no separate charges for SNS notifications, CloudWatch metrics, or dedicated IP warm-up fees. For most workloads the total cost is significantly lower than an equivalent SES + SNS + SES Configuration Set setup.