Keplars

Migrate from AWS SES

Replace AWS SES with Keplars: swap IAM credentials, migrate SNS topics to webhooks

Migrate from AWS SES

API Comparison

AWS SESKeplars
Send methodSendEmail / SendRawMessage APIPOST /api/v1/send-email/instant
AuthIAM Access Key + Secret (SigV4)Single API key in Authorization header
Bounce notificationsSNS topic subscriptionemail.bounced webhook
Complaint notificationsSNS topic subscriptionemail.complained webhook
Suppression listSES account-level suppressionKeplars contact management
Sandbox modeAWS 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 keplars

Verify 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 NotificationKeplars Webhook Event
Bounce notificationemail.bounced
Complaint notificationemail.complained
Delivery notificationemail.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.

On this page