---
title: "Send a draft"
method: POST
path: "/email_inboxes/{inbox_id}/drafts/{draft_id}/send"
tags: ["Email Drafts"]
---

# Send a draft

`POST /email_inboxes/{inbox_id}/drafts/{draft_id}/send`

Sends the draft through the standard send pipeline — the same domain resolution,
suppression, reputation, daily-quota, persistence and Detail Record behaviour as
`POST /v2/email_messages`. The response body is the created email message.

If the draft has no explicit `from_email`, the inbox address is used.

The draft is marked `sent` only after the send is accepted; a send rejected for
suppression, quota or reputation leaves the draft editable so it can be fixed and
retried. A draft that is already `sent` returns 422 rather than sending twice.

## Path parameters

- `inbox_id` string, uuid, required
- `draft_id` string, uuid, required

## Response `202`

The draft was accepted for delivery. Returns the created email message.

- 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
    - `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` MessageEvent[], required
      - `type` 'queued' | 'deferred' | 'scheduled' | 'cancelled' | 'sandbox' | 'sending' | 'sent' | 'failed' | 'delivered' | 'bounced' | 'complained' | 'rejected' | 'opened' | 'clicked' | 'unsubscribed' | 'daily_limit_exceeded', required
      - `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 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` — The draft is missing fields required to send (sender, subject, or recipients).
- `401` — Not authorized (10006).
- `403` — The sender domain is not permitted to send.
- `404` — Resource not found (10001).
- `422` — The draft has already been sent, or failed send-time validation.
- `429` — The account's daily send limit was exceeded.
- `503` — Drafts or the email domain service are temporarily unavailable (10016).

---

[API](https://skmtc.net/team-telnyx/apis/telnyx-api-2.md) · [All operations](https://skmtc.net/team-telnyx/apis/telnyx-api-2/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/team-telnyx/telnyx-api-2/versions/8f5f4e537994/schema)
