Skip to content

SendFleet · Transactional Email API Your SES or
ours. One API. One endpoint, two sending modes.

Route transactional email through your own AWS SES account, with message bodies never stored in our database, or use our managed infrastructure. Same sending endpoint. Same keys. Your choice.

BYOC: Your SES, your data
Managed, zero AWS setup
$0 to get started
BYOC no bodies stored
$5 managed, zero AWS setup
1 endpoint for both modes
sendfleet · POST /v1/send
curl -X POST https://api.sendfleet.net/v1/send \
  -H "X-API-Key: sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "to":         "user@example.com",
    "from_email": "hello@yourdomain.com",
    "from_name":  "Acme",
    "subject":    "Your order is confirmed",
    "message":    "Thanks for your order!"
  }'
import requests

response = requests.post(
    "https://api.sendfleet.net/v1/send",
    headers={"X-API-Key": "sk_live_your_key"},
    json={
        "to":         "user@example.com",
        "from_email": "hello@yourdomain.com",
        "subject":    "Your order is confirmed",
        "message":    "Thanks for your order!",
    },
)
data = response.json()  # {"success": true, "mode": "byoc"}
const res = await fetch("https://api.sendfleet.net/v1/send", {
  method: "POST",
  headers: {
    "X-API-Key":      "sk_live_your_key",
    "Content-Type":  "application/json",
  },
  body: JSON.stringify({
    to:         "user@example.com",
    from_email: "hello@yourdomain.com",
    subject:    "Your order is confirmed",
    message:    "Thanks for your order!",
  }),
});
const { message_id, mode } = await res.json();
// mode → "byoc" | "shared"
<?php
$payload = json_encode([
    'to'         => 'user@example.com',
    'from_email' => 'hello@yourdomain.com',
    'subject'    => 'Your order is confirmed',
    'message'    => 'Thanks for your order!',
]);
$ch = curl_init('https://api.sendfleet.net/v1/send');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => $payload,
    CURLOPT_HTTPHEADER     => [
        'X-API-Key: sk_live_your_key',
        'Content-Type: application/json',
    ],
]);
$data = json_decode(curl_exec($ch), true);
body, _ := json.Marshal(map[string]string{
    "to":         "user@example.com",
    "from_email": "hello@yourdomain.com",
    "subject":    "Your order is confirmed",
    "message":    "Thanks for your order!",
})
req, _ := http.NewRequest("POST",
    "https://api.sendfleet.net/v1/send",
    bytes.NewBuffer(body))
req.Header.Set("X-API-Key", "sk_live_your_key")
req.Header.Set("Content-Type", "application/json")
http.DefaultClient.Do(req)
200 OK: queued
mode: byoc

BYOC and Shared SES,
side by side.

Same API. Same dashboard. The difference is whose AWS account actually sends the mail, and who stores what.

Shared SES: Managed

SendFleet handles
everything.

We handle delivery on our managed AWS infrastructure. Zero AWS setup, verify your domain, drop in a DNS record, you're sending. Full email logs in your dashboard. Bounce and complaint handling built in. Webhook events for every state change.

Managed Starter at $5/month (5k emails), Managed Growth at $15/month (25k emails), or Managed Pro at $59/month (100k emails). Requires account email verification and a verified sending domain.
Zero AWS setup Full email logs Webhook events Bounce handling
BYOC: Bring Your Own SES

Your AWS.
Your data. Always.

Email routes through your own AWS SES account using short-lived temporary credentials we obtain per send. Message bodies never touch our database, and recipients and subjects are kept only while email logs are on, for 14 days. Your sender reputation lives entirely in your account, isolated from every other SendFleet customer.

Free BYOC is free forever (3,000 emails/month). The BYOC plan is $5/month with 20,000 emails included, then $0.10 per 1,000, with delivery tracking, webhooks and bounce protection from your own SES.
No bodies stored Your reputation Your SES limits ExternalId protected

What the API
guarantees.

01

SHA-512 hashed API keys

We store only a hash, the raw secret is shown once and never persisted. Prefix-based lookup keeps DB queries fast. Revoke any key instantly, set optional expiry dates.
02

Integrity-checked queue

Every send request is cryptographically signed before it enters our processing pipeline, and verified again before delivery. Tampered or unsigned messages are rejected, never delivered.
03

Idempotent delivery

Every send carries a unique idempotency key. Duplicate retries from transient network issues are safely de-duplicated, your recipient sees exactly one copy.
04

Webhook delivery events

Subscribe your HTTPS endpoint to sent, delivered, bounced, complained, and failed events. Signed payloads on every request. Managed plans only: BYOC respects your data privacy.
05

Rate limiting & deliverability protection

60 requests/minute per key. Failed auth attempts are tracked and throttled. Bounce and complaint rates are monitored continuously across rolling windows, so a spike is caught early - accounts that cross our thresholds have sending paused automatically. See the Suppression and Suspension for what that means for you.
06

Full DNS verification suite

Guided setup for SPF, DKIM, MAIL FROM, and DMARC. Per-record verify buttons. BYOC domains are registered directly in your SES. DNS propagation up to 48 hours, check status anytime.

Three steps to your first send.

BYOC or Shared SES: both modes share the same onboarding flow up to step 3.

01

Create a free account

Register with your email, no credit card, no approval process, instant access. The Free BYOC plan (3,000 BYOC emails/month) works immediately without any AWS configuration on our end.
02

Add a sending domain

For BYOC: connect your AWS account with one click, and we register the domain in your SES. For Shared SES: subscribe to a Managed plan and add DNS records. Both modes give you exact records to copy.
03

Generate a key and send

Create an API key (shown once, store it). Then POST /v1/send with X-API-Key: your_key. That's the entire integration. Delivery happens in the background.

Running WordPress? The official SendFleet plugin is step 3 for you: paste the key and every wp_mail() email goes through SendFleet, with no SMTP settings. Free on WordPress.org.

Plans and prices,
side by side.

Start free. Scale when you're ready. Switch modes anytime.

Free BYOC

$0
free, forever
  • ✓3,000 emails/month via your own SES
  • ✓Unlimited API keys
  • ✓Full dashboard access
  • ✓Shared SES smoke test, to your own address only
  • − Email log history
  • − Webhook events
Pay as you go

BYOC

$5
per month + usage
  • ✓20,000 emails/month included, then $0.10 per 1,000
  • ✓One-click AWS connection
  • ✓Delivery tracking, webhooks and email logs
  • ✓Bounce and complaint protection
  • ✓Production access requested for you
  • ✓Your SES reputation, never shared
Recommended to start

Managed Starter

$5
per month
  • ✓5,000 emails/month
  • ✓Full email log history
  • ✓Webhook delivery events
  • ✓Bounce & complaint handling
  • ✓Priority email support

Managed Growth

$15
per month
  • ✓25,000 emails/month
  • ✓Full email log history
  • ✓Webhook delivery events
  • ✓Bounce & complaint handling
  • ✓Domain verification (Shared SES)
  • ✓Priority email support

Managed Pro

$59
per month
  • ✓100,000 emails/month
  • ✓Everything in Growth
  • ✓Priority support + SLA
  • ✓Advanced analytics

Frequently asked questions.

BYOC means your emails send through your own AWS SES account. We use short-lived temporary credentials from your IAM role. SendFleet processes your request for delivery and never stores message bodies in its database; recipients and subjects are kept only while email logs are on. Attachments are held temporarily for delivery and then deleted. You need an AWS account you can create an IAM role in; connecting it is one click, and if SES is still in the sandbox, SendFleet can request production access for you.

BYOC routes email through your AWS account, your reputation, your SES limits, and no message bodies stored on our side. Shared SES sends via our managed AWS infrastructure, stores your email logs in your dashboard, and requires no AWS setup. Both use the exact same API endpoint.

We store only a SHA-512 hash of your key, so your stored key cannot be read back. The raw secret is shown exactly once, when you create it. Each key also carries a short public label, so you can tell your keys apart in the dashboard. You can revoke a key from the dashboard, and a revoked key stops authenticating immediately.

ExternalId is a unique 48-character value generated when you save your BYOC config. It must appear in your IAM trust policy's Condition block. Without it, any party who learns your Role ARN could ask our infrastructure to assume it, the "confused deputy" attack. With ExternalId, only requests carrying the correct value (only we know it) can assume your role.

Yes. Plans and domains are independent. Note that sending domains are registered to a specific mode at creation time: BYOC domains live in your SES, Shared domains live in ours. Adding a new domain after switching modes takes a few minutes but is fully self-serve.

API requests beyond your plan's monthly limit return HTTP 429 until the billing period resets. You can upgrade to the next Managed tier anytime: Starter (5k) → Growth (25k) → Pro (100k), and the new limit applies immediately, no waiting for the next cycle.

Yes. 3,000 BYOC emails per month, no credit card, no time limit, with delivery tracking and bounce protection, enough to run a real project before choosing a paid plan. Upgrade to the $5/month BYOC plan, with 20,000 emails included and $0.10 per 1,000 after that, with no other changes to your code.

One endpoint.
Two sending modes.

Start free with 3,000 emails/month on your own AWS SES: no credit card. Or skip AWS entirely with Managed SES from $5/month.