Every dashboard action is an MCP tool your agent can call.Read the docs

Send emails from any language

One REST API for transactional and marketing email. Pick your language for a copy-paste example, or call it from anything that speaks HTTP.

✓Free to start. Unlimited contacts on every tier.

Server quickstart
Languages

One request, complete trace

Request

POST /api/v1/emails

Authorization: Bearer aem_…

Idempotency-Key: welcome-8f21

{ "to": "[email protected]", "template": "welcome" }

202 Accepted

{ "id": "msg_7ca31", "status": "queued" }

RuntimeServer process
RequestPOST /api/v1/emails
Result202 · queued
Credentials stay server-side

[ 01 / 04 ]Quickstart

How do I send email from my server?

Every language guide follows the same three steps. Here they are with curl.

  1. Create an API key

    In the dashboard, open Settings → API & MCP and create a key with the Send + manage permission (the default). It starts with aem_ and is shown once.

  2. Store it as an environment variable

    Keep the key on your server, never in browser or mobile code.

    Terminal
    export AEM_KEY="aem_..."
  3. Send the email

    POST the recipient and the slug of a published template. A retry with the same Idempotency-Key won't send a second email.

    Terminal
    curl -X POST https://sendandretain.com/api/v1/emails \
      -H "Authorization: Bearer $AEM_KEY" \
      -H "Content-Type: application/json" \
      -H "Idempotency-Key: welcome-123" \
      -d '{"to": "[email protected]", "template": "welcome"}'
  4. Keep the message ID

    A 202 means queued, not delivered. Store the id; delivery, bounce, and complaint events arrive later on your signed webhook.

    202 Accepted
    { "id": "msg_7ca31", "status": "queued" }

[ 02 / 04 ]In production

What does every email integration need?

The language changes. These four habits don't.

01

Send from the server

Call the API after the action commits, with the key read from server config.

02

Retry with the same key

Retry timeouts and 5xx errors with the same Idempotency-Key. Don't retry validation or auth errors.

03

Verify webhooks on the raw body

Check the signature before any JSON parsing, then handle repeats safely.

04

Send events for marketing email

Post product events like signup. Automations you've turned on decide what goes out.

Built into every step

    [ 03 / 04 ]Example prompts

    What can you ask your coding agent to do?

    Paste these into Claude Code, Cursor, or Codex. Connect the MCP server and it can build the templates and automations too.

    • First send

      “Find where we create users and send a welcome email with the Send & Retain API. Read the key from AEM_KEY and use the user ID as the idempotency key.”

    • Retries

      “Add retries to our email sends. Reuse the same Idempotency-Key and never retry 4xx errors.”

    • Webhooks

      “Add an endpoint that verifies Send & Retain webhook signatures on the raw body and flags bounced addresses in our database.”

    • Trial automation

      “Send a trial_started event to Send & Retain when a trial begins, then build a paused trial automation for it.”

    Questions people ask us

    Send your first email today.

    Create a key, make one call, and follow the message ID to the inbox.