POST /emails
Send an email to one or more recipients.
Authentication
API Key (Bearer token)
Request Body
| Field | Type | Required | Description |
|---|
from | string | Yes | Sender email address, e.g. you@domain.com or Name <you@domain.com> (must match API key’s domain) |
to | string[] | Yes | Recipient email addresses |
subject | string | Yes | Email subject line |
html | string | No | HTML content |
text | string | No | Plain text content |
cc | string[] | No | CC recipients |
bcc | string[] | No | BCC recipients |
reply_to | string[] | No | Reply-to addresses |
attachments | object[] | No | File attachments (max 10) |
attachments[].filename | string | Yes | File name |
attachments[].content | string | Yes | Base64-encoded content |
attachments[].contentType | string | No | MIME type |
tags | object | No | Key-value metadata tags |
send_at | string | No | ISO 8601 datetime to schedule the email |
Either html or text (or both) must be provided.
Scheduling
Pass send_at with a future ISO 8601 datetime to schedule the email instead of sending immediately.
{
"send_at": "2026-03-08T15:00:00Z"
}
Scheduled emails can be updated or cancelled before the scheduled time.
Response
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"from": "you@yourdomain.com",
"to": ["user@example.com"],
"created_at": "2026-03-07T12:00:00Z"
}
Example
curl -X POST https://app.usesendi.com/api/emails \
-H "Authorization: Bearer snd_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"from": "you@yourdomain.com",
"to": ["user@example.com"],
"subject": "Hello from Sendi",
"html": "<p>It just works.</p>"
}'
Errors
| Status | Error | Cause |
|---|
400 | Validation error | Missing required fields |
403 | Email not verified | Verify your email at the dashboard |
403 | Domain not verified | Verify DNS records for your domain |
403 | From domain mismatch | From address must match API key’s domain |
429 | Daily/monthly limit reached | Upgrade plan or wait |