Skip to the page

API reference

Make a sequence

A sequence is texts with waits between them.

POST/v1/sequences

A sequence is texts with waits between them. Each person added runs through it on their own, and stops when they text back (unless stop_on_reply is off) or text STOP. With send_window, a text due outside it waits for the window to open.

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

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

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.

Request body

  • namestringrequired

    Up to 120 characters.

  • descriptionstring

    Up to 500 characters.

  • stop_on_replyboolean

    Default true.

  • send_windowobject or null

    When steps may send, in your time zone. A step due outside it waits for it to open.

    Show its 3 fields
    • daysarray of stringsrequired

      The days it may send on.

      One of mon, tue, wed, thu, fri, sat, sun.

    • startstringrequired

      A time of day as HH:MM in your account’s time zone.

    • endstringrequired

      A time of day as HH:MM in your account’s time zone.

  • stepsarray of anyrequired

    The steps in order.

    Up to 50 items.

Example

POST/v1/sequencesMake a sequence →
curl -X POST "https://usebluebot.com/api/v1/sequences" \
  -H "Authorization: Bearer $BLUEBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 0f6d8c2e-5b1a-4c7e-9d3f-2a8b6e1c4d70" \
  -d '{
    "name": "New lead follow-up",
    "steps": [
      {
        "kind": "text",
        "text": "Hi {{first_name|there}}, thanks for asking about {{listing}}. Want to see it?"
      },
      {
        "kind": "wait",
        "wait_seconds": 172800
      },
      {
        "kind": "text",
        "text": "Just checking in. Still interested in {{listing}}?"
      }
    ],
    "send_window": {
      "days": [
        "mon",
        "tue",
        "wed",
        "thu",
        "fri"
      ],
      "start": "09:00",
      "end": "18:00"
    }
  }'

Response

201: The sequence.

  • idstringrequired

    A seq_ id.

    Starts with seq_.

  • object"sequence"required
  • namestringrequired
  • descriptionstring or nullrequired
  • statestringrequired

    active takes new people and sends; paused holds every enrollment where it is; archived ends them.

    One of active, paused, archived.

  • stop_on_replybooleanrequired

    Stop a person’s run when they text back. On unless you turn it off. A stop word always stops it.

  • send_windowobject or nullrequired

    When steps may send, in your time zone. A step due outside it waits for it to open.

    Show its 3 fields
    • daysarray of stringsrequired

      The days it may send on.

      One of mon, tue, wed, thu, fri, sat, sun.

    • startstringrequired

      A time of day as HH:MM in your account’s time zone.

    • endstringrequired

      A time of day as HH:MM in your account’s time zone.

  • stepsarray of SequenceSteprequired
    Show its 7 fields
    • idstringrequired

      A step_ id.

      Starts with step_.

    • positionintegerrequired

      Its place in the sequence, from 0.

    • kindstringrequired

      One of text, wait.

    • wait_secondsinteger or nullrequired

      For a wait: how long, from a minute to a year.

    • textstring or nullrequired

      For a text: the words, with {{variables}}.

    • template_idstring or nullrequired

      For a text: the template it uses instead of text.

    • servicestringrequired

      One of auto, imessage, sms.

  • countsmap of integerrequired

    Enrollments by state: active, completed, stopped, canceled.

  • created_viastringrequired

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

  • created_attimestamprequired

    When it was made.

Response201
{
  "id": "seq_1Hq2LxW9cVbN3mKpRtYs0a",
  "object": "sequence",
  "name": "New lead follow-up",
  "description": "For people who ask about a listing.",
  "state": "active",
  "stop_on_reply": true,
  "send_window": {
    "days": [
      "mon",
      "tue",
      "wed",
      "thu",
      "fri"
    ],
    "start": "09:00",
    "end": "18:00"
  },
  "steps": [
    {
      "id": "step_1Hq2LxW9cVbN3mKpRtYs0a",
      "position": 0,
      "kind": "text",
      "wait_seconds": null,
      "text": "Hi {{first_name|there}}, thanks for asking about {{listing}}. Want to see it?",
      "template_id": null,
      "service": "auto"
    },
    {
      "id": "step_2Bf8QzD4kJmA6nXwEuTr1c",
      "position": 1,
      "kind": "wait",
      "wait_seconds": 172800,
      "text": null,
      "template_id": null,
      "service": "auto"
    },
    {
      "id": "step_3Lp3VsC7hGqE5tZyKbWn2d",
      "position": 2,
      "kind": "text",
      "wait_seconds": null,
      "text": "Just checking in. Still interested in {{listing}}?",
      "template_id": null,
      "service": "auto"
    }
  ],
  "counts": {},
  "created_via": "dashboard",
  "created_at": "2026-11-01T15:00: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.
invalid_request400Something in the request doesn’t fit: a missing or malformed field, a bad id, or a combination the endpoint refuses. details names each field.
not_found404There is no such thing on this account. Ids are prefixed by kind, so a message id starts with msg_.
limit_reached409The account has as many of something as it may have.
plan_lapsed402The account’s plan isn’t active, so BlueBot isn’t taking new texts. Texts already queued wait and go once the plan is active again.
idempotency_conflict409The Idempotency-Key was used in the last 24 hours with a different request. A key stands for one request.

Try it

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