# List Emails API

```bash
GET /v1/transactional/email
```

The above returns the first 10 emails sorted by `created_at` in descending order

### Request body for listing transactional emails

{% code title="eg. Response Body" overflow="wrap" %}

```javascript
const response = await fetch('/v1/transactional/email', {
    method: 'GET',
    headers: {
      "Authorization": "Bearer <token>"
    },
});
const data = await response.json();
```

{% endcode %}

### Query Parameters

**limit** integer

max number of messages returned

***

**offset** integer

offset to begin returning messages from

{% code title="`offset` endpoint example" %}

```sh
GET /transactional/email?limit=20&offset=10
```

{% endcode %}

The example above returns the next 20 emails sorted by `created_at` in descending order

***

**status** array of enums

status of messages to filter for.&#x20;

This return emails with the specified status. For a list of possible values, see [this section](https://postman-v1.guides.gov.sg/email-api-guide/programmatic-email-api/tracking-email-status#email-status)

**item** enum

* `UNSENT`
* `ACCEPTED`
* `SENT`
* `BOUNCED`
* `DELIVERED`
* `OPENED`
* `COMPLAINT`

{% code title="`delivered` status example" %}

```bash
GET /transactional/email?status=DELIVERED
```

{% endcode %}

The example above returns the first 10 emails with the status `delivered`, soered by `created_at` in descending order.&#x20;

***

**created\_at** object

Filter for `created_at` timestamp of messages that corresponds to the time the API call to send the email was made.

For `created_at`, the timestamp should be specified in valid [ISO 8601 format](https://en.wikipedia.org/wiki/ISO_8601). The list of supported operators are:

| Operators | Explanation              |
| --------- | ------------------------ |
| `gt`      | greater than             |
| `gte`     | greater than or equal to |
| `lt`      | less than                |
| `lte`     | less than or equal to    |

{% code title="`get` status time example" %}

```bash
GET /transactional/email?created_at[gt]=2023-05-10T03:03:54.163Z
```

{% endcode %}

The example above returns the first 10 emails created after `2023-05-10T03:03:54.163Z` ,sorted by `created_at` in descending order. Do note that if the timezone is not specified, it will be assumed to be UTC.

{% code title="`get` status example" overflow="wrap" %}

```bash
GET /transactional/email?created_at[gt]=2023-05-03&created_at[lt]=2023-05-10
```

{% endcode %}

Returns the first 10 emails created between `2023-05-03` and `2023-05-10` sorted by `created_at` in descending order.

***

**sort\_by** array of enum

The default sorting option is `created_at`, descending.

We currently support the following sorting options:

* `created_at`: sort by the time when the email was created; this roughly corresponds to the time when the API call to send the email was made
* `updated_at`: sort by the time when the email was last updated

We support both ascending and descending order.

To specify the order, add the prefix `+` for ascending order and `-` for descending order.&#x20;

For example, `+created_at` will sort by `created_at` in ascending order, and `-updated_at` will sort by `updated_at` in descending order. If the prefix is omitted, descending order will be used.

{% code title="`sorted_by` example" overflow="wrap" %}

```bash
GET /transactional/email?sort_by=+created_at&created_at[gte]=2022-11-01&status=delivered&limit=48
```

{% endcode %}

Returns the first 48 emails with status `DELIVERED` created on or after `2022-11-01` sorted by `created_at` in ascending order.

***

### Response body for listing emails API

{% code title="Listing emails API response example" overflow="wrap" %}

```json
{
  "has_more": false,
  "data": [
    {
      "id": 42,
      "from": "Postman <info@mail.postman.gov.sg>",
      "recipient": "hello@example.com",
      "params": {
        "body": "Hello World",
        "from": "Postman <info@mail.postman.gov.sg>",
        "subject": "Hello World",
        "reply_to": "hello@example.com"
      },
      "attachments_metadata": [
        {
          "fileName": "text",
          "fileSize": 0,
          "hash": "text"
        }
      ],
      "status": "UNSENT",
      "error_code": "text",
      "error_sub_type": "text",
      "created_at": "2024-09-02T01:34:37.342Z",
      "updated_at": "2024-09-02T01:34:37.342Z",
      "accepted_at": "2024-09-02T01:34:37.342Z",
      "sent_at": "2024-09-02T01:34:37.342Z",
      "delivered_at": "2024-09-02T01:34:37.342Z",
      "opened_at": "2024-09-02T01:34:37.342Z"
    }
  ]
```

{% endcode %}

The response is a JSON object with the following fields:

* `has_more`: a boolean indicating whether there are more emails to retrieve
* `data`: an array of JSON email objects. You can find an example of a single JSON email object [here](/email-api-guide/programmatic-email-api/get-email-by-id-api.md#example-response). We support excluding the `params` field from the response object, see [this section](/email-api-guide/programmatic-email-api/send-email-api.md#body) for more information.

### Excluding `params` Field from Response

Depending on the email `body`, the `params` field could be fairly large and unnecessary to users who are calling this API to retrieve the latest status.

As such, we support an optional `exclude_params` field that allows you to exclude the `params` field from the response. To do so, set `exclude_params` to `true` in the query parameters, i.e. `GET /transactional/email?exclude_params=true`. If `exclude_params` is not specified, the `params` field will be included in the response.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://postman-v1.guides.gov.sg/email-api-guide/programmatic-email-api/list-emails-api.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
