---
title: "List a mailbox's conversations"
method: GET
path: "/api/mailboxes/{id}/conversations"
tags: ["Mailboxes"]
---

# List a mailbox's conversations

`GET /api/mailboxes/{id}/conversations`

## Request

- Base URL: `https://api.sendly.now`
- URL: `https://api.sendly.now/api/mailboxes/{id}/conversations`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `better-auth.session_token`
  - OAuth 2 (authorization code, authorization URL `https://app.sendly.now/api/auth/oauth2/authorize`, token URL `https://app.sendly.now/api/auth/oauth2/token`, scopes: `mailbox-conversations:read`)

The threads in one mailbox, newest activity first, from the Inbox view or the Spam view.

This is correspondence from people outside your project, who wrote to your address without ever dealing with Sendly. That is why it has a scope of its own and is not covered by `mailboxes:read`, which is the mailbox's settings and never its contents.

**No existing API key can call this.** The scope is opt-in only: a key or an OAuth connection holds it only if it was ticked by name when the credential was created or approved — the legacy full-access key and the "Full access" preset do not carry it.

Pages through `nextCursor`: pass it back as `cursor` until it is null. The mailbox must belong to the project the credential resolves to; one in another project answers 404.

Requires the `mailbox-conversations:read` scope — Read the conversations in your hosted mailboxes — every message and attachment people have sent you.

## Path parameters

- `id` string, uuid, required

## Query parameters

- `view` 'inbox' | 'spam': Default `inbox`.
- `status` 'open' | 'snoozed' | 'closed' | 'all': Default `all`.
- `q` string: Case-insensitive substring match on the subject or the correspondent's address.
- `cursor` string, uuid: The `nextCursor` of the previous page.
- `limit` integer: Page size. Default 30, at most 50.

## Response `200`

A page of conversations

- object
  - `data` object, required
    - `items` MailboxConversation[], required
      - `assignee` object, nullable, required: The project member the thread is assigned to, or null.
        - `id` string, required
        - `name` string, required
      - `contact` object, nullable, required: The correspondent, when the thread is linked to a contact; otherwise null.
        - `email` string, email, required
      - `hasUnread` boolean, required: True when at least one inbound message has not been read in the dashboard.
      - `id` string, uuid, required
      - `lastMessageAt` string, date-time, required: When the newest message in the thread arrived or was sent.
      - `mailbox` object, nullable: Always null on this endpoint: the mailbox is the one named in the path.
        - `address` string, email, required
        - `id` string, uuid, required
      - `messageCount` integer, required
      - `spam` boolean, required: True when the thread is filed in the mailbox's Spam view.
      - `status` 'OPEN' | 'SNOOZED' | 'CLOSED', required
      - `subject` string, nullable, required
    - `nextCursor` string, nullable, required: Null on the last page.
  - `success` true, required

## Other responses

- `400`: Validation error
- `401`: Unauthorized — missing or invalid auth
- `403`: Forbidden — insufficient permissions or project disabled
- `404`: Resource not found
- `429`: Rate limit or billing limit exceeded
- `500`: Internal server error

---

[API](https://skmtc.dev/sendly/apis/sendly-api.md) · [All operations](https://skmtc.dev/sendly/apis/sendly-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sendly/apis/sendly-api/revisions/ce7cfb7f7c7e?raw)
