Deliver a transactional email with a single request.
POST/v1/emails
Bearer tokenJSON request body202 Accepted
Body parameters
application/json
fromstringrequired
The sender’s email address. Must belong to a verified domain, or use the test sender in test mode.
"Northstar <hello@northstar.studio>"
tostring[]required
Recipient email addresses. Up to 50 recipients per request.
["alex.morgan@example.com"]
subjectstringrequired
The email subject. Maximum 998 characters.
"Your Northstar receipt"
htmlstringconditional
Required if text is omitted. Provide HTML, plain text, or both.
"<p>Thanks for your order, Alex.</p>"
textstringconditional
Required if html is omitted. If HTML is provided, we generate a plain-text version when text is omitted.
reply_tostringoptional
The address that receives replies. Defaults to the sender.
Send once. Even if you retry.
Set an Idempotency-Key header to safely retry a request. Reusing the same key and body returns the original response for 24 hours.
Idempotency-Key: order_ns_1048
A reused key with a different body returns 409 Conflict.
Response
202 Accepted
The email object confirms your request was accepted. Delivery status arrives separately through webhooks.
idstring
Unique email identifier.
statusstring
queued when first accepted.
created_atstring
Creation time in ISO 8601 format.
Error codes
Errors return a consistent JSON body with a code, a message, and a request ID for troubleshooting.
HTTPCode & recovery
400
validation_errorCheck the field named in the error message.
401
invalid_api_keyCheck your Bearer token and environment.
403
domain_not_verifiedVerify the domain used in your sender address.
409
idempotency_conflictUse a new key when the request body changes.
429
rate_limit_exceededWait for the Retry-After interval before retrying.
500
internal_errorRetry with the same idempotency key.
Rate limits
Each workspace can send up to 100 requests per second. Read the X-RateLimit-Remaining header to see your current allowance. A 429 response includes Retry-After in seconds.