Send product email with an API you can trace. From accepted request to delivery.
Post a message with a small typed payload and get back an ID you can follow. Scoped keys, idempotent retries, signed outbound webhooks, and one error envelope everywhere.
✓Included on every tier, including free.
Accepted now. Observable later.
Request
POST /api/v1/emails
Authorization: Bearer aem_…
Idempotency-Key: welcome-8f21
{ "to": "[email protected]", "template": "welcome" }
202 Accepted
{ "id": "msg_7ca31", "status": "queued" }
[ 01 / 03 ]What it covers
The whole surface, not just a send endpoint.
Start with one request
A transactional message from a small typed payload, using a template you published.
Publish lifecycle events
Trigger flows from the events your application already emits.
Observe every result
Read message and delivery state, or take a signed webhook, instead of scraping a dashboard.
[ 02 / 03 ]Why it holds up
Acceptance and delivery are different states.
A send that waits on a third party puts that third party inside your request. So the call returns once the work is durably queued, and hands back the identifier that follows the real outcome.
- Setup mistakes still fail inline — an unpublished template or unverified sender is a 4xx, not a surprise later.
- Idempotency keys are unique per company, so a retried call never sends twice.
- Scopes are ranked read, write, admin — a valid key with too low a tier gets 403, never 401.
- Outbound webhooks are signed over the id, timestamp, and body together.
Accepted now. Observable later.
Request
POST /api/v1/emails
Authorization: Bearer aem_…
Idempotency-Key: welcome-8f21
{ "to": "[email protected]", "template": "welcome" }
202 Accepted
{ "id": "msg_7ca31", "status": "queued" }
Questions people ask us
Send one real message and keep its delivery trail.
Create a scoped key, send a message, and follow its ID to delivery.