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

# Poll a build's progress

> Works for refine runs too — poll whichever `buildId` you got back. Runs take minutes, so poll every few seconds. `done` only means the pipeline stopped; whether the grader was satisfied is `result.passed`. Live detail (`phase`, `round`, transcript counts) is kept for an hour after the run last moved; after that the poll still returns the outcome — `result` on success, `error` on failure.



## OpenAPI

````yaml /voice-agents/api-reference/openapi.yaml get /realtime-assistants/builds/status/{buildId}
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:
  /realtime-assistants/builds/status/{buildId}:
    get:
      tags:
        - Authoring an assistant
      summary: Poll a build's progress
      description: >-
        Works for refine runs too — poll whichever `buildId` you got back. Runs
        take minutes, so poll every few seconds. `done` only means the pipeline
        stopped; whether the grader was satisfied is `result.passed`. Live
        detail (`phase`, `round`, transcript counts) is kept for an hour after
        the run last moved; after that the poll still returns the outcome —
        `result` on success, `error` on failure.
      operationId: getAssistantBuildStatus
      parameters:
        - name: buildId
          in: path
          required: true
          description: The `buildId` the build or refine returned.
          schema:
            type: string
            format: uuid
          example: 425d3b75-xxxx-xxxx-xxxx-xxxxxxxxxxxx
      responses:
        '200':
          description: The run's latest frame.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BuildProgress'
              examples:
                inProgress:
                  summary: Rehearsing the first round of test calls
                  value:
                    buildId: 425d3b75-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                    status: running
                    round: 1
                    phase: testing
                    persona: >-
                      Ayesha Siddiqi — Lahore patient confirming tomorrow 11am,
                      keeps asking about fees
                    transcriptsDone: 7
                    transcriptsTotal: 10
                failed:
                  summary: A failed run — the reason outlives the hour of live detail
                  value:
                    buildId: 425d3b75-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                    assistantId: ee42ac3b-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                    status: failed
                    phase: failed
                    round: 0
                    error: 'Refine failed: LLM provider rejected the request'
                done:
                  summary: Finished after three rounds, findings still open
                  value:
                    buildId: 425d3b75-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                    assistantId: ee42ac3b-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                    status: done
                    phase: done
                    round: 0
                    result:
                      assistantId: ee42ac3b-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                      promptVersion: 3
                      passed: false
                      chosen:
                        happy:
                          label: >-
                            عائشہ صدیقی — cheerful appointment confirmation for
                            Dr. عمران شیخ, Lahore
                          archetype: happy
                          path: happy
                          turns:
                            - speaker: agent
                              text: >-
                                السلام علیکم، کیا میں عائشہ صدیقی سے بات کر رہی
                                ہوں؟


                                میں Shifa Clinic سے ثناء بات کر رہی ہوں۔ کل کی
                                appointment confirm کرنی تھی، ایک منٹ بات کر
                                سکتی ہوں؟
                            - speaker: caller
                              text: >-
                                وعلیکم السلام بھئی جی، جی میں عائشہ صدیقی ہی بول
                                رہی ہوں۔ ہاں جی بالکل، آپ ایک منٹ بات کر لیں۔
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: >-
            No run with that id in this project — including a run that died
            before it could write an outcome.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                message: No build found for 3f2a9c14-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                error: Not Found
                statusCode: 404
components:
  schemas:
    BuildProgress:
      type: object
      properties:
        buildId:
          type: string
          format: uuid
        assistantId:
          type: string
          format: uuid
          description: >-
            Absent while `phase` is `authoring` through `refining`. Keep the id
            the start-build response gave you.
        status:
          type: string
          enum:
            - started
            - running
            - done
            - failed
          description: >-
            `started` lasts a moment, so the first poll usually already reads
            `running`. `done` and `failed` are terminal.
        phase:
          type: string
          enum:
            - authoring
            - generating_personas
            - testing
            - judging
            - refining
            - persisting
            - done
            - failed
          description: >-
            Step the pipeline is on: the prompt is written (`authoring`), test
            personas are generated, each rehearses a text-only call (`testing`),
            the transcripts are graded (`judging`), and anything the grader
            flags drives a rewrite (`refining`) before the next round.
        round:
          type: integer
          description: >-
            Which hardening round is running, `1` to `3`; `0` on frames outside
            the loop.
        persona:
          type: string
          description: >-
            The test persona whose rehearsal just finished. Only while
            `testing`.
        transcriptsDone:
          type: integer
          description: Rehearsals finished this round. Only while `testing`.
        transcriptsTotal:
          type: integer
          description: >-
            Rehearsals in this round. Present while `testing` and on the
            `judging` frame.
        error:
          type: string
          description: >-
            Why the run stopped, when `status` is `failed`. A second run against
            an assistant that is already building fails here rather than at the
            request: `A build is already in progress for this assistant`.
        result:
          $ref: '#/components/schemas/BuildOutcome'
    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
    BuildOutcome:
      type: object
      description: The finished build. Present only once `status` is `done`.
      properties:
        assistantId:
          type: string
          format: uuid
        promptVersion:
          type: integer
          description: >-
            Version of the prompt that was saved. It counts up once per rewrite,
            so anything above `1` means the grader sent it back.
        passed:
          type: boolean
          description: >-
            Whether the last round ended with nothing flagged. `false` means
            three rounds ran and the grader still had objections. The assistant
            is saved and callable either way — read the sample transcripts
            before putting it on a campaign.
        chosen:
          type: object
          description: >-
            The cleanest rehearsal on each path — fewest findings, longest
            conversation breaking ties. Either may be absent.
          properties:
            happy:
              $ref: '#/components/schemas/SampleTranscript'
            negative:
              $ref: '#/components/schemas/SampleTranscript'
    SampleTranscript:
      type: object
      properties:
        label:
          type: string
          description: The persona this rehearsal was run against.
        archetype:
          type: string
          description: The behavior the persona was built to test.
          enum:
            - happy
            - chatty
            - busy
            - suspicious
            - jailbreak
            - opt_out
            - wrong_party
            - mishearing
            - price_pusher
            - polite_no
            - maybe_later
            - angry
        path:
          type: string
          enum:
            - happy
            - negative
        turns:
          type: array
          items:
            $ref: '#/components/schemas/TranscriptTurn'
    TranscriptTurn:
      type: object
      properties:
        speaker:
          type: string
          enum:
            - agent
            - caller
        text:
          type: string
  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_…`).

````