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

# Confirm enrollment preflight

> Applies a skip or move decision to a saved preflight. For each selected source, a draft enrollment is deleted; any other enrollment is set to completed and its pending steps are canceled. skipReplied is required for move decisions; true leaves replied contacts unenrolled. Contacts suppressed elsewhere by do-not-contact, unsubscribe, or bounce shield are enrolled with that status, are not contacted, and remain included in enrolledLeadIds and enrolledCount. A stale preflight returns 409 with a replacement preflight. A concurrent confirmation returns 423.



## OpenAPI

````yaml https://multichannel-api.salesforge.ai/public/multichannel/swagger/doc.json post /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/enrollments/preflight/{preflightID}/confirm
openapi: 3.1.0
info:
  description: Multichannel public endpoints consumed through salesforge-api public docs.
  title: Multichannel Public API
  version: '1.0'
servers:
  - url: https://multichannel-api.salesforge.ai/public
security:
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
  - ApiKeyAuth: []
externalDocs:
  description: ''
  url: ''
paths:
  /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/enrollments/preflight/{preflightID}/confirm:
    post:
      tags:
        - multichannel
      summary: Confirm enrollment preflight
      description: >-
        Applies a skip or move decision to a saved preflight. For each selected
        source, a draft enrollment is deleted; any other enrollment is set to
        completed and its pending steps are canceled. skipReplied is required
        for move decisions; true leaves replied contacts unenrolled. Contacts
        suppressed elsewhere by do-not-contact, unsubscribe, or bounce shield
        are enrolled with that status, are not contacted, and remain included in
        enrolledLeadIds and enrolledCount. A stale preflight returns 409 with a
        replacement preflight. A concurrent confirmation returns 423.
      parameters:
        - description: Workspace ID
          in: path
          name: workspaceID
          required: true
          schema:
            type: string
        - description: Sequence ID
          in: path
          name: sequenceID
          required: true
          schema:
            type: integer
        - description: Preflight ID
          in: path
          name: preflightID
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              oneOf:
                - type: object
                - $ref: >-
                    #/components/schemas/requests.EnrollmentPreflightConfirmRequest
                  description: Preflight decision to apply.
                  summary: request
        description: Preflight decision to apply.
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/responses.EnrollmentPreflightConfirmResponse
          description: OK
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ErrorResponse'
          description: Bad Request
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ErrorResponse'
          description: Unauthorized
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ErrorResponse'
          description: Forbidden
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ErrorResponse'
          description: Not Found
        '409':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/responses.EnrollmentPreflightStaleResponse
          description: Conflict
        '422':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/responses.EnrollmentAccountContactLimitResponse
          description: The confirmation would exceed the account contact limit
        '423':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/responses.EnrollmentConfirmationBusyResponse
          description: Another enrollment confirmation is in progress for the account
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ErrorResponse'
          description: Internal Server Error
      security:
        - ApiKeyAuth: []
components:
  schemas:
    requests.EnrollmentPreflightConfirmRequest:
      properties:
        action:
          description: >-
            Conflict resolution action. skip excludes conflicts; move resolves
            selected source conflicts.
          enum:
            - skip
            - move
          type: string
        moveSourceSequenceIds:
          description: Source sequence IDs to clean before enrollment.
          items:
            type: integer
          type: array
          uniqueItems: false
        skipReplied:
          description: >-
            Whether to exclude contacts with replies. Required for move
            decisions.
          type: boolean
      required:
        - action
      type: object
    responses.EnrollmentPreflightConfirmResponse:
      properties:
        enrolledLeadIds:
          description: >-
            Contact IDs enrolled in the target sequence. This list includes
            contacts enrolled with a carried do-not-contact, unsubscribed, or
            bounce-shield status.
          items:
            type: string
          type: array
          uniqueItems: false
        summary:
          $ref: '#/components/schemas/responses.EnrollmentPreflightDecisionSummary'
      type: object
    responses.ErrorResponse:
      properties:
        data:
          description: >-
            Optional error context. Its shape depends on the message and
            endpoint.
        message:
          description: >-
            Human-readable error text or, for documented cases, a stable
            machine-readable code that clients can branch on.
          example: Invalid request body
          type: string
      type: object
    responses.EnrollmentPreflightStaleResponse:
      properties:
        data:
          $ref: '#/components/schemas/responses.EnrollmentPreflightResponse'
        message:
          description: 'Stable error code: preflight_stale.'
          enum:
            - preflight_stale
          example: preflight_stale
          type: string
      type: object
    responses.EnrollmentAccountContactLimitResponse:
      properties:
        message:
          description: >-
            Stable error message returned when the account has insufficient
            active-contact headroom.
          enum:
            - insufficient remaining active credits balance
          example: insufficient remaining active credits balance
          type: string
      type: object
    responses.EnrollmentConfirmationBusyResponse:
      properties:
        message:
          description: Stable error code.
          enum:
            - enrollment_confirmation_busy
          example: enrollment_confirmation_busy
          type: string
      type: object
    responses.EnrollmentPreflightDecisionSummary:
      description: Enrollment decision outcome.
      properties:
        alreadyInTargetCount:
          description: Contacts already enrolled in the target sequence.
          example: 3
          type: integer
        enrolledCount:
          description: >-
            Contacts projected or actually enrolled in the target sequence. This
            count includes contacts enrolled with a carried do-not-contact,
            unsubscribed, or bounce-shield status.
          example: 94
          type: integer
        skippedCount:
          description: Contacts projected or actually skipped by the decision.
          example: 3
          type: integer
        sourceCleanupCount:
          description: >-
            Contacts projected or actually removed from at least one source
            sequence.
          example: 9
          type: integer
      type: object
    responses.EnrollmentPreflightResponse:
      description: Enrollment preflight.
      properties:
        expiresAt:
          description: Preflight expiration time.
          format: date-time
          type: string
        moveGroups:
          description: Source sequences available for cleanup.
          items:
            $ref: '#/components/schemas/responses.EnrollmentPreflightMoveGroup'
          type: array
          uniqueItems: false
        preflightId:
          description: Saved preflight ID used by preview and confirm.
          example: 2f4f75ad-2527-4e89-b0dc-2cd75589c64f
          type: string
        repliedDecision:
          $ref: '#/components/schemas/responses.EnrollmentPreflightRepliedDecision'
        summary:
          $ref: '#/components/schemas/responses.EnrollmentPreflightSummary'
      type: object
    responses.EnrollmentPreflightMoveGroup:
      properties:
        selectedContactCount:
          description: >-
            Decision contacts associated with this source sequence. A contact
            can appear in multiple move groups, so do not sum this field across
            groups.
          example: 9
          type: integer
        sequenceId:
          description: Source sequence ID.
          example: 42
          type: integer
        sequenceName:
          description: Source sequence name.
          example: Q3 outbound
          type: string
        sequenceStatus:
          description: Source sequence status.
          example: active
          type: string
      type: object
    responses.EnrollmentPreflightRepliedDecision:
      description: Replied-contact decision details.
      properties:
        contactCount:
          description: Decision contacts with a replied source enrollment.
          example: 2
          type: integer
      type: object
    responses.EnrollmentPreflightSummary:
      description: Candidate and decision counts.
      properties:
        alreadyInTargetCount:
          description: Contacts already enrolled in the target sequence.
          example: 3
          type: integer
        automaticEnrollmentCount:
          description: Contacts eligible for enrollment without conflict resolution.
          example: 85
          type: integer
        candidateCount:
          description: Contacts captured in the preflight snapshot.
          example: 100
          type: integer
        decisionRequiredCount:
          description: >-
            Contacts requiring a skip or move decision because of existing
            enrollments or replies.
          example: 12
          type: integer
      type: object
  securitySchemes:
    ApiKeyAuth:
      in: header
      name: Authorization
      type: apiKey

````