> ## 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.

# Preview enrollment move

> Calculates the projected outcome of a move decision without changing enrollments. Returns projected enrollment, skip, and source cleanup counts with a skip-reason breakdown. A stale preflight returns 409 with a replacement preflight.



## OpenAPI

````yaml https://multichannel-api.salesforge.ai/public/multichannel/swagger/doc.json post /multichannel/workspaces/{workspaceID}/sequences/{sequenceID}/enrollments/preflight/{preflightID}/move-preview
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}/move-preview:
    post:
      tags:
        - multichannel
      summary: Preview enrollment move
      description: >-
        Calculates the projected outcome of a move decision without changing
        enrollments. Returns projected enrollment, skip, and source cleanup
        counts with a skip-reason breakdown. A stale preflight returns 409 with
        a replacement preflight.
      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.EnrollmentPreflightMovePreviewRequest
                  description: Move decision to preview.
                  summary: request
        description: Move decision to preview.
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/responses.EnrollmentPreflightMovePreviewResponse
          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
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/responses.ErrorResponse'
          description: Internal Server Error
      security:
        - ApiKeyAuth: []
components:
  schemas:
    requests.EnrollmentPreflightMovePreviewRequest:
      properties:
        moveSourceSequenceIds:
          description: Source sequence IDs to clean before enrollment.
          items:
            type: integer
          type: array
          uniqueItems: false
        skipReplied:
          description: Whether to exclude contacts with replies.
          type: boolean
      required:
        - skipReplied
      type: object
    responses.EnrollmentPreflightMovePreviewResponse:
      properties:
        skipBreakdown:
          $ref: '#/components/schemas/responses.EnrollmentPreflightSkipBreakdown'
        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.EnrollmentPreflightSkipBreakdown:
      description: Projected skipped-contact breakdown.
      properties:
        repliedCount:
          description: Contacts skipped because skipReplied is true.
          example: 2
          type: integer
        unselectedSourceCount:
          description: >-
            Contacts skipped because one or more required source sequences were
            not selected.
          example: 1
          type: integer
      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

````