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
aveltoand 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.