SendFleet · Transactional Email API
Your SES or
ours.
One API.
One endpoint, two sending modes.
Route transactional email through your own AWS SES account, zero data stored on our servers, or use our managed infrastructure. Same REST endpoint. Same keys. Your choice.
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)
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.
SendFleet handles
everything.
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.
Your AWS.
Your data. Always.
Free BYOC is free forever (50 emails/month). $9/month for 1,000,000 sends a month, still your SES, your limits.
What the API
guarantees.
SHA-512 hashed API keys
Integrity-checked queue
Idempotent delivery
Webhook delivery events
Rate limiting & deliverability protection
Full DNS verification suite
Three steps to your first send.
BYOC or Shared SES: both modes share the same onboarding flow up to step 3.
Create a free account
Add a sending domain
Generate a key and send
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
- ✓50 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
BYOC
- ✓1,000,000 emails/month, your AWS SES quota also applies
- ✓Unlimited API keys
- ✓Complete data privacy
- ✓Your SES reputation & limits
- ✓Domain verification via your SES
- ✓Priority email support
Managed Starter
- ✓5,000 emails/month
- ✓Full email log history
- ✓Webhook delivery events
- ✓Bounce & complaint handling
- ✓Priority email support
Managed Growth
- ✓25,000 emails/month
- ✓Full email log history
- ✓Webhook delivery events
- ✓Bounce & complaint handling
- ✓Domain verification (Shared SES)
- ✓Priority email support
Managed Pro
- ✓100,000 emails/month
- ✓Everything in Growth
- ✓Priority support + SLA
- ✓Advanced analytics
The API reference.
Six pages that answer the questions the API contract raises.
Five things only we do.
And four where somebody else wins.
Every figure was read off that provider's own pricing page. The rows where we lose stay in, because a comparison with nothing in it against us is not a comparison.
| SendFleet | Amazon SES | Resend | Postmark | |
|---|---|---|---|---|
| Send through your own cloud account | Yes, on BYOC | Your account, but you build the integration | No | No |
| Recipient, subject and body held by the provider | Never, on BYOC | Whatever you build | Email logs | Message streams |
| Flat price for up to 1,000,000 emails a month | Yes, $9 a month on BYOC | Metered per email | Tiered, then overage | Tiered, then overage |
| Cheapest paid plan | $5 for 5,000 emails | Metered, $0.10 per 1,000 | $20 for 50,000 | $15 for 10,000 |
| Change which account sends, per domain, on one key | Yes | One account | No | No |
| Free tier | 50 a month, permanent, no card | 3,000 a month, first 12 months only | 3,000 a month, 100 a day | 100 a month, permanent, no card |
| Cheapest at 100,000 a month | $16, on SES direct rather than with us | $16 | $35, cheaper than us | $18 plus $1.20 per 1,000 |
| Sandbox to get out of first | Only on BYOC | Yes | No, they publish that | Review before sending to others |
| Published deliverability figure | None | None | None | Yes, and they lead with it |
The five green rows are why this product exists, and none of the three other columns has an answer to any of them. That is the whole pitch. The four rows underneath are where one of them beats us or where we have nothing to show, and they are here because a table with only the easy rows in it is a table nobody believes.
Frequently asked questions.
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.