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

# List tests

> The agent's tests, newest first, each with its gate state and latest result. Archived tests are left out unless asked for.



## OpenAPI

````yaml /api-reference/openapi.json get /v1/agents/{agentId}/tests
openapi: 3.1.0
info:
  title: SignalMD API
  version: 1.0.0
  description: >-
    SignalMD 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://api.signalmd.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 SignalMD 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}/tests:
    get:
      tags:
        - Tests
      summary: List tests
      description: >-
        The agent's tests, newest first, each with its gate state and latest
        result. Archived tests are left out unless asked for.
      operationId: listTests
      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: integer
            minimum: 1
            maximum: 100
            default: 25
            description: Items per page, 1 to 100.
            example: 25
          required: false
          description: Items per page, 1 to 100.
          name: limit
          in: query
        - schema:
            type: string
            minLength: 1
            description: '`nextCursor` from the previous page.'
          required: false
          description: '`nextCursor` from the previous page.'
          name: cursor
          in: query
        - 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: Only tests in this set.
          required: false
          description: Only tests in this set.
          name: testSetId
          in: query
        - schema:
            type: string
            enum:
              - hearing
              - understanding
              - flow
              - speaking
              - integrations
            description: Only tests in this lane.
          required: false
          description: Only tests in this lane.
          name: lane
          in: query
        - schema:
            type: string
            minLength: 1
            description: Only tests for this intent slug.
          required: false
          description: Only tests for this intent slug.
          name: intent
          in: query
        - schema:
            type: string
            enum:
              - production
              - custom
              - probe
            description: Only tests from this source.
          required: false
          description: Only tests from this source.
          name: source
          in: query
        - schema:
            type: string
            enum:
              - passed
              - failed
              - flaky
              - error
              - drift
              - none
            description: >-
              Only tests whose latest attempt with their own caller has this
              result; none: never run.
          required: false
          description: >-
            Only tests whose latest attempt with their own caller has this
            result; none: never run.
          name: lastResult
          in: query
        - schema:
            type: string
            enum:
              - exclude
              - include
              - only
            default: exclude
            description: >-
              Archived tests are left out (exclude) unless asked for: include
              them, or only them.
          required: false
          description: >-
            Archived tests are left out (exclude) unless asked for: include
            them, or only them.
          name: archived
          in: query
        - schema:
            type: string
            enum:
              - draft
              - accepted
            description: Only drafts, or only accepted tests.
          required: false
          description: Only drafts, or only accepted tests.
          name: state
          in: query
      responses:
        '200':
          description: A page of tests.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TestList'
        '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://api.signalmd.dev/v1/agents/6f1d2c3b-4a5e-4f60-8b7a-9c0d1e2f3a4b/tests"
            \
              -H "Authorization: Bearer $SIGNAL_API_KEY"
components:
  schemas:
    TestList:
      type: object
      properties:
        object:
          type: string
          enum:
            - list
        data:
          type: array
          items:
            $ref: '#/components/schemas/TestSummary'
        hasMore:
          type: boolean
        nextCursor:
          type:
            - string
            - 'null'
          description: Pass as `cursor` for the next page; null on the last page.
      required:
        - object
        - data
        - hasMore
        - nextCursor
    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: credits
                  description: >-
                    credits when the workspace's monthly credits are used up, or
                    agents when the plan's agent limit is reached.
                activity:
                  type: string
                  enum:
                    - observation
                    - testing
                    - chat
                  example: testing
                  description: >-
                    With metric credits: what the request would have spent them
                    on. observation is analysing calls, testing is test runs,
                    chat is the copilot.
                requested:
                  type: integer
                  example: 18
                  description: >-
                    With metric credits: the credits the request needed to
                    start.
                limit:
                  type: integer
                  description: 'The plan''s limit: the month''s credits, or its agents.'
                used:
                  type: integer
                  description: How much of the limit is used this month.
                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.
            proposalId:
              type: string
              format: uuid
              description: >-
                Present when code is criteria_locked: the pending criteria
                proposal the change was filed as. A person approves or rejects
                it.
          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
    TestSummary:
      type: object
      properties:
        object:
          type: string
          enum:
            - test
        id:
          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
        title:
          type:
            - string
            - 'null'
          description: What the test list calls it. Null on tests made before titles.
        source:
          type: string
          enum:
            - production
            - custom
            - probe
          description: >-
            production: a stored call replayed. custom: written as a spec.
            probe: written for a brief line no call exercises; never gates.
        lane:
          type:
            - string
            - 'null'
          enum:
            - hearing
            - understanding
            - flow
            - speaking
            - integrations
            - null
          description: >-
            The lane a defect lives in: hearing, understanding, flow, speaking
            or integrations.
        intentSlug:
          type:
            - string
            - 'null'
          description: The caller's intent the test covers.
        tier:
          type: string
          enum:
            - text
            - phone
          description: text runs a simulated chat; phone is not built yet.
        sourceCallId:
          type:
            - string
            - 'null'
          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 production call it was made from, or based on.
        sourceIssueKey:
          type:
            - string
            - 'null'
          description: The issue it reproduces, for a test made from an issue.
        persona:
          type: object
          properties:
            slug:
              type:
                - string
                - 'null'
              description: >-
                The persona slug of the test's own caller. Null when the caller
                had none.
            label:
              type:
                - string
                - 'null'
          required:
            - slug
            - label
          description: The caller the test plays when a run does not name personas.
        revision:
          type: integer
          description: Bumped by every accepted edit. GET .../revisions has each one.
        state:
          type: string
          enum:
            - draft
            - accepted
          description: >-
            draft: made by a key or the copilot and not accepted yet; it runs
            and reports and never gates or counts. accepted: counts. POST
            .../tests/accept accepts drafts.
        acceptedAt:
          type:
            - string
            - 'null'
          format: date-time
          example: '2026-10-02T14:03:07.120Z'
          description: When it was accepted. Null on a draft.
        criteriaApprovedAt:
          type:
            - string
            - 'null'
          format: date-time
          example: '2026-10-02T14:03:07.120Z'
          description: >-
            When a person approved its criteria. From then on a change to them
            needs a person's approval; anyone else's is filed as a criteria
            proposal.
        expect:
          type: string
          enum:
            - pass
            - fail
          description: >-
            What the test claims: an issue test expects the defect (fail) until
            its fix ships.
        guard:
          type: boolean
          description: >-
            Marked a guard test: it runs several times every release and must
            pass every time.
        gates:
          type: boolean
          description: >-
            Whether its results count toward a release. Only a calibrated test
            in the current scoring epoch gates.
        gateReason:
          type: string
          description: Why it gates or does not, in a few words.
        written:
          type: boolean
          description: >-
            SignalMD generated the caller (a generated test). Such a test
            reports and never gates.
        calibration:
          $ref: '#/components/schemas/TestCalibration'
        inRelease:
          type: boolean
          description: In the release set, which runs on every new version and from CI.
        testSets:
          type: array
          items:
            type: object
            properties:
              id:
                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
              name:
                type: string
            required:
              - id
              - name
          description: The test sets it belongs to.
        tags:
          type: array
          items:
            type: string
        criteriaCount:
          type: integer
          description: Criteria lines after resolving against the current brief.
        fixtureCounts:
          type: object
          properties:
            total:
              type: integer
              description: Tools the test answers for.
            recorded:
              type: integer
              description: Answered from the source call's own recording.
            fromOtherCall:
              type: integer
              description: Answered from another stored call.
            ownerSet:
              type: integer
              description: Answered with a response someone wrote.
            none:
              type: integer
              description: 'No answer: the tool returns a fixed ''not available'' error.'
          required:
            - total
            - recorded
            - fromOtherCall
            - ownerSet
            - none
          description: Where each tool's mocked answer comes from.
        lastAttempt:
          type:
            - object
            - 'null'
          properties:
            result:
              type:
                - string
                - 'null'
              description: passed, failed, flaky, error or drift; null while unscored.
            startedAt:
              type: string
              format: date-time
              example: '2026-10-02T14:03:07.120Z'
          required:
            - result
            - startedAt
          description: >-
            The latest attempt with the test's own caller. Null when it never
            ran.
        autoImprove:
          $ref: '#/components/schemas/TestAutoImprove'
        archivedAt:
          type:
            - string
            - 'null'
          format: date-time
          example: '2026-10-02T14:03:07.120Z'
          description: Set when retired. An archived test is not run.
        createdAt:
          type: string
          format: date-time
          example: '2026-10-02T14:03:07.120Z'
        updatedAt:
          type: string
          format: date-time
          example: '2026-10-02T14:03:07.120Z'
      required:
        - object
        - id
        - title
        - source
        - lane
        - intentSlug
        - tier
        - sourceCallId
        - sourceIssueKey
        - persona
        - revision
        - state
        - acceptedAt
        - criteriaApprovedAt
        - expect
        - guard
        - gates
        - gateReason
        - written
        - calibration
        - inRelease
        - testSets
        - tags
        - criteriaCount
        - fixtureCounts
        - lastAttempt
        - autoImprove
        - archivedAt
        - createdAt
        - updatedAt
      example:
        object: test
        id: 3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f
        title: Books a cleaning when the lookup is slow
        source: production
        lane: integrations
        intentSlug: book_appointment
        tier: text
        sourceCallId: 0b9e8d7c-6f5a-4b3c-9d2e-1f0a9b8c7d6e
        sourceIssueKey: tool_timeout:check_availability
        persona:
          slug: '@source'
          label: The call's own caller
        revision: 2
        state: accepted
        acceptedAt: '2026-09-20T16:12:00.000Z'
        criteriaApprovedAt: '2026-09-20T16:12:00.000Z'
        expect: pass
        guard: false
        gates: true
        gateReason: 'Calibrated: reproduces the failure on version 7 and passes on 8.'
        written: true
        calibration:
          state: stable
          expect: pass
          version: 8
          k: 3
          'n': 3
          results:
            - passed
            - passed
            - passed
          runId: d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a
          revision: 2
          epoch:
            simulatorModel: caller-setup-a
            judgeModel: review-setup-a
            judgePromptHash: 9f2c1a7e
            scorerVersion: '2026-09-18'
          at: '2026-10-02T11:07:41.000Z'
          reason: Passed every run on version 8.
        inRelease: true
        testSets:
          - id: c7d8e9f0-a1b2-4c3d-8e4f-5a6b7c8d9e0f
            name: Release
        tags:
          - booking
        criteriaCount: 2
        fixtureCounts:
          total: 1
          recorded: 1
          fromOtherCall: 0
          ownerSet: 0
          none: 0
        lastAttempt:
          result: passed
          startedAt: '2026-10-02T11:01:15.000Z'
        autoImprove:
          status: ready
          label: Ready for calls
          active: false
          updatedAt: '2026-09-28T09:44:02.000Z'
        archivedAt: null
        createdAt: '2026-09-20T16:12:00.000Z'
        updatedAt: '2026-09-28T09:40:31.000Z'
    ErrorType:
      type: string
      enum:
        - invalid_request_error
        - authentication_error
        - budget_error
        - permission_error
        - not_found_error
        - conflict_error
        - rate_limit_error
        - api_error
    TestCalibration:
      type:
        - object
        - 'null'
      properties:
        state:
          type: string
          enum:
            - uncalibrated
            - calibrating
            - reproduces
            - does_not_reproduce
            - stable
            - unstable
            - inconclusive
            - not_run
          description: >-
            Whether the test gates: only `reproduces` (an issue test that
            reliably fails on its source version) and `stable` (a test that
            reliably passes) do.
        expect:
          type: string
          enum:
            - pass
            - fail
          description: What calibration checked the test against.
        version:
          type:
            - integer
            - 'null'
          description: The agent version it was calibrated on.
        k:
          type: integer
          description: Runs that behaved as expected.
        'n':
          type: integer
          description: Runs scored.
        results:
          type: array
          items:
            type: string
          description: Each calibration run's result, in order.
        runId:
          type:
            - string
            - 'null'
          description: The calibration run.
        revision:
          type:
            - integer
            - 'null'
          description: >-
            The test revision it measured. Null on calibrations stored before
            revisions were recorded.
        epoch:
          $ref: '#/components/schemas/ScoringEpoch'
        at:
          type: string
          description: When it was decided (ISO 8601).
        reason:
          type: string
          description: Why the state is what it is, in one line.
      required:
        - state
        - expect
        - version
        - k
        - 'n'
        - results
        - runId
        - revision
        - epoch
        - at
        - reason
    TestAutoImprove:
      type: object
      properties:
        status:
          type:
            - string
            - 'null'
          enum:
            - improving
            - ready
            - reproduces
            - bot_problem
            - needs_you
            - paused
            - stopped
            - null
          description: >-
            Where auto-improve stands on this test. improving: runs or a fix are
            in progress. ready: the test passes as written. reproduces: an issue
            test that captures the issue. bot_problem: the test is right and the
            agent fails it, confirmed on Retell. needs_you: a person has to
            decide, including a possible problem in the agent seen in a text run
            and not confirmed on Retell (run the test on Retell to confirm it).
            paused: waiting on the budget, a Retell key or credits (the
            workspace has none left this month). stopped: a person edited or
            archived the test. Null when it never ran on this test.
        label:
          type:
            - string
            - 'null'
          description: The same in one line, as the app shows it.
        active:
          type: boolean
          description: Whether it is still working on the test.
        updatedAt:
          type:
            - string
            - 'null'
          format: date-time
          example: '2026-10-02T14:03:07.120Z'
      required:
        - status
        - label
        - active
        - updatedAt
    ScoringEpoch:
      type:
        - object
        - 'null'
      properties:
        simulatorModel:
          type:
            - string
            - 'null'
          description: What played the caller.
        judgeModel:
          type:
            - string
            - 'null'
          description: How the criteria were scored.
        judgePromptHash:
          type:
            - string
            - 'null'
          description: >-
            Identifier of the review setup used, for comparing runs. Runs with
            different values were scored differently.
        scorerVersion:
          type:
            - string
            - 'null'
          description: The version of SignalMD's scoring.
      required:
        - simulatorModel
        - judgeModel
        - judgePromptHash
        - scorerVersion
      description: >-
        What scored a result. Results scored in different epochs are not
        compared.
  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.