Get Email

Fetch the current status and details of a sent email

GET/v1/send/emails/{id}

Return one email by its message id. The id is the value returned by Send Email or Send Batch.

Requires:send:read
Get an email
curl https://api.do.dev/v1/send/emails/msg_3f9c2a1d7b8e4c0f9a1b2 \
-H "Authorization: Bearer $SEND_API_KEY"
Response200
{
"id": "msg_3f9c2a1d7b8e4c0f9a1b2",
"from": { "email": "receipts@mail.example.com", "name": "Example Store" },
"to": ["customer@example.net"],
"replyTo": ["support@example.com"],
"subject": "Your order #4821 has shipped",
"status": "delivered",
"tags": ["order-shipped"],
"metadata": { "orderId": "4821" },
"createdAt": 1757000000000,
"sentAt": 1757000001200,
"deliveredAt": 1757000003900
}

Response fields

FieldTypeDescription
idstringMessage id, prefixed msg_.
fromobject{ email, name? } as submitted.
tostring[]Recipients.
ccstring[]Present only if set.
bccstring[]Present only if set.
replyTostring[]Present only if set.
subjectstringSubject as sent. For template sends, the substituted subject.
statusstringCurrent delivery status. See below.
statusDetailsstringPresent when there is more to say, most often the bounce or failure reason.
templateIdstringPresent if the email was sent from a template.
tagsstring[]Present only if set.
metadataobjectPresent only if set.
createdAtnumberUnix time in milliseconds when the request was accepted.
sentAtnumberWhen SES accepted the message. Present from sent onward.
deliveredAtnumberWhen the receiving server accepted it. Present when status is delivered.
bouncedAtnumberWhen the bounce was received. Present when status is bounced.

The body (html, text) and attachments are not returned.

Statuses

statusMeaning
queuedAccepted and waiting for a worker. Normally lasts under a second.
processingA worker is building the message and handing it to SES.
sentSES accepted the message and is delivering it.
deliveredThe recipient's mail server accepted the message. This is the terminal success state; it does not mean the message was opened or landed in the inbox rather than spam.
bouncedThe recipient's server rejected it. statusDetails has the reason. A hard bounce also adds the address to your suppression list.
complainedThe recipient marked the message as spam. The address is added to your suppression list.
failedThe message could not be sent on this attempt. statusDetails has the reason (for example an attachment URL that could not be fetched). Transient failures are retried automatically.
failed_permanentRetries were exhausted and the message will not be sent. statusDetails has the last error.

Very old emails may show the legacy status pending, which meant the same as queued.

sent can be the final status you see for some recipients: not every receiving server reports delivery back, and SES does not synthesize a delivered event without one.

Errors

{
"error": {
  "code": "not_found",
  "message": "Email not found"
}
}