---
title: "Reply to a conversation"
description: "Reply, reply all or forward one received message of the conversation (received_email_id), as the inbox does: your text and/or html go on top and the original is quoted under them; a reply carries In-Reply-To and References; a forward carries the attachments you list in forward_attachment_ids. `POST /api/v1/email/threads/{id}/reply`"
url: https://www.unitpost.com/docs/email/post-email-threads-id-reply
section: "Email API reference"
updated: 2026-10-13
---
# Reply to a conversation

`POST /api/v1/email/threads/{id}/reply`

Reply, reply all or forward one received message of the conversation (`received_email_id`), as the inbox does: your `text` and/or `html` go on top and the original is quoted under them; a reply carries In-Reply-To and References; a forward carries the attachments you list in `forward_attachment_ids`. The message joins the conversation and the conversation is marked read. For a reply, send `to` the message's `reply_to` addresses, else its `from`. It goes out now (no `scheduled_at`) through the same checks as any send. Pass an `Idempotency-Key`: a retry with it never sends twice. A copy of one of your own sends (`sent_by_us`) is never forwarded or quoted, since what you send isn't readable through the API: a reply to it goes without the quote, and a forward of it is a `403`. Also requires `emails:read` (a reply quotes mail). Requires the `emails:send` capability.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | — |
| `Idempotency-Key` | header | string | no | Any unique string (1–256 characters, e.g. a UUID). Retrying with the same key and the same body within 24 hours returns the first result instead of sending again; the same key with a different body is `409 invalid_idempotent_request`, and one still in flight is `409 concurrent_idempotent_requests`. |

## Request body

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `received_email_id` | string | yes | The received message (`inb_…`) in this conversation to answer or forward. |
| `mode` | enum | yes | `reply` (the sender), `reply_all` (everyone on it), or `forward` (to someone new, with the original's attachments you pick). One of: `reply`, `reply_all`, `forward`. |
| `from` | string | yes | One of your sending addresses, e.g. the address the message came in on. |
| `to` | string \| string[] | yes | For a reply: the message's `reply_to`, else its `from`. Up to 50. |
| `cc` | string \| string[] | no | Copy recipients, up to 50. |
| `bcc` | string \| string[] | no | Blind-copy recipients, up to 50. |
| `subject` | string | yes | Usually `Re: <their subject>` (or `Fwd:`). |
| `text` | string | no | Your words, plain text. The original is quoted under them. |
| `html` | string | no | Your words, HTML. The original is quoted under them. |
| `include_quote` | boolean | no | Quote the original under a reply (default true; a forward always carries it). A copy of one of your own sends (`sent_by_us`) is never quoted: left out, it defaults to false there, and `true` is a `403`. |
| `forward_attachment_ids` | string[] | no | Forward only: the original's attachments to carry over (their `id`s). |
| `attachments` | object[] | no | Files to attach: `content` (base64) or `path` (an https URL), up to 20 with the carried-over ones. |
| `tracking` | boolean | no | Open and click tracking for this message; omitted = the sending domain's default. |

## Response fields (200)

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | enum | yes | One of: `email`. |
| `id` | string | yes | The sent email (`email_…`); read it with `GET /email/{id}`. |
| `status` | enum | yes | One of: `queued`, `scheduled`. |
| `thread_id` | string | yes | — |

## Responses

| Status | Description |
| --- | --- |
| 200 | Accepted for delivery. |
| 400 | The body isn't JSON. |
| 401 | Missing or invalid API key. |
| 403 | Insufficient scope (`emails:send` and `emails:read`), the sending gate refused it, or it would forward or quote a copy of one of your own sends. |
| 404 | Conversation or message not found. |
| 409 | The `Idempotency-Key` is in use by a request still running, or with another body. |
| 422 | A bad field, nothing written, or an unknown key (including `scheduled_at`). |
| 429 | Rate limited or over quota; honor `Retry-After`. |

## Example request

```bash
curl -X POST 'https://www.unitpost.com/api/v1/email/threads/thr_123/reply' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'User-Agent: my-app/1.0' \
  -H 'Content-Type: application/json' \
  -d '{ }'
```

## Example response (200)

```json
{
  "object": "email",
  "id": "id_123",
  "status": "queued",
  "thread_id": "thread_123"
}
```

## Links

- HTML reference (with Node.js, Python, Ruby, PHP, Laravel, Go, Java, Rust, .NET and CLI examples): https://www.unitpost.com/docs/email/post-email-threads-id-reply
- OpenAPI 3.1 (full schemas): https://www.unitpost.com/api/v1/openapi.json
