POST
/api/public/v1/campaigns/{campaignId}/send

Send, pause or cancel a campaign

**Nothing is sent inside this request.** The campaign moves to SCHEDULED and a background drain works through the recipients a minute later — which is what keeps a blast to four thousand people from having to survive one HTTP request, and what makes `pause` able to stop a send mid-flight. Expect "nothing has happened yet" for up to a minute after a successful call. `resume` keeps the recipient list rather than resolving the audience again, so nobody gets a second copy. `cancel` only works before a send starts — after that, pause. A cancelled SMS campaign returns to READY (it keeps its approved registration); an email one returns to DRAFT.

Required scope

The access token must carry this scope. A token missing it gets 403 Forbidden. Grant them to an API client under Settings → Company → API, and to a teammate under Employee → Permissions.

campaigns:write

Path Parameters

NameTypeRequiredDescription
campaignIdstringRequiredCampaign ID.

Request Body

PropertyTypeDescription
actionstringWhat to do with the send.
sendAtstringISO 8601. Required by `schedule`, and must be in the future and within a year.
POSTExample request
curl
curl -X POST "https://www.pxb.app/api/public/v1/campaigns/{campaignId}/send" \
  -H "Authorization: Bearer your_access_token" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "schedule",
    "sendAt": "2026-09-01T14:00:00.000Z"
  }'
200Example response
json
{
  "message": "Campaign scheduled.",
  "content": {
    "campaignId": "cmp_3311"
  }
}
400Example response
json
{
  "message": "This campaign is still waiting on its carrier registration."
}

In the console

The same thing done by hand, for anyone comparing the API against the screen they already use.

xRM → Campaigns
/xrm/campaigns
  1. Open a campaign.
  2. Send now, or schedule it.