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

# Launch a campaign now

> Dialing starts as soon as the calling window allows.

**The contact list is snapshotted at launch.** The configured list is copied into the run, so rows you add or remove from it afterward never reach this campaign. On a `continuous` campaign, [append contacts to the campaign](/api-reference/campaigns/append-contacts-to-a-campaign) instead.

Launch works from three states: `draft`, `scheduled` (fires it early), and `launch_failed` (retries it). Launching a scheduled campaign early leaves `scheduledFor` sitting in the config, but it will not fire a second time.



## OpenAPI

````yaml /voice-agents/api-reference/openapi.yaml post /campaigns/{campaignId}/launch
openapi: 3.1.0
info:
  title: UpliftAI Voice Agents API
  version: '1.0'
  description: >-
    Build voice assistants, start conversations on the web or the phone, run
    calling campaigns, and receive outcomes by webhook. All endpoints take a
    bearer API key unless noted otherwise.
servers:
  - url: https://api.upliftai.org/v1
security:
  - apiKey: []
tags:
  - name: Assistants
  - name: Authoring an assistant
  - name: Starting a conversation
  - name: Sessions & call records
  - name: Campaigns
  - name: Campaign outcomes
  - name: Contacts
  - name: Google Sheet sources
  - name: Integrations & delivery health
paths:
  /campaigns/{campaignId}/launch:
    post:
      tags:
        - Campaigns
      summary: Launch a campaign now
      description: >-
        Dialing starts as soon as the calling window allows.


        **The contact list is snapshotted at launch.** The configured list is
        copied into the run, so rows you add or remove from it afterward never
        reach this campaign. On a `continuous` campaign, [append contacts to the
        campaign](/api-reference/campaigns/append-contacts-to-a-campaign)
        instead.


        Launch works from three states: `draft`, `scheduled` (fires it early),
        and `launch_failed` (retries it). Launching a scheduled campaign early
        leaves `scheduledFor` sitting in the config, but it will not fire a
        second time.
      operationId: launchCampaign
      parameters:
        - name: campaignId
          in: path
          required: true
          schema:
            type: string
            format: uuid
          example: cb5401ef-xxxx-xxxx-xxxx-xxxxxxxxxxxx
      responses:
        '200':
          description: The campaign is `running` and its run has been created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CampaignLaunchResult'
              examples:
                bounded:
                  summary: A bounded campaign enrolling its list
                  value:
                    runId: b83d5f07-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                    enrolled: 1240
                continuous:
                  summary: >-
                    A continuous campaign launched before any contacts were
                    added
                  value:
                    runId: d1403129-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                    enrolled: 0
        '400':
          description: >-
            The campaign cannot be launched as configured — no
            `assistant.assistantId`, no `config.contacts.listId` on a bounded
            campaign, or `dialing.lines` set below 1. The campaign is left in
            `launch_failed`, not `draft` — fix the config and launch again.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                message: Campaign has no contact list to launch
                error: Bad Request
                statusCode: 400
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: >-
            No such campaign in the API key's project — or the configured
            contact list no longer exists (`Contact list not found: …`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                message: 'Campaign not found: 00000000-0000-4000-8000-000000000000'
                error: Not Found
                statusCode: 404
        '409':
          description: >-
            The campaign is already `running`, `paused`, `draining` or
            `completed`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                message: 'illegal campaign transition: running --launch-->'
                error: Conflict
                statusCode: 409
components:
  schemas:
    CampaignLaunchResult:
      type: object
      properties:
        runId:
          type: string
          format: uuid
          description: >-
            The run this launch created, and the id its calls and results are
            filed under. A campaign has one run for its lifetime, so retrying a
            failed launch reuses this id.
        enrolled:
          type: integer
          description: >-
            Contacts copied into the dial queue by this attempt. A retry counts
            only the rows it adds, so it can read low or `0` against an
            already-populated queue. A continuous campaign launched before it
            has a list also reads `0`; those contacts arrive later via
            [`/campaigns/{id}/contacts`](/api-reference/campaigns/append-contacts-to-a-campaign).
    Error:
      type: object
      properties:
        message:
          description: >-
            One message per failed field for validation errors, a single string
            otherwise.
          oneOf:
            - type: string
            - type: array
              items:
                type: string
        error:
          type: string
        statusCode:
          type: integer
  responses:
    Unauthorized:
      description: A bearer key was sent but is not recognized.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            message: invalid authorization
            error: Unauthorized
            statusCode: 401
    Forbidden:
      description: No API key sent, or the key lacks permission for this resource.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            message: Forbidden resource
            error: Forbidden
            statusCode: 403
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: Project API key (`sk_api_…`).

````