> ## 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 an attempt

> One simulated call: its transcript, the verdict on each criterion with who decided it, what SignalMD's own checks found, caller drift, and what played and scored it.



## OpenAPI

````yaml /api-reference/openapi.json get /v1/agents/{agentId}/attempts/{attemptId}
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}/attempts/{attemptId}:
    get:
      tags:
        - Runs
      summary: Get an attempt
      description: >-
        One simulated call: its transcript, the verdict on each criterion with
        who decided it, what SignalMD's own checks found, caller drift, and what
        played and scored it.
      operationId: getAttempt
      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 attempt's id.
          required: true
          description: The attempt's id.
          name: attemptId
          in: path
      responses:
        '200':
          description: The attempt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Attempt'
        '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/attempts/f9a0b1c2-d3e4-4f5a-8b6c-7d8e9f0a1b2c"
            \
              -H "Authorization: Bearer $SIGNAL_API_KEY"
components:
  schemas:
    Attempt:
      allOf:
        - $ref: '#/components/schemas/AttemptSummary'
        - type: object
          properties:
            transcript:
              description: >-
                The conversation as the voice platform returned it, tool calls
                included. Its shape is the platform's, not normalised.
            verdicts:
              type: array
              items:
                $ref: '#/components/schemas/CriterionVerdict'
            findings:
              type: array
              items:
                type: object
                additionalProperties: {}
              description: >-
                Problems SignalMD's own checks found on the transcript (code,
                title, severity, detail), whatever the criteria say.
            drift:
              type:
                - object
                - 'null'
              additionalProperties: {}
              description: >-
                Whether the simulated caller stayed the source caller (drifted,
                reasons, notes). Null: no source to compare with.
            scoreHistory:
              type: array
              items:
                type: object
                additionalProperties: {}
              description: >-
                Earlier scores of this attempt, oldest first, each with the
                epoch it was scored in.
            watches:
              type: array
              items:
                $ref: '#/components/schemas/AttemptWatch'
              description: >-
                Live watches of the agent on this transcript, reported beside
                the verdict. A watch never changes the verdict.
          required:
            - verdicts
            - findings
            - drift
            - scoreHistory
            - watches
    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
    AttemptSummary:
      type: object
      properties:
        object:
          type: string
          enum:
            - attempt
        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
        runId:
          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 run it belongs to.
        testId:
          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
        testRevision:
          type:
            - integer
            - 'null'
          description: The test revision it ran. Null on attempts stored before revisions.
        persona:
          type: string
          description: The persona slug played, or @source for the test's own caller.
        attempt:
          type: integer
          description: >-
            1 for the first try; 2 for the rerun of a failure; 2 and 3 for the
            repeats of a cell that runs three times.
        version:
          type:
            - integer
            - 'null'
          description: The agent version played.
        result:
          type:
            - string
            - 'null'
          enum:
            - passed
            - failed
            - error
            - drift
            - null
          description: >-
            This attempt's own result. The cell's combined result, including
            flaky, is in the run's result document.
        reason:
          type:
            - string
            - 'null'
          description: Why, in one line.
        noFixture:
          type: array
          items:
            type: string
          description: Tools that answered with the fixed 'not available' error.
        providerGrader:
          type: object
          properties:
            status:
              type:
                - string
                - 'null'
            explanation:
              type:
                - string
                - 'null'
          required:
            - status
            - explanation
          description: The voice platform's own grader result.
        models:
          type: object
          properties:
            simulator:
              type:
                - string
                - 'null'
              description: What played the caller.
            judge:
              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'
          required:
            - simulator
            - judge
            - judgePromptHash
            - scorerVersion
          description: What played and scored it.
        cost:
          type: object
          properties:
            retellUsd:
              type:
                - number
                - 'null'
            signalUsd:
              type:
                - number
                - 'null'
          required:
            - retellUsd
            - signalUsd
          description: 'Estimated cost of the attempt: Retell''s share and SignalMD''s.'
        rescoredAt:
          type:
            - string
            - 'null'
          format: date-time
          example: '2026-10-02T14:03:07.120Z'
          description: Set when it was scored again from its transcript.
        startedAt:
          type: string
          format: date-time
          example: '2026-10-02T14:03:07.120Z'
        finishedAt:
          type:
            - string
            - 'null'
          format: date-time
          example: '2026-10-02T14:03:07.120Z'
      required:
        - object
        - id
        - runId
        - testId
        - testRevision
        - persona
        - attempt
        - version
        - result
        - reason
        - noFixture
        - providerGrader
        - models
        - cost
        - rescoredAt
        - startedAt
        - finishedAt
      example:
        object: attempt
        id: f9a0b1c2-d3e4-4f5a-8b6c-7d8e9f0a1b2c
        runId: d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a
        testId: 3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f
        testRevision: 2
        persona: '@source'
        attempt: 1
        version: 8
        result: passed
        reason: null
        noFixture: []
        providerGrader:
          status: null
          explanation: null
        models:
          simulator: caller-setup-a
          judge: review-setup-a
          judgePromptHash: 9f2c1a7e
          scorerVersion: '2026-09-18'
        cost:
          retellUsd: 0.15
          signalUsd: 0.02
        rescoredAt: null
        startedAt: '2026-10-02T11:01:15.000Z'
        finishedAt: '2026-10-02T11:02:40.000Z'
    CriterionVerdict:
      type: object
      properties:
        id:
          type: string
        criterionId:
          type: string
        text:
          type: string
        decidedBy:
          type: string
          enum:
            - detector
            - judge
            - unmeasured
          description: >-
            How the criterion was decided: `detector` by a check on the
            transcript and tool calls, `judge` by reading the conversation,
            `unmeasured` not at all, because a text run cannot measure it.
        met:
          type:
            - boolean
            - 'null'
          description: >-
            Null: not decided (not measurable in text, or the answer was
            unclear).
        detail:
          type: string
        judge:
          type: object
          properties:
            model:
              type:
                - string
                - 'null'
              description: The review setup that read the conversation for this criterion.
            answers:
              type: array
              items: {}
              description: Each answer given when the criterion was scored.
            evidenceTurn:
              type: integer
            quote:
              type: string
            evidenceKind:
              type: string
          required:
            - model
            - answers
          description: >-
            Set when the criterion was scored by reading the conversation, or
            could not be.
      required:
        - id
        - criterionId
        - text
        - decidedBy
        - met
        - detail
    AttemptWatch:
      type: object
      properties:
        watchId:
          type: string
          description: The watch's id.
        name:
          type: string
          description: The watch's name.
        status:
          type: string
          description: >-
            What the watch found on this transcript: met, violated, not in
            scope, not checked, checking, unclear, or flagged. "Not checked: no
            model" means SignalMD could not check this call.
        quote:
          type:
            - string
            - 'null'
          description: >-
            Why the watch was broken, quoted from the call, when status is
            violated; otherwise null.
        evidenceTurn:
          type:
            - integer
            - 'null'
          description: The turn the quote comes from, when it comes from one turn.
      required:
        - watchId
        - name
        - status
        - quote
    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.