---
title: "Reply to a conversation"
method: POST
path: "/api/mailboxes/{id}/conversations/{conversationId}/reply"
tags: ["Mailboxes"]
---

# Reply to a conversation

`POST /api/mailboxes/{id}/conversations/{conversationId}/reply`

## Request

- Base URL: `https://api.sendly.now`
- URL: `https://api.sendly.now/api/mailboxes/{id}/conversations/{conversationId}/reply`
- 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:reply`)

Answer the person who last wrote in, from the mailbox's own address, inside the same thread.

**You cannot name the recipient or the sender.** The recipient is the sender of the latest inbound message and the sender is the mailbox in the path. This is not `sendMailboxMessage`: that starts a new conversation with an address you name, under `mailboxes:send`; this one only ever answers someone who wrote first, under a separate scope, so holding one never implies the other.

Supply either a plain-text body or a structured React Email document. Sendly renders HTML and a matching plain-text alternative.

Refusals worth handling by name:

- `422 UNPROCESSABLE` — the thread has no inbound message to answer, or the mailbox is not provisioned.
- `422 SEND_REFUSED` — the recipient is suppressed or the project may not send.
- `429 SENDING_LIMIT_REACHED` — the project's sending limit.
- `502 JMAP_SUBMISSION_FAILED` — the mail server refused the submission. Nothing was sent.

A reply cannot be recalled once sent.

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

Requires the `mailbox-conversations:reply` scope — Reply to conversations in your hosted mailboxes, from the mailbox's own address.

## Path parameters

- `id` string, uuid, required
- `conversationId` string, uuid, required

## Request body

- MailboxConversationReplyBody
  - `body` string
  - `document` object: Brandable email rendered by React Email. Text is escaped; images/GIFs use public HTTPS URLs. Columns stack on phones. No HTML, scripts, or arbitrary CSS.
    - `blocks` union[], required
      - union
        - object
          - `align` 'left' | 'center' | 'right'
          - `text` string, required
          - `type` 'heading', required
        - object
          - `align` 'left' | 'center' | 'right'
          - `text` string, required
          - `type` 'text', required
        - object
          - `alt` string, required
          - `href` string: Public HTTPS URL
          - `src` string, required: Public HTTPS image or animated GIF URL; no upload or server fetch is performed
          - `type` 'image', required
          - `width` integer
        - object
          - `align` 'left' | 'center' | 'right'
          - `href` string, required: Public HTTPS URL
          - `text` string, required
          - `type` 'button', required
        - object
          - `type` 'divider', required
        - object
          - `columns` array[], required
            - union[]
              - …
          - `type` 'columns', required
    - `brand` object
      - `accentColor` string: Six-digit hex color, e.g. #1454d4
      - `backgroundColor` string: Six-digit hex color, e.g. #1454d4
      - `buttonTextColor` string: Six-digit hex color, e.g. #1454d4
      - `font` 'sans' | 'serif' | 'mono'
      - `logoUrl` string: Public HTTPS URL
      - `name` string, required
      - `surfaceColor` string: Six-digit hex color, e.g. #1454d4
      - `textColor` string: Six-digit hex color, e.g. #1454d4
      - `websiteUrl` string: Public HTTPS URL
    - `footer` string
    - `preview` string: Inbox preview text

## Response `200`

Reply submitted

- object
  - `data` object, required
    - `status` 'queued', required
    - `submitted` true, required
  - `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
- `422`: The thread has nothing to reply to, or the send was refused (`SEND_REFUSED`).
- `429`: Rate limit or billing limit exceeded
- `500`: Internal server error
- `502`: The mail server refused the submission. Nothing was sent.

---

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