---
title: "List messages in an inbox thread"
method: GET
path: "/v3/inbox/threads/{id}/messages"
tags: ["Inbox"]
---

# List messages in an inbox thread

`GET /v3/inbox/threads/{id}/messages`

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

Returns a paginated page of messages on the given thread, ordered by `date` ascending. Messages are polymorphic: `channel: email` carries recipient and subject metadata, `channel: linkedIn` carries only the shared base fields.

## Path parameters

- `id` integer, required

## Query parameters

- `top` integer
- `skip` integer

## Response `200`

Thread messages page

- object
  - `items` union[], required
    - union — Polymorphic message variant within an inbox thread, discriminated by `channel`. Email messages carry recipient and subject metadata; LinkedIn messages carry only the shared base fields.
      - object — Email message within an inbox thread.
        - `channel` 'email', required — Discriminator — always `email` for this variant.
        - `messageId` string, nullable — Unique identifier of the message within the thread. Use this value as `replyToMessageId` when sending a reply to a specific message.
        - `date` string, date-time
        - `body` string, nullable — Message body. May contain HTML.
        - `fromName` string, nullable
        - `isOutbound` boolean — True when the message was sent from this account; false when received.
        - `status` object, nullable — Per-message status. Populated for outbound messages that surfaced a delivery error; absent (`null`) on healthy inbound or successfully delivered outbound messages.
          - `state` 'ok' | 'needsAttention' — Message state, parallel to the thread state.
          - `code` 'linkedInAccountNotEnabled' | 'linkedInInvalidCookie' | 'linkedInSendingLimitExceeded' | 'linkedInMessageSendingDisabled' | 'linkedInSalesNavigatorSubscriptionMissing' | 'linkedInMessageTooLong' | 'linkedInRenderFailed' | 'linkedInUnknown' | 'linkedInProfileNotConnected', nullable — Specific delivery error that put the message into `needsAttention`. `null` for healthy messages.
          - `occurredAt` string, date-time, nullable — Timestamp of the most recent status transition.
        - `aiSentType` 'aiGenerated' | 'aiGeneratedEdited' | 'autoSent', nullable — For a sent message, identifies that it was generated by AI. `null` when the message was not AI-generated.
        - `subject` string, nullable
        - `fromAddress` string, nullable
        - `to` string[], nullable
        - `cc` string[], nullable
        - `bcc` string[], nullable
      - object — LinkedIn message within an inbox thread.
        - `channel` 'linkedIn', required — Discriminator — always `linkedIn` for this variant.
        - `messageId` string, nullable — Unique identifier of the message within the thread.
        - `date` string, date-time
        - `body` string, nullable
        - `fromName` string, nullable
        - `isOutbound` boolean
        - `status` object, nullable — Per-message status. Populated for outbound messages that surfaced a delivery error; absent (`null`) on healthy inbound or successfully delivered outbound messages.
          - `state` 'ok' | 'needsAttention' — Message state, parallel to the thread state.
          - `code` 'linkedInAccountNotEnabled' | 'linkedInInvalidCookie' | 'linkedInSendingLimitExceeded' | 'linkedInMessageSendingDisabled' | 'linkedInSalesNavigatorSubscriptionMissing' | 'linkedInMessageTooLong' | 'linkedInRenderFailed' | 'linkedInUnknown' | 'linkedInProfileNotConnected', nullable — Specific delivery error that put the message into `needsAttention`. `null` for healthy messages.
          - `occurredAt` string, date-time, nullable — Timestamp of the most recent status transition.
        - `aiSentType` 'aiGenerated' | 'aiGeneratedEdited' | 'autoSent', nullable — For a sent message, identifies that it was generated by AI. `null` when the message was not AI-generated.
  - `hasMore` boolean, required

## Other responses

- `400` — Route validation failure, or a business-rule rejection (e.g. invalid pagination, invalid input).
- `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.
- `404` — Thread not found or not visible to the current user.
- `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)
