Transactional Email

Transactional email API for your own Amazon SES or SMTP.

One POST call sends password resets, receipts and notifications through the Amazon SES account or SMTP server you already own. You keep your sending reputation and your per-email rate. We add what SES leaves out: stored message history, idempotent sends, signed webhooks and per-stream suppression, on the same platform as your marketing campaigns.

Simple API

One POST call to send.

No complex SDKs. Bearer token auth. Works with any language or framework. Full API reference →

// Send a transactional email POST /api/tx/v1/send Authorization: Bearer tx_your_api_key { "to": "user@example.com", "from": "you@yourdomain.com", "subject": "Your receipt #9001", "html": "<p>Thanks for your order.</p>", "idempotency_key": "order-9001" } // Response { "status": "queued", "message_id": "d5201056-b486-407a-..." }

Send from your stack

Copy-paste examples for the most common languages and frameworks.

curl -X POST https://mxa.aledamail.com/api/tx/v1/send \
  -H "Authorization: Bearer tx_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "user@example.com",
    "from": "you@yourdomain.com",
    "subject": "Your receipt #9001",
    "html": "<p>Thanks for your order.</p>",
    "idempotency_key": "order-9001"
  }'
const res = await fetch("https://mxa.aledamail.com/api/tx/v1/send", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.ALEDAMAIL_TX_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    to: "user@example.com",
    from: "you@yourdomain.com",
    subject: "Your receipt #9001",
    html: "<p>Thanks for your order.</p>",
    idempotency_key: "order-9001",
  }),
});
const data = await res.json(); // { status: "queued", message_id: "..." }
use Illuminate\Support\Facades\Http;

$res = Http::withToken(env('ALEDAMAIL_TX_KEY'))
    ->post('https://mxa.aledamail.com/api/tx/v1/send', [
        'to'              => 'user@example.com',
        'from'            => 'you@yourdomain.com',
        'subject'         => 'Your receipt #9001',
        'html'            => '<p>Thanks for your order.</p>',
        'idempotency_key' => 'order-9001',
    ]);

$messageId = $res->json('message_id');
import os, requests

res = requests.post(
    "https://mxa.aledamail.com/api/tx/v1/send",
    headers={"Authorization": f"Bearer {os.environ['ALEDAMAIL_TX_KEY']}"},
    json={
        "to": "user@example.com",
        "from": "you@yourdomain.com",
        "subject": "Your receipt #9001",
        "html": "<p>Thanks for your order.</p>",
        "idempotency_key": "order-9001",
    },
)
print(res.json()["message_id"])
What's included

Everything you need for reliable transactional sending.

Streams & API keys

Organize sends into streams — password-reset, receipts, alerts. Each stream gets its own API key for security and monitoring.

Full message history

Every message body and delivery event stored and searchable. See exactly what went out and when — crucial for debugging.

Open & click tracking

Track engagement on transactional emails just like marketing campaigns. Know when receipts are opened or links are clicked.

Delivery webhooks

Real-time delivery events pushed to your endpoint — delivered, opened, clicked, bounced, complained. HMAC-signed.

Suppression management

Per-stream suppression lists. Automatically suppress bounces and complaints before they damage your sender reputation.

Idempotent sends

Pass an idempotency key and we guarantee exactly-once delivery — even if your server retries. No duplicate receipts.

Template management

Store HTML templates server-side and reference them by ID. Update without deploying code.

Same platform as marketing

One login for marketing campaigns and transactional sending. Shared contacts, shared deliverability infrastructure.

How it compares

Everything raw Amazon SES doesn't give you.

SES is cheap and reliable at around $0.10 per 1,000 emails, but it's bare infrastructure. Aledamail sits on top of your SES (or any SMTP) and adds the developer layer, while sending still runs on your own account.

FeatureRaw Amazon SESAledamail + your SES
Send with one REST call + bearer token✗ AWS SDK / SigV4 signing✓ Yes
Message bodies stored & searchable✗ No✓ Always
Delivery webhooksManual SNS / EventBridge setup✓ Built in, HMAC-signed
Open & click trackingManual configuration sets✓ Built in
Idempotent sends✗ No✓ Yes
Bounce & complaint suppressionAccount-level only✓ Per stream
Marketing campaigns on the same platform✗ No✓ Yes
Who owns the sending reputationYou✓ Still you
CostSES usageSES usage + flat plan, free tier available
FAQ

Transactional email API questions

What is a transactional email API?

A transactional email API lets your application send one-to-one emails triggered by user actions, like password resets, receipts, sign-up confirmations and alerts, with a single HTTP request. With Aledamail, one authenticated POST to /api/tx/v1/send queues the email and returns a message ID you can track.

What's the difference between transactional and marketing email?

Transactional emails are triggered by something the recipient did and are expected, so they need to arrive fast and reliably. Marketing emails are sent in bulk to lists. Aledamail handles both on one platform, and transactional sends are prioritised over campaign sends.

Do I need my own sending provider?

Yes. Aledamail sends through the Amazon SES account or SMTP server you connect, so you keep full control of your sending reputation and pay your provider directly. Most teams use Amazon SES. Setup guides for SES and SMTP are in the docs.

Is there a rate limit on transactional sends?

There is no hard rate limit. Transactional sends are processed immediately and prioritised over campaign sends. Bursts above 100 emails per second may be queued briefly to protect your sending reputation.

Are message bodies stored?

Yes. Every message body and delivery event is stored and searchable, so you can see exactly what was sent, to whom and when. That makes debugging and customer support much easier.

How do I prevent duplicate emails when my server retries?

Pass an idempotency_key with each send. If the same key arrives again, Aledamail won't send a second copy, so retries never cause duplicate receipts or password resets.

Can I manage email templates outside my code?

Yes. Store HTML templates server-side and reference them with template_id in the API call, so you can change content without redeploying your app.

What happens when an email bounces or gets a spam complaint?

Bounces and complaints are suppressed automatically per stream, so you don't keep sending to bad addresses. Delivery events (delivered, opened, clicked, bounced, complained) are pushed to your endpoint through HMAC-signed webhooks.

Get started today.

Free plan available. No credit card required.

Start free →