Skip to the page

API reference

Cancel the rest of a broadcast

Nobody still waiting gets their text, and texts queued but not yet taken by your Mac are canceled.

POST/v1/broadcasts/{id}/cancel

Nobody still waiting gets their text, and texts queued but not yet taken by your Mac are canceled. Texts already sent stay sent. broadcast.completed fires with state: "canceled".

Needs a key with the messages:send scope. Keys and scopes

Send an Idempotency-Key so a retry never acts twice. Idempotency

Path parameters

  • idstringrequired

    The broadcast’s id.

    Starts with bc_.

Headers

  • Idempotency-Keystring

    Any string of up to 255 characters, new for each request. A retry with the same key gets the first answer back for 24 hours, with Idempotent-Replayed: true.

    Up to 255 characters.

Example

POST/v1/broadcasts/bc_1Hq2LxW9cVbN3mKpRtYs0a/cancelCancel the rest of a broadcast →
curl -X POST "https://usebluebot.com/api/v1/broadcasts/bc_1Hq2LxW9cVbN3mKpRtYs0a/cancel" \
  -H "Authorization: Bearer $BLUEBOT_API_KEY" \
  -H "Idempotency-Key: 0f6d8c2e-5b1a-4c7e-9d3f-2a8b6e1c4d70"

Response

200: The broadcast, canceled.

  • idstringrequired

    A bc_ id.

    Starts with bc_.

  • object"broadcast"required
  • namestringrequired
  • textstring or nullrequired

    The words, with {{variables}}, as you wrote them. Each person’s filled-in text is on their message. Null once they’re deleted, 30 days after the broadcast finished.

  • text_deletedbooleanrequired

    True once the words, and the values each person’s list row brought, were deleted 30 days after the broadcast finished.

  • template_idstring or nullrequired

    The template the words came from, when one did.

  • audienceanyrequired

    Who the broadcast goes to.

  • servicestringrequired

    One of auto, imessage, sms.

  • statestringrequired

    draft, scheduled (waiting for send_at), sending, completed or canceled.

    One of draft, scheduled, sending, completed, canceled.

  • send_attimestamp or nullrequired

    When it starts, for a scheduled broadcast.

  • started_attimestamp or nullrequired

    When the first text was queued.

  • completed_attimestamp or nullrequired

    When every text had settled.

  • canceled_attimestamp or nullrequired

    When the rest was canceled.

  • recipient_countintegerrequired

    How many people it goes to, up to 500.

  • countsmap of integerrequired

    How many recipients are in each state: pending, queued, sent, delivered, read, failed, skipped and so on.

  • estimateBroadcastEstimate or nullrequired

    For a scheduled or sending broadcast, when the rest should go. Worked out on GET /v1/broadcasts/{id} and when it is made; null in lists.

    Show its 6 fields
    • first_attimestamp or nullrequired

      When the first text should go.

    • last_attimestamp or nullrequired

      When the last text should go, given your pace, quiet hours and daily limits.

    • daysintegerrequired

      How many days the sending spans in your time zone.

    • waits_forarray of stringsrequired

      Holds the texts will meet on the way: quiet_hours, daily_new_people_limit, platform_daily_limit.

    • blocked_bystring or nullrequired

      A hold with no end that stops the broadcast from going, such as plan_lapsed.

    • mac_onlinebooleanrequired

      Whether your Mac is online now. The estimate assumes it stays on.

  • created_viastringrequired

    One of dashboard, api, assistant, mcp, zapier, cli.

  • created_attimestamprequired

    When it was made.

Response200
{
  "id": "bc_1Hq2LxW9cVbN3mKpRtYs0a",
  "object": "broadcast",
  "name": "Open house Saturday",
  "text": "Hi {{first_name|there}}, open house at 412 Oak St this Saturday 1–4. Reply STOP to opt out.",
  "text_deleted": false,
  "template_id": null,
  "audience": {
    "kind": "tags",
    "tags": [
      "buyer"
    ]
  },
  "service": "auto",
  "state": "canceled",
  "send_at": "2026-11-14T15:00:00.000Z",
  "started_at": null,
  "completed_at": null,
  "canceled_at": "2026-11-13T19:41:00.000Z",
  "recipient_count": 42,
  "counts": {
    "sent": 20,
    "canceled": 21,
    "skipped": 1
  },
  "estimate": null,
  "created_via": "api",
  "created_at": "2026-11-13T19:41:00.000Z"
}

Errors

Every refusal has the same envelope and a page of its own. These are the ones this operation can give.

CodeStatusWhat it means
unauthorized401The request carried no key, or a key BlueBot doesn’t know: mistyped, revoked, or a test key sent to the live API.
insufficient_scope403The key doesn’t carry the scope the endpoint needs. Each endpoint’s reference names its scope.
rate_limited429Too many requests. A key may make 120 requests a minute. The RateLimit header says how many are left, and Retry-After how long to wait.
internal500Something went wrong on BlueBot’s side. It was reported. Send the request again; with an Idempotency-Key that is always safe.
not_found404There is no such thing on this account. Ids are prefixed by kind, so a message id starts with msg_.
conflict409The request doesn’t fit the thing’s current state, or another request with the same Idempotency-Key is still running.

Try it

Call this operation from the page with your own key. The key stays in this tab and is forgotten when you leave.