---
title: "Workflow Steps API Reference"
description: "Endpoints for managing workflow steps in Linkbreakers. Workflow steps define the behavior of links, such as redirection destinations and data collection flows."
canonical: "https://linkbreakers.com/help/api/workflow-steps"
---

# Workflow Steps

Endpoints for managing workflow steps in Linkbreakers. Workflow steps define the behavior of links, such as redirection destinations and data collection flows.

## Workflow Steps

## [#](#workflow-steps-object)The Workflow Step object

Models a node in the Linkbreakers workflow canvas, defining what should occur after a scan (redirects, gates, forms) and how it connects to other steps in the visitor journey.

attributeCapture

object

A step's opt-in to save values to the visitor's profile, so a workflow can record qualification without a form: a tapped choice, a milestone reached, or the context of the link that was scanned. Available on every step except conditions, which only route on what is already known. A failed password attempt or a skipped form saves nothing. On forms it saves on top of the answers, which forms already save.

backButton

object

A page step's optional back button: a secondary button under the page's main actions that returns the visitor to the previous page in their browser, exactly like the browser's own back button. Use it for "Back to menu" on a sub-page reached from a MULTI\_LINK menu instead of wiring a connection back to the menu. It hides itself when there is no previous page in the journey, such as on the first page right after a scan, and it never shows on a step whose back\_button\_available is false. Available on page steps only: MESSAGE\_PAGE, MULTI\_LINK, CONTACT\_CARD, SOCIAL\_LINKS\_PAGE, FORM\_SUBMIT, PASSWORD\_VERIFY and THANK\_YOU\_PAGE. It is not part of the step's payload: set it with the back\_button field of workflow\_steps\_create or workflow\_steps\_update.

backButtonAvailable

boolean

Whether this step's back\_button can ever show: the step is a page and some visitor reaches it after already seeing another page (a menu, a form, a password page). False on a page that comes straight after the scan, even through conditions, because a visitor there has no page to go back to. A back\_button stored on a step where this is false is kept, so it shows again once the wiring puts a page before the step.

branches

array<object>

Every exit of this step, with its current destination. This is the vocabulary for connecting the step: pass one of these branch\_ids to workflow\_steps\_connect. An atomic step has exactly one branch, "next". A composite step has one per button, option or range, plus "else" for a condition's fallback. An exit step has none.

canvasPosition

object

Canvas position for React Flow node positioning

childStepIds

array<string>

Child workflow step IDs (steps that this step can transition to, UUID)

createdAt

string (date-time)

When the workflow step was created

eventAction

string (enum)

leads to a next step, not straight out. Records which button the visitor pressed, so use it over SOCIAL\_LINKS\_PAGE when that choice is worth measuring or when a branch needs to do more than redirect. This is the menu step: for several documents or PDFs, give each one a button connected to an OPEN\_MEDIA step for media uploaded to the media library, or to a CLIENT\_REDIRECT when the document is already hosted at a URL. the common case, not the only one: app stores, docs, booking pages and storefronts all work, and the name is the only thing about it that is social. It is an exit step, so the visitor leaves from here. or UNKNOWN. AGENT is an AI agent that names itself (GPTBot, Claude-User, Perplexity-User...). AUTOMATED is a browser driven by software, whoever is behind it: headless Chrome from its request, and a visible browser under automation once a link with the Advanced data collection level has read navigator.webdriver, from that device's next visit on. visitor automatically. It carries no list of destinations, so a page that should offer a choice between two or more places is not this step. Use SOCIAL\_LINKS\_PAGE when the choices leave for external URLs, or MULTI\_LINK when each choice continues into more workflow. Never put links, documents or PDFs on it: it is a message, nothing else. an image (PNG, JPEG, WebP, SVG) or an MP4 video. The visitor is sent straight to the media, with no page of its own. Any media of the library can be opened: it is uploaded once and referenced by its media\_id; swapping it means pointing the step at another media item, and the QR code never changes. their permission (composite: two branches, "location" when it was shared, "else" when it was refused, skipped or is unavailable).

##### Allowed values

`EVENT_ACTION_UNSPECIFIED`

Event action not specified

`EVENT_ACTION_CLIENT_REDIRECT`

Redirect visitors to a destination URL

`EVENT_ACTION_LINK_VISIT`

Entry step triggered when the link is visited.

`EVENT_ACTION_PASSWORD_VERIFY`

Require visitors to enter a password before proceeding

`EVENT_ACTION_FORM_SUBMIT`

Present a data collection form to visitors

`EVENT_ACTION_CONTACT_CARD`

Generate a vCard (VCF) response with contact information

`EVENT_ACTION_MULTI_LINK`

A page of buttons where each one continues into more workflow: the button

`EVENT_ACTION_VISIT_TYPE_CONDITION`

Route visitors based on whether it's a first or returning visit

`EVENT_ACTION_COUNTRY_CONDITION`

Route visitors based on their country location

`EVENT_ACTION_DAY_OF_WEEK_CONDITION`

Route visitors based on day of week

`EVENT_ACTION_TIME_OF_DAY_CONDITION`

Route visitors based on time of day

`EVENT_ACTION_DAY_OF_MONTH_CONDITION`

Route visitors based on day of month

`EVENT_ACTION_SPECIFIC_DATE_CONDITION`

Route visitors based on specific calendar dates

`EVENT_ACTION_SOCIAL_LINKS_PAGE`

A page of buttons that each leave for an external URL. Social profiles are

`EVENT_ACTION_DEVICE_TYPE_CONDITION`

Route visitors based on device type (e.g. MOBILE, DESKTOP, TABLET)

`EVENT_ACTION_DEVICE_PLATFORM_CONDITION`

Route visitors based on device platform / operating system (e.g. iOS, Android, macOS)

`EVENT_ACTION_DEVICE_BROWSER_CONDITION`

Route visitors based on browser family (e.g. Chrome, Safari, Firefox)

`EVENT_ACTION_DEVICE_BRAND_CONDITION`

Route visitors based on hardware brand (e.g. Apple, Samsung, Google)

`EVENT_ACTION_DEVICE_ACTOR_CONDITION`

Route visitors based on actor classification: HUMAN, BOT, AGENT, AUTOMATED

`EVENT_ACTION_VISITOR_DATA_CONDITION`

Route visitors based on their profile data or custom attributes

`EVENT_ACTION_THANK_YOU_PAGE`

Display a final thank you / completion message (exit step)

`EVENT_ACTION_MESSAGE_PAGE`

Text with ONE way onward: a single button, or a timer that moves the

`EVENT_ACTION_OPEN_MEDIA`

Hand the visitor one piece of uploaded media, opened in their browser (exit step): a PDF,

`EVENT_ACTION_LOCATION_REQUEST`

Ask the visitor for their precise location (GPS) through the browser, with

id

string

The unique identifier of the workflow step (UUID)

kind

string (enum)

The kind of workflow step (entry, exit, etc.) - read-only, determined by server

##### Allowed values

`KIND_UNSPECIFIED`

Workflow step kind not specified

`KIND_ENTRY`

Entry steps are automatically triggered when a visitor reaches the workflow

`KIND_EXIT`

Exit steps finalize the workflow (commonly a redirect)

`KIND_INTERACTION`

Interaction steps require visitor input (forms, passwords, etc.)

`KIND_CONDITION`

Condition steps evaluate logic and route to different next steps

linkId

string

The link ID this workflow step belongs to (UUID)

nextCanGoBack

boolean

Whether a page added after this step could show a back button: this step is a page, or a page comes before it. False for a step no visitor reaches.

nodeType

string (enum)

The node type says how many exits a step has. Whatever the answer, you connect every one of them the same way, with workflow\_steps\_connect: name the branch, name the step it leads to. Read a step's branches field for its branch ids. Example: a multi-link with 3 buttons has 3 branches, with the buttons' ids. A redirect has one branch, "next". A country condition has one branch per country plus "else". for a condition's fallback. Examples: MULTI\_LINK, VISIT\_TYPE\_CONDITION, COUNTRY\_CONDITION, DAY\_OF\_WEEK\_CONDITION, TIME\_OF\_DAY\_CONDITION, DAY\_OF\_MONTH\_CONDITION, SPECIFIC\_DATE\_CONDITION, DEVICE\_\*\_CONDITION, VISITOR\_DATA\_CONDITION (THANK\_YOU\_PAGE, CONTACT\_CARD, SOCIAL\_LINKS\_PAGE, CLIENT\_REDIRECT) are atomic but end the journey, so they have no branches at all. Examples: LINK\_VISIT, PASSWORD\_VERIFY, FORM\_SUBMIT, MESSAGE\_PAGE

##### Allowed values

`NODE_TYPE_UNSPECIFIED`

Workflow step node type not specified

`NODE_TYPE_COMPOSITE`

Composite steps have one exit per button, option or range, plus "else"

`NODE_TYPE_ATOMIC`

Atomic steps have exactly one exit, branch id "next". Exit steps

parentStepIds

array<string>

Parent workflow step IDs (steps that can transition into this step, UUID)

payload

object

Workflow step payload - uses oneof for type safety based on EventAction

rendersPage

boolean

Whether visitors see this step as a page. Page steps take the options every page has, such as back\_button; redirects and conditions do not.

updatedAt

string (date-time)

When the workflow step was last updated

[Learn moreLearn more about workflows in Linkbreakers](https://linkbreakers.com/help/article/whats-a-workflow)

Example object

```json
{
  "attributeCapture": {
    "enabled": false,
    "writes": [
      {
        "key": "looking_for",
        "mode": "ATTRIBUTE_WRITE_MODE_UNSPECIFIED",
        "type": "VISITOR_ATTRIBUTE_TYPE_UNSPECIFIED",
        "value": "{{choice.label}}"
      }
    ]
  },
  "backButton": {
    "enabled": false,
    "label": "Back to menu"
  },
  "backButtonAvailable": false,
  "branches": [
    {
      "branchId": "string",
      "label": "string",
      "nextStepId": "string"
    }
  ],
  "canvasPosition": {
    "x": 0,
    "y": 0
  },
  "childStepIds": [
    "string"
  ],
  "createdAt": "2026-10-29T07:18:21.662Z",
  "eventAction": "EVENT_ACTION_CLIENT_REDIRECT",
  "id": "a5f7b184-9d74-4f2a-9ed9-8f6a98cb12f4",
  "kind": "KIND_INTERACTION",
  "linkId": "123e4567-e89b-12d3-a456-426614174000",
  "nextCanGoBack": false,
  "nodeType": "NODE_TYPE_COMPOSITE",
  "parentStepIds": [
    "string"
  ],
  "payload": {
    "clientRedirect": {
      "conversionTracking": true,
      "destination": "https://brand.example.com/checkout"
    },
    "countryCondition": {
      "countries": [
        {}
      ],
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012"
    },
    "dayOfMonthCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "dayOfWeekCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "deviceActorCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "deviceBrandCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "deviceBrowserCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "devicePlatformCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "deviceTypeCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "form": {
      "autoSkipIfKnown": false,
      "formDescription": "string",
      "formFields": [
        {}
      ],
      "formTitle": "string",
      "skipButtonText": "string",
      "skipForm": false,
      "submitButtonText": "string"
    },
    "linkVisit": {},
    "locationRequest": {
      "askOnce": false,
      "buttonLabel": "Share my location",
      "description": "We use it to show you the nearest store.",
      "elseNextStepId": "123e4567-e89b-12d3-a456-426614174000",
      "nextStepId": "123e4567-e89b-12d3-a456-426614174000",
      "skipEnabled": false,
      "skipLabel": "Not now",
      "title": "Share your location"
    },
    "messagePage": {
      "buttonLabel": "string",
      "description": "string",
      "navigationType": "MESSAGE_PAGE_NAVIGATION_TYPE_UNSPECIFIED",
      "timerSeconds": 0,
      "title": "string"
    },
    "multiLink": {
      "buttons": [
        {}
      ],
      "description": "Select one of the options below to continue",
      "title": "Choose your destination"
    },
    "openMedia": {
      "mediaId": "5f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f"
    },
    "password": {
      "description": "string",
      "password": "string",
      "title": "string"
    },
    "socialLinks": {
      "description": "Follow us on your favorite platform",
      "displayStyle": "SOCIAL_LINKS_DISPLAY_STYLE_UNSPECIFIED",
      "links": [
        {}
      ],
      "title": "Connect with us"
    },
    "specificDateCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "thankYouPage": {
      "description": "string",
      "title": "string"
    },
    "timeOfDayCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "ranges": [
        {}
      ]
    },
    "vcard": {
      "buttonLabel": "Add to contacts",
      "city": "San Francisco",
      "country": "United States",
      "email": "hello@acme.com",
      "firstName": "Jane",
      "lastName": "Doe",
      "organization": "Acme Corporation",
      "phone": "+33123456789",
      "phoneIsWhatsapp": false,
      "phoneSmsEnabled": false,
      "postalCode": "94102",
      "saveButtonEnabled": false,
      "socialLinks": [
        {}
      ],
      "state": "CA",
      "streetAddress": "123 Main Street",
      "title": "Software Engineer",
      "website": "https://acme.com"
    },
    "visitTypeCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "visitorDataCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    }
  },
  "rendersPage": false,
  "updatedAt": "2026-10-29T07:18:21.662Z"
}
```

GET

`/v1/links/{linkId}/workflow-steps`

Requires auth

## [#](#list-workflow-steps-for-a-link)List workflow steps for a link

Retrieves all workflow steps for a specific link Requires the \`workflows:read\` scope.

### [#](#list-workflow-steps-for-a-link-parameters)Parameters

#### path parameters

linkId

string

Required

path

The ID of the link to list workflow steps for (UUID)

#### query parameters

pageSize

integer (int64)

query

The maximum number of workflow steps to return (optional)

pageToken

string

query

The token for retrieving the next page of results (optional)

cursor

string

query

Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.

### [#](#list-workflow-steps-for-a-link-response)Response

200

Everything worked as expected.

nextPageToken

string

Cursor to fetch the next page of workflow steps

totalCount

integer (int64)

How many steps this link has in total, so a client can tell a complete answer from a page of one. A local-first client reads absence from this list as the step having been deleted, and may only do so when the count it was given matches what it received. The count covers the link asked about rather than the workspace, which is the only sense in which this list is ever whole.

workflowSteps

array<object>

### [#](#list-workflow-steps-for-a-link-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X GET "https://api.linkbreakers.com/v1/links/{linkId}/workflow-steps?pageSize={pageSize}&pageToken={pageToken}&cursor={cursor}" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{
  "nextPageToken": "eyJzdGVwSWQiOiI5ODcifQ==",
  "totalCount": 0,
  "workflowSteps": [
    {
      "attributeCapture": {
        "enabled": false,
        "writes": []
      },
      "backButton": {
        "enabled": false,
        "label": "Back to menu"
      },
      "backButtonAvailable": false,
      "branches": [
        {}
      ],
      "canvasPosition": {
        "x": 0,
        "y": 0
      },
      "childStepIds": [
        "string"
      ],
      "createdAt": "2026-10-29T07:18:21.636Z",
      "eventAction": "EVENT_ACTION_CLIENT_REDIRECT",
      "id": "a5f7b184-9d74-4f2a-9ed9-8f6a98cb12f4",
      "kind": "KIND_INTERACTION",
      "linkId": "123e4567-e89b-12d3-a456-426614174000",
      "nextCanGoBack": false,
      "nodeType": "NODE_TYPE_COMPOSITE",
      "parentStepIds": [
        "string"
      ],
      "payload": {
        "clientRedirect": {},
        "countryCondition": {},
        "dayOfMonthCondition": {},
        "dayOfWeekCondition": {},
        "deviceActorCondition": {},
        "deviceBrandCondition": {},
        "deviceBrowserCondition": {},
        "devicePlatformCondition": {},
        "deviceTypeCondition": {},
        "form": {},
        "linkVisit": {},
        "locationRequest": {},
        "messagePage": {},
        "multiLink": {},
        "openMedia": {},
        "password": {},
        "socialLinks": {},
        "specificDateCondition": {},
        "thankYouPage": {},
        "timeOfDayCondition": {},
        "vcard": {},
        "visitTypeCondition": {},
        "visitorDataCondition": {}
      },
      "rendersPage": false,
      "updatedAt": "2026-10-29T07:18:21.643Z"
    }
  ]
}
```

Base URL: `https://api.linkbreakers.com`

GET

`/v1/links/{linkId}/workflow-steps/{id}`

Requires auth

## [#](#get-workflow-step-details)Get workflow step details

Retrieves information about a specific workflow step. Requires the \`workflows:read\` scope.

### [#](#get-workflow-step-details-parameters)Parameters

#### path parameters

linkId

string

Required

path

The ID of the link (UUID)

id

string

Required

path

The ID of the workflow step to retrieve (UUID)

### [#](#get-workflow-step-details-response)Response

200

Everything worked as expected.

workflowStep

object

Models a node in the Linkbreakers workflow canvas, defining what should occur after a scan (redirects, gates, forms) and how it connects to other steps in the visitor journey.

### [#](#get-workflow-step-details-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X GET "https://api.linkbreakers.com/v1/links/{linkId}/workflow-steps/{id}" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{
  "workflowStep": {
    "attributeCapture": {
      "enabled": false,
      "writes": [
        {}
      ]
    },
    "backButton": {
      "enabled": false,
      "label": "Back to menu"
    },
    "backButtonAvailable": false,
    "branches": [
      {
        "branchId": "string",
        "label": "string",
        "nextStepId": "string"
      }
    ],
    "canvasPosition": {
      "x": 0,
      "y": 0
    },
    "childStepIds": [
      "string"
    ],
    "createdAt": "2026-10-29T07:18:21.648Z",
    "eventAction": "EVENT_ACTION_CLIENT_REDIRECT",
    "id": "a5f7b184-9d74-4f2a-9ed9-8f6a98cb12f4",
    "kind": "KIND_INTERACTION",
    "linkId": "123e4567-e89b-12d3-a456-426614174000",
    "nextCanGoBack": false,
    "nodeType": "NODE_TYPE_COMPOSITE",
    "parentStepIds": [
      "string"
    ],
    "payload": {
      "clientRedirect": {
        "conversionTracking": true,
        "destination": "https://brand.example.com/checkout"
      },
      "countryCondition": {
        "countries": [],
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012"
      },
      "dayOfMonthCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "dayOfWeekCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceActorCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceBrandCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceBrowserCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "devicePlatformCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceTypeCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "form": {
        "autoSkipIfKnown": false,
        "formDescription": "string",
        "formFields": [],
        "formTitle": "string",
        "skipButtonText": "string",
        "skipForm": false,
        "submitButtonText": "string"
      },
      "linkVisit": {},
      "locationRequest": {
        "askOnce": false,
        "buttonLabel": "Share my location",
        "description": "We use it to show you the nearest store.",
        "elseNextStepId": "123e4567-e89b-12d3-a456-426614174000",
        "nextStepId": "123e4567-e89b-12d3-a456-426614174000",
        "skipEnabled": false,
        "skipLabel": "Not now",
        "title": "Share your location"
      },
      "messagePage": {
        "buttonLabel": "string",
        "description": "string",
        "navigationType": "MESSAGE_PAGE_NAVIGATION_TYPE_UNSPECIFIED",
        "timerSeconds": 0,
        "title": "string"
      },
      "multiLink": {
        "buttons": [],
        "description": "Select one of the options below to continue",
        "title": "Choose your destination"
      },
      "openMedia": {
        "mediaId": "5f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f"
      },
      "password": {
        "description": "string",
        "password": "string",
        "title": "string"
      },
      "socialLinks": {
        "description": "Follow us on your favorite platform",
        "displayStyle": "SOCIAL_LINKS_DISPLAY_STYLE_UNSPECIFIED",
        "links": [],
        "title": "Connect with us"
      },
      "specificDateCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "thankYouPage": {
        "description": "string",
        "title": "string"
      },
      "timeOfDayCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "ranges": []
      },
      "vcard": {
        "buttonLabel": "Add to contacts",
        "city": "San Francisco",
        "country": "United States",
        "email": "hello@acme.com",
        "firstName": "Jane",
        "lastName": "Doe",
        "organization": "Acme Corporation",
        "phone": "+33123456789",
        "phoneIsWhatsapp": false,
        "phoneSmsEnabled": false,
        "postalCode": "94102",
        "saveButtonEnabled": false,
        "socialLinks": [],
        "state": "CA",
        "streetAddress": "123 Main Street",
        "title": "Software Engineer",
        "website": "https://acme.com"
      },
      "visitTypeCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "visitorDataCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      }
    },
    "rendersPage": false,
    "updatedAt": "2026-10-29T07:18:21.648Z"
  }
}
```

Base URL: `https://api.linkbreakers.com`

GET

`/v1/links/{linkId}/workflow-steps/validate`

Requires auth

## [#](#get-v1-links-linkid-workflow-steps-validate)Get V1 Links Workflow Steps Validate

Requires the \`workflows:read\` scope.

### [#](#get-v1-links-linkid-workflow-steps-validate-parameters)Parameters

#### path parameters

linkId

string

Required

path

### [#](#get-v1-links-linkid-workflow-steps-validate-response)Response

200

Everything worked as expected.

issues

array<object>

### [#](#get-v1-links-linkid-workflow-steps-validate-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X GET "https://api.linkbreakers.com/v1/links/{linkId}/workflow-steps/validate" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{
  "issues": [
    {
      "message": "string",
      "severity": "string",
      "stepId": "string",
      "stepType": "string"
    }
  ]
}
```

Base URL: `https://api.linkbreakers.com`

POST

`/v1/links/{linkId}/workflow-steps`

Requires auth

## [#](#create-a-new-workflow-step)Create a new workflow step

This endpoint allows users to create a new workflow step for a link. Workflow steps define the behavior of links, such as redirection destinations. Requires the \`workflows:write\` scope.

### [#](#create-a-new-workflow-step-parameters)Parameters

#### path parameters

linkId

string

Required

path

The ID of the link to create the workflow step for (UUID)

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#create-a-new-workflow-step-request)Request body

attributeCapture

object

A step's opt-in to save values to the visitor's profile, so a workflow can record qualification without a form: a tapped choice, a milestone reached, or the context of the link that was scanned. Available on every step except conditions, which only route on what is already known. A failed password attempt or a skipped form saves nothing. On forms it saves on top of the answers, which forms already save.

backButton

object

A page step's optional back button: a secondary button under the page's main actions that returns the visitor to the previous page in their browser, exactly like the browser's own back button. Use it for "Back to menu" on a sub-page reached from a MULTI\_LINK menu instead of wiring a connection back to the menu. It hides itself when there is no previous page in the journey, such as on the first page right after a scan, and it never shows on a step whose back\_button\_available is false. Available on page steps only: MESSAGE\_PAGE, MULTI\_LINK, CONTACT\_CARD, SOCIAL\_LINKS\_PAGE, FORM\_SUBMIT, PASSWORD\_VERIFY and THANK\_YOU\_PAGE. It is not part of the step's payload: set it with the back\_button field of workflow\_steps\_create or workflow\_steps\_update.

canvasPosition

object

Canvas position for React Flow node positioning

eventAction

string (enum)

leads to a next step, not straight out. Records which button the visitor pressed, so use it over SOCIAL\_LINKS\_PAGE when that choice is worth measuring or when a branch needs to do more than redirect. This is the menu step: for several documents or PDFs, give each one a button connected to an OPEN\_MEDIA step for media uploaded to the media library, or to a CLIENT\_REDIRECT when the document is already hosted at a URL. the common case, not the only one: app stores, docs, booking pages and storefronts all work, and the name is the only thing about it that is social. It is an exit step, so the visitor leaves from here. or UNKNOWN. AGENT is an AI agent that names itself (GPTBot, Claude-User, Perplexity-User...). AUTOMATED is a browser driven by software, whoever is behind it: headless Chrome from its request, and a visible browser under automation once a link with the Advanced data collection level has read navigator.webdriver, from that device's next visit on. visitor automatically. It carries no list of destinations, so a page that should offer a choice between two or more places is not this step. Use SOCIAL\_LINKS\_PAGE when the choices leave for external URLs, or MULTI\_LINK when each choice continues into more workflow. Never put links, documents or PDFs on it: it is a message, nothing else. an image (PNG, JPEG, WebP, SVG) or an MP4 video. The visitor is sent straight to the media, with no page of its own. Any media of the library can be opened: it is uploaded once and referenced by its media\_id; swapping it means pointing the step at another media item, and the QR code never changes. their permission (composite: two branches, "location" when it was shared, "else" when it was refused, skipped or is unavailable).

##### Allowed values

`EVENT_ACTION_UNSPECIFIED`

Event action not specified

`EVENT_ACTION_CLIENT_REDIRECT`

Redirect visitors to a destination URL

`EVENT_ACTION_LINK_VISIT`

Entry step triggered when the link is visited.

`EVENT_ACTION_PASSWORD_VERIFY`

Require visitors to enter a password before proceeding

`EVENT_ACTION_FORM_SUBMIT`

Present a data collection form to visitors

`EVENT_ACTION_CONTACT_CARD`

Generate a vCard (VCF) response with contact information

`EVENT_ACTION_MULTI_LINK`

A page of buttons where each one continues into more workflow: the button

`EVENT_ACTION_VISIT_TYPE_CONDITION`

Route visitors based on whether it's a first or returning visit

`EVENT_ACTION_COUNTRY_CONDITION`

Route visitors based on their country location

`EVENT_ACTION_DAY_OF_WEEK_CONDITION`

Route visitors based on day of week

`EVENT_ACTION_TIME_OF_DAY_CONDITION`

Route visitors based on time of day

`EVENT_ACTION_DAY_OF_MONTH_CONDITION`

Route visitors based on day of month

`EVENT_ACTION_SPECIFIC_DATE_CONDITION`

Route visitors based on specific calendar dates

`EVENT_ACTION_SOCIAL_LINKS_PAGE`

A page of buttons that each leave for an external URL. Social profiles are

`EVENT_ACTION_DEVICE_TYPE_CONDITION`

Route visitors based on device type (e.g. MOBILE, DESKTOP, TABLET)

`EVENT_ACTION_DEVICE_PLATFORM_CONDITION`

Route visitors based on device platform / operating system (e.g. iOS, Android, macOS)

`EVENT_ACTION_DEVICE_BROWSER_CONDITION`

Route visitors based on browser family (e.g. Chrome, Safari, Firefox)

`EVENT_ACTION_DEVICE_BRAND_CONDITION`

Route visitors based on hardware brand (e.g. Apple, Samsung, Google)

`EVENT_ACTION_DEVICE_ACTOR_CONDITION`

Route visitors based on actor classification: HUMAN, BOT, AGENT, AUTOMATED

`EVENT_ACTION_VISITOR_DATA_CONDITION`

Route visitors based on their profile data or custom attributes

`EVENT_ACTION_THANK_YOU_PAGE`

Display a final thank you / completion message (exit step)

`EVENT_ACTION_MESSAGE_PAGE`

Text with ONE way onward: a single button, or a timer that moves the

`EVENT_ACTION_OPEN_MEDIA`

Hand the visitor one piece of uploaded media, opened in their browser (exit step): a PDF,

`EVENT_ACTION_LOCATION_REQUEST`

Ask the visitor for their precise location (GPS) through the browser, with

id

string

Optional ID for the workflow step (UUID; if not provided, will be generated by backend)

insertBefore

string

Inserts the new step in front of this one: every branch that led to it now leads to the new step, and the new step's "next" branch leads on to it. Saves creating and then connecting each side by hand.

payload

object

Workflow step payload - uses oneof for type safety based on EventAction

### [#](#create-a-new-workflow-step-response)Response

200

Everything worked as expected.

workflowStep

object

Models a node in the Linkbreakers workflow canvas, defining what should occur after a scan (redirects, gates, forms) and how it connects to other steps in the visitor journey.

### [#](#create-a-new-workflow-step-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X POST "https://api.linkbreakers.com/v1/links/{linkId}/workflow-steps" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"attributeCapture":{"enabled":false,"writes":[{"key":"looking_for","mode":"ATTRIBUTE_WRITE_MODE_UNSPECIFIED","type":"VISITOR_ATTRIBUTE_TYPE_UNSPECIFIED","value":"{{choice.label}}"}]},"backButton":{"enabled":false,"label":"Back to menu"},"canvasPosition":{"x":0,"y":0},"eventAction":"EVENT_ACTION_FORM_SUBMIT","id":"987fcdeb-a321-45e6-b789-123456789012","insertBefore":"string","payload":{"clientRedirect":{"conversionTracking":true,"destination":"https://brand.example.com/checkout"},"countryCondition":{"countries":[{}],"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012"},"dayOfMonthCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"dayOfWeekCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"deviceActorCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"deviceBrandCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"deviceBrowserCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"devicePlatformCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"deviceTypeCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"form":{"autoSkipIfKnown":false,"formDescription":"string","formFields":[{}],"formTitle":"string","skipButtonText":"string","skipForm":false,"submitButtonText":"string"},"linkVisit":{},"locationRequest":{"askOnce":false,"buttonLabel":"Share my location","description":"We use it to show you the nearest store.","elseNextStepId":"123e4567-e89b-12d3-a456-426614174000","nextStepId":"123e4567-e89b-12d3-a456-426614174000","skipEnabled":false,"skipLabel":"Not now","title":"Share your location"},"messagePage":{"buttonLabel":"string","description":"string","navigationType":"MESSAGE_PAGE_NAVIGATION_TYPE_UNSPECIFIED","timerSeconds":0,"title":"string"},"multiLink":{"buttons":[{}],"description":"Select one of the options below to continue","title":"Choose your destination"},"openMedia":{"mediaId":"5f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f"},"password":{"description":"string","password":"string","title":"string"},"socialLinks":{"description":"Follow us on your favorite platform","displayStyle":"SOCIAL_LINKS_DISPLAY_STYLE_UNSPECIFIED","links":[{}],"title":"Connect with us"},"specificDateCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"thankYouPage":{"description":"string","title":"string"},"timeOfDayCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","ranges":[{}]},"vcard":{"buttonLabel":"Add to contacts","city":"San Francisco","country":"United States","email":"hello@acme.com","firstName":"Jane","lastName":"Doe","organization":"Acme Corporation","phone":"+33123456789","phoneIsWhatsapp":false,"phoneSmsEnabled":false,"postalCode":"94102","saveButtonEnabled":false,"socialLinks":[{}],"state":"CA","streetAddress":"123 Main Street","title":"Software Engineer","website":"https://acme.com"},"visitTypeCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"visitorDataCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]}}}'
```

Sample payload (application/json)

```json
{
  "attributeCapture": {
    "enabled": false,
    "writes": [
      {
        "key": "looking_for",
        "mode": "ATTRIBUTE_WRITE_MODE_UNSPECIFIED",
        "type": "VISITOR_ATTRIBUTE_TYPE_UNSPECIFIED",
        "value": "{{choice.label}}"
      }
    ]
  },
  "backButton": {
    "enabled": false,
    "label": "Back to menu"
  },
  "canvasPosition": {
    "x": 0,
    "y": 0
  },
  "eventAction": "EVENT_ACTION_FORM_SUBMIT",
  "id": "987fcdeb-a321-45e6-b789-123456789012",
  "insertBefore": "string",
  "payload": {
    "clientRedirect": {
      "conversionTracking": true,
      "destination": "https://brand.example.com/checkout"
    },
    "countryCondition": {
      "countries": [
        {}
      ],
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012"
    },
    "dayOfMonthCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "dayOfWeekCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "deviceActorCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "deviceBrandCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "deviceBrowserCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "devicePlatformCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "deviceTypeCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "form": {
      "autoSkipIfKnown": false,
      "formDescription": "string",
      "formFields": [
        {}
      ],
      "formTitle": "string",
      "skipButtonText": "string",
      "skipForm": false,
      "submitButtonText": "string"
    },
    "linkVisit": {},
    "locationRequest": {
      "askOnce": false,
      "buttonLabel": "Share my location",
      "description": "We use it to show you the nearest store.",
      "elseNextStepId": "123e4567-e89b-12d3-a456-426614174000",
      "nextStepId": "123e4567-e89b-12d3-a456-426614174000",
      "skipEnabled": false,
      "skipLabel": "Not now",
      "title": "Share your location"
    },
    "messagePage": {
      "buttonLabel": "string",
      "description": "string",
      "navigationType": "MESSAGE_PAGE_NAVIGATION_TYPE_UNSPECIFIED",
      "timerSeconds": 0,
      "title": "string"
    },
    "multiLink": {
      "buttons": [
        {}
      ],
      "description": "Select one of the options below to continue",
      "title": "Choose your destination"
    },
    "openMedia": {
      "mediaId": "5f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f"
    },
    "password": {
      "description": "string",
      "password": "string",
      "title": "string"
    },
    "socialLinks": {
      "description": "Follow us on your favorite platform",
      "displayStyle": "SOCIAL_LINKS_DISPLAY_STYLE_UNSPECIFIED",
      "links": [
        {}
      ],
      "title": "Connect with us"
    },
    "specificDateCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "thankYouPage": {
      "description": "string",
      "title": "string"
    },
    "timeOfDayCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "ranges": [
        {}
      ]
    },
    "vcard": {
      "buttonLabel": "Add to contacts",
      "city": "San Francisco",
      "country": "United States",
      "email": "hello@acme.com",
      "firstName": "Jane",
      "lastName": "Doe",
      "organization": "Acme Corporation",
      "phone": "+33123456789",
      "phoneIsWhatsapp": false,
      "phoneSmsEnabled": false,
      "postalCode": "94102",
      "saveButtonEnabled": false,
      "socialLinks": [
        {}
      ],
      "state": "CA",
      "streetAddress": "123 Main Street",
      "title": "Software Engineer",
      "website": "https://acme.com"
    },
    "visitTypeCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "visitorDataCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    }
  }
}
```

Typical response

```json
{
  "workflowStep": {
    "attributeCapture": {
      "enabled": false,
      "writes": [
        {}
      ]
    },
    "backButton": {
      "enabled": false,
      "label": "Back to menu"
    },
    "backButtonAvailable": false,
    "branches": [
      {
        "branchId": "string",
        "label": "string",
        "nextStepId": "string"
      }
    ],
    "canvasPosition": {
      "x": 0,
      "y": 0
    },
    "childStepIds": [
      "string"
    ],
    "createdAt": "2026-10-29T07:18:21.646Z",
    "eventAction": "EVENT_ACTION_CLIENT_REDIRECT",
    "id": "a5f7b184-9d74-4f2a-9ed9-8f6a98cb12f4",
    "kind": "KIND_INTERACTION",
    "linkId": "123e4567-e89b-12d3-a456-426614174000",
    "nextCanGoBack": false,
    "nodeType": "NODE_TYPE_COMPOSITE",
    "parentStepIds": [
      "string"
    ],
    "payload": {
      "clientRedirect": {
        "conversionTracking": true,
        "destination": "https://brand.example.com/checkout"
      },
      "countryCondition": {
        "countries": [],
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012"
      },
      "dayOfMonthCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "dayOfWeekCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceActorCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceBrandCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceBrowserCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "devicePlatformCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceTypeCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "form": {
        "autoSkipIfKnown": false,
        "formDescription": "string",
        "formFields": [],
        "formTitle": "string",
        "skipButtonText": "string",
        "skipForm": false,
        "submitButtonText": "string"
      },
      "linkVisit": {},
      "locationRequest": {
        "askOnce": false,
        "buttonLabel": "Share my location",
        "description": "We use it to show you the nearest store.",
        "elseNextStepId": "123e4567-e89b-12d3-a456-426614174000",
        "nextStepId": "123e4567-e89b-12d3-a456-426614174000",
        "skipEnabled": false,
        "skipLabel": "Not now",
        "title": "Share your location"
      },
      "messagePage": {
        "buttonLabel": "string",
        "description": "string",
        "navigationType": "MESSAGE_PAGE_NAVIGATION_TYPE_UNSPECIFIED",
        "timerSeconds": 0,
        "title": "string"
      },
      "multiLink": {
        "buttons": [],
        "description": "Select one of the options below to continue",
        "title": "Choose your destination"
      },
      "openMedia": {
        "mediaId": "5f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f"
      },
      "password": {
        "description": "string",
        "password": "string",
        "title": "string"
      },
      "socialLinks": {
        "description": "Follow us on your favorite platform",
        "displayStyle": "SOCIAL_LINKS_DISPLAY_STYLE_UNSPECIFIED",
        "links": [],
        "title": "Connect with us"
      },
      "specificDateCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "thankYouPage": {
        "description": "string",
        "title": "string"
      },
      "timeOfDayCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "ranges": []
      },
      "vcard": {
        "buttonLabel": "Add to contacts",
        "city": "San Francisco",
        "country": "United States",
        "email": "hello@acme.com",
        "firstName": "Jane",
        "lastName": "Doe",
        "organization": "Acme Corporation",
        "phone": "+33123456789",
        "phoneIsWhatsapp": false,
        "phoneSmsEnabled": false,
        "postalCode": "94102",
        "saveButtonEnabled": false,
        "socialLinks": [],
        "state": "CA",
        "streetAddress": "123 Main Street",
        "title": "Software Engineer",
        "website": "https://acme.com"
      },
      "visitTypeCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "visitorDataCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      }
    },
    "rendersPage": false,
    "updatedAt": "2026-10-29T07:18:21.646Z"
  }
}
```

Base URL: `https://api.linkbreakers.com`

POST

`/v1/links/{linkId}/workflow-steps/{stepId}/resolve-collisions`

Requires auth

## [#](#resolve-step-collisions)Resolve step collisions

Pushes overlapping steps away from a given anchor step using iterative radial repulsion. The anchor step stays fixed. Use after adding or moving individual steps to preserve the existing layout. Requires the \`workflows:write\` scope.

### [#](#resolve-step-collisions-parameters)Parameters

#### path parameters

linkId

string

Required

path

stepId

string

Required

path

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#resolve-step-collisions-request)Request body

No structured schema available for this section.

### [#](#resolve-step-collisions-response)Response

200

Everything worked as expected.

stepsRepositioned

integer (int32)

### [#](#resolve-step-collisions-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X POST "https://api.linkbreakers.com/v1/links/{linkId}/workflow-steps/{stepId}/resolve-collisions" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{}'
```

Sample payload (application/json)

```json
{}
```

Typical response

```json
{
  "stepsRepositioned": 0
}
```

Base URL: `https://api.linkbreakers.com`

POST

`/v1/links/{linkId}/workflow-steps/auto-layout`

Requires auth

## [#](#auto-layout-workflow)Auto-layout workflow

Arranges all workflow steps in a clean left-to-right DAG layout. Useful after building a workflow from scratch. Requires the \`workflows:write\` scope.

### [#](#auto-layout-workflow-parameters)Parameters

#### path parameters

linkId

string

Required

path

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#auto-layout-workflow-request)Request body

No structured schema available for this section.

### [#](#auto-layout-workflow-response)Response

200

Everything worked as expected.

stepsRepositioned

integer (int32)

### [#](#auto-layout-workflow-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X POST "https://api.linkbreakers.com/v1/links/{linkId}/workflow-steps/auto-layout" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{}'
```

Sample payload (application/json)

```json
{}
```

Typical response

```json
{
  "stepsRepositioned": 0
}
```

Base URL: `https://api.linkbreakers.com`

PUT

`/v1/links/{linkId}/workflow-steps/{stepId}/branches/{branchId}/connection`

Requires auth

## [#](#connect-one-exit-of-a-workflow-step-to-another-step)Connect one exit of a workflow step to another step

Every workflow step is connected the same way: name the branch it leaves from, and the step it leads to. Atomic steps (redirect, password, form, message page) have exactly one branch, "next". Composite steps (multi-link, conditions) have one branch per button, option or range, plus "else" for a condition's fallback. Exit steps end the journey and have no branches at all. Read a step to see its branches, their ids and their current destinations. Idempotent: connecting a branch to the step it already leads to is a no-op. Requires the \`workflows:write\` scope.

### [#](#connect-one-exit-of-a-workflow-step-to-another-step-parameters)Parameters

#### path parameters

linkId

string

Required

path

The ID of the link (UUID)

stepId

string

Required

path

The ID of the step the connection leaves from (UUID)

branchId

string

Required

path

Which exit of that step to connect. "next" for atomic steps, or a button id, option id, range id, country code, or "else" for composite steps.

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#connect-one-exit-of-a-workflow-step-to-another-step-request)Request body

nextStepId

string

The ID of the step this branch leads to (UUID)

### [#](#connect-one-exit-of-a-workflow-step-to-another-step-response)Response

200

Everything worked as expected.

disconnectedSteps

array<object>

Steps that nothing can reach now that this connection changed. Empty means the whole workflow is still connected.

unconnectedBranchIds

array<string>

Branches of this step that still lead nowhere, reported without being asked for. Wiring one branch of a condition and forgetting the rest is the most common way a workflow ships broken: the visitor who takes an unwired branch falls through to the fallback URL. Nothing here is unreachable, so a graph-level check would not catch it — only the step itself knows. Empty means every exit of this step leads somewhere.

workflowStep

object

Models a node in the Linkbreakers workflow canvas, defining what should occur after a scan (redirects, gates, forms) and how it connects to other steps in the visitor journey.

### [#](#connect-one-exit-of-a-workflow-step-to-another-step-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X PUT "https://api.linkbreakers.com/v1/links/{linkId}/workflow-steps/{stepId}/branches/{branchId}/connection" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"nextStepId":"456789ab-cdef-1234-5678-9abcdef01234"}'
```

Sample payload (application/json)

```json
{
  "nextStepId": "456789ab-cdef-1234-5678-9abcdef01234"
}
```

Typical response

```json
{
  "disconnectedSteps": [
    {
      "message": "string",
      "severity": "string",
      "stepId": "string",
      "stepType": "string"
    }
  ],
  "unconnectedBranchIds": [
    "string"
  ],
  "workflowStep": {
    "attributeCapture": {
      "enabled": false,
      "writes": [
        {}
      ]
    },
    "backButton": {
      "enabled": false,
      "label": "Back to menu"
    },
    "backButtonAvailable": false,
    "branches": [
      {
        "branchId": "string",
        "label": "string",
        "nextStepId": "string"
      }
    ],
    "canvasPosition": {
      "x": 0,
      "y": 0
    },
    "childStepIds": [
      "string"
    ],
    "createdAt": "2026-10-29T07:18:21.652Z",
    "eventAction": "EVENT_ACTION_CLIENT_REDIRECT",
    "id": "a5f7b184-9d74-4f2a-9ed9-8f6a98cb12f4",
    "kind": "KIND_INTERACTION",
    "linkId": "123e4567-e89b-12d3-a456-426614174000",
    "nextCanGoBack": false,
    "nodeType": "NODE_TYPE_COMPOSITE",
    "parentStepIds": [
      "string"
    ],
    "payload": {
      "clientRedirect": {
        "conversionTracking": true,
        "destination": "https://brand.example.com/checkout"
      },
      "countryCondition": {
        "countries": [],
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012"
      },
      "dayOfMonthCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "dayOfWeekCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceActorCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceBrandCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceBrowserCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "devicePlatformCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceTypeCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "form": {
        "autoSkipIfKnown": false,
        "formDescription": "string",
        "formFields": [],
        "formTitle": "string",
        "skipButtonText": "string",
        "skipForm": false,
        "submitButtonText": "string"
      },
      "linkVisit": {},
      "locationRequest": {
        "askOnce": false,
        "buttonLabel": "Share my location",
        "description": "We use it to show you the nearest store.",
        "elseNextStepId": "123e4567-e89b-12d3-a456-426614174000",
        "nextStepId": "123e4567-e89b-12d3-a456-426614174000",
        "skipEnabled": false,
        "skipLabel": "Not now",
        "title": "Share your location"
      },
      "messagePage": {
        "buttonLabel": "string",
        "description": "string",
        "navigationType": "MESSAGE_PAGE_NAVIGATION_TYPE_UNSPECIFIED",
        "timerSeconds": 0,
        "title": "string"
      },
      "multiLink": {
        "buttons": [],
        "description": "Select one of the options below to continue",
        "title": "Choose your destination"
      },
      "openMedia": {
        "mediaId": "5f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f"
      },
      "password": {
        "description": "string",
        "password": "string",
        "title": "string"
      },
      "socialLinks": {
        "description": "Follow us on your favorite platform",
        "displayStyle": "SOCIAL_LINKS_DISPLAY_STYLE_UNSPECIFIED",
        "links": [],
        "title": "Connect with us"
      },
      "specificDateCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "thankYouPage": {
        "description": "string",
        "title": "string"
      },
      "timeOfDayCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "ranges": []
      },
      "vcard": {
        "buttonLabel": "Add to contacts",
        "city": "San Francisco",
        "country": "United States",
        "email": "hello@acme.com",
        "firstName": "Jane",
        "lastName": "Doe",
        "organization": "Acme Corporation",
        "phone": "+33123456789",
        "phoneIsWhatsapp": false,
        "phoneSmsEnabled": false,
        "postalCode": "94102",
        "saveButtonEnabled": false,
        "socialLinks": [],
        "state": "CA",
        "streetAddress": "123 Main Street",
        "title": "Software Engineer",
        "website": "https://acme.com"
      },
      "visitTypeCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "visitorDataCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      }
    },
    "rendersPage": false,
    "updatedAt": "2026-10-29T07:18:21.652Z"
  }
}
```

Base URL: `https://api.linkbreakers.com`

PATCH

`/v1/links/{linkId}/workflow-steps/{id}`

Requires auth

## [#](#update-a-workflow-step)Update a workflow step

Updates an existing workflow step for a link. Requires the \`workflows:write\` scope.

### [#](#update-a-workflow-step-parameters)Parameters

#### path parameters

linkId

string

Required

path

The ID of the link (UUID)

id

string

Required

path

The ID of the workflow step to update (UUID)

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#update-a-workflow-step-request)Request body

attributeCapture

object

A step's opt-in to save values to the visitor's profile, so a workflow can record qualification without a form: a tapped choice, a milestone reached, or the context of the link that was scanned. Available on every step except conditions, which only route on what is already known. A failed password attempt or a skipped form saves nothing. On forms it saves on top of the answers, which forms already save.

backButton

object

A page step's optional back button: a secondary button under the page's main actions that returns the visitor to the previous page in their browser, exactly like the browser's own back button. Use it for "Back to menu" on a sub-page reached from a MULTI\_LINK menu instead of wiring a connection back to the menu. It hides itself when there is no previous page in the journey, such as on the first page right after a scan, and it never shows on a step whose back\_button\_available is false. Available on page steps only: MESSAGE\_PAGE, MULTI\_LINK, CONTACT\_CARD, SOCIAL\_LINKS\_PAGE, FORM\_SUBMIT, PASSWORD\_VERIFY and THANK\_YOU\_PAGE. It is not part of the step's payload: set it with the back\_button field of workflow\_steps\_create or workflow\_steps\_update.

canvasPosition

object

Canvas position for React Flow node positioning

payload

object

Workflow step payload - uses oneof for type safety based on EventAction

### [#](#update-a-workflow-step-response)Response

200

Everything worked as expected.

workflowStep

object

Models a node in the Linkbreakers workflow canvas, defining what should occur after a scan (redirects, gates, forms) and how it connects to other steps in the visitor journey.

### [#](#update-a-workflow-step-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X PATCH "https://api.linkbreakers.com/v1/links/{linkId}/workflow-steps/{id}" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"attributeCapture":{"enabled":false,"writes":[{"key":"looking_for","mode":"ATTRIBUTE_WRITE_MODE_UNSPECIFIED","type":"VISITOR_ATTRIBUTE_TYPE_UNSPECIFIED","value":"{{choice.label}}"}]},"backButton":{"enabled":false,"label":"Back to menu"},"canvasPosition":{"x":0,"y":0},"payload":{"clientRedirect":{"conversionTracking":true,"destination":"https://brand.example.com/checkout"},"countryCondition":{"countries":[{}],"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012"},"dayOfMonthCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"dayOfWeekCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"deviceActorCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"deviceBrandCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"deviceBrowserCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"devicePlatformCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"deviceTypeCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"form":{"autoSkipIfKnown":false,"formDescription":"string","formFields":[{}],"formTitle":"string","skipButtonText":"string","skipForm":false,"submitButtonText":"string"},"linkVisit":{},"locationRequest":{"askOnce":false,"buttonLabel":"Share my location","description":"We use it to show you the nearest store.","elseNextStepId":"123e4567-e89b-12d3-a456-426614174000","nextStepId":"123e4567-e89b-12d3-a456-426614174000","skipEnabled":false,"skipLabel":"Not now","title":"Share your location"},"messagePage":{"buttonLabel":"string","description":"string","navigationType":"MESSAGE_PAGE_NAVIGATION_TYPE_UNSPECIFIED","timerSeconds":0,"title":"string"},"multiLink":{"buttons":[{}],"description":"Select one of the options below to continue","title":"Choose your destination"},"openMedia":{"mediaId":"5f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f"},"password":{"description":"string","password":"string","title":"string"},"socialLinks":{"description":"Follow us on your favorite platform","displayStyle":"SOCIAL_LINKS_DISPLAY_STYLE_UNSPECIFIED","links":[{}],"title":"Connect with us"},"specificDateCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"thankYouPage":{"description":"string","title":"string"},"timeOfDayCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","ranges":[{}]},"vcard":{"buttonLabel":"Add to contacts","city":"San Francisco","country":"United States","email":"hello@acme.com","firstName":"Jane","lastName":"Doe","organization":"Acme Corporation","phone":"+33123456789","phoneIsWhatsapp":false,"phoneSmsEnabled":false,"postalCode":"94102","saveButtonEnabled":false,"socialLinks":[{}],"state":"CA","streetAddress":"123 Main Street","title":"Software Engineer","website":"https://acme.com"},"visitTypeCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]},"visitorDataCondition":{"elseNextStepId":"987fcdeb-a321-45e6-b789-123456789012","options":[{}]}}}'
```

Sample payload (application/json)

```json
{
  "attributeCapture": {
    "enabled": false,
    "writes": [
      {
        "key": "looking_for",
        "mode": "ATTRIBUTE_WRITE_MODE_UNSPECIFIED",
        "type": "VISITOR_ATTRIBUTE_TYPE_UNSPECIFIED",
        "value": "{{choice.label}}"
      }
    ]
  },
  "backButton": {
    "enabled": false,
    "label": "Back to menu"
  },
  "canvasPosition": {
    "x": 0,
    "y": 0
  },
  "payload": {
    "clientRedirect": {
      "conversionTracking": true,
      "destination": "https://brand.example.com/checkout"
    },
    "countryCondition": {
      "countries": [
        {}
      ],
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012"
    },
    "dayOfMonthCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "dayOfWeekCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "deviceActorCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "deviceBrandCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "deviceBrowserCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "devicePlatformCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "deviceTypeCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "form": {
      "autoSkipIfKnown": false,
      "formDescription": "string",
      "formFields": [
        {}
      ],
      "formTitle": "string",
      "skipButtonText": "string",
      "skipForm": false,
      "submitButtonText": "string"
    },
    "linkVisit": {},
    "locationRequest": {
      "askOnce": false,
      "buttonLabel": "Share my location",
      "description": "We use it to show you the nearest store.",
      "elseNextStepId": "123e4567-e89b-12d3-a456-426614174000",
      "nextStepId": "123e4567-e89b-12d3-a456-426614174000",
      "skipEnabled": false,
      "skipLabel": "Not now",
      "title": "Share your location"
    },
    "messagePage": {
      "buttonLabel": "string",
      "description": "string",
      "navigationType": "MESSAGE_PAGE_NAVIGATION_TYPE_UNSPECIFIED",
      "timerSeconds": 0,
      "title": "string"
    },
    "multiLink": {
      "buttons": [
        {}
      ],
      "description": "Select one of the options below to continue",
      "title": "Choose your destination"
    },
    "openMedia": {
      "mediaId": "5f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f"
    },
    "password": {
      "description": "string",
      "password": "string",
      "title": "string"
    },
    "socialLinks": {
      "description": "Follow us on your favorite platform",
      "displayStyle": "SOCIAL_LINKS_DISPLAY_STYLE_UNSPECIFIED",
      "links": [
        {}
      ],
      "title": "Connect with us"
    },
    "specificDateCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "thankYouPage": {
      "description": "string",
      "title": "string"
    },
    "timeOfDayCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "ranges": [
        {}
      ]
    },
    "vcard": {
      "buttonLabel": "Add to contacts",
      "city": "San Francisco",
      "country": "United States",
      "email": "hello@acme.com",
      "firstName": "Jane",
      "lastName": "Doe",
      "organization": "Acme Corporation",
      "phone": "+33123456789",
      "phoneIsWhatsapp": false,
      "phoneSmsEnabled": false,
      "postalCode": "94102",
      "saveButtonEnabled": false,
      "socialLinks": [
        {}
      ],
      "state": "CA",
      "streetAddress": "123 Main Street",
      "title": "Software Engineer",
      "website": "https://acme.com"
    },
    "visitTypeCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    },
    "visitorDataCondition": {
      "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
      "options": [
        {}
      ]
    }
  }
}
```

Typical response

```json
{
  "workflowStep": {
    "attributeCapture": {
      "enabled": false,
      "writes": [
        {}
      ]
    },
    "backButton": {
      "enabled": false,
      "label": "Back to menu"
    },
    "backButtonAvailable": false,
    "branches": [
      {
        "branchId": "string",
        "label": "string",
        "nextStepId": "string"
      }
    ],
    "canvasPosition": {
      "x": 0,
      "y": 0
    },
    "childStepIds": [
      "string"
    ],
    "createdAt": "2026-10-29T07:18:21.650Z",
    "eventAction": "EVENT_ACTION_CLIENT_REDIRECT",
    "id": "a5f7b184-9d74-4f2a-9ed9-8f6a98cb12f4",
    "kind": "KIND_INTERACTION",
    "linkId": "123e4567-e89b-12d3-a456-426614174000",
    "nextCanGoBack": false,
    "nodeType": "NODE_TYPE_COMPOSITE",
    "parentStepIds": [
      "string"
    ],
    "payload": {
      "clientRedirect": {
        "conversionTracking": true,
        "destination": "https://brand.example.com/checkout"
      },
      "countryCondition": {
        "countries": [],
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012"
      },
      "dayOfMonthCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "dayOfWeekCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceActorCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceBrandCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceBrowserCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "devicePlatformCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceTypeCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "form": {
        "autoSkipIfKnown": false,
        "formDescription": "string",
        "formFields": [],
        "formTitle": "string",
        "skipButtonText": "string",
        "skipForm": false,
        "submitButtonText": "string"
      },
      "linkVisit": {},
      "locationRequest": {
        "askOnce": false,
        "buttonLabel": "Share my location",
        "description": "We use it to show you the nearest store.",
        "elseNextStepId": "123e4567-e89b-12d3-a456-426614174000",
        "nextStepId": "123e4567-e89b-12d3-a456-426614174000",
        "skipEnabled": false,
        "skipLabel": "Not now",
        "title": "Share your location"
      },
      "messagePage": {
        "buttonLabel": "string",
        "description": "string",
        "navigationType": "MESSAGE_PAGE_NAVIGATION_TYPE_UNSPECIFIED",
        "timerSeconds": 0,
        "title": "string"
      },
      "multiLink": {
        "buttons": [],
        "description": "Select one of the options below to continue",
        "title": "Choose your destination"
      },
      "openMedia": {
        "mediaId": "5f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f"
      },
      "password": {
        "description": "string",
        "password": "string",
        "title": "string"
      },
      "socialLinks": {
        "description": "Follow us on your favorite platform",
        "displayStyle": "SOCIAL_LINKS_DISPLAY_STYLE_UNSPECIFIED",
        "links": [],
        "title": "Connect with us"
      },
      "specificDateCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "thankYouPage": {
        "description": "string",
        "title": "string"
      },
      "timeOfDayCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "ranges": []
      },
      "vcard": {
        "buttonLabel": "Add to contacts",
        "city": "San Francisco",
        "country": "United States",
        "email": "hello@acme.com",
        "firstName": "Jane",
        "lastName": "Doe",
        "organization": "Acme Corporation",
        "phone": "+33123456789",
        "phoneIsWhatsapp": false,
        "phoneSmsEnabled": false,
        "postalCode": "94102",
        "saveButtonEnabled": false,
        "socialLinks": [],
        "state": "CA",
        "streetAddress": "123 Main Street",
        "title": "Software Engineer",
        "website": "https://acme.com"
      },
      "visitTypeCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "visitorDataCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      }
    },
    "rendersPage": false,
    "updatedAt": "2026-10-29T07:18:21.651Z"
  }
}
```

Base URL: `https://api.linkbreakers.com`

DELETE

`/v1/links/{linkId}/workflow-steps/{id}`

Requires auth

## [#](#delete-a-workflow-step)Delete a workflow step

Removes a workflow step from the link. This operation cannot be undone. Requires the \`workflows:write\` scope.

### [#](#delete-a-workflow-step-parameters)Parameters

#### path parameters

linkId

string

Required

path

The ID of the link (UUID)

id

string

Required

path

The ID of the workflow step to delete (UUID)

### [#](#delete-a-workflow-step-response)Response

200

Everything worked as expected.

No structured schema available for this section.

### [#](#delete-a-workflow-step-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X DELETE "https://api.linkbreakers.com/v1/links/{linkId}/workflow-steps/{id}" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{}
```

Base URL: `https://api.linkbreakers.com`

DELETE

`/v1/links/{linkId}/workflow-steps/{stepId}/branches/{branchId}/connection`

Requires auth

## [#](#clear-one-exit-of-a-workflow-step)Clear one exit of a workflow step

Leaves the branch with no destination. Clearing a branch that is already clear succeeds. See ConnectStep for what a branch id is. Requires the \`workflows:write\` scope.

### [#](#clear-one-exit-of-a-workflow-step-parameters)Parameters

#### path parameters

linkId

string

Required

path

The ID of the link (UUID)

stepId

string

Required

path

The ID of the step the connection leaves from (UUID)

branchId

string

Required

path

Which exit of that step to clear. See ConnectWorkflowStepRequest.branch\_id.

### [#](#clear-one-exit-of-a-workflow-step-response)Response

200

Everything worked as expected.

disconnectedSteps

array<object>

Steps that nothing can reach now that this connection was cleared

unconnectedBranchIds

array<string>

Branches of this step that lead nowhere, including the one just cleared

workflowStep

object

Models a node in the Linkbreakers workflow canvas, defining what should occur after a scan (redirects, gates, forms) and how it connects to other steps in the visitor journey.

### [#](#clear-one-exit-of-a-workflow-step-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X DELETE "https://api.linkbreakers.com/v1/links/{linkId}/workflow-steps/{stepId}/branches/{branchId}/connection" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{
  "disconnectedSteps": [
    {
      "message": "string",
      "severity": "string",
      "stepId": "string",
      "stepType": "string"
    }
  ],
  "unconnectedBranchIds": [
    "string"
  ],
  "workflowStep": {
    "attributeCapture": {
      "enabled": false,
      "writes": [
        {}
      ]
    },
    "backButton": {
      "enabled": false,
      "label": "Back to menu"
    },
    "backButtonAvailable": false,
    "branches": [
      {
        "branchId": "string",
        "label": "string",
        "nextStepId": "string"
      }
    ],
    "canvasPosition": {
      "x": 0,
      "y": 0
    },
    "childStepIds": [
      "string"
    ],
    "createdAt": "2026-10-29T07:18:21.658Z",
    "eventAction": "EVENT_ACTION_CLIENT_REDIRECT",
    "id": "a5f7b184-9d74-4f2a-9ed9-8f6a98cb12f4",
    "kind": "KIND_INTERACTION",
    "linkId": "123e4567-e89b-12d3-a456-426614174000",
    "nextCanGoBack": false,
    "nodeType": "NODE_TYPE_COMPOSITE",
    "parentStepIds": [
      "string"
    ],
    "payload": {
      "clientRedirect": {
        "conversionTracking": true,
        "destination": "https://brand.example.com/checkout"
      },
      "countryCondition": {
        "countries": [],
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012"
      },
      "dayOfMonthCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "dayOfWeekCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceActorCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceBrandCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceBrowserCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "devicePlatformCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "deviceTypeCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "form": {
        "autoSkipIfKnown": false,
        "formDescription": "string",
        "formFields": [],
        "formTitle": "string",
        "skipButtonText": "string",
        "skipForm": false,
        "submitButtonText": "string"
      },
      "linkVisit": {},
      "locationRequest": {
        "askOnce": false,
        "buttonLabel": "Share my location",
        "description": "We use it to show you the nearest store.",
        "elseNextStepId": "123e4567-e89b-12d3-a456-426614174000",
        "nextStepId": "123e4567-e89b-12d3-a456-426614174000",
        "skipEnabled": false,
        "skipLabel": "Not now",
        "title": "Share your location"
      },
      "messagePage": {
        "buttonLabel": "string",
        "description": "string",
        "navigationType": "MESSAGE_PAGE_NAVIGATION_TYPE_UNSPECIFIED",
        "timerSeconds": 0,
        "title": "string"
      },
      "multiLink": {
        "buttons": [],
        "description": "Select one of the options below to continue",
        "title": "Choose your destination"
      },
      "openMedia": {
        "mediaId": "5f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f"
      },
      "password": {
        "description": "string",
        "password": "string",
        "title": "string"
      },
      "socialLinks": {
        "description": "Follow us on your favorite platform",
        "displayStyle": "SOCIAL_LINKS_DISPLAY_STYLE_UNSPECIFIED",
        "links": [],
        "title": "Connect with us"
      },
      "specificDateCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "thankYouPage": {
        "description": "string",
        "title": "string"
      },
      "timeOfDayCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "ranges": []
      },
      "vcard": {
        "buttonLabel": "Add to contacts",
        "city": "San Francisco",
        "country": "United States",
        "email": "hello@acme.com",
        "firstName": "Jane",
        "lastName": "Doe",
        "organization": "Acme Corporation",
        "phone": "+33123456789",
        "phoneIsWhatsapp": false,
        "phoneSmsEnabled": false,
        "postalCode": "94102",
        "saveButtonEnabled": false,
        "socialLinks": [],
        "state": "CA",
        "streetAddress": "123 Main Street",
        "title": "Software Engineer",
        "website": "https://acme.com"
      },
      "visitTypeCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      },
      "visitorDataCondition": {
        "elseNextStepId": "987fcdeb-a321-45e6-b789-123456789012",
        "options": []
      }
    },
    "rendersPage": false,
    "updatedAt": "2026-10-29T07:18:21.658Z"
  }
}
```

Base URL: `https://api.linkbreakers.com`

Cookies

We use cookies to measure our ads with Meta and Google and to record visits with PostHog. Our own analytics are cookie-free and run either way. [Privacy statement](https://linkbreakers.com/privacy#cookies)

---

Source: https://linkbreakers.com/help/api/workflow-steps
