BluetickedDeveloper docs

Flows

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

All resources
POST/api/v1/flowsflows:writeTry in console

Create Flow draft

Create a WhatsApp Flow draft from a definition in Blueticked's builder dialect.

Body parameters
namerequiredstring
descriptionstring
definitionobject
  • definition is Blueticked's builder dialect, not raw Meta Flow JSON: { version, screens: [...] } where each screen is { id, title, terminal?, layout: { type: "SingleColumnLayout", children: [...] } }. Screen ids use letters, digits and underscores.
  • Supported component types: TextInput, TextArea, DatePicker, CalendarPicker, Dropdown, RadioButtonsGroup, CheckboxGroup, ChipsSelector, OptIn, PhotoPicker, DocumentPicker, Image, TextHeading, TextSubheading, TextBody, TextCaption, RichText, EmbeddedLink, NavigationList, If, Switch and Footer (an explicit Form wrapper is also accepted). Anything else (e.g. Meta-only DateTimePicker or ImageCarousel) is rejected with 400 validation_failed at create/update time.
  • Input components carry name, label and optional required; choice fields take data-source as a static [{ id, title }] list (or a ${data.key} webhook binding on dynamic forms); each screen ends in a Footer whose on-click-action.name is complete (terminal screen), navigate or data_exchange.
  • On publish the stored dialect is transformed to Meta Flow JSON 7.3: the wire version is stamped, screens are wrapped in a Form, and the complete/navigate payload mappings Meta requires are generated, so never paste Meta Flow JSON here. Deeper rules (label caps, footer/payload rules) are checked at publish with friendly errors.
  • Omit definition (or send {}) to create a blank draft and fill it in via PATCH or the Flow builder UI.
  • The flow is returned flat (fields at the top level, the full serializer), matching GET /api/v1/flows/{id}.
curl -X POST "https://app.blueticked.com/api/v1/flows" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: change-me-per-request-0001" \
  -d '{
  "name": "customer_feedback_v1",
  "description": "Post-visit feedback form",
  "definition": {
    "version": "7.3",
    "screens": [
      {
        "id": "MAIN",
        "title": "Feedback",
        "terminal": true,
        "layout": {
          "type": "SingleColumnLayout",
          "children": [
            {
              "type": "TextHeading",
              "text": "How did Karoo Trading Co do?"
            },
            {
              "type": "RadioButtonsGroup",
              "name": "rating",
              "label": "Your rating",
              "required": true,
              "data-source": [
                {
                  "id": "great",
                  "title": "Great"
                },
                {
                  "id": "okay",
                  "title": "Okay"
                },
                {
                  "id": "poor",
                  "title": "Poor"
                }
              ]
            },
            {
              "type": "TextInput",
              "name": "feedback",
              "label": "Anything to add?",
              "helper-text": "A sentence or two is perfect."
            },
            {
              "type": "Footer",
              "label": "Submit",
              "on-click-action": {
                "name": "complete"
              }
            }
          ]
        }
      }
    ]
  }
}'
Response
{
  "id": "2bb7e214-6106-4d25-ba1f-2e28b88dc657",
  "business_id": "22222222-2222-4222-9222-222222222222",
  "name": "customer_feedback_v1",
  "description": "Post-visit feedback form",
  "status": "draft",
  "preset_id": null,
  "meta_flow_id": null,
  "meta_flow_version": null,
  "definition": {
    "version": "7.3",
    "screens": [
      {
        "id": "MAIN",
        "title": "Feedback",
        "terminal": true,
        "layout": {
          "type": "SingleColumnLayout",
          "children": [
            {
              "type": "TextHeading",
              "text": "How did Karoo Trading Co do?"
            },
            {
              "type": "RadioButtonsGroup",
              "name": "rating",
              "label": "Your rating",
              "required": true,
              "data-source": [
                {
                  "id": "great",
                  "title": "Great"
                },
                {
                  "id": "okay",
                  "title": "Okay"
                },
                {
                  "id": "poor",
                  "title": "Poor"
                }
              ]
            },
            {
              "type": "TextInput",
              "name": "feedback",
              "label": "Anything to add?",
              "helper-text": "A sentence or two is perfect."
            },
            {
              "type": "Footer",
              "label": "Submit",
              "on-click-action": {
                "name": "complete"
              }
            }
          ]
        }
      }
    ]
  },
  "public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkq...\n-----END PUBLIC KEY-----\n",
  "last_synced_at": null,
  "created_at": "2026-05-22T10:30:00.000Z",
  "updated_at": "2026-05-22T10:30:00.000Z",
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
POST/api/v1/flows/{id}/publishflows:writeTry in console

Publish Flow

Publish a valid WhatsApp Flow draft to Meta.

Body parameters
channel_idstring
  • Publishing requires a connected WABA and valid Flow definition.
  • channel_id (optional) picks which connected WhatsApp number the Flow publishes through. Resolution order: your explicit channel_id, then the channel the Flow was last published with, then the first connected WhatsApp channel. The Flow is pinned to the resolved number's Flows encryption key (dynamic forms decrypt against it), so multi-number workspaces should always pass it.
  • This route honours the Idempotency-Key header. Publish is the module's most side-effectful call (a republish clones a NEW Meta flow), and a retried request with the same key replays the first response for 24 hours instead of cloning again.
  • The response is the full flow row plus a nested publish object: on a republish republished is true and previous_meta_flow_id / previous_deprecated / templates_referencing_previous / automations_* report what happened to the superseded flow and everything that referenced it.
  • A blu_test_ (sandbox) key never publishes to Meta: it returns a dry-run shape ({ id, name, status, test_mode: true, published: false, publish: { simulated: true, would_publish: true, republished } }) with the local row left unpublished.
curl -X POST "https://app.blueticked.com/api/v1/flows/{id}/publish" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: change-me-per-request-0001" \
  -d '{
  "channel_id": "33333333-3333-4333-9333-333333333333"
}'
Response
{
  "organization_id": "5b8ec566-3d60-45a0-b4ad-688c9386f289",
  "business_id": "8070c984-41f6-4bfa-900b-1ce8750ad439",
  "definition_updated_at": "2026-05-22T10:30:00.000Z",
  "id": "2bb7e214-6106-4d25-ba1f-2e28b88dc657",
  "name": "customer_feedback_v1",
  "description": "Post-visit feedback form",
  "status": "published",
  "meta_flow_id": "4164742601298957",
  "meta_flow_version": 1,
  "definition": {
    "version": "7.3",
    "screens": [
      {
        "id": "MAIN",
        "title": "Feedback",
        "terminal": true,
        "layout": {
          "type": "SingleColumnLayout",
          "children": [
            {
              "type": "TextHeading",
              "text": "How did Karoo Trading Co do?"
            },
            {
              "type": "RadioButtonsGroup",
              "name": "rating",
              "label": "Your rating",
              "required": true,
              "data-source": [
                {
                  "id": "great",
                  "title": "Great"
                },
                {
                  "id": "okay",
                  "title": "Okay"
                },
                {
                  "id": "poor",
                  "title": "Poor"
                }
              ]
            },
            {
              "type": "TextInput",
              "name": "feedback",
              "label": "Anything to add?",
              "helper-text": "A sentence or two is perfect."
            },
            {
              "type": "Footer",
              "label": "Submit",
              "on-click-action": {
                "name": "complete"
              }
            }
          ]
        }
      }
    ]
  },
  "public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkq...\n-----END PUBLIC KEY-----\n",
  "last_synced_at": "2026-05-22T10:35:00.000Z",
  "created_at": "2026-05-22T10:30:00.000Z",
  "updated_at": "2026-05-22T10:35:00.000Z",
  "publish": {
    "republished": false,
    "resumed": false,
    "previous_meta_flow_id": null,
    "previous_deprecated": false,
    "templates_referencing_previous": [],
    "automations_relinked": [],
    "automations_relink_failed": [],
    "automations_referencing_previous": []
  },
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
GET/api/v1/flowsflows:readTry in console

List Flows

List WhatsApp Flows and their publish status, with cursor pagination.

Query parameters
limitstring
statusstring
  • Filter with ?status=: one of draft, published, deprecated, blocked or throttled. Omit it to list every Flow.
  • Page with ?limit= (max 200, default 50) and ?cursor= (the previous page's next_cursor).
  • Use the Flow builder UI for visual editing.
curl -X GET "https://app.blueticked.com/api/v1/flows?limit=50&status=published" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "data": [
    {
      "id": "2bb7e214-6106-4d25-ba1f-2e28b88dc657",
      "business_id": "22222222-2222-4222-9222-222222222222",
      "name": "customer_feedback_v1",
      "description": "Post-visit feedback form",
      "status": "published",
      "preset_id": null,
      "meta_flow_id": "4164742601298957",
      "meta_flow_version": 1,
      "definition": {
        "version": "7.3",
        "screens": [
          {
            "id": "MAIN",
            "title": "Feedback",
            "terminal": true,
            "layout": {
              "type": "SingleColumnLayout",
              "children": [
                {
                  "type": "TextHeading",
                  "text": "How did Karoo Trading Co do?"
                },
                {
                  "type": "RadioButtonsGroup",
                  "name": "rating",
                  "label": "Your rating",
                  "required": true,
                  "data-source": [
                    {
                      "id": "great",
                      "title": "Great"
                    },
                    {
                      "id": "okay",
                      "title": "Okay"
                    },
                    {
                      "id": "poor",
                      "title": "Poor"
                    }
                  ]
                },
                {
                  "type": "TextInput",
                  "name": "feedback",
                  "label": "Anything to add?",
                  "helper-text": "A sentence or two is perfect."
                },
                {
                  "type": "Footer",
                  "label": "Submit",
                  "on-click-action": {
                    "name": "complete"
                  }
                }
              ]
            }
          }
        ]
      },
      "public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkq...\n-----END PUBLIC KEY-----\n",
      "last_synced_at": "2026-05-22T10:35:00.000Z",
      "created_at": "2026-05-22T10:30:00.000Z",
      "updated_at": "2026-05-22T10:35:00.000Z"
    }
  ],
  "next_cursor": null,
  "has_more": false,
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
GET/api/v1/flows/{id}flows:readTry in console

Get a Flow

Fetch one Flow, including its full definition.

curl -X GET "https://app.blueticked.com/api/v1/flows/{id}" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "id": "2bb7e214-6106-4d25-ba1f-2e28b88dc657",
  "business_id": "22222222-2222-4222-9222-222222222222",
  "name": "customer_feedback_v1",
  "description": "Post-visit feedback form",
  "status": "published",
  "preset_id": null,
  "meta_flow_id": "4164742601298957",
  "meta_flow_version": 1,
  "definition": {
    "version": "7.3",
    "screens": [
      {
        "id": "MAIN",
        "title": "Feedback",
        "terminal": true,
        "layout": {
          "type": "SingleColumnLayout",
          "children": [
            {
              "type": "TextHeading",
              "text": "How did Karoo Trading Co do?"
            },
            {
              "type": "RadioButtonsGroup",
              "name": "rating",
              "label": "Your rating",
              "required": true,
              "data-source": [
                {
                  "id": "great",
                  "title": "Great"
                },
                {
                  "id": "okay",
                  "title": "Okay"
                },
                {
                  "id": "poor",
                  "title": "Poor"
                }
              ]
            },
            {
              "type": "TextInput",
              "name": "feedback",
              "label": "Anything to add?",
              "helper-text": "A sentence or two is perfect."
            },
            {
              "type": "Footer",
              "label": "Submit",
              "on-click-action": {
                "name": "complete"
              }
            }
          ]
        }
      }
    ]
  },
  "public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkq...\n-----END PUBLIC KEY-----\n",
  "last_synced_at": "2026-05-22T10:35:00.000Z",
  "created_at": "2026-05-22T10:30:00.000Z",
  "updated_at": "2026-05-22T10:35:00.000Z",
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
PATCH/api/v1/flows/{id}flows:writeTry in console

Update a Flow

Update a Flow's name, description, or definition.

Body parameters
namestring
definitionobject
  • definition is Blueticked's builder dialect, not raw Meta Flow JSON: { version, screens: [...] } where each screen is { id, title, terminal?, layout: { type: "SingleColumnLayout", children: [...] } }. Screen ids use letters, digits and underscores.
  • Supported component types: TextInput, TextArea, DatePicker, CalendarPicker, Dropdown, RadioButtonsGroup, CheckboxGroup, ChipsSelector, OptIn, PhotoPicker, DocumentPicker, Image, TextHeading, TextSubheading, TextBody, TextCaption, RichText, EmbeddedLink, NavigationList, If, Switch and Footer (an explicit Form wrapper is also accepted). Anything else (e.g. Meta-only DateTimePicker or ImageCarousel) is rejected with 400 validation_failed at create/update time.
  • Input components carry name, label and optional required; choice fields take data-source as a static [{ id, title }] list (or a ${data.key} webhook binding on dynamic forms); each screen ends in a Footer whose on-click-action.name is complete (terminal screen), navigate or data_exchange.
  • On publish the stored dialect is transformed to Meta Flow JSON 7.3: the wire version is stamped, screens are wrapped in a Form, and the complete/navigate payload mappings Meta requires are generated, so never paste Meta Flow JSON here. Deeper rules (label caps, footer/payload rules) are checked at publish with friendly errors.
  • Published Flows can be edited too: the change is stored locally and marked as unsynced drift, and reaches WhatsApp only when you POST /api/v1/flows/{id}/publish again, which follows Meta's immutability rules by publishing a NEW Meta flow (meta_flow_id changes; templates and Flow Studio flows that referenced the old one are reconciled and reported in the publish response).
curl -X PATCH "https://app.blueticked.com/api/v1/flows/{id}" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "customer_feedback_v2",
  "definition": {
    "version": "7.3",
    "screens": [
      {
        "id": "MAIN",
        "title": "Feedback",
        "terminal": true,
        "layout": {
          "type": "SingleColumnLayout",
          "children": [
            {
              "type": "TextHeading",
              "text": "How did Karoo Trading Co do?"
            },
            {
              "type": "RadioButtonsGroup",
              "name": "rating",
              "label": "Your rating",
              "required": true,
              "data-source": [
                {
                  "id": "great",
                  "title": "Great"
                },
                {
                  "id": "okay",
                  "title": "Okay"
                },
                {
                  "id": "poor",
                  "title": "Poor"
                }
              ]
            },
            {
              "type": "TextInput",
              "name": "feedback",
              "label": "Anything to add?",
              "helper-text": "A sentence or two is perfect."
            },
            {
              "type": "Footer",
              "label": "Submit",
              "on-click-action": {
                "name": "complete"
              }
            }
          ]
        }
      }
    ]
  }
}'
Response
{
  "id": "2bb7e214-6106-4d25-ba1f-2e28b88dc657",
  "business_id": "22222222-2222-4222-9222-222222222222",
  "name": "customer_feedback_v2",
  "description": "Post-visit feedback form",
  "status": "draft",
  "preset_id": null,
  "meta_flow_id": null,
  "meta_flow_version": null,
  "definition": {
    "version": "7.3",
    "screens": [
      {
        "id": "MAIN",
        "title": "Feedback",
        "terminal": true,
        "layout": {
          "type": "SingleColumnLayout",
          "children": [
            {
              "type": "TextHeading",
              "text": "How did Karoo Trading Co do?"
            },
            {
              "type": "RadioButtonsGroup",
              "name": "rating",
              "label": "Your rating",
              "required": true,
              "data-source": [
                {
                  "id": "great",
                  "title": "Great"
                },
                {
                  "id": "okay",
                  "title": "Okay"
                },
                {
                  "id": "poor",
                  "title": "Poor"
                }
              ]
            },
            {
              "type": "TextInput",
              "name": "feedback",
              "label": "Anything to add?",
              "helper-text": "A sentence or two is perfect."
            },
            {
              "type": "Footer",
              "label": "Submit",
              "on-click-action": {
                "name": "complete"
              }
            }
          ]
        }
      }
    ]
  },
  "public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkq...\n-----END PUBLIC KEY-----\n",
  "last_synced_at": null,
  "created_at": "2026-05-22T10:30:00.000Z",
  "updated_at": "2026-05-22T11:00:00.000Z",
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
DELETE/api/v1/flows/{id}flows:writeTry in console

Delete a Flow

Soft-delete a Flow so it no longer appears in the workspace.

  • Idempotent: deleting an already-deleted Flow still returns deleted: true.
curl -X DELETE "https://app.blueticked.com/api/v1/flows/{id}" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "deleted": true,
  "id": "2bb7e214-6106-4d25-ba1f-2e28b88dc657",
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}