---
title: "Draft a broadcast to a segment."
method: POST
path: "/broadcasts"
tags: ["broadcasts"]
---

# Draft a broadcast to a segment.

`POST /broadcasts`

## Request

- Base URL: `https://api.agentisend.com`
- URL: `https://api.agentisend.com/broadcasts`
- Auth: HTTP bearer

Content comes from a template version or an inline body. With send: true it is sent as soon as it is created, or scheduled when scheduled_at is also given: the same send as POST /broadcasts/{id}/send, with the same checks.

## Headers

- `Idempotency-Key` string
- `Resend-Idempotency-Key` string

## Request body

- PostBroadcastsBody
  - `name` string: A name for your own reference. Omit it to use the subject.
  - `from_address` string, required: Same as from.
  - `template_id` string, uuid
  - `segment_id` string, uuid, required
  - `subject` string
  - `content` union: Same as html, sent as {mode: "html", source}.
    - object
      - `mode` 'block', required: block, markdown or html.
      - `blocks` union[], required: Blocks, in order. At least one.
        - union
          - object
            - `kind` 'text', required: A text block.
            - `body` string, required: The block text. Placeholders use {{name}}.
          - object
            - `kind` 'raw', required: HTML inserted as written.
            - `html` string, required: HTML for this block.
    - object
      - `mode` 'markdown' | 'html', required: markdown or html.
      - `source` string, required: The template source. At most 512 KB when writing.
  - `text` string: The plain-text body, sent as the plain part of every message. Placeholders work as in html. Omit it to have one derived from the body; an empty string sends no plain-text part.
  - `reply_to` union: Reply-To on every message. One address or a list, checked like POST /emails.
    - string
    - string[]
  - `replyTo` union: Resend Node SDK name for reply_to.
    - string
    - string[]
  - `preview_text` string: The line an inbox shows after the subject. Hidden at the top of the HTML; not shown in the body.
  - `previewText` string: Resend Node SDK name for preview_text.
  - `topic_id` string, uuid: A topic on this account. Contacts who unsubscribed from it are skipped, and each message carries a one-click unsubscribe for this topic.
  - `topicId` string, uuid: Resend Node SDK name for topic_id.
  - `send` boolean: Send the broadcast as soon as it is created. With scheduled_at it is scheduled instead. Defaults to false: the broadcast stays a draft.
  - `scheduled_at` string: When to send. With send: true, an ISO 8601 time or a phrase such as "in 1 hour". Without send, an ISO 8601 time: the broadcast is saved as scheduled.

## Response `201`

Success

- PostBroadcastsReply
  - `object` 'broadcast', required
  - `id` string, uuid, required
  - `name` string, required
  - `status` string, required
  - `from_address` string, nullable, required
  - `from` string, nullable, required: Same as from_address, under the name Resend uses.
  - `template_id` string, uuid, nullable, required
  - `segment_id` string, uuid, nullable, required
  - `audience_id` string, uuid, nullable, required: Deprecated: the name Resend gave segment_id before segments. Same value.
  - `subject` string, nullable, required
  - `content` object, nullable, required
  - `html` string, nullable, required: The HTML body as written, placeholders unfilled. null for a broadcast that takes its body from a template.
  - `text` string, nullable, required: The plain-text body as written. null: none written, so the send derives one. An empty string: opted out of a plain-text part.
  - `reply_to` string[], nullable, required: Reply-To on every message the broadcast sends.
  - `preview_text` string, nullable, required: The line an inbox shows after the subject.
  - `topic_id` string, uuid, nullable, required: The topic whose opt-outs the send honours. A contact who unsubscribed from it is skipped.
  - `scheduled_at` string, date-time, nullable, required
  - `sent_at` string, date-time, nullable, required
  - `sent_count` integer, required
  - `archived_at` string, date-time, nullable, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `sent` integer: Messages handed off, when send was true and the broadcast was not scheduled.
  - `skipped` integer: Contacts left out, when send was true.
  - `warnings` object[]: Anything worth knowing that did not stop the send, when send was true.
    - `code` string, required
    - `message` string, required
    - `count` integer, required

## Other responses

- `400`: The request is malformed or a field failed validation. Codes: validation_error, invalid_idempotency_key, invalid_cursor, plan_not_purchasable, stripe_signature_invalid, support_upload_rejected, sign_in_check_required.
- `401`: No usable credential was sent. Codes: missing_api_key, session_required, mfa_required.
- `403`: The credential may not do this, or the account or key is stopped. Codes: sending_domain_blocked, young_domain_held, domain_sending_disabled, domain_not_verified, onboarding_recipient_not_a_member, onboarding_sender_unavailable, account_suspended, account_sandboxed, human_action_required, csrf_origin_rejected, charge_not_this_account, invalid_api_key, restricted_api_key, insufficient_role, invite_email_mismatch, domain_scope_violation, dedicated_ip_assigned_by_us, approval_required, staff_review_required, trust_paused, kill_switch_active.
- `404`: Nothing with this id exists on the account. Codes: billing_customer_missing, not_found, session_expired, support_ticket_not_found.
- `409`: The request conflicts with the current state. Codes: domain_already_exists, template_name_taken, template_alias_taken, template_in_use, segment_in_use, contact_resubscribe_required, email_still_scheduled, domain_verified_elsewhere, domain_not_claimable, return_path_subdomain_in_use, overage_not_on_plan, term_not_on_sale, subscription_active, portal_change_unavailable, already_in_account, idempotency_in_flight, idempotency_payload_mismatch, approval_expired, support_closed, support_reopen_expired, support_merge_conflict, support_reply_too_soon.
- `413`: The request body is larger than this operation accepts. Codes: payload_too_large, support_upload_too_large.
- `415`: The request body is not JSON. Codes: unsupported_media_type.
- `422`: A field is well formed but was refused. Codes: missing_required_field, invalid_from_address, invalid_parameter, invalid_attachment, invalid_region, tracking_subdomain_unverified, tracking_subdomain_cannot_be_removed, domain_field_immutable, open_tracking_on_transactional, header_replaced, html_clipped_by_gmail, link_domain_listed, domain_blocklisted, mailbox_provider_domain, onboarding_shape_refused, dkim_key_mismatch, domain_check_window_expired, spf_conflict, spf_lookup_limit, review_sandbox_recipient_only, suppressed_recipient, content_refused, recipient_blocklisted, last_owner_required, seat_limit_reached, invite_not_valid, key_budget_exceeds_plan, domain_limit_reached, webhook_endpoint_limit_reached.
- `429`: A rate, quota or ramp ceiling was reached. Codes: onboarding_daily_cap_reached, trust_throttled, invite_limit_reached, rate_ceiling_exceeded, daily_quota_exceeded, monthly_quota_exceeded, rate_limit_exceeded, support_rate_limited.
- `500`: Something failed on our side. Codes: internal_server_error.

---

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