---
title: "Reply to a stored inbound email from your platform-assigned {username}@<platform domain> address, preserving thread h..."
method: POST
path: "/v1/email/messages/{message_id}/reply"
tags: ["email"]
---

# Reply to a stored inbound email from your platform-assigned {username}@<platform domain> address, preserving thread h...

`POST /v1/email/messages/{message_id}/reply`

## Request

- Base URL: `https://api.kody.codes`
- URL: `https://api.kody.codes/v1/email/messages/{message_id}/reply`
- Auth: HTTP bearer

Reply to a stored inbound email from your platform-assigned {username}@<platform domain> address, preserving thread headers and optionally attaching files (base64 content). The recipient always comes from the stored message. Refuses with quarantined_inbound_reply when that message is still quarantined, before any send or daily send quota is used, because replies to quarantined mail usually reach spoofed senders. Release it first with emailMessageClassify (classification "accepted") or Not spam on the email inbox page, then reply.

Org permission: `email:send`.

## Path parameters

- `message_id` string, required

## Request body

- object
  - `text` string
  - `html` string
  - `attachments` object[]
    - `filename` string, required
    - `content_type` string, required
    - `content_base64` string, required

## Response `200`

Success.

- object
  - `id` string, required
  - `direction` 'inbound' | 'outbound', required
  - `inbox_id` string, nullable, required
  - `thread_id` string, nullable, required
  - `from_address` string, nullable, required
  - `envelope_from` string, nullable, required
  - `to_addresses` string[], required
  - `subject` string, nullable, required
  - `message_id_header` string, nullable, required
  - `processing_status` 'stored' | 'sent' | 'failed', required
  - `classification` 'accepted' | 'quarantined', required
  - `classification_reason` string, nullable, required
  - `provider_message_id` string, nullable, required
  - `delivery_status` 'delivered' | 'deferred' | 'bounced' | 'failed' | 'rejected' | 'complained', nullable, required
  - `delivery_status_at` string, nullable, required
  - `error` string, nullable, required
  - `received_at` string, nullable, required
  - `sent_at` string, nullable, required
  - `created_at` string, required
  - `updated_at` string, required

## Other responses

- `400`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `401`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `403`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `404`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `409`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `413`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `429`: Too many requests (edge IP/token limit) or an entitlement / plan-cap limit. Wait at least `Retry-After` seconds before retrying.
- `500`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `503`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `default`: Error envelope `{ "error": { "code", "message", "details"? } }`.

---

[API](https://skmtc.dev/kody/apis/kody-api.md) · [All operations](https://skmtc.dev/kody/apis/kody-api/llms.txt) · [OpenAPI document](https://skmtc.dev/kody/apis/kody-api/revisions/705f4f022728?raw)
