Skip to Content
API ReferenceBroadcasts

Broadcasts

DM Broadcasts let you send a message to a segmented list of contacts across supported social platforms. Broadcasts are queued and delivered asynchronously in batches.

Agency plan required. Broadcasts use the dm_broadcasts feature flag, which is only available on Agency plan. Requests on lower-tier plans return 403 with error code PLAN_UPGRADE_REQUIRED and message “DM Broadcasts require an Agency plan”.

Base URL

https://api.voxburst.io/v1/broadcasts

Broadcast Statuses

These statuses apply to the top-level Broadcast object.

StatusDescription
DRAFTCreated but not yet sent or scheduled
SCHEDULEDScheduled to send at a future time
SENDINGCurrently being delivered to contacts
SENTAll deliveries enqueued
PAUSEDPaused mid-delivery
FAILEDDelivery failed unrecoverably

Delivery Statuses

These statuses apply to individual BroadcastDelivery records (one per contact). They are distinct from broadcast-level statuses.

StatusDescription
PENDINGDelivery record created, not yet processed
DELIVERINGDelivery in progress
DELIVEREDMessage successfully delivered to the contact
FAILEDDelivery to this contact failed
READContact has read the message

SENT is a broadcast-level status only. Individual delivery records never have status === "SENT". Checking delivery.status === "SENT" will never match — use "DELIVERED" instead.


Broadcast Object

{ "id": "bc_example123", "workspaceId": "wsp_example123", "name": "May Newsletter", "messageTemplate": "Hi there! Check out our latest update.", "platforms": ["TWITTER"], "socialAccountId": "sa_example456", "segmentRules": { "tags": ["newsletter"], "platforms": ["TWITTER"], "hasInteraction": true }, "status": "DRAFT", "totalContacts": 0, "deliveredCount": 0, "failedCount": 0, "readCount": 0, "scheduledFor": null, "sentAt": null, "createdAt": "2026-05-01T10:00:00Z", "updatedAt": "2026-05-01T10:00:00Z" }

Broadcast Fields

FieldTypeDescription
idstringBroadcast ID
workspaceIdstringWorkspace this broadcast belongs to
namestringHuman-readable name
messageTemplatestringMessage text (max 1,000 chars)
platformsstring[]Platform constants to send on
socialAccountIdstring | nullThe specific connected account to send from. null means the server selects an eligible account at send time
segmentRulesobjectAudience filtering rules — see Segment Rules
statusstringCurrent broadcast status — see Broadcast Statuses
totalContactsintegerTotal contacts targeted (populated at send time)
deliveredCountintegerNumber of deliveries that reached DELIVERED status
failedCountintegerNumber of deliveries that reached FAILED status
readCountintegerNumber of deliveries that reached READ status
scheduledForstring | nullISO 8601 scheduled send time
sentAtstring | nullISO 8601 timestamp when sending started
createdAtstringISO 8601 creation timestamp
updatedAtstringISO 8601 last-updated timestamp

Segment Rules

The segmentRules object filters which contacts receive the broadcast. All conditions are ANDed together.

FieldTypeDescription
tagsstring[]Only include contacts with ALL of these tags
platformsstring[]Only include contacts on these platforms
hasInteractionbooleanIf true, only contacts with a recorded interaction (lastSeenAt is not null)

Only contacts with lastSeenAt set (i.e., contacts who have previously interacted) are eligible for broadcast delivery, regardless of segmentRules. This is enforced server-side as an opt-in safeguard.


List Broadcasts

GET /v1/broadcasts

List broadcasts with optional status filter. Uses page/limit pagination.

Query Parameters

ParameterTypeDescription
statusstringFilter by status: DRAFT, SCHEDULED, SENDING, SENT, PAUSED, FAILED
pageintegerPage number (default: 1)
limitintegerResults per page (default: 20, max: 100)
curl "https://api.voxburst.io/v1/broadcasts?status=DRAFT&limit=20" \ -H "Authorization: Bearer eyJexample..."

Response

{ "broadcasts": [ { "...": "..." } ], "pagination": { "page": 1, "limit": 20, "total": 5, "totalPages": 1 } }

Get Broadcast

GET /v1/broadcasts/:id

Retrieve a single broadcast with delivery statistics broken down by delivery status.

curl https://api.voxburst.io/v1/broadcasts/bc_example123 \ -H "Authorization: Bearer eyJexample..."

Response

{ "broadcast": { "...": "..." }, "deliveryStats": { "PENDING": 0, "DELIVERED": 88, "FAILED": 2, "READ": 10 } }

deliveryStats is a map of delivery status to count. Only statuses with at least one delivery record appear as keys. Possible keys: PENDING, DELIVERING, DELIVERED, FAILED, READ.


Create Broadcast

POST /v1/broadcasts

Create a new broadcast in DRAFT status.

Request Body

FieldTypeRequiredDescription
namestringYesHuman-readable name (1–255 chars)
messageTemplatestringYesMessage text (1–1,000 chars)
platformsstring[]YesAt least one platform constant
socialAccountIdstringNoPin this broadcast to a specific connected account. Must belong to this workspace and its platform must be in platforms.
segmentRulesobjectNoAudience filtering — see Segment Rules
scheduledForstringNoISO 8601 datetime to automatically send
curl -X POST https://api.voxburst.io/v1/broadcasts \ -H "Authorization: Bearer eyJexample..." \ -H "Content-Type: application/json" \ -d '{ "name": "May Newsletter", "messageTemplate": "Hi! Check out our latest update.", "platforms": ["TWITTER"], "segmentRules": { "tags": ["newsletter"] } }'

Response (201)

{ "broadcast": { "...": "..." } }

Preview Audience Count

POST /v1/broadcasts/preview-count

Returns the number of eligible contacts that would receive a broadcast given a platform, account, and tag selection. Uses the same eligibility logic as /:id/send — the count reflects the opt-in filter (lastSeenAt not null) and any specified segment filters. Useful for showing an estimated audience size before creating or sending a broadcast.

This endpoint uses the same contact eligibility query as POST /v1/broadcasts/:id/send. The returned count matches the contacts actually enqueued when you send, provided the selection inputs are the same.

Request Body

All fields are optional.

FieldTypeDescription
platformsstring[]Filter to contacts on these platforms
socialAccountIdstringFilter to contacts reachable via this connected account
tagsstring[]Filter to contacts with ALL of these tags
curl -X POST https://api.voxburst.io/v1/broadcasts/preview-count \ -H "Authorization: Bearer eyJexample..." \ -H "Content-Type: application/json" \ -d '{ "platforms": ["TWITTER"], "tags": ["newsletter"] }'

Response

{ "count": 342 }

Update Broadcast

PATCH /v1/broadcasts/:id

Update a broadcast. Only DRAFT or SCHEDULED broadcasts can be updated. Returns 422 with error code BROADCAST_NOT_EDITABLE for any other status.

Request Body

All fields are optional.

FieldTypeDescription
namestringNew name
messageTemplatestringNew message template
platformsstring[]Replacement platform list (at least one element)
socialAccountIdstring | nullNew pinned account, or null to clear
segmentRulesobjectReplacement segment rules
scheduledForstring | nullNew scheduled time, or null to remove
curl -X PATCH https://api.voxburst.io/v1/broadcasts/bc_example123 \ -H "Authorization: Bearer eyJexample..." \ -H "Content-Type: application/json" \ -d '{ "name": "Updated Newsletter" }'

Response

{ "broadcast": { "...": "..." } }

Send Broadcast

POST /v1/broadcasts/:id/send

Enqueue a DRAFT or SCHEDULED broadcast for immediate delivery. Contacts matching the segment rules are resolved and queued for DM delivery.

curl -X POST https://api.voxburst.io/v1/broadcasts/bc_example123/send \ -H "Authorization: Bearer eyJexample..."

Response

{ "broadcast": { "status": "SENDING" }, "enqueuedContacts": 102, "batches": 3 }

enqueuedContacts is the number of contacts that were matched by segment rules and enqueued. batches is the number of delivery message batches created (contacts are processed in groups of 50).

Error Responses

CodeStatusDescription
BROADCAST_ALREADY_SENT422Broadcast is not in a sendable state (DRAFT or SCHEDULED)
NO_ELIGIBLE_CONTACTS422No contacts match the segment rules and opt-in requirement
BROADCAST_CONTACT_LIMIT_EXCEEDED422Audience exceeds the maximum of 50,000 contacts. Split the audience into smaller segments.

Retry Broadcast

POST /v1/broadcasts/:id/retry

Retry all FAILED deliveries on a FAILED or SENT broadcast. Resets each failed delivery record to PENDING and re-enqueues them for processing. The broadcast status is set back to SENDING.

curl -X POST https://api.voxburst.io/v1/broadcasts/bc_example123/retry \ -H "Authorization: Bearer eyJexample..."

Response

{ "broadcast": { "status": "SENDING" }, "retriedContacts": 14, "batches": 1 }

retriedContacts is the number of failed delivery records that were reset and re-enqueued. batches is the number of delivery message batches created.

Error Responses

CodeStatusDescription
BROADCAST_NOT_RETRYABLE422Broadcast is not in FAILED or SENT status
NO_FAILED_DELIVERIES422No FAILED delivery records exist on this broadcast

List Deliveries

GET /v1/broadcasts/:id/deliveries

List individual delivery records for a broadcast.

Query Parameters

ParameterTypeDescription
pageintegerPage number (default: 1)
limitintegerResults per page (default: 50, max: 100)
curl "https://api.voxburst.io/v1/broadcasts/bc_example123/deliveries?page=1&limit=50" \ -H "Authorization: Bearer eyJexample..."

Response

{ "deliveries": [ { "id": "del_example789", "broadcastId": "bc_example123", "contactId": "cnt_example456", "platform": "TWITTER", "status": "DELIVERED", "sentAt": "2026-05-01T10:05:00Z", "readAt": null, "errorCode": null, "createdAt": "2026-05-01T10:00:00Z", "updatedAt": "2026-05-01T10:05:00Z", "contact": { "id": "cnt_example456", "displayName": "Alice Example", "username": "alice", "avatarUrl": "https://pbs.twimg.com/profile_images/example/photo.jpg", "platform": "TWITTER" } } ], "pagination": { "page": 1, "limit": 50, "total": 102, "totalPages": 3 } }

Delivery Record Fields

FieldTypeDescription
idstringDelivery record ID
broadcastIdstringParent broadcast ID
contactIdstringContact ID
platformstringPlatform constant
statusstringDelivery status — see Delivery Statuses
sentAtstring | nullISO 8601 timestamp when the message was sent
readAtstring | nullISO 8601 timestamp when the contact read the message; null if unread
errorCodestring | nullPlatform-specific error code when status is FAILED; null otherwise
createdAtstringISO 8601 creation timestamp
updatedAtstringISO 8601 last-updated timestamp
contact.idstringContact ID
contact.displayNamestringContact display name
contact.usernamestringContact username
contact.avatarUrlstring | nullContact avatar URL
contact.platformstringContact platform constant

Delete Broadcast

DELETE /v1/broadcasts/:id

Delete a broadcast. Only DRAFT, FAILED, or SENT broadcasts can be deleted. Broadcasts in SENDING, SCHEDULED, or PAUSED status cannot be deleted; cancel or wait for them to finish first. Returns 422 with error code BROADCAST_NOT_DELETABLE if the broadcast is in a non-deletable status.

curl -X DELETE https://api.voxburst.io/v1/broadcasts/bc_example123 \ -H "Authorization: Bearer eyJexample..."

Response

{ "success": true }
Last updated on