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-staging.avelto.dev/v1/emails \
-H "Authorization: Bearer av_test_..." \
-H "Content-Type: application/json" \
-d '{
"from": "[email protected]",
"to": "[email protected]",
"subject": "Hello from Avelto",
"text": "It works."
}'The API answers 201 Created with the email id:
HTTP/1.1 201 Created
Content-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-staging.avelto.dev/v1/emails/9c1f4a52-6f6e-4b8f-9b8e-2e1a5c7d3f10 \
-H "Authorization: Bearer av_test_..."{
"id": "9c1f4a52-6f6e-4b8f-9b8e-2e1a5c7d3f10",
"mode": "test",
"from": "[email protected]",
"to": ["[email protected]"],
"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": ["[email protected]"] },
"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.
For its first 7 days every account is capped at 100 live emails a day and 5 domains, whatever the plan. A live send past the daily cap is refused with 429 plan_limit until midnight UTC. Test sends do not count, so a load test belongs on a test key. Details on Plans and limits.
Every request in the docs is shown in the same seven languages. Node uses the SDK (npm install @avelto/sdk); the others are plain HTTPS with a common client for the language, so anything that can make an HTTPS request works. Choose a tab once and every page remembers it, or set your stack in the sidebar. The quickstarts repeat these steps inside Next.js, Express, Fastify, Django, Laravel, Rails and more.
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.