Skip to the page

API reference

Add a person to a sequence

Starts the sequence for one person, by to (added as a contact when new) or contact_id.

POST/v1/sequences/{id}/enrollments

Starts the sequence for one person, by to (added as a contact when new) or contact_id. A person can be in a sequence once at a time: adding somebody already in it answers conflict, and so does adding somebody on your stop list or a sequence that is archived.

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 sequence’s id.

    Starts with seq_.

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

  • tostring

    The person to add. Send to or contact_id.

    3 to 320 characters.

  • contact_idstring

    A ct_ id.

    Starts with ct_.

  • first_namestring

    Saved on the contact when it has no first name yet.

    Up to 100 characters.

  • last_namestring

    Up to 100 characters.

  • variablesmap of string

    Values for the steps’ {{variables}}.

Example

POST/v1/sequences/seq_1Hq2LxW9cVbN3mKpRtYs0a/enrollmentsAdd a person to a sequence →
curl -X POST "https://usebluebot.com/api/v1/sequences/seq_1Hq2LxW9cVbN3mKpRtYs0a/enrollments" \
  -H "Authorization: Bearer $BLUEBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 0f6d8c2e-5b1a-4c7e-9d3f-2a8b6e1c4d70" \
  -d '{
    "to": "+15555550123",
    "first_name": "Maria",
    "variables": {
      "listing": "412 Oak St"
    }
  }'

Response

201: Their run.

  • idstringrequired

    A enr_ id.

    Starts with enr_.

  • object"enrollment"required
  • sequence_idstringrequired

    A seq_ id.

    Starts with seq_.

  • contact_idstringrequired

    A ct_ id.

    Starts with ct_.

  • handlestringrequired

    A phone number in E.164 (+15555550123) or an email address an Apple ID uses (iMessage only).

  • statestringrequired

    One of active, completed, stopped, canceled.

  • current_stepintegerrequired

    The position of the next step.

  • next_run_attimestamp or nullrequired

    When the next step happens, while active.

  • stop_reasonstring or nullrequired

    Why it ended early, when it did.

    One of replied, stopped, canceled, sequence_archived, failed.

  • enrolled_viastringrequired

    One of dashboard, api, zapier, make, n8n, pipedream, cli, hook, keyword, mcp, assistant, widget.

  • variablesmap of stringrequired

    Values for the steps’ {{variables}}.

  • enrolled_attimestamprequired

    When the person was added.

  • completed_attimestamp or nullrequired

    When it ended, by finishing or stopping.

  • timelinearray of object

    What happened, oldest first. Only on GET /v1/enrollments/{id}.

    Show its 6 fields
    • typestringrequired

      One of enrolled, text_queued, text_skipped, waiting, window, stopped, completed, canceled.

    • positioninteger or nullrequired

      The step it is about.

    • message_idstring or nullrequired

      A msg_ id.

      Starts with msg_.

    • untiltimestamp or nullrequired

      For a wait, when it ends.

    • detailstring or nullrequired

      What happened, in words.

    • attimestamprequired

      When.

Response201
{
  "id": "enr_1Hq2LxW9cVbN3mKpRtYs0a",
  "object": "enrollment",
  "sequence_id": "seq_1Hq2LxW9cVbN3mKpRtYs0a",
  "contact_id": "ct_1Hq2LxW9cVbN3mKpRtYs0a",
  "handle": "+15555550123",
  "state": "active",
  "current_step": 0,
  "next_run_at": "2026-11-13T19:41:00.000Z",
  "stop_reason": null,
  "enrolled_via": "api",
  "variables": {
    "listing": "412 Oak St"
  },
  "enrolled_at": "2026-11-13T19:41:00.000Z",
  "completed_at": null
}

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_.
conflict409The request doesn’t fit the thing’s current state, or another request with the same Idempotency-Key is still running.
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.