Skip to main content
An active campaign builds a queue of messages and works through it on schedule. Where a campaign is set to require approval, nothing leaves until someone says so — and that is what these endpoints are for. They need a key with the campaigns scope.
Approving is the one action in this API that causes mail to be sent. Everything else on this page is reversible; that is not.

Read the queue

GET /business/campaigns/{campaignId}/scheduled-sends lists what is waiting. status is required, so you always ask for a specific slice.

Edit before it goes

PATCH /business/scheduled-sends/{sendId} changes the subject, body or send time of a message that has not gone out.
An edit creates a new send and marks the old one overwritten. The id in the response is the one that will actually go out, and replacedSendId is the one you edited — so store the new id if you intend to approve or skip it afterwards.
Only a message still waiting can be edited. Anything already sent, skipped, stopped, overwritten, or parked on a task answers 409 SCHEDULED_SEND_NOT_EDITABLE.

Approve or decline

Both take a list of ids and report back per id, so a partial batch tells you exactly what happened.
POST /business/scheduled-sends/decline has the same shape and stops the message instead of sending it, reporting declined where approve reports approved.

Skip one

POST /business/scheduled-sends/{sendId}/skip passes over a single message and moves that contact to the next step of the sequence.
Use skip when the message is wrong for one person but the campaign should carry on for them. Use decline when it should not go at all.

A review loop

1

Pull the queue

GET /business/campaigns/{campaignId}/scheduled-sends?status=approval_required
2

Fix what needs fixing

PATCH /business/scheduled-sends/{sendId} — and keep the returned id, not the one you sent.
3

Approve the rest in one call

POST /business/scheduled-sends/approve with every id you are happy with.
4

Check the report

Anything in ignored changed status while you were reviewing; anything in notFound is not yours.

Errors worth handling