BluetickedDeveloper docs

Flow Studio flows

5 endpoints, each with examples that open in the console prefilled.

All resources
GET/api/v1/studio-flowsautomations:readTry in console

List Flow Studio flows

Every Flow Studio flow the key can reach, newest first, each marked with its kind: automation or journey.

Query parameters
business_idstring
statusstring
channelstring
  • kind is automation (it answers a message, an event or a form) or journey (it enrols people on a schedule, a tag or a segment).
  • activation_blockers says, in words, what would keep the flow from going live. has_draft is true when an unpublished draft waits in Flow Studio (read it with GET /api/v1/studio-flows/{id}).
  • Pages of up to 100: pass next_cursor back as cursor while has_more is true.
curl -X GET "https://app.blueticked.com/api/v1/studio-flows?status=off&channel=whatsapp" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "ok": true,
  "flows": [
    {
      "id": "99f5edc2-5abc-4c20-81a3-254d4b3907d7",
      "business_id": "22222222-2222-4222-9222-222222222222",
      "name": "Order paid thank-you",
      "journey_name": null,
      "channel": "whatsapp",
      "status": "off",
      "kind": "automation",
      "definition": {
        "version": 1,
        "name": "Order paid thank-you",
        "channel": "whatsapp",
        "entry": {
          "type": "api_event",
          "apiEvents": [
            "order.paid"
          ]
        },
        "steps": [
          {
            "id": "thanks",
            "type": "message",
            "message": "Thanks for your order, {{first_name}}."
          }
        ]
      },
      "activation_blockers": [],
      "created_at": "2026-10-21T08:00:00.000Z",
      "updated_at": "2026-10-21T08:00:00.000Z",
      "has_draft": false
    }
  ],
  "next_cursor": null,
  "has_more": false
}
GET/api/v1/studio-flows/{id}automations:readTry in console

Get a Flow Studio flow

One flow with its whole definition and any unpublished draft.

  • A flow in a business this key cannot reach answers 404, as one that does not exist.
curl -X GET "https://app.blueticked.com/api/v1/studio-flows/{id}" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "ok": true,
  "flow": {
    "id": "99f5edc2-5abc-4c20-81a3-254d4b3907d7",
    "business_id": "22222222-2222-4222-9222-222222222222",
    "name": "Order paid thank-you",
    "journey_name": null,
    "channel": "whatsapp",
    "status": "off",
    "kind": "automation",
    "definition": {
      "version": 1,
      "name": "Order paid thank-you",
      "channel": "whatsapp",
      "entry": {
        "type": "api_event",
        "apiEvents": [
          "order.paid"
        ]
      },
      "steps": [
        {
          "id": "thanks",
          "type": "message",
          "message": "Thanks for your order, {{first_name}}."
        }
      ]
    },
    "activation_blockers": [],
    "created_at": "2026-10-21T08:00:00.000Z",
    "updated_at": "2026-10-21T08:00:00.000Z",
    "draft_definition": null,
    "has_draft": false
  }
}
POST/api/v1/studio-flowsautomations:writeTry in console

Create a Flow Studio flow

Create a flow from a whole definition, saved off.

Body parameters
business_idstring
definitionrequiredobject
  • Saved OFF, through the same save core as Flow Studio's canvas: a flow that would not compile is refused with details.reason compile_failed and details.issues (path, message), the builder's own checklist. Every SMS message the flow sends itself (before its first wait) says its smsMessageType (transactional or marketing); one without it is refused with sms_type_required. Switch it on in Flow Studio.
  • business_id is required when the key reaches more than one business (details.reason business_id_required); omit it when there is one.
  • Safe to retry with an Idempotency-Key header.
curl -X POST "https://app.blueticked.com/api/v1/studio-flows" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: change-me-per-request-0001" \
  -d '{
  "business_id": "22222222-2222-4222-9222-222222222222",
  "definition": {
    "version": 1,
    "name": "Order paid thank-you",
    "channel": "whatsapp",
    "entry": {
      "type": "api_event",
      "apiEvents": [
        "order.paid"
      ]
    },
    "steps": [
      {
        "id": "thanks",
        "type": "message",
        "message": "Thanks for your order, {{first_name}}."
      }
    ]
  }
}'
Response
{
  "ok": true,
  "flow": {
    "id": "99f5edc2-5abc-4c20-81a3-254d4b3907d7",
    "business_id": "22222222-2222-4222-9222-222222222222",
    "name": "Order paid thank-you",
    "journey_name": null,
    "channel": "whatsapp",
    "status": "off",
    "kind": "automation",
    "definition": {
      "version": 1,
      "name": "Order paid thank-you",
      "channel": "whatsapp",
      "entry": {
        "type": "api_event",
        "apiEvents": [
          "order.paid"
        ]
      },
      "steps": [
        {
          "id": "thanks",
          "type": "message",
          "message": "Thanks for your order, {{first_name}}."
        }
      ]
    },
    "activation_blockers": [],
    "created_at": "2026-10-21T08:00:00.000Z",
    "updated_at": "2026-10-21T08:00:00.000Z"
  }
}
PATCH/api/v1/studio-flows/{id}automations:writeTry in console

Update a Flow Studio flow

Replace an off flow's definition in place.

Body parameters
definitionrequiredobject
expected_updated_atrequiredstring
  • Saved OFF, through the same save core as Flow Studio's canvas: a flow that would not compile is refused with details.reason compile_failed and details.issues (path, message), the builder's own checklist. Every SMS message the flow sends itself (before its first wait) says its smsMessageType (transactional or marketing); one without it is refused with sms_type_required. Switch it on in Flow Studio.
  • A flow that is on is refused (409, details.reason studio_flow_live): switch it off first, or edit it in Flow Studio. A flow that starts a journey shared with other flows is edited in Flow Studio (studio_flow_shared_entry).
  • expected_updated_at is the updated_at you read; a change saved by someone else since then is refused (409 conflict), never overwritten.
curl -X PATCH "https://app.blueticked.com/api/v1/studio-flows/{id}" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "definition": {
    "version": 1,
    "name": "Order paid thank-you",
    "channel": "whatsapp",
    "entry": {
      "type": "api_event",
      "apiEvents": [
        "order.paid"
      ]
    },
    "steps": [
      {
        "id": "thanks",
        "type": "message",
        "message": "Thanks for your order, {{first_name}}."
      }
    ]
  },
  "expected_updated_at": "2026-10-21T08:00:00.000Z"
}'
Response
{
  "ok": true,
  "flow": {
    "id": "99f5edc2-5abc-4c20-81a3-254d4b3907d7",
    "business_id": "22222222-2222-4222-9222-222222222222",
    "name": "Order paid thank-you",
    "journey_name": null,
    "channel": "whatsapp",
    "status": "off",
    "kind": "automation",
    "definition": {
      "version": 1,
      "name": "Order paid thank-you",
      "channel": "whatsapp",
      "entry": {
        "type": "api_event",
        "apiEvents": [
          "order.paid"
        ]
      },
      "steps": [
        {
          "id": "thanks",
          "type": "message",
          "message": "Thanks for your order, {{first_name}}."
        }
      ]
    },
    "activation_blockers": [],
    "created_at": "2026-10-21T08:00:00.000Z",
    "updated_at": "2026-10-21T08:00:00.000Z"
  }
}
POST/api/v1/studio-flows/{id}/switch-offautomations:writeTry in console

Switch a Flow Studio flow off

Switch a flow off: it stops answering and its journeys pause, as with the dashboard's switch.

  • A flow already off answers as it is. Switching a flow on is done in Flow Studio.
curl -X POST "https://app.blueticked.com/api/v1/studio-flows/{id}/switch-off" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "ok": true,
  "flow": {
    "id": "99f5edc2-5abc-4c20-81a3-254d4b3907d7",
    "business_id": "22222222-2222-4222-9222-222222222222",
    "name": "Order paid thank-you",
    "journey_name": null,
    "channel": "whatsapp",
    "status": "off",
    "kind": "automation",
    "definition": {
      "version": 1,
      "name": "Order paid thank-you",
      "channel": "whatsapp",
      "entry": {
        "type": "api_event",
        "apiEvents": [
          "order.paid"
        ]
      },
      "steps": [
        {
          "id": "thanks",
          "type": "message",
          "message": "Thanks for your order, {{first_name}}."
        }
      ]
    },
    "activation_blockers": [],
    "created_at": "2026-10-21T08:00:00.000Z",
    "updated_at": "2026-10-21T08:00:00.000Z"
  }
}