- Docs
- Api%2Freference%2Fnotifications%2FListMessages
List messages
Everything your organization has sent, newest first: who it went to, when, and whether it arrived. The words themselves are not repeated back — this is the record of the sending, not a copy of the email. Filter by `status` to find what went wrong, and read `error` on those rows for the reason. Requires the `notifications.messages.read` permission.
The access token returned after a successful sign-in, sent as
Authorization: Bearer <access_token>.
It identifies the person and the organization they are working in, and
it lasts about fifteen minutes. When it runs out, use their refresh
token at POST /auth/refresh-token instead of asking them to sign in
again.
In: header
Query Parameters
Return only the resource with this identifier. Equivalent to fetching it by path, but usable together with the other list filters.
How many items to return in one page. The default and the maximum are both
25; a larger value is rejected with 400.
25int641 <= value <= 25Search the endpoint's supported text and identifier fields. Matching may be an exact identifier lookup or a case-insensitive prefix search, depending on the resource. Alphanumeric characters only.
Cursor for the next page, taken verbatim from the next field of the previous
response. Keep every other query parameter the same between pages: sortBy
and order are part of what the cursor means. An absent or empty next in a
response means there are no more pages.
The value is opaque. Do not parse it or build one yourself.
Sort direction. Defaults to desc, newest first.
"desc""asc" | "desc"Field used to sort the result. Supported fields depend on the endpoint; use
when_created for chronological ordering where it is available. The default
is the resource identifier, and identifiers break ties so cursor paging stays
stable.
Return only messages rendered from this template.
Return only messages sent to this recipient.
Return only messages rendered in this language.
"en" | "es" | "fr" | "de" | "it" | "pt" | "ru"Return only messages sent over this channel. Email is the only channel in service.
"email" | "sms" | "push"Return only messages of this action type.
Return only messages in this delivery state.
"pending" | "sending" | "delivered" | "failed" | "scheduled" | "cancelled" | "retrying" | "uncertain"Created strictly after this instant.
date-timeCreated strictly before this instant.
date-timeCreated at or after this instant.
date-timeCreated at or before this instant.
date-timeResponse Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://api.dual.network/messages"{
"messages": [
{
"id": "665f1c2d4b1a2c3d4e5f6b01",
"to": "person@example.com",
"system": "email",
"language": "en",
"action_type": "custom",
"status": "delivered",
"template_id": "665f1c2d4b1a2c3d4e5f6ad0",
"when_created": "2026-03-04T09:00:00Z",
"when_modified": "2026-03-04T09:00:03Z"
},
{
"id": "665f1c2d4b1a2c3d4e5f6b02",
"to": "nobody@example.invalid",
"system": "email",
"language": "en",
"action_type": "custom",
"status": "failed",
"error": {
"code": 13,
"message": "recipient rejected: domain does not accept mail"
},
"when_created": "2026-03-04T09:05:00Z",
"when_modified": "2026-03-04T09:05:02Z"
}
]
}{
"code": 3,
"message": "Key: 'limit' Error:Field validation for 'limit' failed on the 'lte' tag"
}{
"code": 16,
"message": "no auth provided"
}{
"code": 7,
"message": "forbidden"
}{
"code": 8,
"message": "too many requests"
}{
"code": 13,
"message": "internal error"
}