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

# List Test Runs

> List every test run this workspace has recorded, newest first.



## OpenAPI

````yaml get /v2/api/projects/{projectId}/workspaces/{workspaceId}/test-runs
openapi: 3.1.0
info:
  title: Upsolve API
  version: 1.5.0
servers:
  - url: https://api.upsolve.ai
security: []
tags: []
paths:
  /v2/api/projects/{projectId}/workspaces/{workspaceId}/test-runs:
    get:
      summary: List every test run this workspace has recorded, …
      description: List every test run this workspace has recorded, newest first.
      operationId: GetV2ApiProjectsProjectIdWorkspacesWorkspaceIdTestRuns
      parameters:
        - name: apiKey
          in: query
          required: false
          description: >-
            Upsolve API key, generated under Account → Developer settings in the
            Upsolve Hub. Keys are user-scoped: pass organizationId alongside the
            key to select which org to act on.
          schema:
            type: string
            minLength: 1
            description: >-
              Upsolve API key, generated under Account → Developer settings in
              the Upsolve Hub. Keys are user-scoped: pass organizationId
              alongside the key to select which org to act on.
            examples:
              - up_embed_************
          examples:
            example1:
              value: up_embed_************
        - name: organizationId
          in: query
          required: false
          description: >-
            Your Upsolve organization's UUID — the org that owns the API key and
            project. This is NOT a project organization: do not pass a value
            registered via /projects/register-organization, and do not pass an
            `externalId` (only `projectOrganizationId` accepts those). Omit it
            when using an org-bound API key — the org is read from the key and
            any value sent here is ignored. Required only for user-scoped API
            keys (created under Account → Developer settings) and for the
            Supabase JWT path, where the org is ambiguous and membership is
            verified against it.
          schema:
            description: >-
              Your Upsolve organization's UUID — the org that owns the API key
              and project. This is NOT a project organization: do not pass a
              value registered via /projects/register-organization, and do not
              pass an `externalId` (only `projectOrganizationId` accepts those).
              Omit it when using an org-bound API key — the org is read from the
              key and any value sent here is ignored. Required only for
              user-scoped API keys (created under Account → Developer settings)
              and for the Supabase JWT path, where the org is ambiguous and
              membership is verified against it.
            examples:
              - 123e4567-e89b-12d3-a456-426614174000
            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})$
          examples:
            example1:
              value: 123e4567-e89b-12d3-a456-426614174000
        - name: projectId
          in: path
          required: true
          description: >-
            GET /v2/api/projects/:projectId/workspaces/:workspaceId/test-runs
            Parameter
          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})$
        - name: workspaceId
          in: path
          required: true
          description: >-
            GET /v2/api/projects/:projectId/workspaces/:workspaceId/test-runs
            Parameter
          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})$
        - name: limit
          in: query
          required: false
          description: How many runs to return, newest first.
          schema:
            default: 20
            description: How many runs to return, newest first.
            type: integer
            minimum: 1
            maximum: 100
        - name: offset
          in: query
          required: false
          description: >-
            GET /v2/api/projects/:projectId/workspaces/:workspaceId/test-runs
            Parameter
          schema:
            default: 0
            type: integer
            minimum: 0
            maximum: 9007199254740991
        - name: filters
          in: query
          required: false
          description: >-
            JSON-encoded AG-Grid filter model. Supported ids: `created_at`
            (date), `pass_rate` (number, 0-100), `trigger` (manual|publish),
            `status` (running|completed|stopped|broke). Example:
            {"pass_rate":{"filterType":"number","type":"lessThan","filter":80}}
          schema:
            description: >-
              JSON-encoded AG-Grid filter model. Supported ids: `created_at`
              (date), `pass_rate` (number, 0-100), `trigger` (manual|publish),
              `status` (running|completed|stopped|broke). Example:
              {"pass_rate":{"filterType":"number","type":"lessThan","filter":80}}
            type: string
            maxLength: 4096
        - name: since_iso
          in: query
          required: false
          description: >-
            Only runs started at or after this ISO timestamp. The time-range
            selector's window; omit for all time.
          schema:
            description: >-
              Only runs started at or after this ISO timestamp. The time-range
              selector's window; omit for all time.
            type: string
            format: date-time
            pattern: >-
              ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
      responses:
        '200':
          description: >-
            GET /v2/api/projects/:projectId/workspaces/:workspaceId/test-runs
            Positive response
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    const: success
                  data:
                    type: object
                    properties:
                      runs:
                        type: array
                        items:
                          type: object
                          properties:
                            jobId:
                              type: string
                            status:
                              type: string
                              enum:
                                - pending
                                - processing
                                - completed
                                - failed
                                - cancelled
                            outcome:
                              type:
                                - string
                                - 'null'
                              enum:
                                - passed
                                - failed
                            partial:
                              type: boolean
                              description: >-
                                True when the run replayed only some of the
                                cases.
                            publishVersion:
                              type:
                                - number
                                - 'null'
                            testedVersion:
                              type:
                                - number
                                - 'null'
                            totalCases:
                              type: number
                            omittedCases:
                              type: number
                              description: >-
                                Cases the run left out because one run replays
                                at most 50. 0 when it ran every case it was
                                asked for.
                            completedCases:
                              type: number
                            passedCases:
                              type: number
                            failedCases:
                              type: number
                            erroredCases:
                              type: number
                              description: >-
                                Cases where the agent never answered, as
                                distinct from failed.
                            checkedTables:
                              type: number
                            failedTables:
                              type: number
                            failureSummary:
                              type:
                                - string
                                - 'null'
                            errorMessage:
                              type:
                                - string
                                - 'null'
                            createdAt:
                              type: string
                            completedAt:
                              type:
                                - string
                                - 'null'
                          required:
                            - jobId
                            - status
                            - outcome
                            - partial
                            - publishVersion
                            - testedVersion
                            - totalCases
                            - omittedCases
                            - completedCases
                            - passedCases
                            - failedCases
                            - erroredCases
                            - checkedTables
                            - failedTables
                            - failureSummary
                            - errorMessage
                            - createdAt
                            - completedAt
                          additionalProperties: false
                      hasMore:
                        type: boolean
                        description: >-
                          Whether another page exists. Answered by reading one
                          row past the page rather than by counting the table.
                      totalCount:
                        type: number
                        description: >-
                          How many runs match in total, for numbering pages.
                          Counted separately from the page, so it can differ by
                          a row from `hasMore` while a run is starting.
                    required:
                      - runs
                      - hasMore
                      - totalCount
                    additionalProperties: false
                required:
                  - status
                  - data
                additionalProperties: false
        '400':
          description: >-
            GET /v2/api/projects/:projectId/workspaces/:workspaceId/test-runs
            Negative response
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    const: error
                  error:
                    type: object
                    properties:
                      message:
                        type: string
                      code:
                        type: string
                      details:
                        type: object
                        propertyNames:
                          type: string
                        additionalProperties: {}
                    required:
                      - message
                    additionalProperties: false
                required:
                  - status
                  - error
                additionalProperties: false
      security:
        - APIKEY_2: []
components:
  securitySchemes:
    APIKEY_2:
      type: apiKey
      in: query
      name: apiKey

````

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