> For the complete documentation index, see [llms.txt](https://docs.sudoplatform.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.sudoplatform.com/guides/email/integrate-the-email-sdk/pagination.md).

# Email SDK Pagination

Email is data heavy and as such various APIs provide the ability to query results in a paginated form. These APIs will typically have an optional `nextToken` input property to facilitate pagination. By default, if a limit is not provided, or set as `undefined/nil/null`, the default limit will be 10.

{% hint style="info" %}
When specifying a large number of records in a query, an upper limit of 1MB is enforced on the data retrieved. If the 1MB limit is hit, the data will be returned as a page and require using the next token of the result to query the next page of results.
{% endhint %}

The following types support pagination:

* Email Addresses
* Email Messages
* Email Folders

If intending to use pagination, the first call to an API should not include a `nextToken`, otherwise the result will return an error. When a paginated API call is successful, the output response will contain a `nextToken` property.

When using a query that supports pagination, it is important to always check the `nextToken`. Due to the nature of the data access from the service, it is possible to retrieve a result with no data but potentially have another page of information to retrieve which may contain results.

To access the next page of a query API, use the previously returned `nextToken` in the subsequent API call. If a successful response does not return a `nextToken`, or it is set to `undefined/nil/null`, the pagination results have been exhausted and there are no more pages to retrieve.

{% hint style="warning" %}
When using subsequent calls for pagination, ensure that the input information (e.g. `limit`) is the same for each call, otherwise unexpected behavior will occur. For example, if the first call uses an input property of `limit = 8`, then each subsequent call must use a `limit` of `8`.
{% endhint %}

## Pagination Example

{% tabs %}
{% tab title="TypeScript" %}
Below is an example usage of `getEmailAddresses` for a user with four email addresses and paginating through the results:

```typescript
const output: EmailAddress[] = []
let nextToken: string | undefined = undefined
try {
  do {
    const listOutput = await emailClient.listEmailAddresses({
      cachePolicy: CachePolicy.RemoteOnly,
      limit = 2,
      nextToken, // `undefined` on first invocation
    })
    output.push(...listOutput.items)
    nextToken = listOutput.nextToken
  } while (nextToken)
} catch {
  // Handle/notify user of errors
}
```

The first iteration of the `do...while` loop will have the `listOutput` return an array of `items` containing two `EmailAddress` objects, as well as a populated `nextToken` which is used in the subsequent call in the next iteration. The second iteration will have the `listOutput` return an array of `items` containing two `EmailAddress` objects, however the `nextToken` will be `undefined` as there are no more objects for the query to fetch.
{% endtab %}

{% tab title="Swift" %}
Below is an example usage of `listEmailAddresses` for a user with 4 email addresses:

```swift
var output: ListOutput<EmailAddress>?
var input = ListEmailAddressesInput(limit: 2, nextToken: nil)
do {
  output = try await emailClient.listEmailAddresses(withInput: input)
  /*
   * This output will contain an `items` array of 2 Email Address objects, as
   * well as a non-`nil` `nextToken` which is used in the subsequent call.
   */
  input = ListEmailAddressesInput(limit: 2, nextToken: output.nextToken)
  output = try await emailClient.listEmailAddresses(withInput: input)
  /*
   * This output will also contain 2 Email Address objects in the `items` array, however the
   * `nextToken` will be `nil`, as there are no more objects for the user to
   * fetch.
   */
} catch {
  // Handle/notify user of errors
}
```

{% endtab %}
{% endtabs %}
