/v1/messages
Lists messages in the archive for this Account — newest first. Returns summary rows (status, evidence, subject, tags), not bodies. Bodies live on .
Authentication
Requires messages:read. A messages:send-only key gets 403.
Keys rule — prefix, shown once, abilities never widen, and no key carries both messages:send and messages:read-content.
Query parameters
Fields
Each row is the summary GET /v1/messages/{id} also returns. Recipients, events and attachments are on that endpoint only.
Worked example
PHP
Node
Python
Ruby
{
"data": [
{
"id": "2ee35675-6bae-42be-aa5e-6d4618d0c61d",
"status": "queued",
"status_label": "Queued",
"evidence": "none",
"supports_feedback": false,
"application_id": 1,
"template_id": 1,
"subject": "Reset password",
"subject_redacted": false,
"from_address": "[email protected]",
"queued_at": "2026-08-06T06:55:48.000000Z",
"completed_at": null,
"content_expires_at": null,
"tags": { "env": "docs" }
}
],
"next_cursor": null
}Responses & failures
401 unauthenticated, 403 when the key lacks messages:read. A key scoped away from the Application named in application_id is also 403, message "This key cannot list messages for that application." There is no type. A cursor whose message was erased or has aged out is 422 with type: cursor_expired. A cursor that is not a uuid is a validation 422 with errors, not cursor_expired. The status filter is an exact match on the stored status. A value that matches no message returns an empty page — data is an empty list and next_cursor is null — rather than a 422. Full matrix under .