---
title: "List inbox threads"
method: GET
path: "/v3/inbox/threads"
tags: ["Inbox"]
---

# List inbox threads

`GET /v3/inbox/threads`

<small>_Requires the `inbox:read` scope (or a broader one that includes it)._</small>

Returns a paginated page of inbox threads visible to the current user, ordered by `lastActivityDate` descending.

## Query parameters

- `top` integer
- `skip` integer

## Response `200`

Inbox threads page

- object
  - `items` object[], required
    - `id` integer, required
    - `channel` 'unknown' | 'email' | 'linkedIn', required
    - `isRead` boolean, required
    - `subject` string, nullable — Subject of the last message in the thread (email only).
    - `bodyPreview` string, nullable — Truncated body of the last message in the thread.
    - `lastActivityDate` string, date-time, required
    - `isLastMessagePlanned` boolean, required — True when the last message in the thread is a scheduled outbound message that has not yet been sent.
    - `contact` object, required — Contact party on the other end of an inbox thread. Two shapes are possible, distinguished by the `isDeleted` flag: - **Live contact** (`isDeleted: false`) — `id` and `ownerId` reference the live contact record; `fullName`, `email`, `linkedInProfileUrl`, `phone`, `companyName`, `title` come from the live record (any may still be `null` if the corresponding field is unset on the contact, e.g. `email` is `null` for a LinkedIn-only contact). - **Deleted contact** (`isDeleted: true`) — the underlying contact record has been removed, so `id` and `ownerId` are `null`. The remaining identifying fields (`fullName`, `email`, `linkedInProfileUrl`, `phone`, `companyName`, `title`) are populated from the snapshot stored on the thread when it was created — typically enough for the user to recognise *who* the thread was with even though the contact no longer exists in their workspace.
      - `id` integer, nullable — Contact id. `null` when the contact has been deleted.
      - `ownerId` integer, nullable — User id of the contact's owner. `null` when the contact has been deleted.
      - `fullName` string, nullable — Display name. May still be populated from the thread snapshot when the contact has been deleted.
      - `email` string, nullable — Contact email address. `null` for LinkedIn-only contacts.
      - `linkedInProfileUrl` string, nullable — LinkedIn profile URL. `null` for email-only contacts.
      - `phone` string, nullable
      - `companyName` string, nullable
      - `title` string, nullable
      - `isDeleted` boolean, required — `true` when the underlying contact record has been deleted from the workspace. In that case `id` and `ownerId` are `null` and the remaining identifying fields reflect the snapshot stored on the thread when the message arrived; `false` when the contact is still present and `id` / `ownerId` reference the live record.
    - `sequence` object, nullable — Minimal sequence reference attached to an inbox thread.
      - `id` integer, required
      - `name` string, required
    - `category` object, nullable — Minimal category reference embedded in thread responses.
      - `id` integer, required
      - `name` string, required
    - `hasMeetingIntent` boolean, required
    - `status` object, required — Aggregated thread state, derived from the latest message.
      - `state` 'ok' | 'needsAttention', required — Thread-level status: - `ok` — nothing requires user attention. - `needsAttention` — the latest outbound message failed to send and the thread needs review.
  - `hasMore` boolean, required

## Other responses

- `400` — Invalid pagination parameters.
- `401` — Unauthorized. The response body is empty; check the `WWW-Authenticate` header for the expected scheme.
- `403` — Inbox feature is not available for this user or team.
- `429` — Too Many Requests

---

[API](https://skmtc.net/reply/apis/reply-api.md) · [All operations](https://skmtc.net/reply/apis/reply-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/reply/reply-api/revisions/1c3d32eaf95e/schema)
