Quickstart

Send your first email in three steps. No domain setup needed: every account gets a sandbox sender and simulator recipients.

1. Get an API key

Sign in and create a key from the dashboard. You get two kinds:

  • av_test_… runs the full pipeline without sending anything. Events and webhooks still fire.
  • av_live_… sends real email.

Every request carries the key as a bearer token: Authorization: Bearer av_test_….

2. Send an email

The request below sends from your sandbox domain (sandbox.avelto.dev) to the delivered@ simulator address, which always reports a delivery. The sandbox sender and the simulator addresses both work with live and test keys.

curl -X POST https://api.avelto.dev/v1/emails \  -H "Authorization: Bearer av_test_..." \  -H "Content-Type: application/json" \  -d '{    "from": "you@sandbox.avelto.dev",    "to": "delivered@sandbox.avelto.dev",    "subject": "Hello from Avelto",    "text": "It works."  }'

The API answers 201 Created with the email id:

HTTP
HTTP/1.1 201 CreatedContent-Type: application/json{ "id": "9c1f4a52-6f6e-4b8f-9b8e-2e1a5c7d3f10" }

3. Watch it move

Fetch the email to see its status and every event so far.

curl https://api.avelto.dev/v1/emails/9c1f4a52-6f6e-4b8f-9b8e-2e1a5c7d3f10 \  -H "Authorization: Bearer av_test_..."
JSON
{  "id": "9c1f4a52-6f6e-4b8f-9b8e-2e1a5c7d3f10",  "mode": "test",  "from": "you@sandbox.avelto.dev",  "to": ["delivered@sandbox.avelto.dev"],  "cc": [],  "bcc": [],  "reply_to": null,  "subject": "Hello from Avelto",  "tags": [],  "status": "delivered",  "scheduled_at": null,  "created_at": "2026-09-17T10:12:04.000Z",  "updated_at": "2026-09-17T10:12:06.000Z",  "html": null,  "text": "It works.",  "headers": {},  "unsubscribe_url": null,  "idempotency_key": null,  "attachments": [],  "domain_id": null,  "ses_message_id": "test-9c1f4a52-6f6e-4b8f-9b8e-2e1a5c7d3f10",  "error": null,  "events": [    {      "id": "e1f0c3a4-8b2d-4c6e-9a1f-5d7b3e2c8a90",      "type": "email.queued",      "payload": {},      "occurred_at": "2026-09-17T10:12:04.000Z"    },    {      "id": "a7c2e9d1-3f4b-4a8e-b6c0-2d9e1f7b5c34",      "type": "email.sent",      "payload": { "test": true, "ses_message_id": "test-9c1f4a52-6f6e-4b8f-9b8e-2e1a5c7d3f10" },      "occurred_at": "2026-09-17T10:12:06.000Z"    },    {      "id": "c4b8d2f6-7e1a-4d3c-8f9b-6a2e0c5d1b78",      "type": "email.delivered",      "payload": { "test": true, "recipients": ["delivered@sandbox.avelto.dev"] },      "occurred_at": "2026-09-17T10:12:06.000Z"    }  ]}

Status goes queued, then sent, then delivered (or bounced, complained, failed). The events array is the full log.

What next

  • Send email covers every field: multiple recipients, attachments, headers, tags, scheduling and idempotency.
  • Domains walks through sending from your own domain. Until a domain is verified, the sandbox sender only delivers to your own verified account email and the simulator addresses.
  • Webhooks push events to your app as they happen.
  • The API reference lists every route, field and error code.
  • Code that already sends over SMTP can use the SMTP relay instead: the username is avelto and the password is an API key.
  • Moving from Resend? Import from Resend brings your domains, templates, webhooks and suppression list across from the dashboard, and lists what to change in your code.
  • Rather have an AI agent do it? The MCP server integrates Avelto into a new or existing project, and with a key for an AI agent it sets the account up too.