Get one received message and its history

Search Documentation

Search across all developer documentation

inbound

Get one received message and its history

GET /v1/inbound/messages/{messageId}
Auth required api.inbound.view

The message's latest state plus every state it passed through, oldest first. history is the answer to "it says delivered now, but did something go wrong first?", which the folded list row cannot answer by construction.

A message addressed to two configured receiving domains is two deliveries with two histories; pass domain to narrow to one.

A message id unknown to your org is a 404 and never confirms that some other org received one with that id.

Path parameters

messageId string required

The SES message id. An opaque string, NOT a UUID — it is also the raw object's key suffix in your own landing bucket.

Query parameters

domain string optional

Narrow to one receiving domain's delivery of this message.

Responses

Errors follow the RFC 7807 problem format — see the error reference.

200 The message and its history application/json
message_id string required
domain string required

The receiving domain this row is about. A message addressed to two configured domains produces two rows.

recipient string required

The address at domain this delivery was for.

recipients array<string> required

The whole SES envelope recipient list, which may include addresses at other domains entirely.

from string required
subject string required
received_at string<date-time> required
outcome string enum required

Only parked is NOT terminal: the raw message is still in your own bucket and a replay can still deliver it. no_route means the recipient matched nothing in the domain's allow_patterns; dropped means a verdict posture discarded it; rejected means your endpoint answered with a 4xx that was not 429, which is a definitive no and is not retried.

One of: delivered, rejected, dropped, no_route, parked

reason string optional
detail string optional
verdicts object required

SES's scan and authentication findings. The empty string IS A REAL VALUE and not a missing one: a replayed message carries no verdicts at all, because SES's results live only in the original notification and are gone by replay time.

Fields of verdicts:

spam string enum required

One of: ``, pass, fail, gray, processing_failed, disabled

virus string enum required

One of: ``, pass, fail, gray, processing_failed, disabled

spf string enum required

One of: ``, pass, fail, gray, processing_failed, disabled

dkim string enum required

One of: ``, pass, fail, gray, processing_failed, disabled

dmarc string enum required

One of: ``, pass, fail, gray, processing_failed, disabled

webhook_status integer required

The HTTP status of the last delivery attempt, 0 when none was made.

attempts integer required
is_auto_reply boolean required

A hint read off Auto-Submitted, Precedence and the X-Auto* headers, not a verdict.

is_reply boolean required

True when SendOps correlated this to something it sent.

history array<object> required

Every outcome recorded for this message, oldest first. It is the answer to "it says delivered now, but did something go wrong first?", which the folded list row cannot answer by construction.

Each entry in history:

message_id string required
domain string required

The receiving domain this row is about. A message addressed to two configured domains produces two rows.

recipient string required

The address at domain this delivery was for.

recipients array<string> required

The whole SES envelope recipient list, which may include addresses at other domains entirely.

from string required
subject string required
received_at string<date-time> required
outcome string enum required

Only parked is NOT terminal: the raw message is still in your own bucket and a replay can still deliver it. no_route means the recipient matched nothing in the domain's allow_patterns; dropped means a verdict posture discarded it; rejected means your endpoint answered with a 4xx that was not 429, which is a definitive no and is not retried.

One of: delivered, rejected, dropped, no_route, parked

reason string optional
detail string optional
verdicts object required

SES's scan and authentication findings. The empty string IS A REAL VALUE and not a missing one: a replayed message carries no verdicts at all, because SES's results live only in the original notification and are gone by replay time.

Fields of verdicts:

spam string enum required

One of: ``, pass, fail, gray, processing_failed, disabled

virus string enum required

One of: ``, pass, fail, gray, processing_failed, disabled

spf string enum required

One of: ``, pass, fail, gray, processing_failed, disabled

dkim string enum required

One of: ``, pass, fail, gray, processing_failed, disabled

dmarc string enum required

One of: ``, pass, fail, gray, processing_failed, disabled

webhook_status integer required

The HTTP status of the last delivery attempt, 0 when none was made.

attempts integer required
is_auto_reply boolean required

A hint read off Auto-Submitted, Precedence and the X-Auto* headers, not a verdict.

is_reply boolean required

True when SendOps correlated this to something it sent.

401 Missing, malformed, or unknown API key application/problem+json
403 Key lacks the required scope or plan limit violated application/problem+json
404 Resource not found application/problem+json
429 Per-org rate limit exceeded application/problem+json
500 Unexpected server-side failure. The code is internal_error. The request_id field can be quoted to SendOps support to investigate. application/problem+json