---
title: "List conversations with a contact"
description: "Every thread the address wrote or was written to, in every folder: the Mail tab on a contact in the app. The address does not have to be a saved contact. `limit` goes up to 100 and defaults to 25, and `nextCursor` goes back as `cursor` while `hasMore` is true."
url: "https://openemail.uk/docs/api/contacts/threads"
area: "API"
category: "Mailbox"
---

# List conversations with a contact

Every thread the address wrote or was written to, in every folder: the Mail tab on a contact in the app. The address does not have to be a saved contact. `limit` goes up to 100 and defaults to 25, and `nextCursor` goes back as `cursor` while `hasMore` is true.

`GET /contacts/{email}/threads`

## GET /contacts/{email}/threads

Every thread the address wrote or was written to, in every folder: the Mail tab on a contact in the app. The address does not have to be a saved contact. `limit` goes up to 100 and defaults to 25, and `nextCursor` goes back as `cursor` while `hasMore` is true.

## Example

Needs `threads:read`, because it reads mail rather than the contact.

**curl**

```
curl "$OE/contacts/ada%40example.com/threads?q=invoice&sort=newest" -H "$AUTH"
```

**Response**

```
{
  "object": "list",
  "data": [
    {
      "object": "thread",
      "id": "thr_5d31c2a8…",
      "subject": "Invoice 2026-09",
      "from": { "name": "Ada Lovelace", "email": "ada@example.com" },
      "receivedAt": "2026-09-22T16:04:11.000Z",
      "messageCount": 3,
      "hasUnread": true,
      "labels": [{ "id": "INBOX", "name": "Inbox" }]
    }
  ],
  "hasMore": false,
  "nextCursor": null
}
```

> `q` searches inside those threads with the mailbox search syntax. `sort` is `newest` (the default), `oldest`, `sender` or `subject`. Pass `cursor` back with the same `q` and `sort`.

> Each row is a summary. `GET /threads/{id}` reads the messages behind it.
