Skip to main content

POST /emails

Send an email to one or more recipients.

Authentication

API Key (Bearer token)

Request Body

FieldTypeRequiredDescription
fromstringYesSender email address, e.g. you@domain.com or Name <you@domain.com> (must match API key’s domain)
tostring[]YesRecipient email addresses
subjectstringYesEmail subject line
htmlstringNoHTML content
textstringNoPlain text content
ccstring[]NoCC recipients
bccstring[]NoBCC recipients
reply_tostring[]NoReply-to addresses
attachmentsobject[]NoFile attachments (max 10)
attachments[].filenamestringYesFile name
attachments[].contentstringYesBase64-encoded content
attachments[].contentTypestringNoMIME type
tagsobjectNoKey-value metadata tags
send_atstringNoISO 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

StatusErrorCause
400Validation errorMissing required fields
403Email not verifiedVerify your email at the dashboard
403Domain not verifiedVerify DNS records for your domain
403From domain mismatchFrom address must match API key’s domain
429Daily/monthly limit reachedUpgrade plan or wait