---
title: "Reply to an inbox message"
method: POST
path: "/email_inboxes/{inbox_id}/messages/{message_id}/actions/reply"
tags: ["Email Inboxes"]
---

# Reply to an inbox message

`POST /email_inboxes/{inbox_id}/messages/{message_id}/actions/reply`

## Request

- Base URL: `https://api.telnyx.com/v2`
- URL: `https://api.telnyx.com/v2/email_inboxes/{inbox_id}/messages/{message_id}/actions/reply`
- Auth: HTTP bearer

Sends from the inbox address through the standard email send pipeline. The recipient is
the original `Reply-To`, falling back to `From`; original Cc recipients are not included.
The subject is prefixed with `Re:` unless it already has that prefix.

Threading headers are derived from the original message: `In-Reply-To` is set to its
RFC Message-ID, and `References` contains the original References values plus that
Message-ID, de-duplicated and limited to the most recent 20 values.

## Path parameters

- `inbox_id` string, uuid, required
- `message_id` string, uuid, required

## Request body

- union: At least one of `text` or `html` must contain a non-whitespace body. Recipients are derived from the source message; caller-supplied `to`, `cc`, or `bcc` values are ignored.
  - object
    - `text` string, required: Plain-text reply body.
    - `html` string: HTML reply body.
  - object
    - `text` string: Plain-text reply body.
    - `html` string, required: HTML reply body.

## Response `202`

Reply accepted by the standard email send pipeline.

- EmailMessageResponse
  - `data` EmailMessage, required
    - `record_type` 'email_message', required
    - `id` string, uuid, required
    - `status` 'queued' | 'scheduled' | 'cancelled' | 'sandbox' | 'sending' | 'sent' | 'failed' | 'deferred' | 'delivered' | 'bounced' | 'complained' | 'rejected' | 'opened' | 'clicked' | 'unsubscribed', required: Current status of an email message. Lifecycle statuses (queued, scheduled, etc.) are set on creation. Delivery statuses (delivered, bounced, etc.) are updated by delivery event consumers.
    - `from` EmailAddress, required
      - `email` string, required
      - `name` string
    - `to` EmailAddress[], required
      - `email` string, required
      - `name` string
    - `cc` EmailAddress[], required
      - `email` string, required
      - `name` string
    - `bcc` EmailAddress[], required
      - `email` string, required
      - `name` string
    - `reply_to` string, nullable, required
    - `subject` string, required
    - `template_id` string, uuid, nullable, required
    - `template_variables` object, required
    - `tags` string[], required: Customer-supplied tags stored with the message.
    - `metadata` object, required: Customer-supplied metadata stored with the message.
    - `attachments` AttachmentResponse[], required
      - `url` string, uri, nullable, required: Telnyx-hosted public URL for the attachment content.
      - `sha256` string, nullable, required: SHA-256 hex digest of the attachment content.
      - `size_bytes` integer, nullable, required: Attachment size in bytes.
      - `filename` string, required
      - `content_type` string, required
      - `disposition` string, required: MIME disposition (e.g. `attachment` or `inline`). Runtime passes through the stored value without enforcing an enum.
      - `content_id` string, nullable, required: MIME Content-ID for inline references.
    - `events` EmbeddedMessageEvent[], required
      - `type` 'queued' | 'deferred' | 'scheduled' | 'cancelled' | 'sandbox' | 'sending' | 'sent' | 'failed' | 'delivered' | 'bounced' | 'complained' | 'suppressed' | 'rejected' | 'opened' | 'clicked' | 'unsubscribed' | 'daily_limit_exceeded' | 'scan_deferred' | 'quarantined' | 'quarantine_released' | 'quarantine_release_dispatched' | 'quarantine_rejected' | 'quarantine_expired' | 'gw_reject' | 'injection_timeout' | 'expired', required: Bare stored event names returned by message history. In addition to the normal send and delivery lifecycle, polling can expose suppression, scan, and quarantine lifecycle rows. Sharp canonical names gw_reject, injection_timeout, and expired distinguish gateway rejection, ambiguous injection timeout, and MTA expiration. The failed and bounced names remain valid for system/admin failures and hard bounces respectively. Existing stored rows retain their original names.
      - `occurred_at` string, date-time, required
      - `payload` object
    - `created_at` string, date-time, required
    - `scheduled_at` string, date-time: Present when a scheduled_at value was stored. Persists even after the scheduled send has been processed or cancelled.
    - `inline_css` boolean: Present when true in the immediate create response. Not persisted; absent on subsequent GET requests.
    - `sandbox` boolean: Present when sandbox mode was used.
    - `recipient_statuses` object: Per-status recipient counts for the message. Present only for outbound messages with recipient rows. Keys are recipient statuses, values are counts. Example: `{"delivered": 998, "bounced": 2}`.
    - `suppressed` SuppressedRecipient[]: Recipients excluded from delivery by suppression checks, with reasons. On batch items, present when that item had suppressed recipients; all other recipients of the item still receive the message. For single sends this information appears at the top level of the response instead (see EmailMessageResponse.suppressed).
      - `to` string, email, required: Suppressed recipient email address.
      - `reason` string, required: Suppression reason returned by the recipient suppression service.
      - `scope` string, required: Scope at which the suppression applies.
      - `override_allowed` boolean, required: Whether an authorized send may override this suppression.
  - `suppressed` SuppressedRecipient[]: Recipients removed by suppression checks when at least one recipient remains and the message is accepted.
    - `to` string, email, required: Suppressed recipient email address.
    - `reason` string, required: Suppression reason returned by the recipient suppression service.
    - `scope` string, required: Scope at which the suppression applies.
    - `override_allowed` boolean, required: Whether an authorized send may override this suppression.

## Other responses

- `400`: Bad Request / Validation Failed (10015).
- `401`: Not authorized (10006).
- `403`: Forbidden (10007), such as domain not verified, suspended, degraded, or missing DKIM.
- `404`: The inbox, source message, or sending domain was not found (10001).
- `422`: Reply validation failed (10015), or all recipients are suppressed.
- `429`: Send rejected before message creation because the account daily recipient quota was exhausted (10011), the sender-domain graduation ceiling was exceeded (domain_graduation_limit_exceeded), or domain reputation is poor (reputation_suspended).
- `503`: Inbox message actions or the email domain service are temporarily unavailable (10016).

## Changes

> 152 revisions in range; 1 not diffed.

- **2026-09-23** `16bfa298dc71`: 10 warning, 2 info
  - added the new `expired` enum value to the `data/events/items/type` response property for the response status `202`
  - added the new `gw_reject` enum value to the `data/events/items/type` response property for the response status `202`
  - added the new `injection_timeout` enum value to the `data/events/items/type` response property for the response status `202`
  - added the new `quarantine_expired` enum value to the `data/events/items/type` response property for the response status `202`
  - …8 more
- **2026-09-22** `9621f6123ebc`: 3 breaking, 13 warning
  - added `#/components/schemas/DailySendLimitError, #/components/schemas/DomainGraduationLimitExceededError, #/components/schemas/ReputationSuspendedError` to the response body `oneOf` list for the response status `429`
  - the response's body type changed from `object` to no type for status `429`
  - removed the required property `errors` from the response with the `429` status
  - removed the optional property `suppressed` from the response with the `429` status
  - …12 more
- **2026-09-16** `a6a61a29ecdd`: 1 info
  - added the optional property `data/suppressed` to the response with the `202` status
- …earlier changes not shown

[Operation history](https://skmtc.dev/team-telnyx/apis/telnyx-api-2/changes/email_inboxes/:inbox_id/messages/:message_id/actions/reply/post.md)

---

[API](https://skmtc.dev/team-telnyx/apis/telnyx-api-2.md) - [All operations](https://skmtc.dev/team-telnyx/apis/telnyx-api-2/llms.txt) - [OpenAPI document](https://skmtc.dev/team-telnyx/apis/telnyx-api-2/revisions/f82938f53ff4?raw)
