Scheduling
Schedule a transactional email up to 30 days ahead, then reschedule or cancel it before it sends.
Schedule a transactional email up to 30 days ahead by passing scheduled_at to
POST /emails. Until it sends, the email sits in status
scheduled and can be rescheduled or canceled.
Schedule a send
scheduled_at accepts an ISO 8601 timestamp or a natural-language time like
"in 1 hour" or "tomorrow at 9am", parsed server-side (relative phrasings
resolve in UTC). It must resolve to a time in the future and at most 30 days out.
All send checks — domain verification, suppression, and your daily and monthly
limits — run at schedule time, and the send is debited from your monthly quota
immediately (canceling refunds it). Recipients who get suppressed between
scheduling and the send time are still dropped at send time.
curl -X POST https://api.eusend.dev/emails \
-H "Authorization: Bearer eu_live_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"from": "noreply@acme.com",
"to": "alice@example.com",
"subject": "Your trial ends tomorrow",
"html": "<p>Reminder: your trial ends in 24 hours.</p>",
"scheduled_at": "2026-07-03T09:00:00Z"
}'{
"id": "9a8b7c6d-5e4f-4a3b-8c1d-0e9f8a7b6c5d"
}Reschedule
/emails/:idMove a scheduled email to a new time. Only emails still in status scheduled
can be rescheduled — once sending has started this returns 409 CONFLICT.
| Parameter | Type | Description |
|---|---|---|
scheduled_atrequired | string (ISO 8601 or natural language) | The new send time — an ISO 8601 timestamp or natural language like "in 1 hour" (parsed server-side). Must resolve to the future, at most 30 days out. |
curl -X PATCH https://api.eusend.dev/emails/9a8b7c6d-5e4f-4a3b-8c1d-0e9f8a7b6c5d \
-H "Authorization: Bearer eu_live_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "scheduled_at": "2026-07-04T09:00:00Z" }'{
"id": "9a8b7c6d-5e4f-4a3b-8c1d-0e9f8a7b6c5d",
"status": "scheduled",
"scheduled_at": "2026-07-04T09:00:00.000Z"
}Cancel
/emails/:id/cancelCancel a scheduled email before it sends. The email moves to the terminal status
canceled and the send is refunded to your monthly quota. Like reschedule, this
returns 409 CONFLICT once sending has started.
curl -X POST https://api.eusend.dev/emails/9a8b7c6d-5e4f-4a3b-8c1d-0e9f8a7b6c5d/cancel \
-H "Authorization: Bearer eu_live_xxxxxxxxxxxx"{
"id": "9a8b7c6d-5e4f-4a3b-8c1d-0e9f8a7b6c5d",
"status": "canceled"
}Scheduling is per-email and not available on the batch endpoint. For
scheduling a campaign to an audience, use Broadcasts —
they have their own scheduled_at.