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

# List a campaign's callback requests

> The contacts who asked to be phoned back by a person, soonest first. Post-call analysis opens these — nothing in the API creates one. Every callback comes back, the already-handled (`done`) alongside the still-waiting (`open`), and there is no status query parameter — so to build a "who still needs a call" queue, filter to `open` in your own code.

**Note:** Scores, conversions, and sentiment are computed by LLMs — best effort, with room to be wrong. We are continuously closing the tracking gaps, but for sensitive workloads we recommend running your own analysis on the transcripts delivered over [webhooks](/voice-agents/webhooks/overview).



## OpenAPI

````yaml /voice-agents/api-reference/openapi.yaml get /campaigns/{campaignId}/callbacks
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}/callbacks:
    get:
      tags:
        - Campaign outcomes
      summary: List a campaign's callback requests
      description: >-
        The contacts who asked to be phoned back by a person, soonest first.
        Post-call analysis opens these — nothing in the API creates one. Every
        callback comes back, the already-handled (`done`) alongside the
        still-waiting (`open`), and there is no status query parameter — so to
        build a "who still needs a call" queue, filter to `open` in your own
        code.


        **Note:** Scores, conversions, and sentiment are computed by LLMs — best
        effort, with room to be wrong. We are continuously closing the tracking
        gaps, but for sensitive workloads we recommend running your own analysis
        on the transcripts delivered over
        [webhooks](/voice-agents/webhooks/overview).
      operationId: listCampaignCallbacks
      parameters:
        - name: campaignId
          in: path
          required: true
          schema:
            type: string
            format: uuid
          example: cb5401ef-98f7-49e7-8a6e-822fc54e697f
        - name: limit
          in: query
          required: false
          description: Rows per page. Larger values are clamped to 100.
          schema:
            type: integer
            minimum: 1
            default: 50
        - name: cursor
          in: query
          required: false
          description: The `nextCursor` returned by the previous page.
          schema:
            type: string
      responses:
        '200':
          description: >-
            One page of callback requests, soonest first — by `callbackAfter`
            where the contact named a time, `createdAt` otherwise.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CallbackList'
              example:
                callbacks:
                  - callbackId: 7d41c9e2-xxxx-xxxx-xxxx-xxxxxxxxxxxx#+923004567890#a1#cb
                    organizationId: a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                    projectId: c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                    assistantId: 80b00435-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                    campaignId: 7d41c9e2-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                    sessionId: 7d41c9e2-xxxx-xxxx-xxxx-xxxxxxxxxxxx#+923004567890#a1
                    reason: >-
                      Cardholder disputes the late fee and wants an agent to go
                      through the statement.
                    callbackAfter: '2026-08-18T11:00:00.000Z'
                    status: open
                    createdAt: '2026-08-18T06:41:19.204Z'
                    updatedAt: '2026-08-18T06:41:19.204Z'
                  - callbackId: 7d41c9e2-xxxx-xxxx-xxxx-xxxxxxxxxxxx#+923218765432#a2#cb
                    organizationId: a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                    projectId: c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                    assistantId: 80b00435-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                    campaignId: 7d41c9e2-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                    sessionId: 7d41c9e2-xxxx-xxxx-xxxx-xxxxxxxxxxxx#+923218765432#a2
                    reason: Asked to be called back to set up an instalment plan.
                    status: done
                    createdAt: '2026-08-18T14:22:07.881Z'
                    updatedAt: '2026-08-18T15:05:33.416Z'
        '400':
          description: The `cursor` was not one this API issued.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                message: Invalid pagination cursor
                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.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                message: 'Campaign not found: 00000000-0000-4000-8000-000000000000'
                error: Not Found
                statusCode: 404
components:
  schemas:
    CallbackList:
      type: object
      properties:
        callbacks:
          type: array
          items:
            $ref: '#/components/schemas/Callback'
        nextCursor:
          type: string
          description: >-
            Pass back as `cursor` for the next page. Only its absence marks the
            last page; a short page does not.
    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
    Callback:
      type: object
      description: One contact's request to be phoned back by a person.
      properties:
        callbackId:
          type: string
          description: >-
            The call's id with `#cb` appended, so it contains `#` and `+`.
            Percent-encode it before putting it in a URL path.
        organizationId:
          type: string
          format: uuid
        projectId:
          type: string
          format: uuid
        assistantId:
          type: string
          format: uuid
          description: The assistant that was on the call.
        campaignId:
          type: string
          format: uuid
          description: Always the campaign in the path.
        sessionId:
          type: string
          description: >-
            The call that raised it. Pass it to the [session
            detail](/api-reference/sessions-%26-call-records/get-a-calls-transcript-and-outcomes)
            for the transcript.
        reason:
          type: string
          description: One line from the grader on why a person is needed.
        callbackAfter:
          type: string
          format: date-time
          description: >-
            Earliest time the contact agreed to. Only present when they named
            one on the call.
        status:
          type: string
          enum:
            - open
            - done
          description: >-
            `open` until a PATCH to
            [`/campaigns/callbacks/{callbackId}`](/api-reference/campaign-outcomes/update-a-callbacks-status)
            sets it `done`; the same call flips it back.
        createdAt:
          type: string
          format: date-time
          description: When the call was graded, not when it was placed.
        updatedAt:
          type: string
          format: date-time
          description: Last status change; equal to `createdAt` until one happens.
  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_…`).

````