---
title: "Send a reply within a thread"
method: POST
path: "/v3/inbox/threads/{id}/messages"
tags: ["Inbox"]
---

# Send a reply within a thread

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

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

Sends an outbound message on the supplied thread. The request body''s `channel` discriminator must match the thread''s channel; mismatches are rejected with `code: inboxThread.channelMismatch`.

## Path parameters

- `id` integer, required

## Request body

- union — Polymorphic outbound message body, discriminated by `channel`. The supplied channel must match the thread's channel; mismatches are rejected with errorCode 8 (ChannelMismatch).
  - object — Outbound email reply within an inbox thread.
    - `channel` 'email', required
    - `message` string, required — Message body. May contain HTML.
    - `attachmentIds` integer[], nullable
    - `cc` string[], nullable
    - `bcc` string[], nullable
    - `applySignature` boolean, nullable — When true, the sender's email-account signature is appended to the message body.
    - `replyToMessageId` string, nullable — MessageId of a specific message in the thread to reply to. When omitted, the reply targets the last message in the thread.
  - object — Outbound LinkedIn reply within an inbox thread.
    - `channel` 'linkedIn', required
    - `message` string, required
    - `attachmentIds` integer[], nullable

## Response `200`

The newly created outbound message.

- 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.

## Other responses

- `400` — Body validation failure, or a business-rule rejection (channel mismatch, attachment not found, referenced sequence not found, contact opted out, 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
- `502` — The provider rejected delivery (LinkedIn cookie invalid, send limit exceeded, message too long, etc.). The thread enters `needsAttention` state.

---

[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)
