Batch, scheduling & idempotency
Batch sending
POST /emails/batch sends up to 100 emails in one request. Each item takes the same fields as POST /emails, except attachments and scheduled_at.
curl https://api.jumploon.com/emails/batch \
-H "Authorization: Bearer $JUMPLOON_API_KEY" -H "Content-Type: application/json" \
-d '[
{ "from": "Acme <hello@acme.com>", "to": ["ada@example.org"], "subject": "Hi Ada", "html": "<p>Hello Ada</p>" },
{ "from": "Acme <hello@acme.com>", "to": ["grace@example.org"], "subject": "Hi Grace", "html": "<p>Hello Grace</p>" }
]'
# → { "data": [{ "id": "…" }, { "id": "…" }] }By default the batch is strict: if any email is invalid, none are sent and you get a 422 naming the bad one. To send the valid emails and get errors for the rest, add the header x-batch-validation: permissive:
{
"data": [{ "id": "…" }],
"errors": [{ "index": 1, "message": "The `to` field must contain at least one address." }]
}Scheduling
Set scheduled_at to send later, up to 30 days ahead. It takes an ISO 8601 timestamp or a phrase of the form in <number> <unit>, such as minutes, hours or days:
{ "scheduled_at": "2026-11-01T09:00:00+01:00" }
{ "scheduled_at": "in 2 hours" }
{ "scheduled_at": "in 3 days" }A scheduled email can be changed or canceled until its first delivery attempt:
# Reschedule
curl -X PATCH https://api.jumploon.com/emails/<id> \
-H "Authorization: Bearer $JUMPLOON_API_KEY" -H "Content-Type: application/json" \
-d '{ "scheduled_at": "in 1 day" }'
# Cancel
curl -X POST https://api.jumploon.com/emails/<id>/cancel \
-H "Authorization: Bearer $JUMPLOON_API_KEY"With the v3 API, use send_at (a Unix timestamp, up to 72 hours ahead).
Idempotency
Networks fail. If your request times out, you don't know whether the email was sent. Send an Idempotency-Key header and you can retry safely:
curl https://api.jumploon.com/emails \
-H "Authorization: Bearer $JUMPLOON_API_KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: receipt-1042" \
-d '{ "from": "Acme <hello@acme.com>", "to": ["ada@example.org"], "subject": "Receipt #1042", "html": "…" }'- Repeating a key with the same request within 24 hours returns the first response. No second email is sent.
- Repeating a key with a different request returns
409 Conflict. - Failed requests aren't remembered, so a request that failed can be retried with the same key.
Use something that identifies the action, such as receipt-<order id> or welcome-<user id>.