---
title: "Send Manual Email"
method: POST
path: "/api/outbound/email/send"
tags: ["outbound"]
---

# Send Manual Email

`POST /api/outbound/email/send`

## Request

- Base URL: `https://platform.verbiflow.com/api/bridge`
- URL: `https://platform.verbiflow.com/api/bridge/api/outbound/email/send`
- Auth: one of:
  - HTTP bearer and API key in header `x-flage-org-id`
  - HTTP bearer and API key in header `x-flage-org-slug`

## Request body

- ManualEmailSendRequest
  - `body_html` string, nullable: Exact HTML body. Mutually exclusive with body_text.
  - `body_text` string, nullable: Exact plain-text body. Mutually exclusive with body_html.
  - `idempotency_key` string, required: Stable identity for this exact sender, recipient, content, tracking, schedule, and runtime effect. Exact retries adopt; changed inputs conflict.
  - `link_tracking` boolean: Whether to rewrite eligible links through workspace click tracking.
  - `open_tracking` boolean: Whether to include the workspace email-open tracking pixel.
  - `respect_sender_window` boolean: Whether to defer eligibility into the selected sender's configured sending window.
  - `scheduled_at` string, date-time, nullable: Optional timezone-aware ISO 8601 timestamp. Omit to queue immediately.
  - `sender_account_id` string, nullable: Connected email sender account. Omit only when workspace sender selection is unambiguous.
  - `sequence_effect` 'manual_hold' | 'none', nullable: Defaults to 'manual_hold': the recipient is resolved to a person and their live sequence instances are held (real manual outreach). Pass 'none' for sends that must not touch runtime state — e.g. builder test emails: no person row is created, no sequences are held, and no conversation is projected.
  - `sequence_id` string, nullable: Optional campaign context recorded with a deliberate manual hold.
  - `subject` string, required: Exact recipient-visible subject line.
  - `to_email` string, email, required: Exact recipient email address.

## Response `200`

Successful Response

- ManualOutboundSendResponse
  - `accepted_at` string, date-time, nullable, required: Recipient acceptance time when the channel exposes that engagement event; normally null for email. It is not queue admission.
  - `action` 'send_email', required: One-new-email action discriminator; this route never returns another action.
  - `channel` 'email', required: Email channel discriminator; this route never returns another channel.
  - `detail` string, nullable, required: Sanitized blocking or terminal failure detail, or null when the intent has no diagnostic detail. Read this with status; it is not provider raw data.
  - `id` string, required: Durable outbound intent id. Pass this exact value to email.status; it is not a provider message id.
  - `next_eligible_at` string, date-time, nullable, required: Next time schedule, pacing, and sender-window policy permits the queued intent to run; null when no deferred queued eligibility remains.
  - `replied_at` string, date-time, nullable, required: First matched recipient reply time after conversation state observes one; null until then.
  - `request_digest` string, nullable, required: Lowercase SHA-256 of the payload-bound sender, recipient, content, tracking, schedule, and runtime-effect contract; null only for a legacy intent.
  - `requested_at` string, date-time, required: ISO 8601 time when the durable intent was admitted.
  - `scheduled_at` string, date-time, nullable, required: Exact caller-requested future send time, or null when no future time was requested. This is distinct from policy-adjusted next_eligible_at.
  - `sender_account_id` string, required: Exact connected mailbox selected for this intent.
  - `sent_at` string, date-time, nullable, required: Provider-confirmed submission time when status is sent; null before send or after failure.
  - `status` 'queued' | 'sent' | 'failed', required: Current durable intent state: queued proves admission but not delivery, sent proves provider-confirmed submission, and failed is terminal without successful submission.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/verbiflow/apis/verbiflow-sdk-http-contract.md) - [All operations](https://skmtc.dev/verbiflow/apis/verbiflow-sdk-http-contract/llms.txt) - [OpenAPI document](https://skmtc.dev/verbiflow/apis/verbiflow-sdk-http-contract/revisions/c80e903ef8f3?raw)
