List received messages

Search Documentation

Search across all developer documentation

inbound

List received messages

GET /v1/inbound/messages
Auth required api.inbound.view

One page of mail your org RECEIVED, newest first, folded to the latest state per (message, receiving domain). A message that parked and was later redelivered is one row saying delivered, not two rows to reconcile; the states it passed through are on the detail route.

PII. Every row carries the sender's address, the recipient's address and the real subject line. Nothing is masked and no further scope unmasks anything — an inbound log that could not say who wrote in could not answer the question it exists for.

outcome is delivered, rejected, dropped, no_route or parked, and only parked is NOT terminal: the raw message is still in your own S3 bucket and a replay can still deliver it. no_route means the recipient did not match the domain's allow_patterns, dropped means a verdict posture discarded it, and rejected means your endpoint answered with a 4xx that was not 429 — it said no, definitively, so nothing retried.

verdicts values may be the empty string, which is a real value rather than a missing one: a replayed message carries no verdicts at all, because SES's results live only in the original notification.

Query parameters

from string<date-time> optional

Window start (RFC 3339). Defaults to 30 days ago.

to string<date-time> optional

Window end (RFC 3339). Defaults to now.

limit integer optional

Page size (1–200). Default 50.

cursor string optional

Opaque cursor returned from the previous page.

domain string optional

Narrow to one receiving domain, by name.

outcome string enum optional

Narrow to one outcome. An unknown value is 422, not an empty page.

verdict string enum optional

Narrow to messages that failed one SES check.

q string optional

Free-text match over sender, recipient and subject.

Responses

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

200 Cursor-paginated list of received messages application/json
data array<object> required

Each entry in data:

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.

pagination object required

Fields of pagination:

has_more boolean required
next_cursor string | null optional
401 Missing, malformed, or unknown API key application/problem+json
403 Key lacks the required scope or plan limit violated application/problem+json
422 A query parameter, path value or body field failed validation. The body is a validation_failed Problem. When the refusal is about a reference — a segment key, template slug, topic or attribute name the organization does not have — it additionally carries validation_code, field, line/column, missing, candidates and next_step, so a client can correct the call without a second round of guessing. See ValidationProblem. 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