Sign inGet Started

Send a rendered broadcast test

POST
/v1/email/broadcasts/{broadcast_id}/test
const params = {
  template: {
    parameters: {
      title: "Welcome",
      offer: "OCTOBER20",
      discount: 20,
      featured: false,
    },
  },
  contact_id: "con_01krdgeqcxet5s7t44vh8rt9mg",
};
const preview = await bird.broadcasts.preview(
  "eb_01krdgeqcxet5s7t44vh8rt9mg",
  params,
);
const accepted = await bird.broadcasts.test(
  "eb_01krdgeqcxet5s7t44vh8rt9mg",
  {
    ...params,
    to: "member@example.com",
    preview_fingerprint: preview.preview_fingerprint,
  },
  { idempotencyKey: "broadcast-preview-intent-1" },
);
console.log(accepted.id, accepted.status);
Response202
{
  "id": "em_01krdgeqcxet5s7t44vh8rt9mg",
  "from": {
    "email": "onboarding@messagebird.dev",
    "name": "Bird"
  },
  "to": [
    {
      "email": "delivered@messagebird.dev"
    }
  ],
  "subject": "Hello from Bird",
  "category": "marketing",
  "status": "accepted",
  "broadcast_id": "eb_01krdgeqcxet5s7t44vh8rt9mg",
  "accepted_count": 1,
  "processed_count": 0,
  "delivered_count": 0,
  "bounced_count": 0,
  "complained_count": 0,
  "deferred_count": 0,
  "rejected_count": 0,
  "open_count": 0,
  "click_count": 0,
  "track_opens": false,
  "track_clicks": false,
  "created_at": "2026-07-01T12:00:00Z"
}

Supply the same changes, contact and fingerprint as a new preview to send the exact rendered content to an authorized current organization member with workspace access. Requires template read and emails write permission. Alternate-member and machine destinations also require members read. A change to template content, envelope fields, parameters or contact values returns E04089 (BroadcastPreviewChanged), a conflict_error. This does not send the campaign audience. A confirmed response replays unchanged for the same key and request within the configured idempotency window, with fresh authorization and member access checks. A replay sends no other test.

Parameters

broadcast_idstring

Broadcast identifier.

Request Payload

template
nullable object

Replaces the template, language or parameters for this request. Null removes the template for this request.

Show child parameters
from
string or object

Replaces the sender for this request. Give it as a plain address, as Jane <jane@acme.com> to include a display name, or as an object with an address and a name.

Show child parameters
reply_to
nullable array

Replaces the reply-to addresses for this request. Null removes them.

headers
object

Replaces the custom headers for this request rather than adding to them. Up to 25 of them, each value up to 998 characters. The header rules for updating a broadcast apply.

contact_id
string

The workspace contact whose values fill bird.contact. inputs. Required when the template or envelope reads contact data. Present values are used as they are, and a property's fallback applies only when the contact has no value for it.

to
string
required

The email address of a current organization member with access to this workspace.

preview_fingerprint
string
required

The preview_fingerprint returned by the preview whose content you are sending.

Response Payload

id
string
required

Message ID.

from
object
required

Sender address. name is present when a display name was provided on the send.

Show child attributes
to
array of object
required

Primary recipients. Length is the recipient count. Use the broadcasts endpoint for audience-targeted sends. Each entry's name is present when a display name was provided on the send.

Show child attributes
cc
array of object

CC recipients.

Show child attributes
bcc
array of object

BCC recipients.

Show child attributes
subject
string
required

The subject line as delivered. For a send that used a template, the stored subject is the template's, so this reports it with the send's parameters substituted in, which is what the recipient saw.

category
string
required

Content classification, which controls suppression policy:

  • marketing: Blocks on all suppression reasons.
  • transactional: Allows delivery through complaint and unsubscribe suppressions, for receipts, password resets, and similar operational mail.

Possible values: marketing, transactional

reply_to
nullable array

Reply-To addresses, if set on the send. Empty/null when no Reply-To was provided.

status
string
required
accepted_count
integer
required

How many recipients are in the accepted state, meaning we have the message and are getting ready to deliver it.

processed_count
integer
required

How many recipients the message has been prepared for and queued for delivery.

delivered_count
integer
required

How many recipients' messages were accepted by their mail server.

bounced_count
integer
required

Number of recipients that resulted in a permanent delivery failure.

complained_count
integer
required

Number of recipients that reported spam.

deferred_count
integer
required

Number of recipients in transient delivery deferral. Their mail server asked for a retry, and delivery attempts continue.

rejected_count
integer
required

Number of recipients rejected before delivery. Read the per-recipient rejection_reason field on GET /v1/email/messages/{message_id}/recipients for the specific cause.

processing_latency_ms
nullable integer

Time between the send being accepted and the message being prepared for delivery, in milliseconds, for the fastest recipient. Null until the first recipient reaches processed.

delivery_latency_ms
nullable integer

Time between the message being processed and the receiving mail server accepting it, in milliseconds, for the fastest delivered recipient. Null until the first recipient is delivered.

total_latency_ms
nullable integer

End-to-end accept → delivered time for the fastest delivered recipient, in milliseconds. Null until the first recipient is delivered.

open_count
integer
required

Total open events across all recipients.

click_count
integer
required

Total click events across all recipients.

requested_language
nullable string

The template language this send asked for, in canonical form (pt-BR for a request of pt-br). Null when the send named no language (it took the template's default) or used no template at all. Compare it with resolved_language: when they differ, the language you asked for was not available and the template's on_missing_language policy chose the one shown there instead.

resolved_language
nullable string

The template language this send was actually delivered in, in canonical form. Null when the send used no template. A non-null value with a null requested_language means the send named no language and took the template's default.

template_id
nullable string

The template this send rendered from, or null for a send that supplied its content inline.

template_version_id
nullable string

The exact template version this send rendered from, or null for an inline send. A template's live version changes every time you submit it, so this is what identifies the wording that was actually delivered, together with resolved_language.

broadcast_id
string

The broadcast that sent this message. Absent for a send that was not part of a broadcast. A broadcast records one message per recipient, and every one of them carries the same value here.

tags
array of object

Labels on this message, each one a name and a value, that you can filter and search messages by. Use tags for anything you want to find messages by later, and metadata for data you only want handed back to you.

Show child attributes
metadata
object

Any JSON you kept on the message. We store it and hand it back in webhook payloads, and that is all it does. If you want to search or filter by it, use tags instead.

parameters
nullable object

The substitution values this send supplied, whether inline or from a template, or null if none were supplied. They are the values applied to subject and to the bodies the content endpoint returns, kept so you can see what produced the delivered copy and not only the result.

attachments
array of object

Attachment metadata for the send. Empty when no attachments were included. Raw content is not echoed. When content storage is enabled, download an attachment by its id via the message's attachment endpoint.

Show child attributes
track_opens
boolean
required

Whether open tracking is enabled for this send.

track_clicks
boolean
required

Whether click tracking is enabled for this send.

created_at
string
required

When the send request was accepted.

thread_id
nullable string

Thread this message belongs to, or null when the message is not part of one.

in_reply_to_message_id
nullable string

The message this one is a reply to, if any.

delivered_at
nullable string

When all recipients reached a terminal delivered state, or null if not yet fully delivered.

scheduled_at
string

When this message is scheduled to send, for a send created with a future send time. Absent for an immediate send. Stays set after the scheduled send fires.

Continue with the documentation, guides and examples for this topic.