> ## Documentation Index
> Fetch the complete documentation index at: https://docs.teamfollowup.ai/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Use the public API base URL: https://api.teamfollowup.ai/api.
> Authenticate public API requests with Authorization: Bearer YOUR_API_KEY.
> Use product-owned terms: agents, campaigns, projects (GoHighLevel sub-accounts), contacts, calls, outcomes, skills, cadences, phone numbers.
> Scope requests by locationId rather than projectName.
> Read the guide linked from each API reference group before recommending an endpoint.

# Get pipeline steps

> Load the visible cadence schedule, step counts, callback count, and parked-lead count for the Power Dialer workspace. Customer roles: `agency_admin`, `project_user`.

Required API key scope: `power_dialer:read`.



## OpenAPI

````yaml /openapi.yaml get /api/power-dialer/pipeline/steps
openapi: 3.1.0
info:
  title: TFUAI Server API
  version: 1.0.0
  description: >-
    API reference for the TFUAI SaaS server.


    All published endpoints are mounted under `/api`. Responses use a standard
    envelope: `{ "success": true, ... }` on success and `{ "success": false,
    "error": "..." }` on failure.


    Product API modules are being launched module by module. This spec currently
    exposes only contracted public modules.


    Authenticate public API requests with an API key in the `Authorization`
    header: `Authorization: Bearer YOUR_API_KEY`.
servers:
  - url: https://api.teamfollowup.ai
    description: Production API origin. Public API paths are under /api.
security: []
tags:
  - name: Agents
    description: >-
      Build the conversation: identity and settings, script, lead context and
      split testing.
  - name: Analytics
    description: >-
      Understand call volume, pickup, booking and transfer metrics within the
      selected reporting scope.
  - name: Billing
    description: >-
      Balances, spend, purchases and sub-account rebilling. Reference and guides
      only; the builder chatbot has no billing playbook.
  - name: Calls
    description: >-
      Review completed calls, recordings, transcripts and campaign run history;
      distinguish observation from placing a new call.
  - name: Campaigns
    description: >-
      Configure what starts calls, who is eligible, calling windows, caller IDs,
      activation and the actions that follow each outcome.


      What runs after a call lands: for each outcome (booked, opted out, asked
      for a callback…), an ordered chain of actions — tag the contact, move a
      pipeline stage, send an SMS, book an appointment. Stored as a graph:
      `nodes` are the actions, `edges` say what follows what, and
      `dispositionEntries` maps each outcome to the node its chain starts at.


      **Pick the narrowest endpoint that does the job.**


      | To | Call | |

      | --- | --- | --- |

      | See what fires per outcome | `GET .../workflow?view=summary` | Reads as
      plain text, no graph walking |

      | Add steps to an outcome | `POST .../outcomes/{outcome}/nodes` | Server
      derives node ids, edge ids, handles, layout |

      | Change a message, tag or setting | `PATCH .../workflow` | Merges;
      carries no graph, so it cannot damage one |

      | Remove one step | `DELETE .../nodes/{nodeId}` | Also re-links the chain
      around it |

      | Author or replace the whole graph | `PUT .../workflow` | Replaces
      everything you send |


      `PUT` is the only one that can re-wire, position nodes, build an `if`,
      save an unconfigured draft, or copy a whole workflow — and the only one
      that can overwrite a change someone else made after you read it. Use it
      when you are genuinely authoring the graph, and send `expectedVersion`
      when you do. For everything else the narrower endpoints are both easier
      and safer.
  - name: Contacts
    description: >-
      Find contacts and their calls, manage do-not-call status and identify
      internal contacts excluded from reporting.
  - name: In-call Capabilities
    description: >-
      Configure actions and instructions the agent uses during a live call:
      booking, transfers, lookups and custom skills.
  - name: Master agent
    description: >-
      Run a shared agent and campaign across linked projects; manage
      inheritance, local bindings, synchronization and rollout readiness.
  - name: Native Calendar
    description: >-
      The diary of a sub-account with no CRM: its bookable calendars, the free
      slots they offer, and the appointments on them. Availability is computed
      per request against live bookings and is never cached, because a cached
      slot is one somebody else has already taken.
  - name: Native Contacts
    description: >-
      The people a sub-account with no CRM calls, and the fields it keeps on
      them. This is the system of record for those contacts: there is nowhere
      else they exist. A sub-account with a CRM keeps its contacts there and
      every operation here answers 400 for it.
  - name: Phone Numbers
    description: >-
      Find and manage caller IDs, assign numbers to campaigns and understand
      connected Twilio numbers.
  - name: Projects
    description: >-
      Understand project ownership, inspect configuration and validate the local
      resources used by a campaign.
  - name: TFU Live
    description: >-
      Build one TFU Live agent with its Brain, Voice and equipped actions;
      connect it through shared Campaigns.
  - name: Voices
    description: >-
      Browse the voice catalogue and select a voice; configure speech and
      listening behavior in Agents.
paths:
  /api/power-dialer/pipeline/steps:
    get:
      tags:
        - Campaigns
      summary: Get pipeline steps
      description: >-
        Load the visible cadence schedule, step counts, callback count, and
        parked-lead count for the Power Dialer workspace. Customer roles:
        `agency_admin`, `project_user`.


        Required API key scope: `power_dialer:read`.
      operationId: get-pipeline-steps
      parameters:
        - name: locationId
          in: query
          required: false
          schema:
            type: string
          description: Project location id used to scope the cadence schedule.
          example: loc_9f7a123
        - name: leadLocationId
          in: query
          required: false
          schema:
            type: string
          description: >-
            Optional lead location override. Use `__all__` to include every
            linked subaccount the caller can access.
          example: __all__
        - name: campaignId
          in: query
          required: false
          schema:
            type: string
          description: Campaign id used to scope campaign-bound cadence editing.
          example: campaign_speed_to_lead_123
        - name: campaignIds
          in: query
          required: false
          schema:
            type: string
          description: Comma-separated campaign ids for combined campaign views.
          example: campaign_speed_to_lead_123,campaign_reactivation_123
      responses:
        '200':
          description: Power Dialer cadence columns and counts.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerDialerPipelineStepsResponse'
              examples:
                default:
                  value:
                    success: true
                    data:
                      stepCounts:
                        - cadenceStep: 0
                          count: 4
                      cadences:
                        - _id: cadence_123
                          cadenceName: Three-touch follow-up
                          isDefault: false
                          locationIds:
                            - loc_9f7a123
                          campaignIds:
                            - campaign_speed_to_lead_123
                          activeDays:
                            - 1
                            - 2
                            - 3
                            - 4
                            - 5
                          active: true
                          schedule:
                            - day: 1
                              hour: 9
                              minute: 30
                              period: AM
                              label: First touch
                              doubleDial: true
                              kind: call
                              call:
                                enabled: true
                                openingMessage: >-
                                  Hi {{first_name}}, it's Sam from Acme Clinic
                                  following up on your consultation request.
                                screeningPurpose: following up on your consultation request
                                voicemail: true
                                voicemailMessage: >-
                                  Hi {{first_name}}, it's Sam from Acme Clinic.
                                  Call us back whenever suits you.
                            - day: 1
                              hour: 9
                              minute: 30
                              period: AM
                              kind: sms
                              body: >-
                                Hi Alex, are you still interested in booking a
                                consultation?
                          createdAt: '2026-07-08T16:10:00.000Z'
                          updatedAt: '2026-07-08T16:30:00.000Z'
                          headers:
                            - stepIndex: 0
                              label: First touch
                              day: 1
                              time: 9:30 AM
                      pdOverCount: 2
                      callbacksCount: 1
                      timezone: America/New_York
        '400':
          description: Validation failed or the request is malformed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerDialerErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: cadenceStep query parameter is required
        '401':
          description: Missing or invalid authentication.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerDialerErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: Unauthorized
        '403':
          description: >-
            Authenticated but not permitted to access the requested project or
            schedule.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerDialerErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: You do not have access to this project
        '429':
          description: Rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerDialerErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: TooManyRequests
        '500':
          description: Unexpected server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerDialerErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: Unexpected server error.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: bash
          label: cURL
          source: |-
            curl --request GET \
              --url https://api.teamfollowup.ai/api/power-dialer/pipeline/steps \
              --header 'Authorization: Bearer YOUR_API_KEY'
components:
  schemas:
    PowerDialerPipelineStepsResponse:
      type: object
      additionalProperties: false
      required:
        - success
        - data
      properties:
        success:
          type: boolean
        data:
          $ref: '#/components/schemas/PowerDialerPipelineStepsData'
    PowerDialerErrorResponse:
      type: object
      additionalProperties: {}
      required:
        - success
        - error
      properties:
        success:
          type: boolean
        error:
          type: string
          example: You do not have access to this project
        code:
          type: string
          example: FORBIDDEN
        message:
          type: string
          example: You do not have access to this project
    PowerDialerPipelineStepsData:
      type: object
      additionalProperties: false
      required:
        - stepCounts
        - cadences
        - pdOverCount
        - callbacksCount
      properties:
        stepCounts:
          type: array
          items:
            $ref: '#/components/schemas/PowerDialerStepCount'
        cadences:
          type: array
          items:
            $ref: '#/components/schemas/PowerDialerCadenceWithHeaders'
        pdOverCount:
          type: integer
          example: 2
        callbacksCount:
          type: integer
          example: 1
        timezone:
          type:
            - string
            - 'null'
          description: >-
            IANA zone the schedule clock times run in. Per-lead when the project
            has multiple-timezone handling on, and null when no zone resolves.
          example: America/New_York
    PowerDialerStepCount:
      type: object
      additionalProperties: false
      required:
        - cadenceStep
        - count
      properties:
        cadenceStep:
          type: integer
          example: 0
        count:
          type: integer
          example: 4
    PowerDialerCadenceWithHeaders:
      allOf:
        - $ref: '#/components/schemas/PowerDialerCadence'
        - type: object
          additionalProperties: {}
          required:
            - headers
          properties:
            headers:
              type: array
              items:
                $ref: '#/components/schemas/PowerDialerColumnHeader'
    PowerDialerCadence:
      type: object
      additionalProperties: {}
      required:
        - _id
        - cadenceName
        - isDefault
        - locationIds
        - campaignIds
        - activeDays
        - active
        - schedule
      properties:
        _id:
          type: string
          example: cadence_123
        cadenceName:
          type: string
          example: Three-touch follow-up
        isDefault:
          type: boolean
          example: false
        locationIds:
          type: array
          items:
            type: string
          example:
            - loc_9f7a123
        campaignIds:
          type: array
          items:
            type: string
          example:
            - campaign_speed_to_lead_123
        activeDays:
          type: array
          items:
            type: integer
            minimum: 0
            maximum: 6
          example:
            - 1
            - 2
            - 3
            - 4
            - 5
        active:
          type: boolean
          example: true
        stepCount:
          type: integer
          minimum: 0
          description: Number of touchpoints in the schedule.
          example: 3
        schedule:
          type: array
          items:
            $ref: '#/components/schemas/PowerDialerScheduleEntry'
        mode:
          type: string
          enum:
            - appointment_reminder
          example: appointment_reminder
        createdAt:
          type:
            - string
            - 'null'
          format: date-time
          example: '2026-07-08T16:10:00.000Z'
        updatedAt:
          type:
            - string
            - 'null'
          format: date-time
          example: '2026-07-08T16:30:00.000Z'
    PowerDialerColumnHeader:
      type: object
      additionalProperties: false
      required:
        - stepIndex
        - label
        - day
        - time
      properties:
        stepIndex:
          type: integer
          example: 0
        label:
          type: string
          description: >-
            Display name for the step: the operator’s own name when the
            touchpoint has been renamed, otherwise a description derived from
            its schedule position.
          example: First touch
        day:
          type: integer
          example: 1
        time:
          type: string
          description: >-
            The step’s clock time (or offset before the appointment, on a
            reminder cadence). Always derived from the schedule, never the name,
            so the timing is still readable here for a renamed step.
          example: 9:30 AM
    PowerDialerScheduleEntry:
      oneOf:
        - $ref: '#/components/schemas/PowerDialerScheduleForwardEntry'
        - $ref: '#/components/schemas/PowerDialerScheduleWaitEntry'
        - $ref: '#/components/schemas/PowerDialerScheduleReminderEntry'
      description: >-
        A single touchpoint in a cadence. Clock-time entries
        (PowerDialerScheduleForwardEntry) dial at a wall-clock time; wait
        entries (PowerDialerScheduleWaitEntry) dial a set time after the
        previous touchpoint resolved; appointment_reminder cadences use
        appointment-anchored entries (PowerDialerScheduleReminderEntry). Every
        entry in one schedule must be the same shape: send all clock-time
        entries or all wait entries, never a mix.
    PowerDialerScheduleForwardEntry:
      type: object
      additionalProperties: {}
      required:
        - day
        - hour
        - minute
      description: 'A clock-time touchpoint: dial on a given weekday at a given time.'
      properties:
        day:
          type: integer
          minimum: 0
          example: 1
        hour:
          type: integer
          minimum: 1
          maximum: 12
          example: 9
        minute:
          type: integer
          minimum: 0
          maximum: 59
          example: 30
        period:
          type: string
          enum:
            - AM
            - PM
          description: AM or PM. Defaults to AM when omitted.
          example: AM
        label:
          type: string
          maxLength: 40
          description: >-
            Operator-authored name for this touchpoint. Presentational only: the
            dialer schedules and tags the step from its position, not its name.
            Omitted when the step has not been renamed, and readers then fall
            back to its position ("Step 2"). A blank or whitespace-only value is
            discarded rather than stored.
          example: First touch
        doubleDial:
          type: boolean
          example: true
        kind:
          type: string
          enum:
            - call
            - sms
            - email
            - add-tag
            - move-stage
            - api-event
          description: >-
            What this step DOES. A step does exactly one thing: it is a call, or
            a message, or a tag, or a stage move, never a call plus something
            else. Defaults to `call` when omitted. Each kind is one box on the
            Power Dialer canvas, so a step you send is a step the operator can
            see and edit. To make something happen right after a call, send it
            as its OWN step with the SAME day/hour/minute/period, directly after
            the call in the list - equal times are allowed and are how adjacency
            is expressed. A step that both dials and carries additionalActions
            is rejected with 422.
          example: call
        body:
          type: string
          description: >-
            kind sms/email: the message text. Supports the same {{variables}} as
            the agent script.
        subject:
          type: string
          description: 'kind email: the subject line.'
        tags:
          type: array
          items:
            type: string
          description: 'kind add-tag: CRM tags to apply.'
        pipelineId:
          type: string
          description: 'kind move-stage: GHL pipeline id.'
        stageId:
          type: string
          description: 'kind move-stage: GHL stage id from that pipeline.'
        pipelineName:
          type: string
          description: >-
            kind move-stage: pipeline display name. Send it so the step reads
            back legibly.
        stageName:
          type: string
          description: >-
            kind move-stage: stage display name. Send it so the step reads back
            legibly.
        call:
          type: object
          additionalProperties: false
          description: >-
            Whether this touchpoint dials, and what the agent says on its call.
            Every text field is optional. Leave one out and the agent uses its
            own opening and call purpose, and the campaign voicemail setting
            applies. Callbacks the lead asked for always use the agent's own
            settings. Text can use the `{{variables}}` the agent already uses,
            and a variable with no value is read out as written. Blank text is
            discarded rather than stored.


            Keys other than these are ignored, not refused, so a misspelt field
            is dropped without an error. Read the schedule in the response to
            confirm what was saved. A call step that also carries
            additionalActions is rejected with 422: give the call its own step
            and put the action on its own step at the same time (a step does one
            thing).
          properties:
            enabled:
              type: boolean
              description: >-
                Whether this touchpoint places a call. `false` for a touchpoint
                that only runs its actions. Treated as `true` when omitted.
              example: true
            openingMessage:
              type: string
              maxLength: 1000
              description: >-
                The first thing the agent says when the lead answers this
                touchpoint's call, in place of the agent's own opening. An agent
                built as a conversation flow opens from its flow and ignores it.
              example: >-
                Hi {{first_name}}, it's Sam from Acme Clinic following up on
                your consultation request.
            screeningPurpose:
              type: string
              maxLength: 300
              description: >-
                Why this touchpoint is calling, given when the lead's phone
                screens the call and asks. The agent still introduces itself by
                its own name. Ignored when the agent has no call screening set
                up.
              example: following up on your consultation request
            voicemail:
              type: boolean
              description: >-
                `true` leaves `voicemailMessage` when this touchpoint's call
                reaches voicemail, on its last dial (the second dial when it
                double dials), in place of the campaign's voicemail. Requires
                `voicemailMessage`, or the save is refused with `422`. Leave it
                out, or send `false`, to use the campaign's voicemail setting.
              example: true
            voicemailMessage:
              type: string
              maxLength: 1000
              description: >-
                The voicemail this touchpoint leaves when `voicemail` is `true`.
                Kept while `voicemail` is off, so switching it back on does not
                lose the message.
              example: >-
                Hi {{first_name}}, it's Sam from Acme Clinic. Call us back
                whenever suits you.
        additionalActions:
          type: array
          items:
            $ref: '#/components/schemas/PowerDialerScheduleAction'
    PowerDialerScheduleWaitEntry:
      type: object
      additionalProperties: {}
      required:
        - offsetMinutes
      description: >-
        A wait touchpoint: dial this long after the PREVIOUS touchpoint actually
        resolved, or after the lead arrives when it is the first step. Send
        offsetMinutes; offsetHours and offsetDays are also accepted and folded
        into minutes. Do not send day/hour/period, and do not mix wait entries
        with clock-time entries in the same schedule.
      properties:
        offsetMinutes:
          type: integer
          minimum: 0
          maximum: 43200
          example: 45
        at:
          type: object
          description: >-
            Optional set time. Once the wait is over, dial at the next such time
            instead of straight away. A zero wait with a set time means straight
            away, at that time.
          required:
            - hour
            - minute
          properties:
            hour:
              type: integer
              minimum: 1
              maximum: 12
              example: 9
            minute:
              type: integer
              minimum: 0
              maximum: 59
              example: 0
            period:
              type: string
              enum:
                - AM
                - PM
              example: AM
        label:
          type: string
          maxLength: 40
          description: >-
            Operator-authored name for this touchpoint. Presentational only: the
            dialer schedules and tags the step from its position, not its name.
            Omitted when the step has not been renamed, and readers then fall
            back to its position ("Step 2"). A blank or whitespace-only value is
            discarded rather than stored.
          example: First touch
        doubleDial:
          type: boolean
          example: true
        call:
          type: object
          additionalProperties: false
          description: >-
            Whether this touchpoint dials, and what the agent says on its call.
            Every text field is optional. Leave one out and the agent uses its
            own opening and call purpose, and the campaign voicemail setting
            applies. Callbacks the lead asked for always use the agent's own
            settings. Text can use the `{{variables}}` the agent already uses,
            and a variable with no value is read out as written. Blank text is
            discarded rather than stored.


            Keys other than these are ignored, not refused, so a misspelt field
            is dropped without an error. Read the schedule in the response to
            confirm what was saved. A call step that also carries
            additionalActions is rejected with 422: give the call its own step
            and put the action on its own step at the same time (a step does one
            thing).
          properties:
            enabled:
              type: boolean
              description: >-
                Whether this touchpoint places a call. `false` for a touchpoint
                that only runs its actions. Treated as `true` when omitted.
              example: true
            openingMessage:
              type: string
              maxLength: 1000
              description: >-
                The first thing the agent says when the lead answers this
                touchpoint's call, in place of the agent's own opening. An agent
                built as a conversation flow opens from its flow and ignores it.
              example: >-
                Hi {{first_name}}, it's Sam from Acme Clinic following up on
                your consultation request.
            screeningPurpose:
              type: string
              maxLength: 300
              description: >-
                Why this touchpoint is calling, given when the lead's phone
                screens the call and asks. The agent still introduces itself by
                its own name. Ignored when the agent has no call screening set
                up.
              example: following up on your consultation request
            voicemail:
              type: boolean
              description: >-
                `true` leaves `voicemailMessage` when this touchpoint's call
                reaches voicemail, on its last dial (the second dial when it
                double dials), in place of the campaign's voicemail. Requires
                `voicemailMessage`, or the save is refused with `422`. Leave it
                out, or send `false`, to use the campaign's voicemail setting.
              example: true
            voicemailMessage:
              type: string
              maxLength: 1000
              description: >-
                The voicemail this touchpoint leaves when `voicemail` is `true`.
                Kept while `voicemail` is off, so switching it back on does not
                lose the message.
              example: >-
                Hi {{first_name}}, it's Sam from Acme Clinic. Call us back
                whenever suits you.
        additionalActions:
          type: array
          items:
            $ref: '#/components/schemas/PowerDialerScheduleAction'
    PowerDialerScheduleReminderEntry:
      type: object
      additionalProperties: {}
      required:
        - minutesBeforeAppt
      description: >-
        An appointment-anchored touchpoint for an appointment_reminder cadence:
        dial a fixed lead time before the booked appointment. Send
        minutesBeforeAppt; hoursBeforeAppt and daysBeforeAppt are also accepted
        and folded into minutes. Do not send day/hour/period.
      properties:
        minutesBeforeAppt:
          type: integer
          minimum: 1
          example: 1440
        label:
          type: string
          maxLength: 40
          description: >-
            Operator-authored name for this touchpoint. Presentational only: the
            dialer schedules and tags the step from its position, not its name.
            Omitted when the step has not been renamed, and readers then fall
            back to its position ("Step 2"). A blank or whitespace-only value is
            discarded rather than stored.
          example: First touch
        doubleDial:
          type: boolean
          example: true
        kind:
          type: string
          enum:
            - call
            - sms
            - email
            - add-tag
            - move-stage
            - api-event
          description: >-
            What this step DOES. A step does exactly one thing: it is a call, or
            a message, or a tag, or a stage move, never a call plus something
            else. Defaults to `call` when omitted. Each kind is one box on the
            Power Dialer canvas, so a step you send is a step the operator can
            see and edit. To make something happen right after a call, send it
            as its OWN step with the SAME day/hour/minute/period, directly after
            the call in the list - equal times are allowed and are how adjacency
            is expressed. A step that both dials and carries additionalActions
            is rejected with 422.
          example: call
        body:
          type: string
          description: >-
            kind sms/email: the message text. Supports the same {{variables}} as
            the agent script.
        subject:
          type: string
          description: 'kind email: the subject line.'
        tags:
          type: array
          items:
            type: string
          description: 'kind add-tag: CRM tags to apply.'
        pipelineId:
          type: string
          description: 'kind move-stage: GHL pipeline id.'
        stageId:
          type: string
          description: 'kind move-stage: GHL stage id from that pipeline.'
        pipelineName:
          type: string
          description: >-
            kind move-stage: pipeline display name. Send it so the step reads
            back legibly.
        stageName:
          type: string
          description: >-
            kind move-stage: stage display name. Send it so the step reads back
            legibly.
        call:
          type: object
          additionalProperties: false
          description: >-
            Whether this touchpoint dials, and what the agent says on its call.
            Every text field is optional. Leave one out and the agent uses its
            own opening and call purpose, and the campaign voicemail setting
            applies. Callbacks the lead asked for always use the agent's own
            settings. Text can use the `{{variables}}` the agent already uses,
            and a variable with no value is read out as written. Blank text is
            discarded rather than stored.


            Keys other than these are ignored, not refused, so a misspelt field
            is dropped without an error. Read the schedule in the response to
            confirm what was saved. A call step that also carries
            additionalActions is rejected with 422: give the call its own step
            and put the action on its own step at the same time (a step does one
            thing).
          properties:
            enabled:
              type: boolean
              description: >-
                Whether this touchpoint places a call. `false` for a touchpoint
                that only runs its actions. Treated as `true` when omitted.
              example: true
            openingMessage:
              type: string
              maxLength: 1000
              description: >-
                The first thing the agent says when the lead answers this
                touchpoint's call, in place of the agent's own opening. An agent
                built as a conversation flow opens from its flow and ignores it.
              example: >-
                Hi {{first_name}}, it's Sam from Acme Clinic following up on
                your consultation request.
            screeningPurpose:
              type: string
              maxLength: 300
              description: >-
                Why this touchpoint is calling, given when the lead's phone
                screens the call and asks. The agent still introduces itself by
                its own name. Ignored when the agent has no call screening set
                up.
              example: following up on your consultation request
            voicemail:
              type: boolean
              description: >-
                `true` leaves `voicemailMessage` when this touchpoint's call
                reaches voicemail, on its last dial (the second dial when it
                double dials), in place of the campaign's voicemail. Requires
                `voicemailMessage`, or the save is refused with `422`. Leave it
                out, or send `false`, to use the campaign's voicemail setting.
              example: true
            voicemailMessage:
              type: string
              maxLength: 1000
              description: >-
                The voicemail this touchpoint leaves when `voicemail` is `true`.
                Kept while `voicemail` is off, so switching it back on does not
                lose the message.
              example: >-
                Hi {{first_name}}, it's Sam from Acme Clinic. Call us back
                whenever suits you.
        additionalActions:
          type: array
          items:
            $ref: '#/components/schemas/PowerDialerScheduleAction'
    PowerDialerScheduleAction:
      type: object
      additionalProperties: {}
      required:
        - type
      description: >-
        A side effect the dialer runs when a touchpoint advances on no outcome,
        whether the call was unanswered or answered without an actionable
        outcome. `sms`/`email` carry exactly one of `body`/`snippetId`;
        `add-tag` carries `tags`; `move-stage` carries `pipelineId`+`stageId`.
        These four actions require GHL. Native sub-accounts support `api-event`:
        a signed HTTPS POST containing current contact, campaign and cadence
        details plus static custom `data`. Set `call.enabled:false` for an
        event-only touchpoint. Delivery retries retain one event ID; receivers
        should deduplicate by ID.
      properties:
        type:
          type: string
          enum:
            - sms
            - email
            - add-tag
            - move-stage
            - api-event
          example: sms
        body:
          type: string
          example: Hi Alex, are you still interested in booking a consultation?
        snippetId:
          type: string
          example: snippet_follow_up_1
        subject:
          type: string
          example: Following up
        tags:
          type: array
          items:
            type: string
          description: GoHighLevel tags applied to the contact (`add-tag` actions).
          example:
            - no-answer-followup
        pipelineId:
          type: string
          description: Target GoHighLevel pipeline id (`move-stage` actions).
          example: pipeline_123
        stageId:
          type: string
          description: Target GoHighLevel stage id (`move-stage` actions).
          example: stage_456
        url:
          type: string
          format: uri
          maxLength: 2048
          description: >-
            Required for api-event. Public HTTPS receiver URL, without
            credentials or fragment. Private network destinations are refused.
        eventName:
          type: string
          pattern: ^[a-zA-Z][a-zA-Z0-9_.-]{0,127}$
          default: cadence.step
          description: API-event name; omitted defaults to cadence.step.
        data:
          type: object
          additionalProperties: {}
          description: >-
            API-event static custom JSON object (maximum 16 KiB serialized
            UTF-8); nested arrays, objects and scalar values are preserved.
            Defaults to an empty object. No interpolation.
        delaySeconds:
          type: number
          minimum: 0
          example: 0
        jitterSeconds:
          type: number
          minimum: 0
          example: 60
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: 'Send your API key as `Authorization: Bearer YOUR_API_KEY`.'

````