Fetch the current status and details of a sent email
/v1/send/emails/{id}Return one email by its message id. The id is the value returned by Send Email or Send Batch.
curl https://api.do.dev/v1/send/emails/msg_3f9c2a1d7b8e4c0f9a1b2 \
-H "Authorization: Bearer $SEND_API_KEY"{
"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
}| Field | Type | Description |
|---|---|---|
id | string | Message id, prefixed msg_. |
from | object | { email, name? } as submitted. |
to | string[] | Recipients. |
cc | string[] | Present only if set. |
bcc | string[] | Present only if set. |
replyTo | string[] | Present only if set. |
subject | string | Subject as sent. For template sends, the substituted subject. |
status | string | Current delivery status. See below. |
statusDetails | string | Present when there is more to say, most often the bounce or failure reason. |
templateId | string | Present if the email was sent from a template. |
tags | string[] | Present only if set. |
metadata | object | Present only if set. |
createdAt | number | Unix time in milliseconds when the request was accepted. |
sentAt | number | When SES accepted the message. Present from sent onward. |
deliveredAt | number | When the receiving server accepted it. Present when status is delivered. |
bouncedAt | number | When the bounce was received. Present when status is bounced. |
The body (html, text) and attachments are not returned.
status | Meaning |
|---|---|
queued | Accepted and waiting for a worker. Normally lasts under a second. |
processing | A worker is building the message and handing it to SES. |
sent | SES accepted the message and is delivering it. |
delivered | The 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. |
bounced | The recipient's server rejected it. statusDetails has the reason. A hard bounce also adds the address to your suppression list. |
complained | The recipient marked the message as spam. The address is added to your suppression list. |
failed | The 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_permanent | Retries 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.
{
"error": {
"code": "not_found",
"message": "Email not found"
}
}