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

# Get a run's result document

> The run as one document (schemaVersion 1), the same the CLI writes and webhooks post: every cell with its attempts, verdicts and who decided them, and the change from the previous comparable run, or from `compareTo`.



## OpenAPI

````yaml /api-reference/openapi.json get /v1/agents/{agentId}/runs/{runId}/result
openapi: 3.1.0
info:
  title: Signal API
  version: 1.0.0
  description: >-
    Signal reads a voice agent's production calls and says what to fix, then
    tests whether the fix worked.

    This API exposes the same data the web app shows: agents, calls and their
    traces, signals, issues,

    versions and their comparisons, tests, and test runs.


    Authenticate with `Authorization: Bearer sig_...` (an API key from the API
    keys page). Read keys may

    call every `read` operation; write keys may also call `write` operations,
    within their monthly budget.

    Each operation's scope is in `x-signal-scope`. Errors share one envelope
    (`Error`), lists share one

    cursor scheme (`limit`, `cursor`, `hasMore`, `nextCursor`), and every
    response carries `Request-Id`

    and `RateLimit-*` headers.
servers:
  - url: https://first-signal-api.fly.dev
    description: Production
  - url: http://localhost:43124
    description: Local development
security:
  - bearerAuth: []
tags:
  - name: Account
    description: Who the token belongs to and what it may do.
  - name: Agents
    description: Voice agents connected to the workspace.
  - name: Calls
    description: Production calls, their traces and per-call signals.
  - name: Signals
    description: What Signal noticed across calls.
  - name: Issues
    description: 'Problems worth fixing: where, why, and what to change.'
  - name: Versions
    description: Agent versions and how each one did.
  - name: Comparisons
    description: Stored comparisons between two versions.
  - name: Tests
    description: Tests, test sets, personas and coverage.
  - name: Runs
    description: Test runs and the attempts inside them.
paths:
  /v1/agents/{agentId}/runs/{runId}/result:
    get:
      tags:
        - Runs
      summary: Get a run's result document
      description: >-
        The run as one document (schemaVersion 1), the same the CLI writes and
        webhooks post: every cell with its attempts, verdicts and who decided
        them, and the change from the previous comparable run, or from
        `compareTo`.
      operationId: getRunResult
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: >-
              ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$
            example: 3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f
            description: The agent's id.
          required: true
          description: The agent's id.
          name: agentId
          in: path
        - schema:
            type: string
            format: uuid
            pattern: >-
              ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$
            example: 3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f
            description: The run's id.
          required: true
          description: The run's id.
          name: runId
          in: path
        - schema:
            type: string
            format: uuid
            pattern: >-
              ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$
            example: 3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f
            description: Compare with this run instead of the previous comparable one.
          required: false
          description: Compare with this run instead of the previous comparable one.
          name: compareTo
          in: query
      responses:
        '200':
          description: The result document.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResultDocument'
        '400':
          description: 'Invalid request: a parameter or the body failed validation.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing, invalid or revoked credentials.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Not permitted for this principal.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: >-
            The agent, or a resource under it, does not exist or is not visible
            to this key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited. See Retry-After.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Server error. The message is generic; quote the request id.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      x-codeSamples:
        - lang: bash
          label: curl
          source: >-
            curl
            "https://first-signal-api.fly.dev/v1/agents/6f1d2c3b-4a5e-4f60-8b7a-9c0d1e2f3a4b/runs/d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a/result"
            \
              -H "Authorization: Bearer $SIGNAL_API_KEY"
components:
  schemas:
    ResultDocument:
      type: object
      properties:
        schemaVersion:
          type: number
          enum:
            - 1
        batchId:
          type: string
          description: >-
            The run's id (runId on v1). The document keeps its schemaVersion 1
            names because CI and webhooks already read them.
        agentId:
          type: string
        status:
          type: string
          description: >-
            The run's status: queued, awaiting_approval, running, complete,
            refused or failed.
        message:
          type:
            - string
            - 'null'
        kind:
          type: string
          description: run or calibration.
        trigger:
          type:
            - string
            - 'null'
        targetVersion:
          type: object
          properties:
            platform:
              type: string
              enum:
                - retell
            version:
              type: integer
            configHash:
              type:
                - string
                - 'null'
          required:
            - platform
            - version
            - configHash
        comparedTo:
          type:
            - object
            - 'null'
          properties:
            batchId:
              type: string
              description: The compared run's id.
            version:
              type: integer
          required:
            - batchId
            - version
        epoch:
          $ref: '#/components/schemas/ScoringEpoch'
        summary:
          type: object
          properties:
            cells:
              type: integer
            gating:
              type: integer
            passed:
              type: integer
            failed:
              type: integer
            flaky:
              type: integer
            error:
              type: integer
            drift:
              type: integer
            notRun:
              type: integer
            newlyBroken:
              type: integer
            fixed:
              type: integer
          required:
            - cells
            - gating
            - passed
            - failed
            - flaky
            - error
            - drift
            - notRun
            - newlyBroken
            - fixed
        cost:
          type: object
          properties:
            retellUsd:
              type: number
            signalUsd:
              type: number
          required:
            - retellUsd
            - signalUsd
          description: >-
            Retell's share is the customer's spend; Signal's is ours to serve.
            Estimates.
        cells:
          type: array
          items:
            $ref: '#/components/schemas/ResultCell'
        shadow:
          type: object
          properties:
            shadowAgentId:
              type: string
            clonedFromVersion:
              type: integer
          required:
            - shadowAgentId
            - clonedFromVersion
          description: >-
            Present when the run played a shadow copy; the version is the one it
            was cloned from.
      required:
        - schemaVersion
        - batchId
        - agentId
        - status
        - message
        - kind
        - trigger
        - targetVersion
        - comparedTo
        - epoch
        - summary
        - cost
        - cells
      description: >-
        A run as one JSON document, the same one the CLI writes and webhooks
        post. Its field names are fixed by schemaVersion 1 and predate v1
        naming: batchId is the run's id, and attempts[].runId is an attempt's
        id.
      example:
        schemaVersion: 1
        batchId: d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a
        agentId: 6f1d2c3b-4a5e-4f60-8b7a-9c0d1e2f3a4b
        status: complete
        message: null
        kind: run
        trigger: ci
        targetVersion:
          platform: retell
          version: 8
          configHash: b41f9c0e2a7d
        comparedTo:
          batchId: e5f6a7b8-c9d0-4e1f-9a2b-3c4d5e6f7a8b
          version: 7
        epoch:
          simulatorModel: claude-haiku-4-5
          judgeModel: claude-sonnet-4-5
          judgePromptHash: 9f2c1a7e
          scorerVersion: '2026-09-18'
        summary:
          cells: 12
          gating: 10
          passed: 9
          failed: 2
          flaky: 1
          error: 0
          drift: 0
          notRun: 0
          newlyBroken: 0
          fixed: 2
        cost:
          retellUsd: 1.84
          signalUsd: 0.21
        cells:
          - testId: 3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f
            testRevision: 2
            source: production
            persona: '@source'
            tier: text
            lane: integrations
            expect: pass
            guard: false
            gates: true
            gateReason: Calibrated.
            result: passed
            attempts:
              - runId: f9a0b1c2-d3e4-4f5a-8b6c-7d8e9f0a1b2c
                attempt: 1
                result: passed
            k: 1
            'n': 1
            change: fixed
            reason: null
            criteria:
              - criterionId: c1
                text: The agent offers at least one time for a cleaning
                met: true
                decidedBy:
                  kind: judge
                  model: claude-sonnet-4-5
                  answers: []
                evidenceTurn: 9
                quote: I have Tuesday at 10 or Thursday at 2.
            noFixture: []
            retellGrader:
              status: null
              explanation: null
            findings: []
            cost:
              retellUsd: 0.15
              signalUsd: 0.02
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            type:
              $ref: '#/components/schemas/ErrorType'
            code:
              type: string
              example: agent_not_found
              description: The specific reason; stable within v1.
            message:
              type: string
              example: Agent not found.
            param:
              type:
                - string
                - 'null'
              description: The request field at fault, for a validation error.
            requestId:
              type:
                - string
                - 'null'
              example: req_8c1f0e2b4a6d9e3f7a5c1b0d
            quota:
              type: object
              properties:
                metric:
                  type: string
                  example: test_calls
                  description: analysed_calls, agents, copilot_messages or test_calls.
                limit:
                  type: integer
                used:
                  type: integer
                plan:
                  type: string
                  example: free_org
                  description: The workspace's plan slug.
                upgradePath:
                  type: string
                  example: /billing
                  description: Where in the web app the plan is changed.
              required:
                - metric
                - limit
                - used
                - plan
                - upgradePath
              description: >-
                Present when code is quota_exceeded: the plan limit the request
                would pass.
          required:
            - type
            - code
            - message
            - param
            - requestId
      required:
        - error
      example:
        error:
          type: not_found_error
          code: agent_not_found
          message: Agent not found.
          param: null
          requestId: req_8c1f0e2b4a6d9e3f7a5c1b0d
    ScoringEpoch:
      type:
        - object
        - 'null'
      properties:
        simulatorModel:
          type:
            - string
            - 'null'
          description: What played the caller.
        judgeModel:
          type:
            - string
            - 'null'
          description: What scored the criteria.
        judgePromptHash:
          type:
            - string
            - 'null'
          description: >-
            Identifies how results were scored. Results with different values
            were scored differently.
        scorerVersion:
          type:
            - string
            - 'null'
          description: The version of Signal's scoring.
      required:
        - simulatorModel
        - judgeModel
        - judgePromptHash
        - scorerVersion
      description: >-
        What scored a result. Results scored in different epochs are not
        compared.
    ResultCell:
      type: object
      properties:
        testId:
          type: string
          description: The test.
        testRevision:
          type:
            - integer
            - 'null'
          description: The test revision its attempts ran.
        source:
          type: string
          description: production, custom or probe.
        persona:
          type: string
          description: The persona slug, or @source for the test's own caller.
        tier:
          type: string
        lane:
          type:
            - string
            - 'null'
        expect:
          type: string
          enum:
            - pass
            - fail
        guard:
          type: boolean
        gates:
          type: boolean
          description: >-
            Whether this cell decides the release (calibrated, own caller,
            current epoch).
        gateReason:
          type: string
        result:
          type: string
          enum:
            - passed
            - failed
            - flaky
            - error
            - drift
            - not_run
        attempts:
          type: array
          items:
            type: object
            properties:
              runId:
                type: string
                description: >-
                  The attempt's id: GET
                  /v1/agents/{agentId}/attempts/{attemptId}. Named runId in
                  schemaVersion 1.
              attempt:
                type: integer
              result:
                type:
                  - string
                  - 'null'
                enum:
                  - passed
                  - failed
                  - error
                  - drift
                  - null
            required:
              - runId
              - attempt
              - result
          description: Each attempt's own result, in order.
        k:
          type: integer
          description: Attempts that passed.
        'n':
          type: integer
          description: Attempts scored.
        change:
          type:
            - string
            - 'null'
          enum:
            - fixed
            - still_failing
            - newly_broken
            - still_passing
            - not_comparable
            - null
        reason:
          type:
            - string
            - 'null'
        criteria:
          type: array
          items:
            type: object
            properties:
              criterionId:
                type: string
              text:
                type: string
              met:
                type:
                  - boolean
                  - 'null'
              decidedBy:
                type: object
                properties:
                  kind:
                    type: string
                  model:
                    type:
                      - string
                      - 'null'
                  answers:
                    type: array
                    items: {}
                required:
                  - kind
              evidenceTurn:
                type: integer
              quote:
                type: string
            required:
              - criterionId
              - text
              - met
              - decidedBy
        noFixture:
          type: array
          items:
            type: string
          description: Tools that answered with the fixed 'not available' error.
        retellGrader:
          type:
            - object
            - 'null'
          properties:
            status:
              type:
                - string
                - 'null'
            explanation:
              type:
                - string
                - 'null'
          required:
            - status
            - explanation
          description: Retell's own grader on the last attempt.
        findings:
          type: array
          items: {}
          description: Problems Signal's own checks found on the last attempt's transcript.
        cost:
          type: object
          properties:
            retellUsd:
              type: number
            signalUsd:
              type: number
          required:
            - retellUsd
            - signalUsd
      required:
        - testId
        - testRevision
        - source
        - persona
        - tier
        - lane
        - expect
        - guard
        - gates
        - gateReason
        - result
        - attempts
        - k
        - 'n'
        - change
        - reason
        - criteria
        - noFixture
        - retellGrader
        - findings
        - cost
    ErrorType:
      type: string
      enum:
        - invalid_request_error
        - authentication_error
        - budget_error
        - permission_error
        - not_found_error
        - conflict_error
        - rate_limit_error
        - api_error
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: An API key (`sig_...`), or a session token from the web app.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.