components:
  parameters:
    orderBy:
      in: query
      name: orderBy
      schema:
        type: string
    pageSize:
      in: query
      name: pageSize
      schema:
        maximum: 100
        minimum: 1
        type: integer
    pageSizeUnbounded:
      in: query
      name: pageSize
      schema:
        type: integer
    pageToken:
      in: query
      name: pageToken
      schema:
        type: string
    runCounterQuery:
      description: |
        Resolve against this run of the entity rather than its current one. Omit for
        the current run. Runs are 0-based, matching the runCounter reported on the
        entity itself.
      in: query
      name: runCounter
      schema:
        $ref: '#/components/schemas/runCounter'
  responses:
    alreadyExists:
      description: The resource already exists.
    badRequest:
      description: The request contained one or more errors.
    conflict:
      description: The request could not be completed; it may be attempting to modify
        something that is currently being modified.
    forbidden:
      description: The user does not have adequate privileges.
    insufficientQuota:
      description: Current quota is insufficient for this operation
    notFound:
      description: The resource could not be found.
    unauthenticated:
      description: Access token is missing or invalid.
  schemas:
    addAssetsToBuildInput:
      properties:
        assets:
          items:
            $ref: '#/components/schemas/assetBuildLinkInput'
          minItems: 1
          type: array
      required:
      - assets
      type: object
    addSuitesToExperiencesInput:
      allOf:
      - $ref: '#/components/schemas/selectExperiencesInput'
      - required:
        - testSuiteIDs
      - properties:
          testSuiteIDs:
            items:
              $ref: '#/components/schemas/testSuiteID'
            type: array
        type: object
    addTagsToExperiencesInput:
      allOf:
      - $ref: '#/components/schemas/selectExperiencesInput'
      - required:
        - experienceTagIDs
      - properties:
          experienceTagIDs:
            items:
              $ref: '#/components/schemas/experienceTagID'
            type: array
        type: object
    agent:
      description: A HiL Agent registration, hydrated with derived activity and recent-activity
        fields for the customer-facing list/detail surfaces.
      properties:
        activity:
          $ref: '#/components/schemas/agentActivity'
        agentID:
          type: string
        firstCheckin:
          format: date-time
          type: string
        isOutOfDate:
          description: |
            True iff the agent's reported version is older (semver-canonical,
            prerelease stripped) than latestKnownVersion. False when
            latestKnownVersion is unset (the UI suppresses the indicator
            entirely in that case).
          type: boolean
        lastCheckin:
          format: date-time
          type: string
        orgID:
          $ref: '#/components/schemas/orgID'
        pauseReason:
          description: The free-text reason recorded with the pause, if any. Absent
            when not paused or no reason was given.
          type: string
        pausedAt:
          description: |
            When the agent was paused, or absent if it is not paused. A paused
            agent stops launching workers and has its in-flight worker
            terminated (the interrupted task is requeued, not cancelled).
          format: date-time
          type: string
        pausedBy:
          description: The actor (email, or client identity for machine tokens) who
            set the current pause. Absent when not paused.
          type: string
        poolLabels:
          $ref: '#/components/schemas/poolLabels'
        recentActivity:
          description: Up to a server-defined cap of most-recent unified batch+job
            activity cards.
          items:
            $ref: '#/components/schemas/agentRecentActivity'
          type: array
        reportedPausedAt:
          description: |
            When the agent last confirmed it had quiesced — observed the pause
            and its in-flight worker exited. Absent if it has not acknowledged
            the current pause (an older agent binary never will; use `version`
            to disambiguate "old binary" from "still draining"). Raw timestamp
            rather than a derived boolean by design.
          format: date-time
          type: string
        version:
          type: string
      required:
      - agentID
      - orgID
      - poolLabels
      - firstCheckin
      - lastCheckin
      - version
      - isOutOfDate
      - activity
      - recentActivity
      type: object
    agentActivity:
      description: |
        Whether the agent is actively running a job. ACTIVE means the agent
        has at least one job in conflatedStatus=RUNNING joined via
        jobs_status_history.agent_id, AND its last_checkin is within the
        active-window threshold (default 5 minutes). INACTIVE otherwise.
      enum:
      - ACTIVE
      - INACTIVE
      type: string
    agentMarkdownHistoryEntry:
      properties:
        agentMarkdown:
          type: string
        editedAt:
          $ref: '#/components/schemas/timestamp'
        editedBy:
          type: string
        id:
          format: uuid
          type: string
      required:
      - id
      - agentMarkdown
      - editedBy
      - editedAt
      type: object
    agentRecentActivity:
      description: |
        One card in an agent's recent-activity feed, combining the batch
        with the specific test/job that ran. The UI renders a single
        unified card per activity item rather than separate batch and
        test columns.
      properties:
        batchConflatedStatus:
          $ref: '#/components/schemas/conflatedBatchStatus'
        batchID:
          format: uuid
          type: string
        batchName:
          type: string
        branchName:
          description: Optional — null when the batch's build is not associated with
            a branch.
          type: string
        buildID:
          description: ID of the build the batch ran, for linking to the build page.
            Optional — null when no build can be resolved.
          format: uuid
          type: string
        buildVersion:
          description: The build version associated with the batch. Optional — null
            when no build can be resolved.
          type: string
        errorSummary:
          description: Latest error_text recorded against the job. Optional — null
            when the job has no errors.
          type: string
        executionErrors:
          description: |
            Structured errors recorded against the job on its current run, keyed
            by error code so the UI can resolve brief/full copy (mirrors the Job
            shape). Scoped to the current run_counter, so a stale error from a
            prior attempt is not surfaced after a passing rerun.
          items:
            $ref: '#/components/schemas/executionError'
          type: array
        jobConflatedStatus:
          $ref: '#/components/schemas/conflatedJobStatus'
        jobID:
          format: uuid
          type: string
        jobName:
          description: Surfaced as "test name" in the agent-status UI; sourced from
            the experience name on the job.
          type: string
        projectID:
          format: uuid
          type: string
        projectName:
          description: Name of the project the batch belongs to. Always present —
            every batch has a project.
          type: string
        systemID:
          description: ID of the system the batch's build belongs to, for linking
            to the system page. Optional — null when no build/system can be resolved.
          format: uuid
          type: string
        systemName:
          description: Name of the system the batch's build belongs to. Optional —
            null when no build/system can be resolved.
          type: string
        testSuiteID:
          description: ID of the test suite the batch belongs to, for linking to the
            test-suite page. Optional — null when the batch is adhoc.
          format: uuid
          type: string
        testSuiteName:
          description: Name of the test suite the batch belongs to. Optional — null
            when the batch is adhoc or the test_suites row cannot be resolved.
          type: string
        testSuiteRevision:
          description: Revision of the test suite the batch ran. Optional — present
            only alongside testSuiteID, since the test-suite page is revision-specific.
          format: int32
          type: integer
        timestamp:
          format: date-time
          type: string
        workerID:
          description: Identifier of the worker that ran the job, sourced from jobs_status_history.
            Optional — older rows may not have a worker recorded.
          type: string
      required:
      - batchID
      - batchName
      - batchConflatedStatus
      - jobID
      - jobName
      - jobConflatedStatus
      - projectName
      - timestamp
      type: object
    agentResultBranch:
      description: One branch that appears in a HiL Agent's results.
      properties:
        branchID:
          format: uuid
          type: string
        name:
          type: string
      required:
      - branchID
      - name
      type: object
    agentUtilizationBucket:
      description: |
        One time bucket of agent utilization. utilization is the union of
        the agent's EXPERIENCE_RUNNING intervals clipped to the bucket,
        divided by the bucket's wall-clock duration — a fraction in
        [0.0, 1.0]. An agent runs one experience at a time, so there is no
        concurrency dimension.

        offline is the fraction of bucket wall-clock during which the
        agent's heartbeat had been silent for over five minutes (0 before
        offline recording was deployed). Online-but-idle time is derived,
        not reported: 1 − utilization − offline, clamped at 0 — a stuck
        run overlapping recorded offline time can push utilization +
        offline past 1.0 transiently. testsRun counts job runs that
        started in the bucket; each run counts exactly once across the
        series, so bucket sums match the window's totalTestsRun.
      properties:
        bucketEnd:
          format: date-time
          type: string
        bucketStart:
          format: date-time
          type: string
        offline:
          format: double
          type: number
        testsRun:
          type: integer
        utilization:
          format: double
          type: number
      required:
      - bucketStart
      - bucketEnd
      - utilization
      - offline
      - testsRun
      type: object
    agentUtilizationOutput:
      description: |
        Dense, time-ordered utilization series for one HiL Agent. Every
        bucket in [windowStart, windowEnd) is present — buckets with no
        running experiences carry explicit zeros, so the series charts
        directly without gap-filling. windowStart/windowEnd echo the
        resolved window (after server-side defaulting), since clipped edge
        buckets do not recover it. totalTestsRun counts job runs started
        in the window (the per-bucket testsRun figures sum to it; a run
        that began before the window is not counted). topExperiences
        ranks the agent's experiences by total running seconds in the
        window. avgQueueSeconds/medianQueueSeconds aggregate the queue
        wait (submission to execution start) of runs started in the
        window; both are omitted when no started run has a measurable
        wait. Queue waits are long-tailed, so the median resists the
        stuck-batch outliers that drag the average.
      properties:
        agentID:
          type: string
        avgQueueSeconds:
          format: double
          type: number
        buckets:
          items:
            $ref: '#/components/schemas/agentUtilizationBucket'
          type: array
        interval:
          enum:
          - hour
          - day
          type: string
        medianQueueSeconds:
          format: double
          type: number
        topExperiences:
          items:
            $ref: '#/components/schemas/agentUtilizationTopExperience'
          type: array
        totalTestsRun:
          type: integer
        windowEnd:
          format: date-time
          type: string
        windowStart:
          format: date-time
          type: string
      required:
      - agentID
      - interval
      - windowStart
      - windowEnd
      - totalTestsRun
      - buckets
      - topExperiences
      type: object
    agentUtilizationSeries:
      description: |
        One agent's dense bucket series within a listAgentUtilization
        response. The window and interval are shared across all series and
        live on the enclosing output, not repeated per agent.
      properties:
        agentID:
          type: string
        buckets:
          items:
            $ref: '#/components/schemas/agentUtilizationBucket'
          type: array
        poolLabels:
          description: |
            The agent's pool labels at query time, so a consumer can group the
            per-agent series by pool client-side. Empty when the agent carries
            no labels.
          items:
            $ref: '#/components/schemas/poolLabel'
          type: array
      required:
      - agentID
      - poolLabels
      - buckets
      type: object
    agentUtilizationTopExperience:
      description: |
        One experience's share of running time within a utilization
        window. runCount is the number of distinct job runs of this
        experience in the window; totalRunSeconds sums their clipped
        running durations (concurrent runs accumulate independently);
        share is totalRunSeconds over all experiences' running seconds in
        the window — a fraction in [0.0, 1.0] of busy time, not of
        wall-clock.
      properties:
        experienceID:
          format: uuid
          type: string
        experienceName:
          type: string
        runCount:
          type: integer
        share:
          format: double
          type: number
        totalRunSeconds:
          format: double
          type: number
      required:
      - experienceID
      - experienceName
      - runCount
      - totalRunSeconds
      - share
      type: object
    architecture:
      enum:
      - AMD64
      - ARM64
      type: string
    archiveAgentOutput:
      description: |
        Response shape for archiveAgent. archivedAt is the original
        archive timestamp — re-archiving an already-archived agent
        preserves the first value rather than refreshing it.
      properties:
        agentID:
          type: string
        archivedAt:
          format: date-time
          type: string
      required:
      - agentID
      - archivedAt
      type: object
    archived:
      type: boolean
    asset:
      properties:
        archived:
          type: boolean
        assetID:
          $ref: '#/components/schemas/assetID'
        assetRevision:
          $ref: '#/components/schemas/assetRevision'
        cacheExempt:
          description: If true, the asset will not be cached.
          type: boolean
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        description:
          type: string
        locations:
          items:
            type: string
          type: array
        mountFolder:
          type: string
        name:
          type: string
        numBuilds:
          description: Number of builds this asset revision is linked to.
          type: integer
        orgID:
          $ref: '#/components/schemas/orgID'
        projectID:
          $ref: '#/components/schemas/projectID'
        updateTimestamp:
          $ref: '#/components/schemas/timestamp'
        updateUserID:
          $ref: '#/components/schemas/userID'
        userID:
          $ref: '#/components/schemas/userID'
        version:
          type: string
      required:
      - assetID
      - assetRevision
      - name
      - description
      - mountFolder
      - locations
      - version
      - projectID
      - userID
      - orgID
      - creationTimestamp
      - updateTimestamp
      - updateUserID
      - archived
      - cacheExempt
      - numBuilds
      type: object
    assetBuildLinkInput:
      properties:
        assetID:
          $ref: '#/components/schemas/assetID'
        assetRevision:
          $ref: '#/components/schemas/assetRevision'
      required:
      - assetID
      - assetRevision
      type: object
    assetBuildReference:
      properties:
        assetRevision:
          $ref: '#/components/schemas/assetRevision'
        buildID:
          $ref: '#/components/schemas/buildID'
      type: object
    assetID:
      format: uuid
      type: string
    assetRevision:
      format: int64
      type: integer
    associatedAccount:
      type: string
    batch:
      properties:
        adhocTestSuite:
          type: boolean
        allowable_failure_percent:
          type: integer
        associatedAccount:
          $ref: '#/components/schemas/associatedAccount'
        associatedSweepID:
          $ref: '#/components/schemas/parameterSweepID'
        batchID:
          $ref: '#/components/schemas/batchID'
        batchMetricsStatus:
          $ref: '#/components/schemas/metricStatus'
        batchType:
          $ref: '#/components/schemas/batchType'
        blueprintName:
          description: Name of the blueprint this batch ran. Null for batches recorded
            before blueprints existed; system blueprints read "resim:default.0".
          nullable: true
          type: string
        blueprintVersion:
          description: Revision of the blueprint this batch ran. Only set for custom
            blueprints; system blueprints carry their version in the name.
          nullable: true
          type: integer
        branchID:
          $ref: '#/components/schemas/branchID'
        buildID:
          $ref: '#/components/schemas/buildID'
        conflatedStatus:
          $ref: '#/components/schemas/conflatedBatchStatus'
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        description:
          type: string
        executionError:
          $ref: '#/components/schemas/executionError'
        executionErrors:
          items:
            $ref: '#/components/schemas/executionError'
          type: array
        friendlyName:
          $ref: '#/components/schemas/friendlyName'
        jobMetricsStatusCounts:
          $ref: '#/components/schemas/jobMetricsStatusCounts'
        jobStatusCounts:
          $ref: '#/components/schemas/batchJobStatusCounts'
        jobsMetricsStatus:
          $ref: '#/components/schemas/metricStatus'
        labelledBuilds:
          $ref: '#/components/schemas/labelledBuilds'
        lastRunTimestamp:
          $ref: '#/components/schemas/timestamp'
        lastUpdatedTimestamp:
          $ref: '#/components/schemas/timestamp'
        metricsBuildID:
          $ref: '#/components/schemas/metricsBuildID'
        metricsSetName:
          $ref: '#/components/schemas/metricsSetName'
        orgID:
          $ref: '#/components/schemas/orgID'
        overallMetricsStatus:
          $ref: '#/components/schemas/metricStatus'
        parameters:
          $ref: '#/components/schemas/batchParameters'
        poolLabels:
          $ref: '#/components/schemas/poolLabels'
        priority:
          type: integer
        projectID:
          $ref: '#/components/schemas/projectID'
        runCounter:
          $ref: '#/components/schemas/runCounter'
        runnerType:
          $ref: '#/components/schemas/runnerType'
        status:
          $ref: '#/components/schemas/batchStatus'
        statusHistory:
          $ref: '#/components/schemas/batchStatusHistory'
        systemID:
          $ref: '#/components/schemas/systemID'
        testSuiteID:
          $ref: '#/components/schemas/testSuiteID'
        testSuiteRevision:
          $ref: '#/components/schemas/testSuiteRevision'
        totalJobs:
          $ref: '#/components/schemas/batchTotalJobs'
        userID:
          $ref: '#/components/schemas/userID'
      required:
      - associatedAccount
      - runnerType
      type: object
    batchID:
      format: uuid
      type: string
    batchInput:
      properties:
        allowableFailurePercent:
          nullable: true
          type: integer
        associatedAccount:
          $ref: '#/components/schemas/associatedAccount'
        batchName:
          $ref: '#/components/schemas/name'
        blueprintName:
          nullable: true
          type: string
        blueprintVersion:
          nullable: true
          type: integer
        buildID:
          $ref: '#/components/schemas/buildID'
        excludedExperienceIDs:
          items:
            $ref: '#/components/schemas/excludedExperienceID'
          nullable: true
          type: array
        experienceIDs:
          items:
            $ref: '#/components/schemas/experienceID'
          nullable: true
          type: array
        experienceNames:
          items:
            $ref: '#/components/schemas/experienceName'
          nullable: true
          type: array
        experienceTagIDs:
          items:
            $ref: '#/components/schemas/experienceTagID'
          nullable: true
          type: array
        experienceTagNames:
          items:
            $ref: '#/components/schemas/experienceTagName'
          nullable: true
          type: array
        filters:
          $ref: '#/components/schemas/experienceFilterInput'
        labelledBuilds:
          $ref: '#/components/schemas/labelledBuilds'
        metricsBuildID:
          $ref: '#/components/schemas/metricsBuildID'
        metricsSetName:
          $ref: '#/components/schemas/metricsSetName'
        parameters:
          $ref: '#/components/schemas/batchParameters'
        poolLabels:
          $ref: '#/components/schemas/poolLabels'
        priority:
          maximum: 32767
          minimum: 0
          nullable: true
          type: integer
        triggeredVia:
          $ref: '#/components/schemas/triggeredVia'
      type: object
    batchJobStatusCounts:
      properties:
        cancelled:
          type: integer
        error:
          type: integer
        metricsQueued:
          type: integer
        metricsRunning:
          type: integer
        running:
          type: integer
        submitted:
          type: integer
        succeeded:
          type: integer
      required:
      - submitted
      - running
      - succeeded
      - error
      - cancelled
      - metricsQueued
      - metricsRunning
      type: object
    batchLog:
      allOf:
      - $ref: '#/components/schemas/log'
      - properties:
          batchID:
            $ref: '#/components/schemas/batchID'
        type: object
    batchMetric:
      allOf:
      - $ref: '#/components/schemas/metric'
      - properties:
          batchID:
            $ref: '#/components/schemas/batchID'
        type: object
    batchMetricsData:
      allOf:
      - $ref: '#/components/schemas/metricsData'
      - properties:
          batchID:
            $ref: '#/components/schemas/batchID'
        type: object
    batchMetricsDataAndIDs:
      properties:
        batchMetricID:
          $ref: '#/components/schemas/metricID'
        batchMetricsData:
          $ref: '#/components/schemas/batchMetricsData'
      type: object
    batchParameters:
      additionalProperties:
        type: string
      type: object
    batchStatus:
      enum:
      - SUBMITTED
      - EXPERIENCES_RUNNING
      - BATCH_METRICS_QUEUED
      - BATCH_METRICS_RUNNING
      - ERROR
      - SUCCEEDED
      - CANCELLED
      type: string
    batchStatusHistory:
      items:
        $ref: '#/components/schemas/batchStatusHistoryType'
      type: array
    batchStatusHistoryType:
      properties:
        status:
          $ref: '#/components/schemas/batchStatus'
        updatedAt:
          $ref: '#/components/schemas/timestamp'
      type: object
    batchSuggestionsOutput:
      properties:
        lastPassingOnBranch:
          allOf:
          - $ref: '#/components/schemas/batch'
          nullable: true
        lastPassingOnMain:
          allOf:
          - $ref: '#/components/schemas/batch'
          nullable: true
        latestOnBranch:
          allOf:
          - $ref: '#/components/schemas/batch'
          nullable: true
        latestOnMain:
          allOf:
          - $ref: '#/components/schemas/batch'
          nullable: true
      required:
      - lastPassingOnMain
      - latestOnMain
      - lastPassingOnBranch
      - latestOnBranch
      type: object
    batchTotalJobs:
      type: integer
    batchType:
      enum:
      - NORMAL
      - DEBUG_EXPERIENCE
      - LIGHT
      type: string
    batchUsageOutput:
      description: One page of per-test runtime usage for a batch, one row per (job,
        run) for the page's tests.
      properties:
        batchID:
          $ref: '#/components/schemas/batchID'
        nextPageToken:
          type: string
        projectID:
          $ref: '#/components/schemas/projectID'
        runs:
          items:
            $ref: '#/components/schemas/batchUsageRunRow'
          type: array
        totalTests:
          description: Total number of tests (jobs) in the batch, across all pages.
          format: int64
          type: integer
      required:
      - batchID
      - projectID
      - runs
      - nextPageToken
      - totalTests
      type: object
    batchUsageRunRow:
      description: |
        Rerun-sourced runtime usage for one run (run_counter) of one test
        (job) within a batch. Same meters as jobUsageRunRow, plus jobID,
        experienceID, and experienceName identifying which test the run
        belongs to.
      properties:
        cpuSeconds:
          format: int64
          type: integer
        experienceID:
          $ref: '#/components/schemas/experienceID'
        experienceName:
          $ref: '#/components/schemas/experienceName'
        gpuSeconds:
          format: int64
          type: integer
        jobID:
          $ref: '#/components/schemas/jobID'
        memoryMibSeconds:
          format: int64
          type: integer
        orchestrationSeconds:
          format: int64
          type: integer
        runCounter:
          $ref: '#/components/schemas/runCounter'
        storageBytes:
          description: Rerun-side storage for the run.
          format: int64
          type: integer
      required:
      - jobID
      - experienceID
      - experienceName
      - runCounter
      - orchestrationSeconds
      - cpuSeconds
      - gpuSeconds
      - memoryMibSeconds
      - storageBytes
      type: object
    batchUsageTotalsOutput:
      description: |
        Rerun-sourced runtime usage totals for the batch: the compute meters
        (orchestration/cpu/gpu/memory seconds) summed across every test, plus
        total rerun-side log storage. All integer base units. Metrics-compute
        scan bytes, data-lake storage, and the batch-processes breakdown are
        added downstream in the BFF.
      properties:
        cpuSeconds:
          format: int64
          type: integer
        gpuSeconds:
          format: int64
          type: integer
        logStorageBytes:
          description: Total rerun-side log storage for the batch.
          format: int64
          type: integer
        memoryMibSeconds:
          format: int64
          type: integer
        orchestrationSeconds:
          format: int64
          type: integer
      required:
      - orchestrationSeconds
      - cpuSeconds
      - gpuSeconds
      - memoryMibSeconds
      - logStorageBytes
      type: object
    blueprint:
      properties:
        blueprintID:
          format: uuid
          type: string
        createdAt:
          $ref: '#/components/schemas/timestamp'
        cueContent:
          type: string
        description:
          type: string
        name:
          type: string
        orgID:
          $ref: '#/components/schemas/orgID'
        userID:
          $ref: '#/components/schemas/userID'
        version:
          type: integer
      required:
      - blueprintID
      - orgID
      - name
      - description
      - version
      - cueContent
      - createdAt
      - userID
      type: object
    branch:
      properties:
        branchID:
          $ref: '#/components/schemas/branchID'
        branchType:
          $ref: '#/components/schemas/branchType'
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        name:
          type: string
        orgID:
          $ref: '#/components/schemas/orgID'
        projectID:
          $ref: '#/components/schemas/projectID'
        userID:
          $ref: '#/components/schemas/userID'
      required:
      - branchID
      - name
      - projectID
      - branchType
      - creationTimestamp
      - userID
      - orgID
      type: object
    branchID:
      format: uuid
      type: string
    branchType:
      enum:
      - CHANGE_REQUEST
      - MAIN
      - RELEASE
      type: string
    build:
      properties:
        associatedAccount:
          $ref: '#/components/schemas/associatedAccount'
        branchID:
          $ref: '#/components/schemas/branchID'
        buildID:
          $ref: '#/components/schemas/buildID'
        buildSpecification:
          $ref: '#/components/schemas/buildSpecificationOutput'
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        description:
          $ref: '#/components/schemas/buildDescription'
        imageUri:
          $ref: '#/components/schemas/buildImageUri'
        name:
          $ref: '#/components/schemas/buildName'
        numAssets:
          description: Number of assets linked to this build.
          type: integer
        orgID:
          $ref: '#/components/schemas/orgID'
        projectID:
          $ref: '#/components/schemas/projectID'
        systemID:
          $ref: '#/components/schemas/systemID'
        updateTimestamp:
          $ref: '#/components/schemas/timestamp'
        updateUserID:
          $ref: '#/components/schemas/userID'
        userID:
          $ref: '#/components/schemas/userID'
        version:
          $ref: '#/components/schemas/buildVersion'
      required:
      - associatedAccount
      - buildID
      - branchID
      - projectID
      - systemID
      - name
      - description
      - version
      - imageUri
      - buildSpecification
      - creationTimestamp
      - updateTimestamp
      - updateUserID
      - userID
      - orgID
      type: object
    buildAssetLink:
      properties:
        asset:
          $ref: '#/components/schemas/asset'
        buildID:
          $ref: '#/components/schemas/buildID'
        linkCreationTimestamp:
          $ref: '#/components/schemas/timestamp'
      required:
      - asset
      - buildID
      - linkCreationTimestamp
      type: object
    buildDescription:
      deprecated: true
      description: The description of the build. May be a SHA or commit message.
      type: string
    buildID:
      format: uuid
      type: string
    buildImageUri:
      type: string
    buildName:
      description: The name of the build.
      type: string
    buildSpecificationInput:
      format: byte
      type: string
    buildSpecificationOutput:
      description: Build spec in YAML format.
      type: string
    buildVersion:
      minLength: 1
      type: string
    bulkArchiveExperiencesInput:
      allOf:
      - $ref: '#/components/schemas/selectExperiencesInput'
      - required:
        - experienceIDs
      - properties:
          experienceIDs:
            items:
              $ref: '#/components/schemas/experienceID'
            type: array
        type: object
    checksum:
      type: string
    closeJobInput:
      properties:
        errorMessage:
          description: Optional user-provided error message for the job. Only used
            when status is ERROR.
          type: string
        status:
          $ref: '#/components/schemas/lightJobStatus'
      required:
      - status
      type: object
    compareBatchTest:
      properties:
        experienceID:
          $ref: '#/components/schemas/experienceID'
        experienceName:
          $ref: '#/components/schemas/experienceName'
        fromTest:
          $ref: '#/components/schemas/compareBatchTestDetails'
        toTest:
          $ref: '#/components/schemas/compareBatchTestDetails'
      required:
      - experienceID
      - experienceName
      - fromTest
      - toTest
      type: object
    compareBatchTestDetails:
      nullable: true
      properties:
        jobID:
          $ref: '#/components/schemas/jobID'
        numMetrics:
          description: The number of failblock/failwarn/passing metrics (based on
            job's status). Otherwise this will be null
          nullable: true
          type: integer
        status:
          $ref: '#/components/schemas/conflatedJobStatus'
      required:
      - jobID
      - status
      - numMetrics
      type: object
    compareBatchesOutput:
      properties:
        nextPageToken:
          type: string
        tests:
          items:
            $ref: '#/components/schemas/compareBatchTest'
          type: array
        total:
          type: integer
      required:
      - total
      - nextPageToken
      - tests
      type: object
    compareBatchesStatusFilter:
      enum:
      - BOTH_PASSING
      - BOTH_FAILING
      - ONE_FAILING
      type: string
    conflatedBatchStatus:
      enum:
      - SUBMITTED
      - RUNNING
      - CANCELLED
      - ERROR
      - COMPLETE
      - BLOCKER
      - WARNING
      type: string
    conflatedJobStatus:
      enum:
      - QUEUED
      - RUNNING
      - ERROR
      - CANCELLED
      - BLOCKER
      - WARNING
      - PASSED
      type: string
    containerName:
      type: string
    containerStatus:
      type: string
    containerStatusLine:
      properties:
        containerName:
          type: string
        exitCode:
          type: integer
        status:
          $ref: '#/components/schemas/containerStatus'
        statusChangedTimestamp:
          $ref: '#/components/schemas/timestamp'
      required:
      - containerName
      - status
      - statusChangedTimestamp
      type: object
    createAssetInput:
      properties:
        cacheExempt:
          description: If true, the asset will not be cached.
          type: boolean
        description:
          type: string
        locations:
          items:
            type: string
          type: array
        mountFolder:
          type: string
        name:
          type: string
        version:
          type: string
      required:
      - name
      - description
      - mountFolder
      - locations
      - version
      type: object
    createBlueprintInput:
      properties:
        cueContent:
          type: string
        description:
          type: string
        name:
          type: string
      required:
      - name
      - cueContent
      type: object
    createBranchInput:
      properties:
        branchType:
          $ref: '#/components/schemas/branchType'
        name:
          minLength: 1
          type: string
      required:
      - name
      - branchType
      type: object
    createBuildForBranchInput:
      oneOf:
      - required:
        - imageUri
      - required:
        - buildSpecification
      - required:
        - noBuildDefinition
      properties:
        associatedAccount:
          $ref: '#/components/schemas/associatedAccount'
        buildSpecification:
          $ref: '#/components/schemas/buildSpecificationInput'
        description:
          $ref: '#/components/schemas/buildDescription'
        imageUri:
          $ref: '#/components/schemas/buildImageUri'
        name:
          $ref: '#/components/schemas/buildName'
        noBuildDefinition:
          type: boolean
        systemID:
          $ref: '#/components/schemas/systemID'
        version:
          $ref: '#/components/schemas/buildVersion'
      required:
      - systemID
      - version
      type: object
    createBuildForSystemInput:
      oneOf:
      - required:
        - imageUri
      - required:
        - buildSpecification
      - required:
        - noBuildDefinition
      properties:
        associatedAccount:
          $ref: '#/components/schemas/associatedAccount'
        branchID:
          $ref: '#/components/schemas/branchID'
        buildSpecification:
          $ref: '#/components/schemas/buildSpecificationInput'
        description:
          $ref: '#/components/schemas/buildDescription'
        imageUri:
          $ref: '#/components/schemas/buildImageUri'
        name:
          $ref: '#/components/schemas/buildName'
        noBuildDefinition:
          type: boolean
        triggeredVia:
          $ref: '#/components/schemas/triggeredVia'
        version:
          $ref: '#/components/schemas/buildVersion'
      required:
      - branchID
      - version
      type: object
    createExperienceInput:
      properties:
        cacheExempt:
          description: If true, the experience will not be cached.
          type: boolean
        containerTimeoutSeconds:
          format: int32
          type: integer
        customFields:
          description: Custom field key/value pairs to associate with the experience.
            Field names are case-insensitive. Each field can have multiple values.
          items:
            $ref: '#/components/schemas/customFieldDefinition'
          type: array
        description:
          type: string
        environmentVariables:
          items:
            $ref: '#/components/schemas/environmentVariable'
          type: array
        experienceTagIDs:
          items:
            $ref: '#/components/schemas/experienceTagID'
          type: array
        location:
          deprecated: true
          description: '[DEPRECATED] This field was previously used to define an experience''s
            location. Experiences can now be defined with multiple locations, using
            the locations field. This field will be removed in a later release.'
          minLength: 1
          type: string
        locations:
          items:
            minLength: 1
            type: string
          type: array
        name:
          $ref: '#/components/schemas/experienceName'
        profile:
          $ref: '#/components/schemas/profile'
        systemIDs:
          items:
            $ref: '#/components/schemas/systemID'
          type: array
      required:
      - name
      - description
      type: object
    createExperienceTagInput:
      properties:
        description:
          type: string
        name:
          $ref: '#/components/schemas/experienceTagName'
      required:
      - name
      - description
      type: object
    createJobForBatchInput:
      properties:
        description:
          description: Optional description for the job and experience.
          type: string
        experienceID:
          $ref: '#/components/schemas/experienceID'
        name:
          description: Name for the experience. Either name or experienceID must be
            provided, but not both.
          type: string
      type: object
    createJobLogInput:
      properties:
        checksum:
          $ref: '#/components/schemas/checksum'
        fileName:
          $ref: '#/components/schemas/fileName'
        fileSize:
          $ref: '#/components/schemas/fileSize'
        logType:
          $ref: '#/components/schemas/logType'
      required:
      - fileName
      - fileSize
      - checksum
      type: object
    createJobLogOutput:
      properties:
        logID:
          $ref: '#/components/schemas/logID'
        requiredHeaders:
          $ref: '#/components/schemas/requiredHeaders'
        uploadURL:
          description: Presigned S3 URL for uploading the log file via HTTP PUT.
          format: uri
          type: string
      required:
      - logID
      - uploadURL
      type: object
    createMetricsBuildInput:
      properties:
        imageUri:
          $ref: '#/components/schemas/metricsBuildImageUri'
        name:
          $ref: '#/components/schemas/metricsBuildName'
        version:
          $ref: '#/components/schemas/metricsBuildVersion'
      required:
      - name
      - version
      - imageUri
      type: object
    createProjectInput:
      properties:
        agentMarkdown:
          maxLength: 65536
          type: string
        description:
          type: string
        name:
          minLength: 1
          type: string
      required:
      - name
      - description
      type: object
    createSystemInput:
      properties:
        architecture:
          $ref: '#/components/schemas/architecture'
        build_gpus:
          type: integer
        build_memory_mib:
          type: integer
        build_shared_memory_mb:
          type: integer
        build_vcpus:
          type: integer
        description:
          type: string
        metrics_build_gpus:
          nullable: true
          type: integer
        metrics_build_memory_mib:
          nullable: true
          type: integer
        metrics_build_shared_memory_mb:
          nullable: true
          type: integer
        metrics_build_vcpus:
          nullable: true
          type: integer
        name:
          minLength: 1
          type: string
      required:
      - name
      - description
      - build_vcpus
      - build_memory_mib
      - build_gpus
      - build_shared_memory_mb
      type: object
    createTestSuiteInput:
      properties:
        allExperiences:
          type: boolean
        description:
          $ref: '#/components/schemas/testSuiteDescription'
        excludedExperienceIDs:
          items:
            $ref: '#/components/schemas/excludedExperienceID'
          type: array
        experiences:
          items:
            $ref: '#/components/schemas/experienceID'
          type: array
        filters:
          $ref: '#/components/schemas/experienceFilterInput'
        metricsBuildID:
          $ref: '#/components/schemas/metricsBuildID'
        metricsSetName:
          $ref: '#/components/schemas/metricsSetName'
        name:
          $ref: '#/components/schemas/testSuiteName'
        showOnSummary:
          type: boolean
        summaryReferenceDate:
          $ref: '#/components/schemas/timestamp'
        systemID:
          $ref: '#/components/schemas/systemID'
      required:
      - name
      - description
      - systemID
      - experiences
      type: object
    createWorkflowInput:
      properties:
        ciWorkflowLink:
          type: string
        description:
          type: string
        name:
          type: string
        workflowSuites:
          items:
            $ref: '#/components/schemas/workflowSuiteInput'
          type: array
      required:
      - name
      - description
      - workflowSuites
      type: object
    createWorkflowRunInput:
      description: |
        Input to create a workflow run. A run is configured via exactly one of
        two mutually-exclusive mechanisms:

        1. **Multi-system (preferred)**: set `builds` with one entry per
           system covered by the workflow's enabled suites. Each entry pins a
           build by `buildID`; the system is derived server-side from
           `builds.system_id`. Optional per-entry `poolLabels`, `parameters`,
           and `allowableFailurePercent` apply to that build's batch only.
        2. **Legacy single-system (deprecated)**: set the top-level `buildID`.
           The run-level `poolLabels`, `parameters`, and
           `allowableFailurePercent` (if any) apply to every enabled suite in
           the workflow. New integrations should use `builds` even when the
           workflow only covers one system.

        Mixing the two mechanisms is rejected with HTTP 400. Specifically:
          - `buildID` and `builds` cannot both be set.
          - When `builds` is set, the run-level `poolLabels`, `parameters`,
            and `allowableFailurePercent` must be omitted; supply those
            values per-entry on the `builds` items instead.

        Within `builds`, two entries resolving to the same system are
        rejected, and a build whose system is not covered by any enabled
        suite is rejected. A workflow with an enabled suite whose system has
        no matching entry in `builds` is also rejected (HTTP 422).

        `associatedAccount` and `triggeredVia` are run-level metadata that
        apply to every batch produced by the run and are valid in both
        mechanisms.
      properties:
        allowableFailurePercent:
          deprecated: true
          description: |
            **Deprecated**: run-level allowable failure percent for the legacy
            `buildID` mechanism; applied to every enabled suite. Must be
            omitted when using `builds`. With `builds`, set
            `allowableFailurePercent` per-entry on the builds items instead.
          nullable: true
          type: integer
        associatedAccount:
          $ref: '#/components/schemas/associatedAccount'
        buildID:
          allOf:
          - $ref: '#/components/schemas/buildID'
          deprecated: true
          description: |
            **Deprecated**: legacy single-system mechanism. Identifies the
            build for the one system covered by the workflow. Mutually
            exclusive with `builds`. New integrations should use `builds`
            instead, even for single-system workflows.
          nullable: true
        builds:
          description: |
            Multi-system mechanism (preferred). One entry per system covered
            by the workflow's enabled suites; the system for each entry is
            derived from the entry's `buildID`. Mutually exclusive with the
            run-level `buildID`, `poolLabels`, `parameters`, and
            `allowableFailurePercent`.
          items:
            $ref: '#/components/schemas/workflowRunBuildInput'
          nullable: true
          type: array
        parameters:
          allOf:
          - $ref: '#/components/schemas/batchParameters'
          deprecated: true
          description: |
            **Deprecated**: run-level parameters for the legacy `buildID`
            mechanism; applied to every enabled suite. Must be omitted when
            using `builds`. With `builds`, set `parameters` per-entry on the
            builds items instead.
          nullable: true
        poolLabels:
          allOf:
          - $ref: '#/components/schemas/poolLabels'
          deprecated: true
          description: |
            **Deprecated**: run-level pool labels for the legacy `buildID`
            mechanism; applied to every enabled suite. Must be omitted when
            using `builds`. With `builds`, set `poolLabels` per-entry on the
            builds items instead.
          nullable: true
        triggeredVia:
          $ref: '#/components/schemas/triggeredVia'
      type: object
    createWorkflowSuiteInput:
      properties:
        enabled:
          $ref: '#/components/schemas/enabled'
        testSuiteID:
          $ref: '#/components/schemas/testSuiteID'
      required:
      - testSuiteID
      - enabled
      type: object
    createWorkflowSuiteOutput:
      properties:
        enabled:
          $ref: '#/components/schemas/enabled'
        testSuiteID:
          $ref: '#/components/schemas/testSuiteID'
        workflowID:
          $ref: '#/components/schemas/workflowID'
      required:
      - workflowID
      - testSuiteID
      - enabled
      type: object
    createWorkflowSuitesInput:
      properties:
        workflowSuites:
          items:
            $ref: '#/components/schemas/createWorkflowSuiteInput'
          type: array
      required:
      - workflowSuites
      type: object
    createWorkflowSuitesOutput:
      properties:
        workflowSuites:
          items:
            $ref: '#/components/schemas/createWorkflowSuiteOutput'
          type: array
      required:
      - workflowSuites
      type: object
    customFieldDefinition:
      properties:
        name:
          type: string
        type:
          $ref: '#/components/schemas/customFieldValueType'
        values:
          description: Array of field values. For 'text' type, use plain strings.
            For 'number' type, use string representations of numbers (e.g., "32").
            For 'timestamp' type, use ISO 8601 format strings. For 'json' type, use
            JSON string representations of objects or arrays.
          items:
            type: string
          type: array
      required:
      - name
      - values
      - type
      type: object
    customFieldValueType:
      enum:
      - text
      - number
      - timestamp
      - json
      type: string
    customMetric:
      properties:
        name:
          example: Planning time
          type: string
        unit:
          example: Seconds
          type: string
        value:
          example: 0.01253
          format: double
          type: number
      required:
      - name
      - value
      type: object
    debugExperienceInput:
      properties:
        batchID:
          $ref: '#/components/schemas/batchID'
        buildID:
          $ref: '#/components/schemas/buildID'
        containers:
          items:
            $ref: '#/components/schemas/containerName'
          type: array
        poolLabels:
          $ref: '#/components/schemas/poolLabels'
        testSuiteID:
          $ref: '#/components/schemas/testSuiteID'
      type: object
    debugExperienceOutput:
      properties:
        batchID:
          $ref: '#/components/schemas/batchID'
        clusterCAData:
          type: string
        clusterEndpoint:
          type: string
        clusterToken:
          type: string
        namespace:
          type: string
      type: object
    deleteWorkflowSuitesInput:
      properties:
        testSuiteIDs:
          items:
            $ref: '#/components/schemas/testSuiteID'
          type: array
      required:
      - testSuiteIDs
      type: object
    enabled:
      type: boolean
    entityRun:
      description: |
        One run an entity actually reached. metricsStatus is absent when the run
        finished before per-run results were recorded — an unknown result, not a
        passing one.
      properties:
        batchStatus:
          $ref: '#/components/schemas/batchStatus'
        jobStatus:
          $ref: '#/components/schemas/jobStatus'
        lastUpdatedTimestamp:
          $ref: '#/components/schemas/timestamp'
        metricsStatus:
          $ref: '#/components/schemas/metricStatus'
        runCounter:
          $ref: '#/components/schemas/runCounter'
      required:
      - runCounter
      - lastUpdatedTimestamp
      type: object
    environmentVariable:
      properties:
        name:
          type: string
        value:
          type: string
      required:
      - name
      - value
      type: object
    event:
      properties:
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        description:
          type: string
        eventID:
          $ref: '#/components/schemas/eventID'
        metricsIDs:
          items:
            $ref: '#/components/schemas/metricID'
          type: array
        name:
          type: string
        status:
          $ref: '#/components/schemas/metricStatus'
        tags:
          $ref: '#/components/schemas/eventTags'
        timestamp:
          $ref: '#/components/schemas/timestamp'
        timestampType:
          $ref: '#/components/schemas/eventTimestampType'
      required:
      - eventID
      - name
      - description
      - creationTimestamp
      - timestampType
      - timestamp
      - tags
      - status
      - metricsIDs
      type: object
    eventID:
      format: uuid
      type: string
    eventTags:
      example:
      - tag1
      - tag2
      items:
        type: string
      type: array
    eventTimestampType:
      enum:
      - ABSOLUTE
      - RELATIVE
      type: string
    excludedExperienceID:
      format: uuid
      type: string
    executionError:
      properties:
        errorCode:
          description: Standardized error code (e.g., UNKNOWN_ERROR, NONZERO_EXIT_CODE)
          type: string
        errorText:
          description: Error text
          type: string
        exitCode:
          description: Container exit code when applicable
          nullable: true
          type: integer
        metadata:
          description: Error metadata
          type: object
        parentID:
          description: ID of the parent object (e.g., job ID, batch ID)
          format: uuid
          type: string
        parentType:
          description: Type of the parent object (e.g., JOB, BATCH)
          type: string
        runCounter:
          description: Run counter of the error
          type: integer
      required:
      - errorCode
      type: object
    executionStep:
      type: string
    experience:
      properties:
        archived:
          type: boolean
        cacheExempt:
          type: boolean
        containerTimeoutSeconds:
          format: int32
          type: integer
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        customFields:
          description: Custom field key/value pairs associated with the experience.
          items:
            $ref: '#/components/schemas/customFieldDefinition'
          type: array
        description:
          type: string
        environmentVariables:
          items:
            $ref: '#/components/schemas/environmentVariable'
          type: array
        experienceID:
          $ref: '#/components/schemas/experienceID'
        location:
          deprecated: true
          description: '[DEPRECATED] This field was previously used to report an experience''s
            location. Experiences can now be defined with multiple locations, this
            field will display the first location; this field will be removed in a
            future version.'
          type: string
        locations:
          items:
            type: string
          type: array
        name:
          $ref: '#/components/schemas/experienceName'
        orgID:
          $ref: '#/components/schemas/orgID'
        profile:
          $ref: '#/components/schemas/profile'
        projectID:
          $ref: '#/components/schemas/projectID'
        updateTimestamp:
          $ref: '#/components/schemas/timestamp'
        updateUserID:
          $ref: '#/components/schemas/userID'
        userID:
          $ref: '#/components/schemas/userID'
      required:
      - archived
      - experienceID
      - projectID
      - name
      - description
      - location
      - locations
      - containerTimeoutSeconds
      - profile
      - environmentVariables
      - creationTimestamp
      - updateTimestamp
      - updateUserID
      - userID
      - orgID
      - cacheExempt
      - customFields
      type: object
    experienceFilterInput:
      properties:
        name:
          description: Filter experiences by name
          type: string
        search:
          description: A search query. Supports searching by tag_id
          example: tag_id IN ("71b96a67-9990-426b-993e-0f3d9c6bbe48")
          type: string
        text:
          description: Filter experiences by a text string on name and description
          type: string
      type: object
    experienceID:
      format: uuid
      type: string
    experienceInputFile:
      properties:
        fileName:
          $ref: '#/components/schemas/fileName'
        filePath:
          description: The path of the input file relative to the cached input root.
          type: string
        fileSize:
          $ref: '#/components/schemas/fileSize'
        lastCachedTimestamp:
          $ref: '#/components/schemas/timestamp'
        sourceLocation:
          description: The experience location URI this file was cached from, when
            known; empty when unknown.
          type: string
      required:
      - fileName
      - filePath
      - fileSize
      - sourceLocation
      - lastCachedTimestamp
      type: object
    experienceLocation:
      properties:
        location:
          format: uri
          type: string
        projectId:
          format: uuid
          type: string
      type: object
    experienceLocationContents:
      properties:
        files:
          description: Per-file details of the objects currently at the location.
          items:
            $ref: '#/components/schemas/experienceLocationFile'
          type: array
        isCloud:
          type: boolean
        objectCount:
          type: integer
        objects:
          items:
            type: string
          type: array
        totalSizeBytes:
          format: int64
          type: integer
      type: object
    experienceLocationFile:
      properties:
        lastModified:
          format: date-time
          type: string
        name:
          description: The object's key relative to the location prefix.
          type: string
        sizeBytes:
          format: int64
          type: integer
      type: object
    experienceName:
      minLength: 1
      type: string
    experienceSyncConfig:
      properties:
        experiences:
          items:
            $ref: '#/components/schemas/experienceSyncExperience'
          type: array
        managedExperienceTags:
          items:
            $ref: '#/components/schemas/experienceTagName'
          type: array
        managedTestSuites:
          items:
            $ref: '#/components/schemas/experienceSyncTestSuite'
          type: array
      required:
      - experiences
      - managedTestSuites
      - managedExperienceTags
      type: object
    experienceSyncExperience:
      properties:
        archived:
          type: boolean
        cacheExempt:
          type: boolean
        containerTimeoutSeconds:
          format: int32
          type: integer
        customFields:
          items:
            $ref: '#/components/schemas/customFieldDefinition'
          type: array
        description:
          type: string
        environmentVariables:
          items:
            $ref: '#/components/schemas/environmentVariable'
          type: array
        experienceID:
          $ref: '#/components/schemas/experienceID'
        locations:
          items:
            type: string
          type: array
        name:
          $ref: '#/components/schemas/experienceName'
        profile:
          $ref: '#/components/schemas/profile'
        systems:
          items:
            type: string
          type: array
        tags:
          items:
            $ref: '#/components/schemas/experienceTagName'
          type: array
      required:
      - name
      - description
      - locations
      - tags
      - systems
      - archived
      type: object
    experienceSyncTestSuite:
      properties:
        experiences:
          items:
            $ref: '#/components/schemas/experienceName'
          type: array
        name:
          $ref: '#/components/schemas/testSuiteName'
      required:
      - name
      - experiences
      type: object
    experienceTag:
      properties:
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        description:
          type: string
        experienceTagID:
          $ref: '#/components/schemas/experienceTagID'
        name:
          $ref: '#/components/schemas/experienceTagName'
        orgID:
          $ref: '#/components/schemas/orgID'
        projectID:
          $ref: '#/components/schemas/projectID'
        userID:
          $ref: '#/components/schemas/userID'
      required:
      - experienceTagID
      - projectID
      - name
      - description
      - creationTimestamp
      - userID
      - orgID
      type: object
    experienceTagID:
      format: uuid
      type: string
    experienceTagName:
      type: string
    fileName:
      type: string
    fileSize:
      format: int64
      type: integer
    firstBuildMetric:
      description: The first batch metric in the sequence, and some info about how
        it has changed
      nullable: true
      properties:
        delta:
          format: double
          type: number
        time:
          $ref: '#/components/schemas/timestamp'
        value:
          example: -120.234
          format: double
          type: number
      required:
      - time
      - value
      - delta
      type: object
    friendlyName:
      type: string
    getContainerStatusOutput:
      properties:
        containerStatuses:
          items:
            $ref: '#/components/schemas/containerStatusLine'
          type: array
      required:
      - containerStatuses
      type: object
    getQuotaOutput:
      properties:
        availableTokens:
          format: int32
          type: integer
        maxTokens:
          format: int32
          type: integer
        orgID:
          $ref: '#/components/schemas/orgID'
        secondsUntilRefresh:
          format: int32
          type: integer
      type: object
    getWorkflowSuiteOutput:
      properties:
        enabled:
          $ref: '#/components/schemas/enabled'
        testSuiteID:
          $ref: '#/components/schemas/testSuiteID'
      required:
      - testSuiteID
      - enabled
      type: object
    job:
      properties:
        batchID:
          $ref: '#/components/schemas/batchID'
        branchID:
          $ref: '#/components/schemas/branchID'
        buildID:
          $ref: '#/components/schemas/buildID'
        conflatedStatus:
          $ref: '#/components/schemas/conflatedJobStatus'
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        description:
          type: string
        executionError:
          $ref: '#/components/schemas/executionError'
        executionErrors:
          items:
            $ref: '#/components/schemas/executionError'
          type: array
        experienceEnvironmentVariables:
          items:
            $ref: '#/components/schemas/environmentVariable'
          type: array
        experienceID:
          $ref: '#/components/schemas/experienceID'
        experienceName:
          $ref: '#/components/schemas/experienceName'
        experienceProfile:
          type: string
        hasLogAnalysis:
          type: boolean
        jobID:
          $ref: '#/components/schemas/jobID'
        jobMetricsStatus:
          $ref: '#/components/schemas/metricStatus'
        jobStatus:
          $ref: '#/components/schemas/jobStatus'
        lastRunTimestamp:
          $ref: '#/components/schemas/timestamp'
        lastUpdatedTimestamp:
          $ref: '#/components/schemas/timestamp'
        orgID:
          $ref: '#/components/schemas/orgID'
        outputLocation:
          type: string
        parameters:
          $ref: '#/components/schemas/batchParameters'
        projectID:
          $ref: '#/components/schemas/projectID'
        runCounter:
          $ref: '#/components/schemas/runCounter'
        statusHistory:
          $ref: '#/components/schemas/jobStatusHistory'
        systemID:
          $ref: '#/components/schemas/systemID'
        userID:
          $ref: '#/components/schemas/userID'
        workerID:
          type: string
      type: object
    jobExperienceInputFile:
      properties:
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        fileName:
          $ref: '#/components/schemas/fileName'
        filePath:
          description: The path of the input file relative to the staged input directory
            root.
          type: string
        fileSize:
          $ref: '#/components/schemas/fileSize'
        runCounter:
          $ref: '#/components/schemas/runCounter'
        sourceLocation:
          description: The experience location URI this file was staged from, when
            known; empty when unknown.
          type: string
      required:
      - fileName
      - filePath
      - fileSize
      - sourceLocation
      - runCounter
      - creationTimestamp
      type: object
    jobID:
      format: uuid
      type: string
    jobLog:
      allOf:
      - $ref: '#/components/schemas/log'
      - properties:
          jobID:
            $ref: '#/components/schemas/jobID'
        type: object
    jobMetric:
      allOf:
      - $ref: '#/components/schemas/metric'
      - properties:
          batchID:
            $ref: '#/components/schemas/batchID'
          jobID:
            $ref: '#/components/schemas/jobID'
        type: object
    jobMetricsData:
      allOf:
      - $ref: '#/components/schemas/metricsData'
      - properties:
          jobID:
            $ref: '#/components/schemas/jobID'
        type: object
    jobMetricsStatusCounts:
      properties:
        failBlock:
          type: integer
        failWarn:
          type: integer
        noStatusReported:
          type: integer
        notApplicable:
          type: integer
        passed:
          type: integer
        raw:
          type: integer
      required:
      - passed
      - raw
      - noStatusReported
      - notApplicable
      - failWarn
      - failBlock
      type: object
    jobStatus:
      enum:
      - SUBMITTED
      - EXPERIENCE_RUNNING
      - METRICS_QUEUED
      - METRICS_RUNNING
      - ERROR
      - SUCCEEDED
      - CANCELLED
      type: string
    jobStatusHistory:
      items:
        $ref: '#/components/schemas/jobStatusHistoryType'
      type: array
    jobStatusHistoryType:
      properties:
        status:
          $ref: '#/components/schemas/jobStatus'
        updatedAt:
          $ref: '#/components/schemas/timestamp'
      type: object
    jobUsageOutput:
      description: |
        Rerun-sourced runtime usage for a job, one row per run
        (run_counter). The BFF augments each row with the meters it stores
        itself (data-lake storage, metrics-compute scan bytes, agentic
        tokens) before exposing them through GraphQL.
      properties:
        batchID:
          $ref: '#/components/schemas/batchID'
        jobID:
          $ref: '#/components/schemas/jobID'
        projectID:
          $ref: '#/components/schemas/projectID'
        runs:
          items:
            $ref: '#/components/schemas/jobUsageRunRow'
          type: array
      required:
      - jobID
      - batchID
      - projectID
      - runs
      type: object
    jobUsageRunRow:
      description: |
        Rerun-sourced runtime usage for one run (run_counter) of a job.
        All quantities are integer base units. The *Seconds compute meters
        are the resource (vcpus/gpus/memory_mib) multiplied by the task's
        total wall-clock seconds, summed over the run's experience tasks.
      properties:
        cpuSeconds:
          format: int64
          type: integer
        gpuSeconds:
          format: int64
          type: integer
        memoryMibSeconds:
          format: int64
          type: integer
        orchestrationSeconds:
          format: int64
          type: integer
        runCounter:
          $ref: '#/components/schemas/runCounter'
        storageBytes:
          description: Rerun-side storage for the run.
          format: int64
          type: integer
      required:
      - runCounter
      - orchestrationSeconds
      - cpuSeconds
      - gpuSeconds
      - memoryMibSeconds
      - storageBytes
      type: object
    keyMetric:
      nullable: true
      properties:
        firstBuildMetric:
          $ref: '#/components/schemas/firstBuildMetric'
        latestValue:
          example: 150
          format: double
          type: number
        name:
          example: Meal Planning Time
          type: string
        performance:
          items:
            $ref: '#/components/schemas/keyMetricPerformancePoint'
          type: array
        target:
          $ref: '#/components/schemas/keyMetricTarget'
        unit:
          example: Seconds
          nullable: true
          type: string
      required:
      - name
      - target
      - firstBuildMetric
      - latestValue
      - unit
      - performance
      type: object
    keyMetricPerformancePoint:
      properties:
        time:
          $ref: '#/components/schemas/timestamp'
        value:
          format: double
          type: number
      required:
      - time
      - value
      type: object
    keyMetricTarget:
      description: The optional desired target for this metric
      nullable: true
      properties:
        operator:
          example: <
          type: string
        value:
          example: 150.1
          format: double
          type: number
      required:
      - operator
      - value
      type: object
    labelledBuild:
      properties:
        buildID:
          $ref: '#/components/schemas/buildID'
        buildType:
          type: string
      required:
      - buildID
      - buildType
      type: object
    labelledBuilds:
      items:
        $ref: '#/components/schemas/labelledBuild'
      nullable: true
      type: array
    lightBatchInput:
      properties:
        batchName:
          $ref: '#/components/schemas/name'
        branchID:
          $ref: '#/components/schemas/branchID'
        metricsSetName:
          $ref: '#/components/schemas/metricsSetName'
        priority:
          maximum: 32767
          minimum: 0
          nullable: true
          type: integer
        systemID:
          $ref: '#/components/schemas/systemID'
        testSuiteID:
          $ref: '#/components/schemas/testSuiteID'
        testSuiteRevision:
          $ref: '#/components/schemas/testSuiteRevision'
        version:
          description: |
            Optional. When provided, the latest existing build matching (branchID, systemID, version) is reused; a new build is created only if none is found. When omitted, a new build is always created with version "n/a".
          type: string
      required:
      - branchID
      type: object
    lightJobStatus:
      enum:
      - SUCCEEDED
      - ERROR
      type: string
    listAgentMarkdownHistoryOutput:
      properties:
        entries:
          items:
            $ref: '#/components/schemas/agentMarkdownHistoryEntry'
          type: array
        hasMore:
          type: boolean
        nextPageToken:
          type: string
      required:
      - entries
      - nextPageToken
      - hasMore
      type: object
    listAgentResultBranchesOutput:
      description: |
        The distinct branches an agent has run, ordered by name. Not
        paginated — an agent runs a bounded number of branches, so the
        full set is returned for client-side search.
      properties:
        branches:
          items:
            $ref: '#/components/schemas/agentResultBranch'
          type: array
      required:
      - branches
      type: object
    listAgentResultsOutput:
      description: |
        Paginated list of recent batch+test activity for a single HiL Agent,
        sorted by `updated_at DESC, jobID DESC` so the cursor is stable
        across heartbeat updates. Surfaces every test the agent has run
        for the caller's org via the structural jobs_status_history.agent_id
        join.
      properties:
        items:
          items:
            $ref: '#/components/schemas/agentRecentActivity'
          type: array
        nextPageToken:
          type: string
        total:
          description: Total number of results for the agent across all pages, useful
            for the Results tab count in the UI.
          type: integer
      required:
      - items
      - total
      type: object
    listAgentUtilizationOutput:
      description: |
        Utilization series for every non-removed agent in the org, ordered
        by agentID ASC (the listAgents order). Not paginated — an org has
        a bounded number of HiL agents. windowStart/windowEnd echo the
        resolved window after server-side defaulting. Agents with no
        activity in the window appear with explicit all-zero buckets.
        totalTestsRun counts job runs started in the window on the listed
        (non-archived) agents; topExperiences ranks experiences by total
        running seconds on any listed agent. Runs on archived agents are
        excluded from both, matching the agents series. avgQueueSeconds/medianQueueSeconds
        aggregate the queue wait (submission to execution start) of runs
        started in the window, fleet-wide; both are omitted when no
        started run has a measurable wait.
      properties:
        agents:
          items:
            $ref: '#/components/schemas/agentUtilizationSeries'
          type: array
        avgQueueSeconds:
          format: double
          type: number
        interval:
          enum:
          - hour
          - day
          type: string
        medianQueueSeconds:
          format: double
          type: number
        topExperiences:
          items:
            $ref: '#/components/schemas/agentUtilizationTopExperience'
          type: array
        totalTestsRun:
          type: integer
        windowEnd:
          format: date-time
          type: string
        windowStart:
          format: date-time
          type: string
      required:
      - interval
      - windowStart
      - windowEnd
      - totalTestsRun
      - agents
      - topExperiences
      type: object
    listAgentsOutput:
      properties:
        agents:
          items:
            $ref: '#/components/schemas/agent'
          type: array
        latestKnownVersion:
          description: |
            The latest released agent version the server is aware of. Empty
            string when the server cannot currently determine it; clients
            should treat empty as "no canonical latest" and suppress the
            per-agent out-of-date indicator entirely.
          type: string
      required:
      - agents
      - latestKnownVersion
      type: object
    listAllJobsOutput:
      properties:
        jobs:
          items:
            $ref: '#/components/schemas/job'
          type: array
        nextPageToken:
          type: string
        total:
          type: integer
      type: object
    listAssetBuildsOutput:
      properties:
        builds:
          items:
            $ref: '#/components/schemas/assetBuildReference'
          type: array
        nextPageToken:
          type: string
        total:
          type: integer
      required:
      - builds
      - nextPageToken
      - total
      type: object
    listAssetRevisionsOutput:
      properties:
        assets:
          items:
            $ref: '#/components/schemas/asset'
          type: array
        nextPageToken:
          type: string
        total:
          type: integer
      required:
      - assets
      - nextPageToken
      - total
      type: object
    listAssetsOutput:
      properties:
        assets:
          items:
            $ref: '#/components/schemas/asset'
          type: array
        nextPageToken:
          type: string
        total:
          type: integer
      required:
      - assets
      - nextPageToken
      - total
      type: object
    listBatchErrorsOutput:
      properties:
        errors:
          items:
            $ref: '#/components/schemas/executionError'
          type: array
        jobExecutionErrors:
          items:
            $ref: '#/components/schemas/executionError'
          type: array
      type: object
    listBatchLogStreamsOutput:
      properties:
        logStreams:
          items:
            $ref: '#/components/schemas/logStream'
          type: array
      required:
      - logStreams
      type: object
    listBatchLogsOutput:
      properties:
        logs:
          items:
            $ref: '#/components/schemas/batchLog'
          type: array
        nextPageToken:
          type: string
      type: object
    listBatchMetricsDataForBatchMetricIDsOutput:
      properties:
        batchMetricsDataAndIDs:
          items:
            $ref: '#/components/schemas/batchMetricsDataAndIDs'
          type: array
        nextPageToken:
          type: string
      type: object
    listBatchMetricsDataOutput:
      properties:
        batchMetricsData:
          items:
            $ref: '#/components/schemas/batchMetricsData'
          type: array
        nextPageToken:
          type: string
      type: object
    listBatchMetricsOutput:
      properties:
        batchMetrics:
          items:
            $ref: '#/components/schemas/batchMetric'
          type: array
        nextPageToken:
          type: string
      type: object
    listBatchRunsOutput:
      properties:
        runs:
          items:
            $ref: '#/components/schemas/entityRun'
          type: array
      type: object
    listBatchesOutput:
      properties:
        batches:
          items:
            $ref: '#/components/schemas/batch'
          type: array
        nextPageToken:
          type: string
        total:
          type: integer
      type: object
    listBlueprintsOutput:
      properties:
        blueprints:
          items:
            $ref: '#/components/schemas/blueprint'
          type: array
        nextPageToken:
          type: string
      type: object
    listBranchesOutput:
      properties:
        branches:
          items:
            $ref: '#/components/schemas/branch'
          type: array
        nextPageToken:
          type: string
      type: object
    listBuildAssetsOutput:
      items:
        $ref: '#/components/schemas/buildAssetLink'
      type: array
    listBuildsOutput:
      properties:
        builds:
          items:
            $ref: '#/components/schemas/build'
          type: array
        nextPageToken:
          type: string
        total:
          type: integer
      required:
      - builds
      - nextPageToken
      - total
      type: object
    listExperienceCustomFieldsOutput:
      properties:
        customFields:
          items:
            $ref: '#/components/schemas/customFieldDefinition'
          type: array
      required:
      - customFields
      type: object
    listExperienceInputFilesOutput:
      properties:
        inputFiles:
          items:
            $ref: '#/components/schemas/experienceInputFile'
          type: array
        nextPageToken:
          type: string
        total:
          type: integer
      required:
      - inputFiles
      - nextPageToken
      - total
      type: object
    listExperienceTagsOutput:
      properties:
        experienceTags:
          items:
            $ref: '#/components/schemas/experienceTag'
          type: array
        nextPageToken:
          type: string
      type: object
    listExperiencesOutput:
      properties:
        experiences:
          items:
            $ref: '#/components/schemas/experience'
          type: array
        nextPageToken:
          type: string
        total:
          type: integer
      type: object
    listJobEventTagsOutput:
      properties:
        eventTags:
          items:
            type: string
          type: array
        nextPageToken:
          type: string
      type: object
    listJobEventsOutput:
      properties:
        events:
          items:
            $ref: '#/components/schemas/event'
          type: array
        nextPageToken:
          type: string
      type: object
    listJobExperienceInputFilesOutput:
      properties:
        inputFiles:
          items:
            $ref: '#/components/schemas/jobExperienceInputFile'
          type: array
        nextPageToken:
          type: string
        total:
          type: integer
      required:
      - inputFiles
      - nextPageToken
      - total
      type: object
    listJobLogsOutput:
      properties:
        logs:
          items:
            $ref: '#/components/schemas/jobLog'
          type: array
        nextPageToken:
          type: string
        total:
          type: integer
      type: object
    listJobMetricsDataOutput:
      properties:
        metricsData:
          items:
            $ref: '#/components/schemas/jobMetricsData'
          type: array
        nextPageToken:
          type: string
      type: object
    listJobMetricsOutput:
      properties:
        metrics:
          items:
            $ref: '#/components/schemas/jobMetric'
          type: array
        nextPageToken:
          type: string
      type: object
    listJobRunsOutput:
      properties:
        runs:
          items:
            $ref: '#/components/schemas/entityRun'
          type: array
      type: object
    listJobsOutput:
      properties:
        jobs:
          items:
            $ref: '#/components/schemas/job'
          type: array
        nextPageToken:
          type: string
        total:
          type: integer
      type: object
    listMetricsBuildOutput:
      properties:
        metricsBuilds:
          items:
            $ref: '#/components/schemas/metricsBuild'
          type: array
        nextPageToken:
          type: string
        total:
          type: integer
      required:
      - metricsBuilds
      - nextPageToken
      - total
      type: object
    listMetricsDataAndMetricIDOutput:
      properties:
        metricsDataAndIDs:
          items:
            $ref: '#/components/schemas/metricsDataAndMetricID'
          type: array
        nextPageToken:
          type: string
      type: object
    listParameterSweepsOutput:
      properties:
        nextPageToken:
          type: string
        sweeps:
          items:
            $ref: '#/components/schemas/parameterSweep'
          type: array
      type: object
    listPoolLabelQueueOutput:
      properties:
        items:
          items:
            $ref: '#/components/schemas/poolLabelQueueItem'
          type: array
      required:
      - items
      type: object
    listPoolLabelUtilizationOutput:
      description: |
        Per-pool-label utilization for the caller's org, ordered by pool label
        ASC. Pools group non-removed agents by their pool_labels' colon-prefix
        (resim*-reserved labels excluded). windowStart/windowEnd echo the
        resolved window after server-side defaulting. Not paginated. An agent
        in multiple pools contributes to each pool's series and totals, so the
        org total is not the sum of pool totals.
      properties:
        interval:
          enum:
          - hour
          - day
          type: string
        poolLabels:
          items:
            $ref: '#/components/schemas/poolUtilizationSeries'
          type: array
        windowEnd:
          format: date-time
          type: string
        windowStart:
          format: date-time
          type: string
      required:
      - interval
      - windowStart
      - windowEnd
      - poolLabels
      type: object
    listPoolLabelsOutput:
      properties:
        nextPageToken:
          type: string
        poolLabels:
          items:
            $ref: '#/components/schemas/poolLabel'
          type: array
      type: object
    listProjectsOutput:
      properties:
        nextPageToken:
          type: string
        projects:
          items:
            $ref: '#/components/schemas/project'
          type: array
      type: object
    listReportLogsOutput:
      properties:
        logs:
          items:
            $ref: '#/components/schemas/reportLog'
          type: array
        nextPageToken:
          type: string
      type: object
    listReportMetricsDataForReportMetricIDsOutput:
      properties:
        nextPageToken:
          type: string
        reportMetricsDataAndIDs:
          items:
            $ref: '#/components/schemas/reportMetricsDataAndIDs'
          type: array
      type: object
    listReportMetricsDataOutput:
      properties:
        nextPageToken:
          type: string
        reportMetricsData:
          items:
            $ref: '#/components/schemas/metricsData'
          type: array
      type: object
    listReportMetricsOutput:
      properties:
        nextPageToken:
          type: string
        reportMetrics:
          items:
            $ref: '#/components/schemas/metric'
          type: array
      type: object
    listReportsOutput:
      properties:
        nextPageToken:
          type: string
        reports:
          items:
            $ref: '#/components/schemas/report'
          type: array
        total:
          type: integer
      type: object
    listSystemsOutput:
      properties:
        nextPageToken:
          type: string
        systems:
          items:
            $ref: '#/components/schemas/system'
          type: array
      type: object
    listTagsForBatchMetricsOutput:
      properties:
        nextPageToken:
          type: string
        tags:
          items:
            $ref: '#/components/schemas/metricTag'
          type: array
      type: object
    listTagsForJobMetricsOutput:
      properties:
        nextPageToken:
          type: string
        tags:
          items:
            $ref: '#/components/schemas/metricTag'
          type: array
      type: object
    listTagsForReportMetricsOutput:
      properties:
        nextPageToken:
          type: string
        tags:
          items:
            $ref: '#/components/schemas/metricTag'
          type: array
      type: object
    listTestSuiteOutput:
      properties:
        nextPageToken:
          type: string
        testSuites:
          items:
            $ref: '#/components/schemas/testSuite'
          type: array
        total:
          type: integer
      required:
      - testSuites
      - nextPageToken
      - total
      type: object
    listTestSuiteRevisionsOutput:
      properties:
        nextPageToken:
          type: string
        testSuites:
          items:
            $ref: '#/components/schemas/testSuite'
          type: array
      type: object
    listUsersOutput:
      example:
      - joe-smith
      - foobar123
      - bobs-github-username
      items:
        type: string
      type: array
    listWorkflowRunsOutput:
      properties:
        nextPageToken:
          type: string
        total:
          type: integer
        workflowRuns:
          items:
            $ref: '#/components/schemas/workflowRun'
          type: array
      required:
      - workflowRuns
      - nextPageToken
      - total
      type: object
    listWorkflowSuitesOutput:
      properties:
        workflowSuites:
          items:
            $ref: '#/components/schemas/workflowSuiteOutput'
          type: array
      required:
      - workflowSuites
      type: object
    listWorkflowsOutput:
      properties:
        nextPageToken:
          type: string
        total:
          type: integer
        workflows:
          items:
            $ref: '#/components/schemas/workflow'
          type: array
      required:
      - workflows
      - nextPageToken
      - total
      type: object
    log:
      properties:
        checksum:
          $ref: '#/components/schemas/checksum'
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        downloadUrl:
          description: Presigned URL with Content-Disposition attachment header for
            browser-native file downloads. Not set for external (BYO-bucket) logs.
          format: uri
          type: string
        executionStep:
          $ref: '#/components/schemas/executionStep'
        external:
          description: True if the log is stored in a customer-owned (BYO) bucket.
            For external logs, logOutputLocation will echo the raw location (no presigned
            URL).
          type: boolean
        fileName:
          $ref: '#/components/schemas/fileName'
        filePath:
          description: The directory path relative to the output root (empty for root-level
            files)
          type: string
        fileSize:
          $ref: '#/components/schemas/fileSize'
        fullPath:
          description: The fully qualified path (filePath/fileName) of the log file
          readOnly: true
          type: string
        location:
          $ref: '#/components/schemas/logLocation'
        logID:
          $ref: '#/components/schemas/logID'
        logOutputLocation:
          format: uri
          type: string
        logType:
          $ref: '#/components/schemas/logType'
        orgID:
          $ref: '#/components/schemas/orgID'
        userID:
          $ref: '#/components/schemas/userID'
      type: object
    logID:
      format: uuid
      type: string
    logLocation:
      format: uri
      type: string
    logStream:
      properties:
        batchID:
          $ref: '#/components/schemas/batchID'
        jobID:
          $ref: '#/components/schemas/jobID'
        logName:
          $ref: '#/components/schemas/fileName'
      required:
      - batchID
      - logName
      type: object
    logType:
      enum:
      - OTHER_LOG
      - METRICS_OUTPUT_LOG
      - CONTAINER_LOG
      - EXECUTION_LOG
      - MCAP_LOG
      - MP4_LOG
      - ARCHIVE_LOG
      - FOXGLOVE_MCAP_LOG
      - RERUN_IO_LOG
      - ERROR_LOG
      - SERVICE_LOG
      - EMISSIONS_LOG
      - SYSTEM_LOG
      type: string
    metric:
      properties:
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        dataIDs:
          items:
            $ref: '#/components/schemas/metricsDataID'
          type: array
        eventMetric:
          description: true if this metric is for an event
          type: boolean
        fileLocation:
          $ref: '#/components/schemas/metricLocation'
        metricID:
          $ref: '#/components/schemas/metricID'
        metricURL:
          $ref: '#/components/schemas/metricURL'
        name:
          $ref: '#/components/schemas/metricName'
        orgID:
          $ref: '#/components/schemas/orgID'
        projectID:
          $ref: '#/components/schemas/projectID'
        status:
          $ref: '#/components/schemas/metricStatus'
        type:
          $ref: '#/components/schemas/metricType'
        unit:
          nullable: true
          type: string
        userID:
          $ref: '#/components/schemas/userID'
        value:
          $ref: '#/components/schemas/metricValue'
      type: object
    metricID:
      format: uuid
      type: string
    metricLocation:
      format: uri
      type: string
    metricName:
      type: string
    metricStatus:
      enum:
      - PASSED
      - FAIL_WARN
      - RAW
      - NOT_APPLICABLE
      - FAIL_BLOCK
      - NO_STATUS_REPORTED
      type: string
    metricTag:
      properties:
        creationTimestamp:
          format: date-time
          readOnly: true
          type: string
        metricID:
          format: uuid
          readOnly: true
          type: string
        name:
          type: string
        tagID:
          $ref: '#/components/schemas/tagID'
        value:
          type: string
      required:
      - tagID
      - name
      - value
      - creationTimestamp
      type: object
    metricType:
      enum:
      - SCALAR
      - COMPOSITE
      type: string
    metricURL:
      format: uri
      type: string
    metricValue:
      format: double
      nullable: true
      type: number
    metricsBuild:
      properties:
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        imageUri:
          $ref: '#/components/schemas/metricsBuildImageUri'
        metricsBuildID:
          $ref: '#/components/schemas/metricsBuildID'
        name:
          $ref: '#/components/schemas/metricsBuildName'
        orgID:
          $ref: '#/components/schemas/orgID'
        projectID:
          $ref: '#/components/schemas/projectID'
        userID:
          $ref: '#/components/schemas/userID'
        version:
          $ref: '#/components/schemas/metricsBuildVersion'
      required:
      - metricsBuildID
      - projectID
      - name
      - version
      - imageUri
      - creationTimestamp
      - userID
      - orgID
      type: object
    metricsBuildID:
      format: uuid
      type: string
    metricsBuildImageUri:
      type: string
    metricsBuildName:
      type: string
    metricsBuildVersion:
      type: string
    metricsData:
      properties:
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        dataID:
          $ref: '#/components/schemas/metricsDataID'
        fileLocation:
          $ref: '#/components/schemas/metricsDataLocation'
        filename:
          nullable: true
          type: string
        metricsDataType:
          $ref: '#/components/schemas/metricsDataType'
        metricsDataURL:
          $ref: '#/components/schemas/metricsDataURL'
        name:
          type: string
        orgID:
          $ref: '#/components/schemas/orgID'
        userID:
          $ref: '#/components/schemas/userID'
      type: object
    metricsDataAndMetricID:
      properties:
        metricID:
          $ref: '#/components/schemas/metricID'
        metricsData:
          $ref: '#/components/schemas/jobMetricsData'
      type: object
    metricsDataID:
      format: uuid
      type: string
    metricsDataLocation:
      format: uri
      type: string
    metricsDataType:
      enum:
      - STANDARD
      - EXTERNAL_FILE
      - VIDEO
      type: string
    metricsDataURL:
      format: uri
      type: string
    metricsSetName:
      nullable: true
      type: string
    mutateSystemsToExperienceInput:
      allOf:
      - $ref: '#/components/schemas/selectExperiencesInput'
      - required:
        - systemIDs
      - properties:
          systemIDs:
            items:
              $ref: '#/components/schemas/systemID'
            type: array
        type: object
    name:
      type: string
    orgID:
      type: string
    parameterSweep:
      properties:
        associatedAccount:
          $ref: '#/components/schemas/associatedAccount'
        batches:
          items:
            $ref: '#/components/schemas/batchID'
          type: array
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        lastUpdatedTimestamp:
          $ref: '#/components/schemas/timestamp'
        name:
          type: string
        orgID:
          $ref: '#/components/schemas/orgID'
        parameterSweepID:
          $ref: '#/components/schemas/parameterSweepID'
        parameters:
          items:
            $ref: '#/components/schemas/sweepParameter'
          type: array
        projectID:
          $ref: '#/components/schemas/projectID'
        status:
          $ref: '#/components/schemas/parameterSweepStatus'
        statusHistory:
          $ref: '#/components/schemas/parameterSweepStatusHistory'
        userID:
          $ref: '#/components/schemas/userID'
      required:
      - associatedAccount
      type: object
    parameterSweepID:
      format: uuid
      type: string
    parameterSweepInput:
      properties:
        allowableFailurePercent:
          nullable: true
          type: integer
        associatedAccount:
          $ref: '#/components/schemas/associatedAccount'
        blueprintName:
          nullable: true
          type: string
        blueprintVersion:
          nullable: true
          type: integer
        buildID:
          $ref: '#/components/schemas/buildID'
        experienceIDs:
          items:
            $ref: '#/components/schemas/experienceID'
          nullable: true
          type: array
        experienceNames:
          items:
            $ref: '#/components/schemas/experienceName'
          nullable: true
          type: array
        experienceTagIDs:
          items:
            $ref: '#/components/schemas/experienceTagID'
          nullable: true
          type: array
        experienceTagNames:
          items:
            $ref: '#/components/schemas/experienceTagName'
          nullable: true
          type: array
        metricsBuildID:
          $ref: '#/components/schemas/metricsBuildID'
        metricsSetName:
          $ref: '#/components/schemas/metricsSetName'
        parameters:
          items:
            $ref: '#/components/schemas/sweepParameter'
          type: array
        poolLabels:
          $ref: '#/components/schemas/poolLabels'
        triggeredVia:
          $ref: '#/components/schemas/triggeredVia'
      type: object
    parameterSweepStatus:
      enum:
      - SUBMITTED
      - RUNNING
      - SUCCEEDED
      - ERROR
      - CANCELLED
      type: string
      x-enum-varnames:
      - ParameterSweepStatusSUBMITTED
      - ParameterSweepStatusRUNNING
      - ParameterSweepStatusSUCCEEDED
      - ParameterSweepStatusERROR
      - ParameterSweepStatusCANCELLED
    parameterSweepStatusHistory:
      items:
        $ref: '#/components/schemas/parameterSweepStatusHistoryType'
      type: array
    parameterSweepStatusHistoryType:
      properties:
        status:
          $ref: '#/components/schemas/parameterSweepStatus'
        updatedAt:
          $ref: '#/components/schemas/timestamp'
      type: object
    pauseAgentInput:
      description: Optional metadata supplied with a pause request.
      properties:
        reason:
          description: |
            Optional free-text reason for the pause. It is stored on the
            agent, returned in list/get responses, written to the pause audit
            history, and surfaced in the paused agent's logs on the customer
            host — so it is bounded to 500 characters and restricted to
            printable text (no control characters).
          maxLength: 500
          pattern: ^\P{Cc}*$
          type: string
      type: object
    pauseAgentOutput:
      description: |
        Response shape for pauseAgent. Because pausing is idempotent, these
        fields echo the effective pause slot: re-pausing an already-paused
        agent returns the original pausedAt/reason/actor rather than the
        values from this call.
      properties:
        agentID:
          type: string
        pauseReason:
          type: string
        pausedAt:
          format: date-time
          type: string
        pausedBy:
          type: string
        reportedPausedAt:
          format: date-time
          type: string
      required:
      - agentID
      - pausedAt
      - pausedBy
      type: object
    poolLabel:
      type: string
    poolLabelQueueBatch:
      description: One batch slot inside a pool-label-queue group. Used for active,
        queued, and completed batch lists.
      properties:
        batchID:
          format: uuid
          type: string
        batchName:
          type: string
        branchName:
          type: string
        conflatedStatus:
          $ref: '#/components/schemas/conflatedBatchStatus'
        priority:
          description: |
            Raw scheduler priority. batches.priority defaults to 1000 and
            the scheduler sorts ASC, so a value below 1000 is elevated
            above default (rendered "High") and above 1000 is deprioritised
            (rendered "Low"). Equal to 1000 is the default (no pill).
            Display-only — setting priority via the UI is not yet supported.
          type: integer
        projectID:
          format: uuid
          type: string
        queuePosition:
          description: |
            1-based position within the queued list (e.g. 1 for "Queued 1").
            Null on active and completed entries — only queued batches carry
            a position.
          type: integer
        testSuiteID:
          description: ID of the test suite the batch belongs to, for linking to the
            test-suite page. Optional — null when the batch is adhoc or the test_suites
            row no longer exists.
          format: uuid
          type: string
        testSuiteName:
          description: |
            Name of the test suite the batch belongs to, or omitted when
            adhoc / the test_suites row no longer exists.
          type: string
        testSuiteRevision:
          description: Revision of the test suite the batch ran. Optional — present
            only alongside testSuiteID, since the test-suite page is revision-specific.
          format: int32
          type: integer
        timestamp:
          format: date-time
          type: string
      required:
      - batchID
      - batchName
      - conflatedStatus
      - timestamp
      - priority
      type: object
    poolLabelQueueItem:
      description: One pool-label group in the queue view. Groups carry an optional
        active batch, queued batches, recently-completed batches (under a collapse),
        and the list of agents that have served this label.
      properties:
        activeBatches:
          description: Batches in a non-terminal, non-SUBMITTED status currently running
            under this pool label. Multiple concurrent runners are normal — agents
            in a pool can serve more than one batch at a time.
          items:
            $ref: '#/components/schemas/poolLabelQueueBatch'
          type: array
        associatedAgentIDs:
          description: |
            IDs of agents that either advertise this pool label OR have at
            least one historical job on a batch carrying it. Soft-deleted
            agents are excluded.
          items:
            type: string
          type: array
        completedBatches:
          description: Batches in terminal status (SUCCEEDED / CANCELLED / ERROR)
            within the completedSinceDays window.
          items:
            $ref: '#/components/schemas/poolLabelQueueBatch'
          type: array
        poolLabel:
          description: The colon-prefixed root form (e.g. "RackHiLConfig"); see scheduler
            tasks.sql split_part(label, ':', 1) convention.
          type: string
        queuedBatches:
          items:
            $ref: '#/components/schemas/poolLabelQueueBatch'
          type: array
      required:
      - poolLabel
      - activeBatches
      - queuedBatches
      - completedBatches
      - associatedAgentIDs
      type: object
    poolLabels:
      items:
        $ref: '#/components/schemas/poolLabel'
      type: array
    poolUtilizationSeries:
      description: |
        One pool label's utilization within a listPoolLabelUtilization
        response. utilization per bucket is the mean of the pool's distinct
        agents' per-agent utilizations (dark/offline agents count as 0%, so
        idle/dark capacity is surfaced); offline is the mean per-agent offline
        fraction on the same denominator, so idle = 1 − utilization − offline
        (clamped at 0) holds as in the per-agent series. agentCount is the
        number of distinct agents in the pool (the mean's denominator). The
        window and interval are shared across all series and live on the
        enclosing output. totalTestsRun counts runs started in the window by
        the pool's agents; topExperiences ranks them; avgQueueSeconds and
        medianQueueSeconds aggregate their queue wait (both omitted when none
        is measurable). An agent in multiple pools contributes to each, so
        these totals overlap across pools.
      properties:
        agentCount:
          type: integer
        avgQueueSeconds:
          format: double
          type: number
        buckets:
          items:
            $ref: '#/components/schemas/agentUtilizationBucket'
          type: array
        medianQueueSeconds:
          format: double
          type: number
        poolLabel:
          $ref: '#/components/schemas/poolLabel'
        topExperiences:
          items:
            $ref: '#/components/schemas/agentUtilizationTopExperience'
          type: array
        totalTestsRun:
          type: integer
      required:
      - poolLabel
      - agentCount
      - totalTestsRun
      - buckets
      - topExperiences
      type: object
    profile:
      type: string
    project:
      properties:
        agentMarkdown:
          type: string
        archived:
          $ref: '#/components/schemas/archived'
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        description:
          type: string
        name:
          type: string
        orgID:
          $ref: '#/components/schemas/orgID'
        projectID:
          $ref: '#/components/schemas/projectID'
        userID:
          $ref: '#/components/schemas/userID'
      required:
      - projectID
      - name
      - description
      - creationTimestamp
      - userID
      - orgID
      - archived
      - agentMarkdown
      type: object
    projectID:
      format: uuid
      type: string
    referenceBatchSummary:
      nullable: true
      properties:
        fixedTests:
          format: int64
          type: integer
        newIssues:
          format: int64
          type: integer
        newTests:
          format: int64
          type: integer
      required:
      - fixedTests
      - newTests
      - newIssues
      type: object
    removeAssetsFromBuildInput:
      properties:
        assets:
          items:
            $ref: '#/components/schemas/assetBuildLinkInput'
          minItems: 1
          type: array
      required:
      - assets
      type: object
    report:
      properties:
        associatedAccount:
          $ref: '#/components/schemas/associatedAccount'
        branchID:
          $ref: '#/components/schemas/branchID'
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        endTimestamp:
          $ref: '#/components/schemas/timestamp'
        lastUpdatedTimestamp:
          $ref: '#/components/schemas/timestamp'
        metricsBuildID:
          $ref: '#/components/schemas/metricsBuildID'
        metricsSetName:
          $ref: '#/components/schemas/metricsSetName'
        metricsStatus:
          $ref: '#/components/schemas/metricStatus'
        name:
          $ref: '#/components/schemas/name'
        orgID:
          $ref: '#/components/schemas/orgID'
        outputLocation:
          type: string
        projectID:
          $ref: '#/components/schemas/projectID'
        reportID:
          $ref: '#/components/schemas/reportID'
        respectRevisionBoundary:
          $ref: '#/components/schemas/respectRevisionBoundary'
        startTimestamp:
          $ref: '#/components/schemas/timestamp'
        status:
          $ref: '#/components/schemas/reportStatus'
        statusHistory:
          $ref: '#/components/schemas/reportStatusHistory'
        testSuiteID:
          $ref: '#/components/schemas/testSuiteID'
        testSuiteRevision:
          $ref: '#/components/schemas/testSuiteRevision'
        triggeredVia:
          $ref: '#/components/schemas/triggeredVia'
        userID:
          $ref: '#/components/schemas/userID'
      required:
      - reportID
      - projectID
      - testSuiteID
      - testSuiteRevision
      - respectRevisionBoundary
      - branchID
      - startTimestamp
      - endTimestamp
      - name
      - status
      - statusHistory
      - lastUpdatedTimestamp
      - creationTimestamp
      - metricsBuildID
      - metricsSetName
      - userID
      - orgID
      - associatedAccount
      - outputLocation
      - metricsStatus
      type: object
    reportID:
      format: uuid
      type: string
    reportInput:
      properties:
        associatedAccount:
          $ref: '#/components/schemas/associatedAccount'
        branchID:
          $ref: '#/components/schemas/branchID'
        endTimestamp:
          $ref: '#/components/schemas/timestamp'
        metricsBuildID:
          $ref: '#/components/schemas/metricsBuildID'
        metricsSetName:
          $ref: '#/components/schemas/metricsSetName'
        name:
          $ref: '#/components/schemas/name'
        poolLabels:
          $ref: '#/components/schemas/poolLabels'
        respectRevisionBoundary:
          $ref: '#/components/schemas/respectRevisionBoundary'
        startTimestamp:
          $ref: '#/components/schemas/timestamp'
        testSuiteID:
          $ref: '#/components/schemas/testSuiteID'
        testSuiteRevision:
          $ref: '#/components/schemas/testSuiteRevision'
        triggeredVia:
          $ref: '#/components/schemas/triggeredVia'
      required:
      - testSuiteID
      - branchID
      - startTimestamp
      - metricsBuildID
      type: object
    reportLog:
      properties:
        checksum:
          $ref: '#/components/schemas/checksum'
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        downloadUrl:
          description: Presigned URL with Content-Disposition attachment header for
            browser-native file downloads. Not set for external (BYO-bucket) logs.
          format: uri
          type: string
        external:
          description: True if the log is stored in a customer-owned (BYO) bucket.
          type: boolean
        fileName:
          $ref: '#/components/schemas/fileName'
        filePath:
          description: The directory path relative to the output root (empty for root-level
            files)
          type: string
        fileSize:
          $ref: '#/components/schemas/fileSize'
        fullPath:
          description: The fully qualified path (filePath/fileName) of the log file
          readOnly: true
          type: string
        location:
          $ref: '#/components/schemas/logLocation'
        logID:
          $ref: '#/components/schemas/logID'
        logOutputLocation:
          format: uri
          type: string
        logType:
          $ref: '#/components/schemas/logType'
        orgID:
          $ref: '#/components/schemas/orgID'
        userID:
          $ref: '#/components/schemas/userID'
      required:
      - logID
      - fileName
      - fileSize
      - checksum
      - creationTimestamp
      - location
      - logOutputLocation
      - logType
      - userID
      - orgID
      type: object
    reportMetricsDataAndIDs:
      properties:
        reportMetricID:
          $ref: '#/components/schemas/metricID'
        reportMetricsData:
          $ref: '#/components/schemas/metricsData'
      type: object
    reportMetricsDataToReportMetric:
      properties:
        reportMetricID:
          $ref: '#/components/schemas/metricID'
        reportMetricsDataIDs:
          items:
            $ref: '#/components/schemas/metricsDataID'
          type: array
      type: object
    reportStatus:
      enum:
      - SUBMITTED
      - RUNNING
      - ERROR
      - SUCCEEDED
      type: string
      x-enum-varnames:
      - ReportStatusSUBMITTED
      - ReportStatusRUNNING
      - ReportStatusERROR
      - ReportStatusSUCCEEDED
    reportStatusHistory:
      items:
        $ref: '#/components/schemas/reportStatusHistoryType'
      type: array
    reportStatusHistoryType:
      properties:
        status:
          $ref: '#/components/schemas/reportStatus'
        updatedAt:
          $ref: '#/components/schemas/timestamp'
      type: object
    requiredHeaders:
      additionalProperties:
        type: string
      description: Headers the client MUST include when uploading. Includes x-amz-tagging
        when tags were provided.
      type: object
    rerunBatchInput:
      properties:
        jobIDs:
          items:
            $ref: '#/components/schemas/jobID'
          type: array
        rerunMetricsOnly:
          default: false
          type: boolean
        syncBatch:
          default: false
          type: boolean
      required:
      - syncBatch
      type: object
    rerunBatchOutput:
      properties:
        batchID:
          $ref: '#/components/schemas/batchID'
        jobIDs:
          items:
            $ref: '#/components/schemas/jobID'
          type: array
        runCounter:
          $ref: '#/components/schemas/runCounter'
      type: object
    respectRevisionBoundary:
      type: boolean
    reviseAssetInput:
      properties:
        locations:
          items:
            type: string
          type: array
        mountFolder:
          type: string
        version:
          type: string
      required:
      - locations
      - version
      type: object
    reviseTestSuiteInput:
      properties:
        adhoc:
          type: boolean
        allExperiences:
          type: boolean
        description:
          $ref: '#/components/schemas/testSuiteDescription'
        excludedExperienceIDs:
          items:
            $ref: '#/components/schemas/excludedExperienceID'
          type: array
        experiences:
          items:
            $ref: '#/components/schemas/experienceID'
          type: array
        filters:
          $ref: '#/components/schemas/experienceFilterInput'
        metricsBuildID:
          $ref: '#/components/schemas/metricsBuildID'
        metricsSetName:
          $ref: '#/components/schemas/metricsSetName'
        name:
          $ref: '#/components/schemas/testSuiteName'
        show_on_summary:
          type: boolean
        systemID:
          $ref: '#/components/schemas/systemID'
        updateMetricsBuild:
          type: boolean
        updateMetricsSet:
          type: boolean
      required:
      - updateMetricsBuild
      type: object
    runCounter:
      type: integer
    runnerType:
      enum:
      - SDK
      - AGENT
      - CLOUD
      type: string
    selectExperiencesInput:
      properties:
        allExperiences:
          type: boolean
        experiences:
          items:
            $ref: '#/components/schemas/experienceID'
          type: array
        filters:
          $ref: '#/components/schemas/experienceFilterInput'
      type: object
    sweepParameter:
      properties:
        name:
          type: string
        values:
          items:
            type: string
          type: array
      type: object
    system:
      properties:
        architecture:
          $ref: '#/components/schemas/architecture'
        archived:
          $ref: '#/components/schemas/archived'
        build_gpus:
          type: integer
        build_memory_mib:
          type: integer
        build_shared_memory_mb:
          type: integer
        build_vcpus:
          type: integer
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        description:
          type: string
        metrics_build_gpus:
          nullable: true
          type: integer
        metrics_build_memory_mib:
          nullable: true
          type: integer
        metrics_build_shared_memory_mb:
          nullable: true
          type: integer
        metrics_build_vcpus:
          nullable: true
          type: integer
        name:
          type: string
        numBatches:
          type: integer
        numBuilds:
          type: integer
        numExperiences:
          type: integer
        numMetricsBuilds:
          type: integer
        numTestSuites:
          type: integer
        orgID:
          $ref: '#/components/schemas/orgID'
        projectID:
          $ref: '#/components/schemas/projectID'
        systemID:
          $ref: '#/components/schemas/systemID'
        updateTimestamp:
          $ref: '#/components/schemas/timestamp'
        updateUserID:
          $ref: '#/components/schemas/userID'
        userID:
          $ref: '#/components/schemas/userID'
      required:
      - systemID
      - projectID
      - name
      - description
      - build_vcpus
      - build_memory_mib
      - build_gpus
      - build_shared_memory_mb
      - architecture
      - numBuilds
      - numTestSuites
      - numExperiences
      - numMetricsBuilds
      - numBatches
      - creationTimestamp
      - updateTimestamp
      - updateUserID
      - userID
      - orgID
      - archived
      type: object
    systemID:
      format: uuid
      type: string
    tagID:
      format: uuid
      readOnly: true
      type: string
    testSuite:
      properties:
        archived:
          type: boolean
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        description:
          $ref: '#/components/schemas/testSuiteDescription'
        experiences:
          items:
            $ref: '#/components/schemas/experienceID'
          type: array
        metricsBuildID:
          $ref: '#/components/schemas/metricsBuildID'
        metricsSetName:
          $ref: '#/components/schemas/metricsSetName'
        name:
          $ref: '#/components/schemas/testSuiteName'
        orgID:
          $ref: '#/components/schemas/orgID'
        projectID:
          $ref: '#/components/schemas/projectID'
        showOnSummary:
          type: boolean
        summaryReferenceDate:
          $ref: '#/components/schemas/timestamp'
        systemID:
          $ref: '#/components/schemas/systemID'
        testSuiteID:
          $ref: '#/components/schemas/testSuiteID'
        testSuiteRevision:
          $ref: '#/components/schemas/testSuiteRevision'
        updateTimestamp:
          $ref: '#/components/schemas/timestamp'
        updateUserID:
          $ref: '#/components/schemas/userID'
        userID:
          $ref: '#/components/schemas/userID'
      required:
      - archived
      - testSuiteID
      - testSuiteRevision
      - name
      - description
      - projectID
      - systemID
      - experiences
      - userID
      - orgID
      - creationTimestamp
      - updateTimestamp
      - updateUserID
      - showOnSummary
      type: object
    testSuiteBatchInput:
      properties:
        allowableFailurePercent:
          nullable: true
          type: integer
        associatedAccount:
          $ref: '#/components/schemas/associatedAccount'
        batchName:
          $ref: '#/components/schemas/name'
        blueprintName:
          nullable: true
          type: string
        blueprintVersion:
          nullable: true
          type: integer
        buildID:
          $ref: '#/components/schemas/buildID'
        labelledBuilds:
          $ref: '#/components/schemas/labelledBuilds'
        parameters:
          $ref: '#/components/schemas/batchParameters'
        poolLabels:
          $ref: '#/components/schemas/poolLabels'
        priority:
          maximum: 32767
          minimum: 0
          nullable: true
          type: integer
        triggeredVia:
          $ref: '#/components/schemas/triggeredVia'
      required:
      - buildID
      type: object
    testSuiteBatchSummaryJobResults:
      properties:
        batchCreationTimestamp:
          $ref: '#/components/schemas/timestamp'
        batchID:
          $ref: '#/components/schemas/batchID'
        blocker:
          format: int64
          type: integer
        buildCreationTimestamp:
          $ref: '#/components/schemas/timestamp'
        buildID:
          $ref: '#/components/schemas/buildID'
        cancelled:
          format: int64
          type: integer
        error:
          format: int64
          type: integer
        metrics:
          items:
            $ref: '#/components/schemas/customMetric'
          type: array
        passed:
          format: int64
          type: integer
        queued:
          format: int64
          type: integer
        running:
          format: int64
          type: integer
        total:
          format: int64
          type: integer
        warning:
          format: int64
          type: integer
      required:
      - batchID
      - batchCreationTimestamp
      - buildID
      - buildCreationTimestamp
      - metrics
      - total
      - queued
      - running
      - error
      - cancelled
      - blocker
      - warning
      - passed
    testSuiteDescription:
      type: string
    testSuiteID:
      format: uuid
      type: string
    testSuiteName:
      minLength: 1
      type: string
    testSuiteRevision:
      format: int32
      type: integer
    testSuiteSummary:
      properties:
        batches:
          items:
            $ref: '#/components/schemas/testSuiteBatchSummaryJobResults'
          type: array
        branchID:
          $ref: '#/components/schemas/branchID'
        keyMetric:
          $ref: '#/components/schemas/keyMetric'
        name:
          $ref: '#/components/schemas/testSuiteName'
        projectID:
          $ref: '#/components/schemas/projectID'
        referenceBatch:
          $ref: '#/components/schemas/testSuiteBatchSummaryJobResults'
        referenceBatchSummary:
          $ref: '#/components/schemas/referenceBatchSummary'
        reportID:
          $ref: '#/components/schemas/reportID'
        summary:
          properties:
            fixedTests:
              format: int64
              type: integer
            newIssues:
              format: int64
              type: integer
            newTests:
              format: int64
              type: integer
          required:
          - fixedTests
          - newTests
          - newIssues
          type: object
        systemID:
          $ref: '#/components/schemas/systemID'
        testSuiteDescription:
          $ref: '#/components/schemas/testSuiteDescription'
        testSuiteID:
          $ref: '#/components/schemas/testSuiteID'
        testSuiteRevision:
          $ref: '#/components/schemas/testSuiteRevision'
      required:
      - name
      - testSuiteID
      - testSuiteRevision
      - testSuiteDescription
      - projectID
      - systemID
      - branchID
      - reportID
      - keyMetric
      - referenceBatchSummary
      - summary
      - batches
      type: object
    testSuiteSummaryOutput:
      properties:
        nextPageToken:
          type: string
        testSuites:
          items:
            $ref: '#/components/schemas/testSuiteSummary'
          type: array
      required:
      - testSuites
      - nextPageToken
      type: object
    timestamp:
      format: date-time
      type: string
    triggeredVia:
      enum:
      - LOCAL
      - WEBAPP
      - GITLAB
      - GITHUB
      type: string
    unpauseAgentOutput:
      description: Response shape for unpauseAgent. The agent is no longer paused.
      properties:
        agentID:
          type: string
      required:
      - agentID
      type: object
    updateAssetInput:
      properties:
        description:
          type: string
        name:
          type: string
      type: object
    updateBatchInput:
      properties:
        description:
          type: string
      required:
      - description
      type: object
    updateBuildFields:
      properties:
        branchID:
          format: uuid
          type: string
        description:
          $ref: '#/components/schemas/buildDescription'
        name:
          $ref: '#/components/schemas/buildName'
      type: object
    updateBuildInput:
      properties:
        build:
          $ref: '#/components/schemas/updateBuildFields'
        updateMask:
          $ref: '#/components/schemas/updateMask'
      type: object
    updateEventInput:
      properties:
        description:
          type: string
      required:
      - description
      type: object
    updateExperienceFields:
      properties:
        cacheExempt:
          description: If true, the experience will not be cached.
          type: boolean
        containerTimeoutSeconds:
          format: int32
          type: integer
        customFields:
          description: Custom field key/value pairs to associate with the experience.
            Field names are case-insensitive. Each field can have multiple values.
            When updating, this replaces all existing custom fields.
          items:
            $ref: '#/components/schemas/customFieldDefinition'
          type: array
        description:
          type: string
        environmentVariables:
          items:
            $ref: '#/components/schemas/environmentVariable'
          type: array
        experienceTagIDs:
          items:
            $ref: '#/components/schemas/experienceTagID'
          type: array
        location:
          deprecated: true
          description: '[DEPRECATED] This field was previously used to define an experience''s
            location. Experiences can now be defined with multiple locations, using
            the locations field. This field will be removed in a future version.'
          minLength: 1
          type: string
        locations:
          items:
            minLength: 1
            type: string
          type: array
        name:
          $ref: '#/components/schemas/experienceName'
        profile:
          $ref: '#/components/schemas/profile'
        systemIDs:
          items:
            $ref: '#/components/schemas/systemID'
          type: array
      type: object
    updateExperienceInput:
      properties:
        experience:
          $ref: '#/components/schemas/updateExperienceFields'
        updateMask:
          $ref: '#/components/schemas/updateMask'
      type: object
    updateExperienceTagFields:
      properties:
        description:
          type: string
        name:
          $ref: '#/components/schemas/experienceTagName'
      type: object
    updateExperienceTagInput:
      properties:
        experienceTag:
          $ref: '#/components/schemas/updateExperienceTagFields'
        updateMask:
          $ref: '#/components/schemas/updateMask'
      type: object
    updateJobInput:
      properties:
        description:
          type: string
      required:
      - description
      type: object
    updateMask:
      items:
        type: string
      type: array
    updateProjectFields:
      properties:
        agentMarkdown:
          maxLength: 65536
          type: string
        description:
          type: string
        name:
          type: string
      type: object
    updateProjectInput:
      properties:
        project:
          $ref: '#/components/schemas/updateProjectFields'
        updateMask:
          $ref: '#/components/schemas/updateMask'
      type: object
    updateSystemInput:
      properties:
        architecture:
          $ref: '#/components/schemas/architecture'
        build_gpus:
          type: integer
        build_memory_mib:
          type: integer
        build_shared_memory_mb:
          type: integer
        build_vcpus:
          type: integer
        description:
          type: string
        metrics_build_gpus:
          nullable: true
          type: integer
        metrics_build_memory_mib:
          nullable: true
          type: integer
        metrics_build_shared_memory_mb:
          nullable: true
          type: integer
        metrics_build_vcpus:
          nullable: true
          type: integer
        name:
          type: string
      type: object
    updateWorkflowInput:
      properties:
        ciWorkflowLink:
          nullable: true
          type: string
        description:
          type: string
        name:
          type: string
      type: object
    updateWorkflowSuiteInput:
      properties:
        enabled:
          $ref: '#/components/schemas/enabled'
        testSuiteID:
          $ref: '#/components/schemas/testSuiteID'
      required:
      - testSuiteID
      - enabled
      type: object
    updateWorkflowSuiteOutput:
      properties:
        enabled:
          $ref: '#/components/schemas/enabled'
        testSuiteID:
          $ref: '#/components/schemas/testSuiteID'
        workflowID:
          $ref: '#/components/schemas/workflowID'
      required:
      - testSuiteID
      - workflowID
      - enabled
      type: object
    updateWorkflowSuitesInput:
      properties:
        workflowSuites:
          items:
            $ref: '#/components/schemas/updateWorkflowSuiteInput'
          type: array
      required:
      - workflowSuites
      type: object
    updateWorkflowSuitesOutput:
      properties:
        workflowSuites:
          items:
            $ref: '#/components/schemas/updateWorkflowSuiteOutput'
          type: array
      required:
      - workflowSuites
      type: object
    userID:
      type: string
    validateBlueprintOutput:
      properties:
        error:
          description: The validation error, present only when valid is false.
          type: string
        valid:
          type: boolean
      required:
      - valid
      type: object
    workflow:
      properties:
        archived:
          $ref: '#/components/schemas/archived'
        ciWorkflowLink:
          nullable: true
          type: string
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        description:
          type: string
        lastRunTimestamp:
          $ref: '#/components/schemas/timestamp'
        name:
          type: string
        orgID:
          $ref: '#/components/schemas/orgID'
        projectID:
          $ref: '#/components/schemas/projectID'
        requiredSystems:
          description: |
            Distinct systems covered by this workflow's currently-enabled,
            non-archived test suites. To create a workflow run, the caller
            must provide one build for each of these systems via
            `createWorkflowRunInput.builds`. An enabled suite whose system has
            no matching build in the request is rejected with HTTP 422.
          items:
            $ref: '#/components/schemas/systemID'
          type: array
        updateTimestamp:
          $ref: '#/components/schemas/timestamp'
        updateUserID:
          $ref: '#/components/schemas/userID'
        userID:
          $ref: '#/components/schemas/userID'
        workflowID:
          $ref: '#/components/schemas/workflowID'
      required:
      - workflowID
      - projectID
      - name
      - description
      - creationTimestamp
      - userID
      - updateTimestamp
      - updateUserID
      - orgID
      - archived
      - requiredSystems
      type: object
    workflowID:
      format: uuid
      type: string
    workflowRun:
      properties:
        associatedAccount:
          $ref: '#/components/schemas/associatedAccount'
        buildID:
          allOf:
          - $ref: '#/components/schemas/buildID'
          deprecated: true
          description: |
            **Deprecated**: convenience echo of the build for single-system
            runs (populated when every enabled suite of the run used the same
            build; omitted otherwise). Use `workflowRunTestSuites[].buildID`
            instead — each suite carries the build it was actually exercised
            with.
          nullable: true
        creationTimestamp:
          $ref: '#/components/schemas/timestamp'
        orgID:
          $ref: '#/components/schemas/orgID'
        triggeredVia:
          $ref: '#/components/schemas/triggeredVia'
        unusedBuilds:
          description: |
            Builds that were supplied via `createWorkflowRunInput.builds` but
            whose system is not covered by any enabled, non-archived suite of
            the workflow. The run is created and the missing-system rejection
            (HTTP 422) is unaffected; these builds are simply not exercised.
            Surfaced here so callers (e.g. CI integrations) can warn when
            they're sending more than the workflow needs. Empty/omitted in
            the typical case.
          items:
            $ref: '#/components/schemas/buildID'
          nullable: true
          type: array
        userID:
          $ref: '#/components/schemas/userID'
        workflowID:
          $ref: '#/components/schemas/workflowID'
        workflowRunID:
          $ref: '#/components/schemas/workflowRunID'
        workflowRunTestSuites:
          description: |
            One row per test suite that was associated with the workflow at
            run time. For each enabled suite, `buildID`, `systemID`, and
            `batchID` are populated (the suite was exercised against that
            build, on that system, producing that batch). For suites that
            were disabled at run time the row is still recorded but `buildID`
            and `batchID` are null.
          items:
            $ref: '#/components/schemas/workflowRunTestSuite'
          type: array
      required:
      - workflowRunID
      - workflowID
      - creationTimestamp
      - userID
      - orgID
      - workflowRunTestSuites
      type: object
    workflowRunBuildInput:
      description: |
        Multi-build input entry for `createWorkflowRunInput.builds`. The
        caller pins a build by `buildID`; Optional per-entry `poolLabels`,
        `parameters`, and `allowableFailurePercent` replace — and must not be
        combined with — the run-level fields of the same name.
      properties:
        allowableFailurePercent:
          nullable: true
          type: integer
        buildID:
          allOf:
          - $ref: '#/components/schemas/buildID'
          description: |
            The build to run for this entry. The system this entry covers is
            derived from this build's `system_id`. Two entries resolving to
            the same system are rejected with HTTP 400, and a build whose
            system is not covered by any enabled suite in the workflow is
            also rejected.
        parameters:
          $ref: '#/components/schemas/batchParameters'
        poolLabels:
          $ref: '#/components/schemas/poolLabels'
      required:
      - buildID
      type: object
    workflowRunID:
      format: uuid
      type: string
    workflowRunTestSuite:
      description: |
        One row per test suite associated with a workflow run. Enabled suites
        carry the build allocated to them (`buildID`), the system that build
        was for (`systemID`, copied from the test suite's system), and the
        resulting batch (`batchID`). Disabled suites have `buildID` and
        `batchID` null.
      properties:
        batchID:
          allOf:
          - $ref: '#/components/schemas/batchID'
          description: |
            The batch produced for this suite. `null` for suites that were
            disabled at run time, and also `null` if the suite has no active
            experiences (the run is recorded for traceability but no batch is
            launched).
          nullable: true
        buildID:
          allOf:
          - $ref: '#/components/schemas/buildID'
          description: |
            The build allocated to this suite for this run, taken from the
            input `builds` entry whose system matches this suite. `null` for
            suites that were disabled at run time.
          nullable: true
        systemID:
          allOf:
          - $ref: '#/components/schemas/systemID'
          description: |
            The system this test suite covers (copied from the test suite at
            run creation time). Always populated.
        testSuiteID:
          $ref: '#/components/schemas/testSuiteID'
      required:
      - testSuiteID
      - systemID
      type: object
    workflowSuiteInput:
      properties:
        enabled:
          $ref: '#/components/schemas/enabled'
        testSuiteID:
          $ref: '#/components/schemas/testSuiteID'
      required:
      - testSuiteID
      - enabled
      type: object
    workflowSuiteOutput:
      properties:
        enabled:
          $ref: '#/components/schemas/enabled'
        testSuite:
          $ref: '#/components/schemas/testSuite'
        workflowID:
          $ref: '#/components/schemas/workflowID'
      required:
      - workflowID
      - testSuite
      - enabled
      type: object
  securitySchemes:
    OAuth:
      description: This API uses OAuth 2
      flows:
        authorizationCode:
          authorizationUrl: https://resim.us.auth0.com/authorize
          refreshUrl: https://resim.us.auth0.com/oauth/token
          scopes:
            assets:read: Read asset data.
            assets:write: Write asset data.
            batches:read: Read batch data.
            batches:write: Write batch data.
            builds:read: Read build data.
            builds:write: Write build data.
            experienceTags:read: Read experience tag data.
            experienceTags:write: Write experience tag data.
            experiences:read: Read experience data.
            experiences:write: Write experience data.
            projects:read: Read project data.
            projects:write: Write project data.
            reports:read: Read report data.
            reports:write: Write report data.
            sweeps:read: Read sweep data.
            sweeps:write: Write sweep data.
            systems:read: Read system data.
            systems:write: Write system data.
            workflows:read: Read workflow data.
            workflows:write: Write workflow data.
          tokenUrl: https://resim.us.auth0.com/oauth/token
        clientCredentials:
          scopes:
            assets:read: Read asset data.
            assets:write: Write asset data.
            batches:read: Read batch data.
            batches:write: Write batch data.
            builds:read: Read build data.
            builds:write: Write build data.
            experienceTags:read: Read experience tag data.
            experienceTags:write: Write experience tag data.
            experiences:read: Read experience data.
            experiences:write: Write experience data.
            projects:read: Read project data.
            projects:write: Write project data.
            reports:read: Read report data.
            reports:write: Write report data.
            sweeps:read: Read sweep data.
            sweeps:write: Write sweep data.
            systems:read: Read system data.
            systems:write: Write system data.
            workflows:read: Read workflow data.
            workflows:write: Write workflow data.
          tokenUrl: https://resim.us.auth0.com/oauth/token
        implicit:
          authorizationUrl: https://resim.us.auth0.com/authorize
          scopes:
            assets:read: Read asset data.
            assets:write: Write asset data.
            batches:read: Read batch data.
            batches:write: Write batch data.
            builds:read: Read build data.
            builds:write: Write build data.
            experienceTags:read: Read experience tag data.
            experienceTags:write: Write experience tag data.
            experiences:read: Read experience data.
            experiences:write: Write experience data.
            projects:read: Read project data.
            projects:write: Write project data.
            reports:read: Read report data.
            reports:write: Write report data.
            sweeps:read: Read sweep data.
            sweeps:write: Write sweep data.
            systems:read: Read system data.
            systems:write: Write system data.
            workflows:read: Read workflow data.
            workflows:write: Write workflow data.
      type: oauth2
info:
  title: ReRun API
  version: "0.1"
openapi: 3.0.2
paths:
  /agents:
    get:
      description: |
        Returns the list of HiL Agents for the caller's org. Removed agents
        are hidden from this list until they next check in. The response
        envelope carries `latestKnownVersion` (an empty string when no
        target is configured) so clients can render the per-agent
        out-of-date indicator without a second request.

        This endpoint is not paginated: an org has at most a handful of HiL
        agents, and the UI fetches the full set to compute exact
        active/inactive counts client-side.
      operationId: listAgents
      parameters:
      - description: |
          Maximum number of recent-activity cards to return per agent,
          newest-first. Defaults to 2 (the latest-run summary). The HiL
          agent status UI requests up to 20 to render a recent-status
          timeline. Values are clamped server-side to [1, 50].
        in: query
        name: recentActivityLimit
        schema:
          default: 2
          type: integer
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listAgentsOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - projects:read
      tags:
      - agents
  /agents/{agentID}:
    get:
      description: Returns the HiL Agent identified by agentID, scoped to the caller's
        org. Returns 404 for removed or cross-org agents.
      operationId: getAgent
      parameters:
      - description: Agent identifier as supplied at check-in.
        in: path
        name: agentID
        required: true
        schema:
          type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/agent'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - projects:read
      tags:
      - agents
  /agents/{agentID}/archive:
    post:
      description: |
        Archives (soft-deletes) a HiL Agent so it disappears from
        listAgents until it next checks in. Idempotent — re-archiving an
        already-archived agent returns the original archivedAt. Cross-org
        agentIDs return 404 (the handler's pre-check runs AgentExistsInOrg
        first; the archive only fires if the agent is visible to the
        caller).
      operationId: archiveAgent
      parameters:
      - in: path
        name: agentID
        required: true
        schema:
          type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/archiveAgentOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - projects:write
      tags:
      - agents
  /agents/{agentID}/pause:
    post:
      description: |
        Pauses a HiL Agent: it stops picking up new work and its in-flight
        worker is terminated, with the interrupted task requeued rather than
        cancelled. New-task handout to the agent's workers stops before any
        claim, so no task is lost. Idempotent — re-pausing an already-paused
        agent is a no-op that preserves the original pausedAt, reason, and
        actor; changing the reason means unpause then pause. Unknown,
        cross-org, and archived agents all return 404. Pause state is durable
        and survives agent restarts and archive/restore cycles until an
        explicit unpause. The agent observes the pause within roughly one
        check-in interval.
      operationId: pauseAgent
      parameters:
      - in: path
        name: agentID
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/pauseAgentInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pauseAgentOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - projects:write
      tags:
      - agents
  /agents/{agentID}/result-branches:
    get:
      description: |
        Returns the distinct branches that appear in a single HiL Agent's
        results, scoped to the caller's org and ordered by name. Backs the
        branch filter on the agent detail page's Results tab — only
        branches the agent has actually run are offered, each carrying its
        project so same-named branches across projects ("main" in every
        project) stay distinguishable. Not paginated, but the picker's
        search is applied server-side via the optional `name` filter.
      operationId: listAgentResultBranches
      parameters:
      - description: Agent identifier as supplied at check-in.
        in: path
        name: agentID
        required: true
        schema:
          type: string
      - description: Optional case-insensitive substring filter on the branch name.
          Omit or leave blank to return all of the agent's branches.
        in: query
        name: name
        schema:
          type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listAgentResultBranchesOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - projects:read
      tags:
      - agents
  /agents/{agentID}/results:
    get:
      description: |
        Returns the paginated list of recent activity (batch + test pairs)
        for a single HiL Agent, sorted newest-first. Surfaces every test
        the agent has ever run for the caller's org, joined via
        jobs_status_history.agent_id. Backs the agent detail page's
        Results tab.
      operationId: listAgentResults
      parameters:
      - description: Agent identifier as supplied at check-in.
        in: path
        name: agentID
        required: true
        schema:
          type: string
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - description: Optional branch IDs. When set, only results whose build is on
          one of these branches are returned (and counted).
        explode: false
        in: query
        name: branchIds
        schema:
          items:
            format: uuid
            type: string
          type: array
        style: form
      - description: Optional lower bound (RFC 3339) on a result's timestamp. When
          set, only results updated at or after this instant are returned (and counted).
        in: query
        name: createdAfter
        schema:
          format: date-time
          type: string
      - description: Optional case-insensitive substring filter on the test (experience)
          name.
        in: query
        name: text
        schema:
          type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listAgentResultsOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - projects:read
      tags:
      - agents
  /agents/{agentID}/unpause:
    post:
      description: |
        Unpauses a HiL Agent so it resumes launching workers on its next
        check-in (within roughly one check-in interval). Idempotent — a no-op
        on an agent that is not paused. Clears the whole pause slot including
        the quiesced acknowledgement; the pause audit history is retained.
        Unknown, cross-org, and archived agents all return 404.
      operationId: unpauseAgent
      parameters:
      - in: path
        name: agentID
        required: true
        schema:
          type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/unpauseAgentOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - projects:write
      tags:
      - agents
  /agents/{agentID}/utilization:
    get:
      description: |
        Returns a dense, time-ordered series of utilization buckets for a
        single HiL Agent over [startTime, endTime). Each bucket reports
        `utilization` — the fraction of bucket wall-clock during which the
        agent was running at least one experience (a union of running
        intervals, in [0.0, 1.0]). Only EXPERIENCE_RUNNING time counts;
        metrics phases run on metrics workers, not the agent.
        The denominator is always full wall-clock, so buckets in which the
        agent was offline read 0.0. Every bucket in the window is returned
        explicitly, zeros included, so the series charts directly.

        Each bucket also reports `offline` — the fraction of wall-clock
        during which the agent's heartbeat had been silent for over five
        minutes — and `testsRun`, the number of job runs that started in
        the bucket. Online-but-idle time is not a separate field: derive
        it as 1 − utilization − offline. Each run counts exactly once
        across the series, so bucket sums match `totalTestsRun`, the
        count of runs started in the window. A run that began before the
        window contributes running time but no count.

        Caveat: a job that never recorded a terminal transition (e.g. the
        agent died mid-run) counts as running until query time, so a
        sustained 100% utilization can indicate a stuck run rather than a
        busy rack — and because such a phantom run overlaps the offline
        time it died into, `utilization + offline` can transiently exceed
        1.0 (clamp the derived idle at 0).

        Caveat: offline intervals are recorded from this feature's
        deployment onward. In earlier windows `offline` reads 0 and all
        non-running time appears as `idle`.
      operationId: getAgentUtilization
      parameters:
      - description: Agent identifier as supplied at check-in.
        in: path
        name: agentID
        required: true
        schema:
          type: string
      - description: |
          Inclusive window start. Defaults to endTime minus 7 days.
          Must be strictly before endTime; requests where
          startTime >= endTime return 400.
        in: query
        name: startTime
        schema:
          format: date-time
          type: string
      - description: Exclusive window end. Defaults to now.
        in: query
        name: endTime
        schema:
          format: date-time
          type: string
      - description: |
          Bucket width. Buckets are UTC-aligned (hour to the top of the
          hour, day to UTC midnight). The window may span at most 1000
          buckets; wider requests return 400.
        in: query
        name: interval
        schema:
          default: day
          enum:
          - hour
          - day
          type: string
      - description: |
          How many top experiences (ranked by total running seconds on
          this agent in the window) to include in `topExperiences`. 0
          returns an empty list. Values above 50 return 400.
        in: query
        name: topExperiences
        schema:
          default: 10
          maximum: 50
          minimum: 0
          type: integer
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/agentUtilizationOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - projects:read
      tags:
      - agents
  /agents/poolLabels/queue:
    get:
      description: |
        Returns the per-pool-label batch queue across the caller's org.
        Pool-label matching uses the colon-prefix convention
        (split_part(label, ':', 1)) consistent with the scheduler's
        worker-task routing.
      operationId: listAgentPoolLabelQueue
      parameters:
      - description: Window for completed batches surfaced under the per-pool-label
          collapse. Defaults to 7.
        in: query
        name: completedSinceDays
        schema:
          default: 7
          maximum: 30
          minimum: 1
          type: integer
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listPoolLabelQueueOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - projects:read
      tags:
      - agents
  /agents/poolLabels/utilization:
    get:
      description: |
        Returns a dense, time-ordered utilization series per pool label for
        the caller's org over [startTime, endTime), in a single request. Each
        pool label groups the non-removed agents whose pool_labels carry it,
        matched on the label's colon-prefix (resim*-reserved labels excluded).
        An agent in several pools contributes to each, so per-pool totals
        deliberately overlap and the org total is not the sum of pool totals.

        Pool utilization per bucket is the busy fraction of the provisioned
        fleet: the mean of the pool's distinct agents' per-agent utilizations
        (equivalently Σ running-seconds / (agentCount × bucket wall-clock)).
        Dark/offline agents count as 0% and pull the pool down, so idle/dark
        capacity is surfaced rather than hidden. offline is the mean per-agent
        offline fraction on the same denominator, so idle = 1 − utilization −
        offline (clamped at 0) holds as in the per-agent series. testsRun sums
        runs started by the pool's agents in the bucket.

        Bucket and window semantics, and the caveats about runs that never
        recorded a terminal transition and about offline data existing only
        from feature deployment onward, match getAgentUtilization. Because the
        metric is a fleet mean, a single stuck run shifts a pool figure by at
        most ~1/agentCount.
      operationId: listPoolLabelUtilization
      parameters:
      - description: |
          Inclusive window start. Defaults to endTime minus 7 days.
          Must be strictly before endTime; requests where
          startTime >= endTime return 400.
        in: query
        name: startTime
        schema:
          format: date-time
          type: string
      - description: Exclusive window end. Defaults to now.
        in: query
        name: endTime
        schema:
          format: date-time
          type: string
      - description: |
          Bucket width. Buckets are UTC-aligned (hour to the top of the
          hour, day to UTC midnight). The window may span at most 1000
          buckets; wider requests return 400.
        in: query
        name: interval
        schema:
          default: day
          enum:
          - hour
          - day
          type: string
      - description: |
          How many top experiences (ranked by total running seconds in the
          window, per pool) to include in each pool's `topExperiences`. 0
          returns an empty list. Values above 50 return 400.
        in: query
        name: topExperiences
        schema:
          default: 10
          maximum: 50
          minimum: 0
          type: integer
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listPoolLabelUtilizationOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - projects:read
      tags:
      - agents
  /agents/utilization:
    get:
      description: |
        Returns a dense, time-ordered utilization series for every
        non-removed HiL Agent in the caller's org over [startTime,
        endTime), in a single request. The agent set matches listAgents
        (agents that have checked in and are not archived); an agent with
        no activity in the window still appears, with an all-zero series.
        Running intervals are loaded with one set-based query across the
        org, not per-agent.

        Bucket semantics are identical to getAgentUtilization: each bucket
        reports `utilization` (union of running intervals over wall-clock,
        in [0.0, 1.0]), with only EXPERIENCE_RUNNING time counting and
        explicit zeros for empty buckets, plus the `offline` fraction and
        `testsRun` count. The same caveats about jobs that never
        recorded a terminal transition and about offline data existing
        only from feature deployment onward apply.

        `totalTestsRun` and `topExperiences` aggregate across the listed
        (non-archived) agents — runs on archived agents are excluded,
        matching the `agents` series — with experiences ranked by total
        running seconds on any listed agent.
      operationId: listAgentUtilization
      parameters:
      - description: |
          Inclusive window start. Defaults to endTime minus 7 days.
          Must be strictly before endTime; requests where
          startTime >= endTime return 400.
        in: query
        name: startTime
        schema:
          format: date-time
          type: string
      - description: Exclusive window end. Defaults to now.
        in: query
        name: endTime
        schema:
          format: date-time
          type: string
      - description: |
          Bucket width. Buckets are UTC-aligned (hour to the top of the
          hour, day to UTC midnight). The window may span at most 1000
          buckets; wider requests return 400.
        in: query
        name: interval
        schema:
          default: day
          enum:
          - hour
          - day
          type: string
      - description: |
          How many top experiences (ranked by total running seconds in
          the window, fleet-wide) to include in `topExperiences`. 0
          returns an empty list. Values above 50 return 400.
        in: query
        name: topExperiences
        schema:
          default: 10
          maximum: 50
          minimum: 0
          type: integer
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listAgentUtilizationOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - projects:read
      tags:
      - agents
  /blueprints:
    get:
      description: Returns the list of blueprints for the organization.
      operationId: listBlueprints
      parameters:
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBlueprintsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - batches:read
      tags:
      - blueprints
    post:
      description: Creates a new blueprint or a new version of an existing blueprint.
      operationId: createBlueprint
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createBlueprintInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/blueprint'
          description: Created
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - batches:write
      tags:
      - blueprints
  /blueprints/{blueprintName}:
    delete:
      description: Archives (soft-deletes) all versions of a blueprint.
      operationId: archiveBlueprint
      parameters:
      - in: path
        name: blueprintName
        required: true
        schema:
          type: string
      responses:
        "200":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - blueprints
    get:
      description: Returns the latest version of a blueprint by name.
      operationId: getLatestBlueprint
      parameters:
      - in: path
        name: blueprintName
        required: true
        schema:
          type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/blueprint'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - blueprints
  /blueprints/{blueprintName}/versions/{blueprintVersion}:
    delete:
      description: Archives (soft-deletes) a specific version of a blueprint.
      operationId: archiveBlueprintVersion
      parameters:
      - in: path
        name: blueprintName
        required: true
        schema:
          type: string
      - in: path
        name: blueprintVersion
        required: true
        schema:
          type: integer
      responses:
        "200":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - blueprints
    get:
      description: Returns a specific version of a blueprint.
      operationId: getBlueprintVersion
      parameters:
      - in: path
        name: blueprintName
        required: true
        schema:
          type: string
      - in: path
        name: blueprintVersion
        required: true
        schema:
          type: integer
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/blueprint'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - blueprints
  /blueprints/validate:
    post:
      description: |
        Validates blueprint CUE content using the same validator that runs on blueprint creation, without creating the blueprint. Returns whether the content is valid and, if not, the validation error.
      operationId: validateBlueprint
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createBlueprintInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/validateBlueprintOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - batches:read
      tags:
      - blueprints
  /branches:
    get:
      description: Searches branches across every project in the caller's org, rank-ordered
        by name similarity (with an absent name, branches named 'main' surface first).
        Backs the agent Results branch filter, whose results span the whole org rather
        than one project.
      operationId: searchBranches
      parameters:
      - description: Filter branches by name; results are rank-ordered so the closest
          matches surface first.
        in: query
        name: name
        schema:
          type: string
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBranchesOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - projects:read
      tags:
      - projects
  /health:
    get:
      description: Returns whether the service is healthy or not.
      operationId: health
      responses:
        "200":
          description: OK
      tags:
      - health
  /poolLabels:
    get:
      description: Returns the list of distinct pool labels visible to the org, ordered
        by most recent agent check-in or by trigram similarity to a search term.
      operationId: listPoolLabels
      parameters:
      - description: Filter pool labels by name. It is recommended to use orderBy=rank
          when this is set, so you get the most relevant results first.
        in: query
        name: name
        schema:
          maxLength: 256
          type: string
      - in: query
        name: orderBy
        schema:
          default: timestamp
          enum:
          - timestamp
          - rank
          type: string
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listPoolLabelsOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - projects:read
      tags:
      - agents
  /projects:
    get:
      description: Returns the list of projects.
      operationId: listProjects
      parameters:
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listProjectsOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - projects:read
      tags:
      - projects
    post:
      description: Adds a project.
      operationId: createProject
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createProjectInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/project'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "409":
          $ref: '#/components/responses/alreadyExists'
      security:
      - OAuth:
        - projects:write
      tags:
      - projects
  /projects/{projectID}:
    delete:
      description: Archives a project.
      operationId: archiveProject
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      responses:
        "204":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - projects:write
      tags:
      - projects
    get:
      description: Returns a specific project.
      operationId: getProject
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/project'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - projects:read
      tags:
      - projects
    patch:
      description: Updates the project.
      operationId: updateProject
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/updateProjectInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/project'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - projects:write
      tags:
      - projects
  /projects/{projectID}/agent-markdown-history:
    get:
      description: Returns the version history of agent markdown edits for a project.
      operationId: listAgentMarkdownHistory
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listAgentMarkdownHistoryOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - projects:read
      tags:
      - projects
  /projects/{projectID}/assets:
    get:
      description: Returns the list of assets at their latest revision
      operationId: listAssets
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: query
        name: archived
        schema:
          type: boolean
      - description: Filter assets by name
        in: query
        name: name
        schema:
          type: string
      - description: Filter assets by name or description
        in: query
        name: text
        schema:
          type: string
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listAssetsOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - assets:read
      tags:
      - assets
    post:
      description: Creates a new asset for a project.
      operationId: createAsset
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createAssetInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/asset'
          description: Created
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "409":
          $ref: '#/components/responses/alreadyExists'
      security:
      - OAuth:
        - assets:write
      tags:
      - assets
  /projects/{projectID}/assets/{assetID}:
    get:
      description: Returns the latest revision of a specific asset.
      operationId: getAsset
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: assetID
        required: true
        schema:
          $ref: '#/components/schemas/assetID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/asset'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - assets:read
      tags:
      - assets
    patch:
      description: Updates the name and/or description of an asset across all revisions.
      operationId: updateAsset
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: assetID
        required: true
        schema:
          $ref: '#/components/schemas/assetID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/updateAssetInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/asset'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - assets:write
      tags:
      - assets
  /projects/{projectID}/assets/{assetID}/archive:
    post:
      description: Archives an asset.
      operationId: archiveAsset
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: assetID
        required: true
        schema:
          $ref: '#/components/schemas/assetID'
      responses:
        "204":
          description: No Content
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - assets:write
      tags:
      - assets
  /projects/{projectID}/assets/{assetID}/builds:
    get:
      description: Lists the builds referencing a given asset.
      operationId: listBuildsForAsset
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: assetID
        required: true
        schema:
          $ref: '#/components/schemas/assetID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listAssetBuildsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - assets:read
      tags:
      - assets
  /projects/{projectID}/assets/{assetID}/restore:
    post:
      description: Restores an archived asset.
      operationId: restoreAsset
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: assetID
        required: true
        schema:
          $ref: '#/components/schemas/assetID'
      responses:
        "204":
          description: No Content
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - assets:write
      tags:
      - assets
  /projects/{projectID}/assets/{assetID}/revisions:
    get:
      description: Returns all the revisions of a specific asset.
      operationId: listAssetRevisions
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: assetID
        required: true
        schema:
          $ref: '#/components/schemas/assetID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listAssetRevisionsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - assets:read
      tags:
      - assets
    post:
      description: Creates a new asset revision.
      operationId: reviseAsset
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: assetID
        required: true
        schema:
          $ref: '#/components/schemas/assetID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/reviseAssetInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/asset'
          description: Created
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - assets:write
      tags:
      - assets
  /projects/{projectID}/assets/{assetID}/revisions/{assetRevision}:
    get:
      description: Returns a specified revision of an asset.
      operationId: getAssetRevision
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: assetID
        required: true
        schema:
          $ref: '#/components/schemas/assetID'
      - in: path
        name: assetRevision
        required: true
        schema:
          $ref: '#/components/schemas/assetRevision'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/asset'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - assets:read
      tags:
      - assets
  /projects/{projectID}/assets/{assetID}/revisions/{assetRevision}/builds:
    get:
      description: Lists the builds referencing a given asset revision.
      operationId: listBuildsForAssetRevision
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: assetID
        required: true
        schema:
          $ref: '#/components/schemas/assetID'
      - in: path
        name: assetRevision
        required: true
        schema:
          $ref: '#/components/schemas/assetRevision'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listAssetBuildsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - assets:read
      tags:
      - assets
  /projects/{projectID}/batches:
    get:
      description: List the batches.
      operationId: listBatches
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - description: Filter based on branch_id, build_id, system_id, created_at, status,
          metrics_status, batch_id, runner_type, blueprint, blueprint_version. blueprint_version
          may only be used alongside blueprint.
        example: branch_id = "71b96a67-9990-426b-993e-0f3d9c6bbe48" AND created_at
          > "2024-01-01T00:00:00Z"
        in: query
        name: search
        schema:
          type: string
      - description: Filter batches by a text string on batch name and build version
        in: query
        name: text
        schema:
          type: string
      - description: Filter batches to those with (true) or without (false) at least
          one completed log analysis. Omit to return all batches.
        in: query
        name: hasLogAnalysis
        schema:
          type: boolean
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBatchesOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
    post:
      description: Adds a batch.  ID should be omitted and will be returned in the
        response.
      operationId: CreateBatch
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/batchInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/batch'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "402":
          $ref: '#/components/responses/insufficientQuota'
      security:
      - OAuth:
        - batches:write
      tags:
      - batches
  /projects/{projectID}/batches/-/jobs:
    get:
      description: List jobs across all batches in a project
      operationId: listAllJobs
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - description: Filter based on attributes metrics_build_name and metrics_build_version
        example: metrics_build_name IN ("hello world") AND metrics_build_version IN
          ("1.0", "1.1")
        in: query
        name: search
        schema:
          type: string
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listAllJobsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}:
    get:
      description: Returns a batch.
      operationId: getBatch
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/batch'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
    patch:
      description: Updates the batch.
      operationId: updateBatch
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/updateBatchInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/batch'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/:cancel:
    post:
      description: Cancels a batch.
      operationId: cancelBatch
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      responses:
        "200":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/close:
    post:
      description: Closes a light batch, marking batch metrics tasks as pending.
      operationId: closeBatch
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      responses:
        "204":
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - light batches
  /projects/{projectID}/batches/{batchID}/compare/{otherBatchID}:
    get:
      description: Get a summary describing how individual tests have changed between
        the two given batches. A warning or a blocking failure is considered failing
        from the point of view of filters and ordering.
      operationId: compareBatches
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - description: the batch to compare to
        in: path
        name: otherBatchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - description: filter tests by their status
        in: query
        name: status
        schema:
          $ref: '#/components/schemas/compareBatchesStatusFilter'
      - description: filter tests by their name
        in: query
        name: search
        schema:
          type: string
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/compareBatchesOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/errors:
    get:
      description: Returns the errors associated with a given batch ID
      operationId: listBatchErrors
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - $ref: '#/components/parameters/runCounterQuery'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBatchErrorsOutput'
          description: OK
        "204":
          description: No errors found for batch
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
      - errors
  /projects/{projectID}/batches/{batchID}/jobs:
    get:
      description: List the jobs in the given batch.
      operationId: listJobs
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - description: Filter jobs by status
        in: query
        name: status
        schema:
          $ref: '#/components/schemas/jobStatus'
      - description: Filter jobs by their conflated status
        explode: false
        in: query
        name: conflatedStatus
        schema:
          items:
            $ref: '#/components/schemas/conflatedJobStatus'
          type: array
      - description: Filter experiences (in job) by name
        in: query
        name: name
        schema:
          type: string
      - description: Filter experiences (in job) by a text string on name and description
        in: query
        name: text
        schema:
          type: string
      - description: Filter jobs by the tag id(s) attached to the experience
        explode: false
        in: query
        name: experienceTagIDs
        schema:
          items:
            format: uuid
            type: string
          type: array
      - description: Filter jobs to those with (true) or without (false) a completed
          log analysis. Omit to return all jobs.
        in: query
        name: hasLogAnalysis
        schema:
          type: boolean
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listJobsOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
    post:
      description: Creates a job within a light batch. The batch must be of type LIGHT.
        Either a name (to get-or-create an experience) or an experienceID must be
        provided.
      operationId: createJobForBatch
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createJobForBatchInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/job'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - batches:write
      tags:
      - light batches
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}:
    get:
      description: Retrieve the given job.
      operationId: getJob
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - $ref: '#/components/parameters/runCounterQuery'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/job'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
    patch:
      description: Updates the job.
      operationId: updateJob
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/updateJobInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/job'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/close:
    post:
      description: Closes a job in a light batch, marking it as succeeded or errored.
      operationId: closeJob
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/closeJobInput'
      responses:
        "204":
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - light batches
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/containerStatus:
    get:
      description: Gets the current container statuses for a running job
      operationId: getContainerStatus
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/getContainerStatusOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/eventMetrics:
    get:
      description: Lists the metrics for a given job. Does not return associated data.
      operationId: listEventMetricsForJob
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - description: Filter metrics by a text string on name and description
        in: query
        name: text
        schema:
          type: string
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listJobMetricsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
      - metrics
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/eventTags:
    get:
      description: Lists the event tags for a given job.
      operationId: listEventTagsForJob
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - description: Filter event tags by name
        in: query
        name: name
        schema:
          type: string
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listJobEventTagsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
      - metrics
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/events:
    get:
      description: Lists the events for a given job. Does not return associated data.
      operationId: listEventsForJob
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - description: Tags on which to filter the events
        in: query
        name: eventTags
        schema:
          $ref: '#/components/schemas/eventTags'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/runCounterQuery'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listJobEventsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
      - metrics
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/events/{eventID}:
    get:
      description: Retrieve a single event. Does not return associated data.
      operationId: getEventForJob
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - in: path
        name: eventID
        required: true
        schema:
          $ref: '#/components/schemas/eventID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/event'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
      - metrics
    patch:
      description: Updates the event.
      operationId: updateEvent
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - in: path
        name: eventID
        required: true
        schema:
          $ref: '#/components/schemas/eventID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/updateEventInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/event'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - batches
      - metrics
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/experienceinputfiles:
    get:
      description: List the input files staged from the experience's locations for
        a given job run (name and size). Does not cover assets, task-to-task handoffs,
        or custom data-flow inputs.
      operationId: listExperienceInputFilesForJob
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - description: Return the input files for this run of the job. Defaults to the
          job's current run.
        in: query
        name: runCounter
        schema:
          $ref: '#/components/schemas/runCounter'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listJobExperienceInputFilesOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/logStream/{logName}:
    get:
      description: Streams a log for a given job/container
      operationId: getLogStream
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - in: path
        name: logName
        required: true
        schema:
          $ref: '#/components/schemas/fileName'
      responses:
        "200":
          content:
            application/octet-stream:
              schema:
                format: binary
                type: string
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/logs:
    get:
      description: List the logs associated with a given job
      operationId: listJobLogsForJob
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - in: query
        name: type
        schema:
          items:
            $ref: '#/components/schemas/logType'
          type: array
      - description: Filter logs by name
        in: query
        name: name
        schema:
          type: string
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/runCounterQuery'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listJobLogsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
    post:
      description: Creates a log entry for a job and returns a presigned S3 upload
        URL. The batch must be of type LIGHT and the job must be in EXPERIENCE_RUNNING
        status. When logType is omitted, it is inferred from the file name.
      operationId: createJobLog
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createJobLogInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/createJobLogOutput'
          description: Created
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - light batches
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/logs/{logID}:
    delete:
      description: Deletes a log.
      operationId: deleteJobLog
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - in: path
        name: logID
        required: true
        schema:
          $ref: '#/components/schemas/logID'
      responses:
        "204":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - batches
    get:
      description: Get an individual log file
      operationId: getJobLog
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - in: path
        name: logID
        required: true
        schema:
          $ref: '#/components/schemas/logID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/jobLog'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/metrics:
    get:
      description: Lists the metrics for a given job. Does not return associated data.
      operationId: listMetricsForJob
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listJobMetricsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
      - metrics
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/metrics/{metricID}:
    get:
      description: Lists the metrics associated with given metric IDs
      operationId: listMetricsForMetricIDs
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - explode: false
        in: path
        name: metricID
        required: true
        schema:
          items:
            $ref: '#/components/schemas/metricID'
          minItems: 1
          type: array
        style: simple
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listJobMetricsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
      - metrics
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/metrics/{metricID}/metricsData:
    get:
      description: Returns the metrics data associated with given metric ID(s)
      operationId: listMetricsDataForMetricIDs
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - explode: false
        in: path
        name: metricID
        required: true
        schema:
          items:
            $ref: '#/components/schemas/metricID'
          minItems: 1
          type: array
        style: simple
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listMetricsDataAndMetricIDOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
      - metrics
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/metrics/{metricID}/tags:
    get:
      description: List the tags associated to the given job metric id(s)
      operationId: listTagsForJobMetrics
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - explode: false
        in: path
        name: metricID
        required: true
        schema:
          items:
            $ref: '#/components/schemas/metricID'
          minItems: 1
          type: array
        style: simple
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listTagsForJobMetricsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - metrics
      - tags
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/metricsData:
    get:
      description: Returns the metrics data associated with a given job ID
      operationId: listMetricsDataForJob
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listJobMetricsDataOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
      - metrics
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/metricsData/{metricsDataID}:
    get:
      description: Lists the metrics data associated with given metrics data IDs
      operationId: listMetricsDataForMetricsDataIDs
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      - explode: false
        in: path
        name: metricsDataID
        required: true
        schema:
          items:
            $ref: '#/components/schemas/metricsDataID'
          minItems: 1
          type: array
        style: simple
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listJobMetricsDataOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
      - metrics
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/runs:
    get:
      description: |
        List the runs this job actually reached, oldest first, for labelling a run
        selector. metricsStatus is absent for runs that finished before per-run
        results were recorded; such a run has no known result and must not be shown
        as passing.
      operationId: listJobRuns
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listJobRunsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/jobs/{jobID}/usage:
    get:
      description: |
        Returns runtime usage for the given job, one row per run
        (run_counter) of the job. All quantities are integer base units:
        seconds for durations (vcpu/gpu/memory-seconds are the resource
        multiplied by the task's total wall-clock seconds), bytes for
        storage and transfer.
      operationId: getJobUsage
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: jobID
        required: true
        schema:
          $ref: '#/components/schemas/jobID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/jobUsageOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/logs:
    get:
      description: List the logs associated with a given batch
      operationId: listBatchLogsForBatch
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBatchLogsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/logs/{logID}:
    delete:
      description: Deletes a log.
      operationId: deleteBatchLog
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: logID
        required: true
        schema:
          $ref: '#/components/schemas/logID'
      responses:
        "204":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - batches
    get:
      description: Get an individual log file
      operationId: getBatchLog
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - in: path
        name: logID
        required: true
        schema:
          $ref: '#/components/schemas/logID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/batchLog'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/logs/streams:
    get:
      description: Get the active log streams for a given batch
      operationId: listBatchLogStreams
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBatchLogStreamsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/metrics:
    get:
      description: Lists the (batch) metrics for a given batch. Does not return associated
        data.
      operationId: listBatchMetrics
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBatchMetricsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
      - metrics
  /projects/{projectID}/batches/{batchID}/metrics/{metricID}:
    get:
      description: Lists the batch metrics associated with given batch metric IDs
      operationId: listBatchMetricsForBatchMetricIDs
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - explode: false
        in: path
        name: metricID
        required: true
        schema:
          items:
            $ref: '#/components/schemas/metricID'
          minItems: 1
          type: array
        style: simple
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBatchMetricsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
      - metrics
  /projects/{projectID}/batches/{batchID}/metrics/{metricID}/metricsData:
    get:
      description: Returns the batch metrics data associated with given batch metric
        ID(s)
      operationId: listBatchMetricsDataForBatchMetricIDs
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - explode: false
        in: path
        name: metricID
        required: true
        schema:
          items:
            $ref: '#/components/schemas/metricID'
          minItems: 1
          type: array
        style: simple
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBatchMetricsDataForBatchMetricIDsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
      - metrics
  /projects/{projectID}/batches/{batchID}/metrics/{metricID}/tags:
    get:
      description: List the tags associated to the given metric id(s)
      operationId: listTagsForBatchMetrics
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - explode: false
        in: path
        name: metricID
        required: true
        schema:
          items:
            $ref: '#/components/schemas/metricID'
          minItems: 1
          type: array
        style: simple
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listTagsForBatchMetricsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - metrics
      - tags
  /projects/{projectID}/batches/{batchID}/metricsData:
    get:
      description: Returns the metrics data associated with a given batch ID
      operationId: listBatchMetricsData
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBatchMetricsDataOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
      - metrics
  /projects/{projectID}/batches/{batchID}/metricsData/{metricsDataID}:
    get:
      description: Lists the batch metrics data associated with given batch metrics
        data IDs
      operationId: listBatchMetricsDataForBatchMetricsDataIDs
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - explode: false
        in: path
        name: metricsDataID
        required: true
        schema:
          items:
            $ref: '#/components/schemas/metricsDataID'
          minItems: 1
          type: array
        style: simple
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBatchMetricsDataOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
      - metrics
  /projects/{projectID}/batches/{batchID}/rerun:
    post:
      description: Rerun a batch
      operationId: rerunBatch
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/rerunBatchInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/rerunBatchOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
        "409":
          $ref: '#/components/responses/conflict'
      security:
      - OAuth:
        - batches:write
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/runs:
    get:
      description: List the runs this batch actually reached, oldest first.
      operationId: listBatchRuns
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBatchRunsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/suggestions:
    get:
      description: Returns a list of suggested batches to A/B compare against
      operationId: getBatchSuggestions
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/batchSuggestionsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/usage:
    get:
      description: |
        Returns one page of per-test runtime usage for the given batch: one row
        per (job, run) for the page's tests, ordered by experience name then job
        id. Each row carries
        the compute meters (orchestration/cpu/gpu/memory seconds) and rerun-side
        storage bytes. All quantities are integer base units (seconds for
        durations, bytes for storage). Whole-batch totals are served
        separately by getBatchUsageTotals.
      operationId: getBatchUsage
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/batchUsageOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/batches/{batchID}/usage/totals:
    get:
      description: |
        Returns whole-batch runtime usage totals for the given batch: the
        compute meters (orchestration/cpu/gpu/memory seconds) summed across
        every test, plus total rerun-side log storage bytes. All quantities are
        integer base units. Metrics-compute scan bytes, data-lake storage, and
        the batch-processes breakdown are added downstream in the BFF. Per-test
        detail is served separately (paginated) by getBatchUsage.
      operationId: getBatchUsageTotals
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: batchID
        required: true
        schema:
          $ref: '#/components/schemas/batchID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/batchUsageTotalsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/batches/accounts:
    get:
      description: Get all the account names that have triggered batches in the given
        project. These usernames are collected automatically from CI systems.
      operationId: listBatchAccounts
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - description: Filter by the account name
        in: query
        name: name
        schema:
          type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listUsersOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/batches/light:
    post:
      description: Creates a light batch with no jobs, intended for externally-run
        batches.
      operationId: CreateLightBatch
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/lightBatchInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/batch'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "402":
          $ref: '#/components/responses/insufficientQuota'
      security:
      - OAuth:
        - batches:write
      tags:
      - light batches
  /projects/{projectID}/batches/lookup/name/{friendlyName}/:
    get:
      description: Looks up a batch by friendly name. Returns the most recent batch
        with the given name.
      operationId: lookupLatestBatchByName
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: friendlyName
        required: true
        schema:
          $ref: '#/components/schemas/friendlyName'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/batchID'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/branches:
    get:
      description: Returns the list of branches for a project.
      operationId: listBranchesForProject
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - description: Filter branches by name. It is recommended to use orderBy=rank
          with this so the closest matches surface first. When orderBy=rank is set
          without a name, the 'main' branch is bubbled to the top.
        in: query
        name: name
        schema:
          type: string
      - description: Filter branches by branchType
        in: query
        name: branchType
        schema:
          $ref: '#/components/schemas/branchType'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - in: query
        name: orderBy
        schema:
          default: id
          enum:
          - id
          - timestamp
          - rank
          - activity
          type: string
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBranchesOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - projects:read
      tags:
      - projects
    post:
      description: Adds a branch for a project.
      operationId: createBranchForProject
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createBranchInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/branch'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "409":
          $ref: '#/components/responses/alreadyExists'
      security:
      - OAuth:
        - projects:write
      tags:
      - projects
  /projects/{projectID}/branches/{branchID}:
    delete:
      description: Deletes a branch for a project.
      operationId: deleteBranchForProject
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: branchID
        required: true
        schema:
          $ref: '#/components/schemas/branchID'
      responses:
        "204":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - projects:write
      tags:
      - projects
    get:
      description: Returns a specific branch for a project.
      operationId: getBranchForProject
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: branchID
        required: true
        schema:
          $ref: '#/components/schemas/branchID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/branch'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - projects:read
      tags:
      - projects
  /projects/{projectID}/branches/{branchID}/builds:
    get:
      description: Returns the list of builds for a branch.
      operationId: listBuildsForBranches
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - explode: false
        in: path
        name: branchID
        required: true
        schema:
          items:
            $ref: '#/components/schemas/branchID'
          minItems: 1
          type: array
        style: simple
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBuildsOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - builds:read
      tags:
      - builds
    post:
      description: Adds a build.
      operationId: createBuildForBranch
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: branchID
        required: true
        schema:
          $ref: '#/components/schemas/branchID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createBuildForBranchInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/build'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - builds:write
      tags:
      - builds
  /projects/{projectID}/branches/{branchID}/builds/{buildID}:
    delete:
      description: Delete a build.
      operationId: deleteBuildForBranch
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: branchID
        required: true
        schema:
          $ref: '#/components/schemas/branchID'
      - in: path
        name: buildID
        required: true
        schema:
          $ref: '#/components/schemas/buildID'
      responses:
        "204":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - builds:write
      tags:
      - builds
    get:
      description: Returns a specific build for a branch.
      operationId: getBuildForBranch
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: branchID
        required: true
        schema:
          $ref: '#/components/schemas/branchID'
      - in: path
        name: buildID
        required: true
        schema:
          $ref: '#/components/schemas/buildID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/build'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - builds:read
      tags:
      - builds
  /projects/{projectID}/branches/{branchID}/builds/{buildID}/batches:
    get:
      description: Returns the batches for a build.
      operationId: listBatchesForBuilds
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: branchID
        required: true
        schema:
          $ref: '#/components/schemas/branchID'
      - explode: false
        in: path
        name: buildID
        required: true
        schema:
          items:
            $ref: '#/components/schemas/buildID'
          minItems: 1
          type: array
        style: simple
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBatchesOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/builds:
    get:
      description: Returns the list of builds.
      operationId: listBuilds
      parameters:
      - description: A search query. Supports searching by branch_id, system_id
        example: branch_id = "71b96a67-9990-426b-993e-0f3d9c6bbe48"
        in: query
        name: search
        schema:
          type: string
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - description: Filter builds by their name or description
        in: query
        name: text
        schema:
          type: string
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBuildsOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - builds:read
      tags:
      - builds
  /projects/{projectID}/builds/{buildID}:
    get:
      description: Returns a specific build.
      operationId: getBuild
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: buildID
        required: true
        schema:
          $ref: '#/components/schemas/buildID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/build'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - builds:read
      tags:
      - builds
    patch:
      description: Updates the build.
      operationId: updateBuild
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: buildID
        required: true
        schema:
          $ref: '#/components/schemas/buildID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/updateBuildInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/build'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - builds:write
      tags:
      - builds
  /projects/{projectID}/builds/{buildID}/assets:
    delete:
      description: Remove one or more assets from a build.
      operationId: removeAssetsFromBuild
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: buildID
        required: true
        schema:
          $ref: '#/components/schemas/buildID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/removeAssetsFromBuildInput'
      responses:
        "204":
          description: No Content
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - assets:write
      tags:
      - assets
    get:
      description: Lists the assets attached to a build.
      operationId: listAssetsForBuild
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: buildID
        required: true
        schema:
          $ref: '#/components/schemas/buildID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBuildAssetsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - assets:read
      tags:
      - assets
    post:
      description: Add one or more assets to a build.
      operationId: addAssetsToBuild
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: buildID
        required: true
        schema:
          $ref: '#/components/schemas/buildID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/addAssetsToBuildInput'
      responses:
        "201":
          description: Created
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
        "409":
          $ref: '#/components/responses/conflict'
      security:
      - OAuth:
        - assets:write
      tags:
      - assets
  /projects/{projectID}/builds/accounts:
    get:
      description: Get all the account names that have created builds in the given
        project. These usernames are collected automatically from CI systems.
      operationId: listBuildAccounts
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listUsersOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - builds:read
      tags:
      - builds
  /projects/{projectID}/experienceTags:
    get:
      description: Returns a list of all experience tags.
      operationId: listExperienceTags
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - description: Filter experience tags by name. It is recommended to use orderBy=rank,
          so you get the most relevant results first.
        in: query
        name: name
        schema:
          type: string
      - in: query
        name: orderBy
        schema:
          default: id
          enum:
          - id
          - timestamp
          - rank
          type: string
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listExperienceTagsOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - experienceTags:read
      tags:
      - experience tags
    post:
      description: Adds an experience tag.
      operationId: createExperienceTag
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createExperienceTagInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/experienceTag'
          description: Created
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "409":
          $ref: '#/components/responses/alreadyExists'
      security:
      - OAuth:
        - experienceTags:write
      tags:
      - experience tags
  /projects/{projectID}/experienceTags/{experienceTagID}:
    delete:
      description: Deletes an experience tag.
      operationId: deleteExperienceTag
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: experienceTagID
        required: true
        schema:
          $ref: '#/components/schemas/experienceTagID'
      responses:
        "204":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - experienceTags:write
      tags:
      - experience tags
    get:
      description: Returns a specific experience tag.
      operationId: getExperienceTag
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: experienceTagID
        required: true
        schema:
          $ref: '#/components/schemas/experienceTagID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/experienceTag'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - experienceTags:read
      tags:
      - experience tags
    patch:
      description: Updates the experience tag.  Experience membership cannot be changed
        with this method.
      operationId: updateExperienceTag
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: experienceTagID
        required: true
        schema:
          $ref: '#/components/schemas/experienceTagID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/updateExperienceTagInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/experienceTag'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - experienceTags:write
      tags:
      - experience tags
  /projects/{projectID}/experienceTags/{experienceTagID}/experiences:
    get:
      description: Returns a list of experiences with the given experience tag.
      operationId: listExperiencesWithExperienceTag
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: experienceTagID
        required: true
        schema:
          $ref: '#/components/schemas/experienceTagID'
      - description: Filter by archived status.
        in: query
        name: archived
        schema:
          type: boolean
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listExperiencesOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - experienceTags:read
      tags:
      - experience tags
  /projects/{projectID}/experienceTags/{experienceTagID}/experiences/{experienceID}:
    delete:
      description: Removes the given experience tag from the given experience.
      operationId: removeExperienceTagFromExperience
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: experienceTagID
        required: true
        schema:
          $ref: '#/components/schemas/experienceTagID'
      - in: path
        name: experienceID
        required: true
        schema:
          $ref: '#/components/schemas/experienceID'
      responses:
        "204":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - experienceTags:write
      tags:
      - experience tags
    post:
      description: Adds the given experience tag to the given experience.
      operationId: addExperienceTagToExperience
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: experienceTagID
        required: true
        schema:
          $ref: '#/components/schemas/experienceTagID'
      - in: path
        name: experienceID
        required: true
        schema:
          $ref: '#/components/schemas/experienceID'
      responses:
        "201":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
        "409":
          $ref: '#/components/responses/alreadyExists'
      security:
      - OAuth:
        - experienceTags:write
      tags:
      - experience tags
  /projects/{projectID}/experienceTags/addExperiences:
    post:
      description: Registers the given experiences as applicable for the experience
        tags
      operationId: addTagsToExperiences
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/addTagsToExperiencesInput'
      responses:
        "201":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
        "409":
          $ref: '#/components/responses/alreadyExists'
      security:
      - OAuth:
        - experienceTags:write
      tags:
      - experience tags
  /projects/{projectID}/experiences:
    get:
      description: Returns the list of experiences.
      operationId: listExperiences
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - description: Filter experiences by name
        in: query
        name: name
        schema:
          type: string
      - description: Filter experiences by a text string on experience name, experience
          description, or experience tag name
        in: query
        name: text
        schema:
          type: string
      - description: A search query. Supports searching by tag_id, test_suite_id,
          archived, profile, and system_id
        example: tag_id IN ("71b96a67-9990-426b-993e-0f3d9c6bbe48")
        in: query
        name: search
        schema:
          type: string
      - in: query
        name: archived
        schema:
          default: false
          type: boolean
      - description: If true, includes customFields in the response. Defaults to false
          to avoid performance issues when listing many experiences.
        in: query
        name: includeCustomFields
        schema:
          default: false
          type: boolean
      - $ref: '#/components/parameters/pageSizeUnbounded'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listExperiencesOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - experiences:read
      tags:
      - experiences
    post:
      description: Adds an experience.
      operationId: createExperience
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createExperienceInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/experience'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "409":
          $ref: '#/components/responses/alreadyExists'
      security:
      - OAuth:
        - experiences:write
      tags:
      - experiences
  /projects/{projectID}/experiences/{experienceID}:
    delete:
      description: Archives an experience.
      operationId: archiveExperience
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: experienceID
        required: true
        schema:
          $ref: '#/components/schemas/experienceID'
      responses:
        "204":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - experiences:write
      tags:
      - experiences
    get:
      description: Returns a specific experience.
      operationId: getExperience
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: experienceID
        required: true
        schema:
          $ref: '#/components/schemas/experienceID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/experience'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - experiences:read
      tags:
      - experiences
    patch:
      description: Updates the experience. When updating environment variables or
        custom fields, the entire array is replaced.
      operationId: updateExperience
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: experienceID
        required: true
        schema:
          $ref: '#/components/schemas/experienceID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/updateExperienceInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/experience'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - experiences:write
      tags:
      - experiences
  /projects/{projectID}/experiences/{experienceID}/debug:
    post:
      description: Reruns an experience in debug mode.
      operationId: debugExperience
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: experienceID
        required: true
        schema:
          $ref: '#/components/schemas/experienceID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/debugExperienceInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/debugExperienceOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - experiences
  /projects/{projectID}/experiences/{experienceID}/experienceTags:
    get:
      description: Returns a list of experience tags associated with a given experience.
      operationId: listExperienceTagsForExperience
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: experienceID
        required: true
        schema:
          $ref: '#/components/schemas/experienceID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listExperienceTagsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - experiences:read
      tags:
      - experiences
  /projects/{projectID}/experiences/{experienceID}/inputfiles:
    get:
      description: List the input files in the experience's most recently cached input
        data (name and size).
      operationId: listExperienceInputFilesForExperience
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: experienceID
        required: true
        schema:
          $ref: '#/components/schemas/experienceID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listExperienceInputFilesOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - experiences:read
      tags:
      - experiences
  /projects/{projectID}/experiences/{experienceID}/restore:
    post:
      description: Restores an experience.
      operationId: restoreExperience
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: experienceID
        required: true
        schema:
          $ref: '#/components/schemas/experienceID'
      responses:
        "204":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - experiences:write
      tags:
      - experiences
  /projects/{projectID}/experiences/{experienceID}/systems:
    get:
      description: Returns the systems for a given experience
      operationId: getSystemsForExperience
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: experienceID
        required: true
        schema:
          $ref: '#/components/schemas/experienceID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listSystemsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - experiences:read
      tags:
      - experiences
  /projects/{projectID}/experiences/archive:
    post:
      description: Archives multiple experiences in bulk.
      operationId: bulkArchiveExperiences
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/bulkArchiveExperiencesInput'
        required: true
      responses:
        "200":
          content:
            application/json:
              schema:
                type: integer
          description: Number of experiences successfully archived
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - experiences:write
      tags:
      - experiences
  /projects/{projectID}/experiences/customfields:
    get:
      description: Returns all custom field definitions with unique values for the
        project. Useful for populating filter dropdowns.
      operationId: listExperienceCustomFields
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - description: List of custom field types to filter by.
        explode: false
        in: query
        name: type
        schema:
          items:
            $ref: '#/components/schemas/customFieldValueType'
          type: array
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listExperienceCustomFieldsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - experiences:read
      tags:
      - experiences
  /projects/{projectID}/logs/{logID}:
    get:
      description: Get an individual log file by ID without requiring batch or job
        context
      operationId: getLogByID
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: logID
        required: true
        schema:
          $ref: '#/components/schemas/logID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/jobLog'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
  /projects/{projectID}/metricsBuilds:
    get:
      description: Returns the list of metrics builds.
      operationId: listMetricsBuilds
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - description: A search query. Supports searching by system_id
        example: system_id = "71b96a67-9990-426b-993e-0f3d9c6bbe48"
        in: query
        name: systemID
        schema:
          format: uuid
          type: string
      - description: Free text filter on the metrics build name.
        in: query
        name: text
        schema:
          type: string
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listMetricsBuildOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - builds:read
      tags:
      - metricsBuilds
    post:
      description: Adds a metrics build.
      operationId: createMetricsBuild
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createMetricsBuildInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/metricsBuild'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "409":
          $ref: '#/components/responses/alreadyExists'
      security:
      - OAuth:
        - builds:write
      tags:
      - metricsBuilds
  /projects/{projectID}/metricsBuilds/{metricsBuildID}:
    get:
      description: Returns a specific metrics build.
      operationId: getMetricsBuild
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: metricsBuildID
        required: true
        schema:
          $ref: '#/components/schemas/metricsBuildID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/metricsBuild'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - builds:read
      tags:
      - metricsBuilds
  /projects/{projectID}/metricsBuilds/{metricsBuildID}/systems:
    get:
      description: Returns the systems for a given metrics build
      operationId: getSystemsForMetricsBuild
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: metricsBuildID
        required: true
        schema:
          $ref: '#/components/schemas/metricsBuildID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listSystemsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - builds:read
      tags:
      - metricsBuilds
  /projects/{projectID}/profiles:
    get:
      description: Returns the list of service profiles.
      operationId: listServiceProfiles
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      responses:
        "200":
          content:
            application/json:
              schema:
                items:
                  type: string
                type: array
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - experiences:read
      tags:
      - experiences
  /projects/{projectID}/reports:
    get:
      description: List the reports.
      operationId: listReports
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - description: Filter based on branch_id, test_suite_id, created_at, status,
          associated_account
        example: branch_id = "71b96a67-9990-426b-993e-0f3d9c6bbe48" AND created_at
          > "2024-01-01T00:00:00Z"
        in: query
        name: search
        schema:
          type: string
      - description: Filter reports by a text string (only supports batch id as of
          3/21/2025)
        in: query
        name: text
        schema:
          type: string
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listReportsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - reports:read
      tags:
      - reports
    post:
      description: Adds a report. If the user supplies a name parameter, that name
        will be used, otherwise a name will be generated. The end timestamp is optional
        and will default to now(). The respectRevisionBoundary field enables strict
        report generation from only the defined testSuiteRevision.
      operationId: CreateReport
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/reportInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/report'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "402":
          $ref: '#/components/responses/insufficientQuota'
      security:
      - OAuth:
        - reports:write
      tags:
      - reports
  /projects/{projectID}/reports/{reportID}:
    get:
      description: Returns a report.
      operationId: getReport
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: reportID
        required: true
        schema:
          $ref: '#/components/schemas/reportID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/report'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - reports:read
      tags:
      - reports
  /projects/{projectID}/reports/{reportID}/logs:
    get:
      description: List the logs associated with a given report
      operationId: listLogsForReport
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: reportID
        required: true
        schema:
          $ref: '#/components/schemas/reportID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listReportLogsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - reports:read
      tags:
      - reports
  /projects/{projectID}/reports/{reportID}/logs/{logID}:
    get:
      description: Get an individual log file
      operationId: getReportLog
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: reportID
        required: true
        schema:
          $ref: '#/components/schemas/reportID'
      - in: path
        name: logID
        required: true
        schema:
          $ref: '#/components/schemas/logID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/reportLog'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - reports:read
      tags:
      - reports
  /projects/{projectID}/reports/{reportID}/metrics:
    get:
      description: Lists the metrics for a given report. Does not return associated
        data.
      operationId: listReportMetrics
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: reportID
        required: true
        schema:
          $ref: '#/components/schemas/reportID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listReportMetricsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - reports:read
      tags:
      - reports
      - metrics
  /projects/{projectID}/reports/{reportID}/metrics/{metricID}:
    get:
      description: Lists the report metrics associated with given report metric IDs
      operationId: listReportMetricsForReportMetricIDs
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: reportID
        required: true
        schema:
          $ref: '#/components/schemas/reportID'
      - explode: false
        in: path
        name: metricID
        required: true
        schema:
          items:
            $ref: '#/components/schemas/metricID'
          minItems: 1
          type: array
        style: simple
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listReportMetricsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - reports:read
      tags:
      - reports
      - metrics
  /projects/{projectID}/reports/{reportID}/metrics/{metricID}/metricsData:
    get:
      description: Returns the report metrics data associated with given report metric
        ID(s)
      operationId: listReportMetricsDataForReportMetricIDs
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: reportID
        required: true
        schema:
          $ref: '#/components/schemas/reportID'
      - explode: false
        in: path
        name: metricID
        required: true
        schema:
          items:
            $ref: '#/components/schemas/metricID'
          minItems: 1
          type: array
        style: simple
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listReportMetricsDataForReportMetricIDsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - reports:read
      tags:
      - reports
      - metrics
  /projects/{projectID}/reports/{reportID}/metrics/{metricID}/tags:
    get:
      description: Lists the tags associated with given report metric IDs
      operationId: listTagsForReportMetrics
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: reportID
        required: true
        schema:
          $ref: '#/components/schemas/reportID'
      - explode: false
        in: path
        name: metricID
        required: true
        schema:
          items:
            $ref: '#/components/schemas/metricID'
          minItems: 1
          type: array
        style: simple
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listTagsForReportMetricsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - reports:read
      tags:
      - reports
      - metrics
  /projects/{projectID}/reports/{reportID}/metricsData:
    get:
      description: Returns the metrics data associated with a given report ID
      operationId: listReportMetricsData
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: reportID
        required: true
        schema:
          $ref: '#/components/schemas/reportID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listReportMetricsDataOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - reports:read
      tags:
      - reports
      - metrics
  /projects/{projectID}/reports/{reportID}/metricsData/{metricsDataID}:
    get:
      description: Lists the report metrics data associated with given report metrics
        data IDs
      operationId: listReportMetricsDataForReportMetricsDataIDs
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: reportID
        required: true
        schema:
          $ref: '#/components/schemas/reportID'
      - explode: false
        in: path
        name: metricsDataID
        required: true
        schema:
          items:
            $ref: '#/components/schemas/metricsDataID'
          minItems: 1
          type: array
        style: simple
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listReportMetricsDataOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - reports:read
      tags:
      - reports
      - metrics
  /projects/{projectID}/reports/accounts:
    get:
      description: Get all the account names that have triggered reports in the given
        project. These usernames are collected automatically from CI systems.
      operationId: listReportAccounts
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listUsersOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - reports:read
      tags:
      - reports
  /projects/{projectID}/suites:
    get:
      description: Returns the list of test suites at their latest revision
      operationId: listTestSuites
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - description: Only return test suites that contain the given experience id(s)
        explode: false
        in: query
        name: experienceIDs
        schema:
          items:
            $ref: '#/components/schemas/experienceID'
          minItems: 1
          type: array
        style: form
      - description: Only return test suites that contain the given system id
        in: query
        name: systemID
        schema:
          format: uuid
          type: string
      - in: query
        name: archived
        schema:
          type: boolean
      - description: Filter test suites by name
        in: query
        name: name
        schema:
          type: string
      - description: Filter test suites by a text string on name and description
        in: query
        name: text
        schema:
          type: string
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listTestSuiteOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - batches:read
      tags:
      - test_suites
    post:
      description: Adds a test suite for a project.
      operationId: createTestSuite
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createTestSuiteInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/testSuite'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "409":
          $ref: '#/components/responses/alreadyExists'
      security:
      - OAuth:
        - batches:write
      tags:
      - test_suites
  /projects/{projectID}/suites/{testSuiteID}:
    delete:
      description: Archives a test suite.
      operationId: archiveTestSuite
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: testSuiteID
        required: true
        schema:
          $ref: '#/components/schemas/testSuiteID'
      responses:
        "204":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - test_suites
    get:
      description: Returns a specific test suite's latest revision.
      operationId: getTestSuite
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: testSuiteID
        required: true
        schema:
          $ref: '#/components/schemas/testSuiteID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/testSuite'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - test_suites
    patch:
      description: Revise a test suite, generating a new revision. Supply a false
        value for ad-hoc to convert an existing ad hoc test suite to a full test suite.
      operationId: reviseTestSuite
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: testSuiteID
        required: true
        schema:
          $ref: '#/components/schemas/testSuiteID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/reviseTestSuiteInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/testSuite'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - test_suites
  /projects/{projectID}/suites/{testSuiteID}/addExperiences:
    patch:
      description: Add experiences to a test suite. This will generate a new test
        suite revision.
      operationId: addExperiencesToTestSuite
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: testSuiteID
        required: true
        schema:
          $ref: '#/components/schemas/testSuiteID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/selectExperiencesInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/testSuite'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - test_suites
  /projects/{projectID}/suites/{testSuiteID}/batches:
    get:
      description: List the batches for a test suite (all revisions).
      operationId: listBatchesForTestSuite
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: testSuiteID
        required: true
        schema:
          $ref: '#/components/schemas/testSuiteID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBatchesOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
    post:
      description: Creates a batch for that test suite
      operationId: CreateBatchForTestSuite
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: testSuiteID
        required: true
        schema:
          $ref: '#/components/schemas/testSuiteID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/testSuiteBatchInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/batch'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "402":
          $ref: '#/components/responses/insufficientQuota'
      security:
      - OAuth:
        - batches:write
      tags:
      - batches
  /projects/{projectID}/suites/{testSuiteID}/removeExperiences:
    patch:
      description: Remove experiences from a test suite. This will generate a new
        test suite revision.
      operationId: removeExperiencesFromTestSuite
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: testSuiteID
        required: true
        schema:
          $ref: '#/components/schemas/testSuiteID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/selectExperiencesInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/testSuite'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - test_suites
  /projects/{projectID}/suites/{testSuiteID}/restore:
    post:
      description: Restores a test suite.
      operationId: restoreTestSuite
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: testSuiteID
        required: true
        schema:
          $ref: '#/components/schemas/testSuiteID'
      responses:
        "204":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - test_suites
  /projects/{projectID}/suites/{testSuiteID}/revisions:
    get:
      description: Returns all the revisions of a specific test suite.
      operationId: listTestSuiteRevisions
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: testSuiteID
        required: true
        schema:
          $ref: '#/components/schemas/testSuiteID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listTestSuiteRevisionsOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - test_suites
  /projects/{projectID}/suites/{testSuiteID}/revisions/{revision}:
    get:
      description: Returns a specified revision of a test suite.
      operationId: getTestSuiteRevision
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: testSuiteID
        required: true
        schema:
          $ref: '#/components/schemas/testSuiteID'
      - in: path
        name: revision
        required: true
        schema:
          $ref: '#/components/schemas/testSuiteRevision'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/testSuite'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:read
      tags:
      - test_suites
  /projects/{projectID}/suites/{testSuiteID}/revisions/{revision}/batches:
    get:
      description: List the batches for a test suite revision
      operationId: listBatchesForTestSuiteRevision
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: testSuiteID
        required: true
        schema:
          $ref: '#/components/schemas/testSuiteID'
      - in: path
        name: revision
        required: true
        schema:
          $ref: '#/components/schemas/testSuiteRevision'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBatchesOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - batches:read
      tags:
      - batches
    post:
      description: Creates a batch for that test suite revision
      operationId: CreateBatchForTestSuiteRevision
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: testSuiteID
        required: true
        schema:
          $ref: '#/components/schemas/testSuiteID'
      - in: path
        name: revision
        required: true
        schema:
          $ref: '#/components/schemas/testSuiteRevision'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/testSuiteBatchInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/batch'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "402":
          $ref: '#/components/responses/insufficientQuota'
      security:
      - OAuth:
        - batches:write
      tags:
      - batches
  /projects/{projectID}/suites/addExperiences:
    post:
      description: Add experiences to test suites. This will generate a new test suite
        revision.
      operationId: addTestSuitesToExperiences
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/addSuitesToExperiencesInput'
      responses:
        "201":
          description: Created
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - batches:write
      tags:
      - test_suites
  /projects/{projectID}/suites/summary:
    get:
      description: Returns an overview of test suites and high-level performance data.
        A test suite will only be returned if it has 1 or more reports on the main
        branch assocated to it.
      operationId: getTestSuiteSummary
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/testSuiteSummaryOutput'
          description: OK
      security:
      - OAuth:
        - batches:read
      tags:
      - test_suites
  /projects/{projectID}/sweeps:
    get:
      description: Returns the list of parameter sweeps.
      operationId: listParameterSweeps
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listParameterSweepsOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - sweeps:read
      tags:
      - parameterSweeps
    post:
      description: Adds a parameter sweep.  ID should be omitted and will be returned
        in the response.
      operationId: createParameterSweep
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/parameterSweepInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/parameterSweep'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - sweeps:write
      tags:
      - parameterSweeps
  /projects/{projectID}/sweeps/{sweepID}:
    get:
      description: Returns a specific parameter sweep.
      operationId: getParameterSweep
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: sweepID
        required: true
        schema:
          $ref: '#/components/schemas/parameterSweepID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/parameterSweep'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - sweeps:read
      tags:
      - parameterSweeps
  /projects/{projectID}/sweeps/{sweepID}/:cancel:
    post:
      description: Cancels a parameter sweep.
      operationId: cancelParameterSweep
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: sweepID
        required: true
        schema:
          $ref: '#/components/schemas/parameterSweepID'
      responses:
        "200":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - sweeps:write
      tags:
      - parameterSweeps
  /projects/{projectID}/sweeps/accounts:
    get:
      description: Get all the account names that have triggered sweeps in the given
        project. These usernames are collected automatically from CI systems.
      operationId: listSweepAccounts
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listUsersOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - sweeps:read
      tags:
      - parameterSweeps
  /projects/{projectID}/systems:
    get:
      description: Returns the list of systems.
      operationId: listSystems
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - description: Filter systems by name
        in: query
        name: name
        schema:
          type: string
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listSystemsOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - systems:read
      tags:
      - systems
    post:
      description: Adds a system.
      operationId: createSystem
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createSystemInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/system'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "409":
          $ref: '#/components/responses/alreadyExists'
      security:
      - OAuth:
        - systems:write
      tags:
      - systems
  /projects/{projectID}/systems/{systemID}:
    delete:
      description: Archives a system.
      operationId: archiveSystem
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: systemID
        required: true
        schema:
          $ref: '#/components/schemas/systemID'
      responses:
        "204":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - systems:write
      tags:
      - systems
    get:
      description: Returns a specific system.
      operationId: getSystem
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: systemID
        required: true
        schema:
          $ref: '#/components/schemas/systemID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/system'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - systems:read
      tags:
      - systems
    patch:
      description: Updates the system.
      operationId: updateSystem
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: systemID
        required: true
        schema:
          $ref: '#/components/schemas/systemID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/updateSystemInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/system'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - systems:write
      tags:
      - systems
  /projects/{projectID}/systems/{systemID}/builds:
    get:
      description: Returns the list of builds for a system.
      operationId: listBuildsForSystem
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: systemID
        required: true
        schema:
          $ref: '#/components/schemas/systemID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listBuildsOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - builds:read
      tags:
      - builds
    post:
      description: Adds a build.
      operationId: createBuildForSystem
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: systemID
        required: true
        schema:
          $ref: '#/components/schemas/systemID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createBuildForSystemInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/build'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - builds:write
      tags:
      - builds
  /projects/{projectID}/systems/{systemID}/builds/{buildID}:
    get:
      description: Returns a specific build for a system.
      operationId: getBuildForSystem
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: systemID
        required: true
        schema:
          $ref: '#/components/schemas/systemID'
      - in: path
        name: buildID
        required: true
        schema:
          $ref: '#/components/schemas/buildID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/build'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - builds:read
      tags:
      - builds
  /projects/{projectID}/systems/{systemID}/experiences:
    get:
      description: Returns a list of all experiences applicable to the system.
      operationId: listExperiencesForSystem
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: systemID
        required: true
        schema:
          $ref: '#/components/schemas/systemID'
      - description: Filter experiences by archived status
        in: query
        name: archived
        schema:
          type: boolean
      - description: If true, includes customFields in the response. Defaults to false
          to avoid performance issues when listing many experiences.
        in: query
        name: includeCustomFields
        schema:
          default: false
          type: boolean
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listExperiencesOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - systems:read
      tags:
      - systems
  /projects/{projectID}/systems/{systemID}/experiences/{experienceID}:
    delete:
      description: Deregisters the given experience as applicable for the system
      operationId: removeSystemFromExperience
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: systemID
        required: true
        schema:
          $ref: '#/components/schemas/systemID'
      - in: path
        name: experienceID
        required: true
        schema:
          $ref: '#/components/schemas/experienceID'
      responses:
        "204":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - systems:write
      tags:
      - systems
    post:
      description: Registers the given experience as applicable for the system
      operationId: addSystemToExperience
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: systemID
        required: true
        schema:
          $ref: '#/components/schemas/systemID'
      - in: path
        name: experienceID
        required: true
        schema:
          $ref: '#/components/schemas/experienceID'
      responses:
        "201":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
        "409":
          $ref: '#/components/responses/alreadyExists'
      security:
      - OAuth:
        - systems:write
      tags:
      - systems
  /projects/{projectID}/systems/{systemID}/metricsBuilds/{metricsBuildID}:
    delete:
      description: Deregisters the given metrics build as applicable for the system
      operationId: removeSystemFromMetricsBuild
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: systemID
        required: true
        schema:
          $ref: '#/components/schemas/systemID'
      - in: path
        name: metricsBuildID
        required: true
        schema:
          $ref: '#/components/schemas/metricsBuildID'
      responses:
        "204":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - systems:write
      tags:
      - systems
    post:
      description: Registers the given metrics build as applicable for the system
      operationId: addSystemToMetricsBuild
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: systemID
        required: true
        schema:
          $ref: '#/components/schemas/systemID'
      - in: path
        name: metricsBuildID
        required: true
        schema:
          $ref: '#/components/schemas/metricsBuildID'
      responses:
        "201":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
        "409":
          $ref: '#/components/responses/alreadyExists'
      security:
      - OAuth:
        - systems:write
      tags:
      - systems
  /projects/{projectID}/systems/addExperiences:
    post:
      description: Registers the given experiences as applicable for the systems
      operationId: addSystemsToExperiences
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/mutateSystemsToExperienceInput'
      responses:
        "201":
          description: Created
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
        "409":
          $ref: '#/components/responses/alreadyExists'
      security:
      - OAuth:
        - systems:write
      tags:
      - systems
  /projects/{projectID}/systems/removeExperiences:
    post:
      description: Removes the given experiences from association with the systems
      operationId: removeSystemsFromExperiences
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/mutateSystemsToExperienceInput'
      responses:
        "201":
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
        "409":
          $ref: '#/components/responses/alreadyExists'
      security:
      - OAuth:
        - systems:write
      tags:
      - systems
  /projects/{projectID}/workflows:
    get:
      description: Lists the workflows for a project.
      operationId: listWorkflows
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - description: Filter branches by name
        in: query
        name: name
        schema:
          type: string
      - description: Filter test suites by a text string on name and description
        in: query
        name: text
        schema:
          type: string
      - in: query
        name: archived
        schema:
          type: boolean
      - description: Filter workflows by test suite ID
        in: query
        name: testSuiteID
        schema:
          $ref: '#/components/schemas/testSuiteID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listWorkflowsOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - workflows:read
      tags:
      - workflows
    post:
      description: Creates a new workflow.
      operationId: createWorkflow
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createWorkflowInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/workflow'
          description: Created
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "409":
          $ref: '#/components/responses/alreadyExists'
      security:
      - OAuth:
        - workflows:write
      tags:
      - workflows
  /projects/{projectID}/workflows/{workflowID}:
    get:
      description: Gets a workflow by ID.
      operationId: getWorkflow
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: workflowID
        required: true
        schema:
          $ref: '#/components/schemas/workflowID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/workflow'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - workflows:read
      tags:
      - workflows
    patch:
      description: Updates a workflow.
      operationId: updateWorkflow
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: workflowID
        required: true
        schema:
          $ref: '#/components/schemas/workflowID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/updateWorkflowInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/workflow'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - workflows:write
      tags:
      - workflows
  /projects/{projectID}/workflows/{workflowID}/runs:
    get:
      description: Lists the runs for a workflow.
      operationId: listWorkflowRuns
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: workflowID
        required: true
        schema:
          $ref: '#/components/schemas/workflowID'
      - $ref: '#/components/parameters/pageSize'
      - $ref: '#/components/parameters/pageToken'
      - $ref: '#/components/parameters/orderBy'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listWorkflowRunsOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - workflows:read
      tags:
      - workflows
    post:
      description: Creates a new workflow run.
      operationId: createWorkflowRun
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: workflowID
        required: true
        schema:
          $ref: '#/components/schemas/workflowID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createWorkflowRunInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/workflowRun'
          description: Created
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - workflows:write
      tags:
      - workflows
  /projects/{projectID}/workflows/{workflowID}/runs/{workflowRunID}:
    get:
      description: Gets a workflow run by ID.
      operationId: getWorkflowRun
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: workflowID
        required: true
        schema:
          $ref: '#/components/schemas/workflowID'
      - in: path
        name: workflowRunID
        required: true
        schema:
          $ref: '#/components/schemas/workflowRunID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/workflowRun'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - workflows:read
      tags:
      - workflows
  /projects/{projectID}/workflows/{workflowID}/test_suites:
    delete:
      description: Removes test suites from a workflow.
      operationId: deleteWorkflowSuites
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: workflowID
        required: true
        schema:
          $ref: '#/components/schemas/workflowID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/deleteWorkflowSuitesInput'
      responses:
        "204":
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - workflows:write
      tags:
      - workflows
    get:
      description: Lists the suites for a workflow.
      operationId: listWorkflowSuites
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: workflowID
        required: true
        schema:
          $ref: '#/components/schemas/workflowID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/listWorkflowSuitesOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - workflows:read
      tags:
      - workflows
    patch:
      description: Updates workflow test suites.
      operationId: updateWorkflowSuites
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: workflowID
        required: true
        schema:
          $ref: '#/components/schemas/workflowID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/updateWorkflowSuitesInput'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/updateWorkflowSuitesOutput'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - workflows:write
      tags:
      - workflows
    post:
      description: Adds test suites to a workflow.
      operationId: createWorkflowSuites
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: workflowID
        required: true
        schema:
          $ref: '#/components/schemas/workflowID'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/createWorkflowSuitesInput'
      responses:
        "201":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/createWorkflowSuitesOutput'
          description: Created
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
        "409":
          $ref: '#/components/responses/conflict'
      security:
      - OAuth:
        - workflows:write
      tags:
      - workflows
  /projects/{projectID}/workflows/{workflowID}/test_suites/{testSuiteID}:
    get:
      description: Gets a specific workflow test suite.
      operationId: getWorkflowSuite
      parameters:
      - in: path
        name: projectID
        required: true
        schema:
          $ref: '#/components/schemas/projectID'
      - in: path
        name: workflowID
        required: true
        schema:
          $ref: '#/components/schemas/workflowID'
      - in: path
        name: testSuiteID
        required: true
        schema:
          $ref: '#/components/schemas/testSuiteID'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/workflowSuiteOutput'
          description: OK
        "401":
          $ref: '#/components/responses/unauthenticated'
        "404":
          $ref: '#/components/responses/notFound'
      security:
      - OAuth:
        - workflows:read
      tags:
      - workflows
  /quota:
    get:
      description: Get current quota usage and limits
      operationId: getQuota
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/getQuotaOutput'
          description: quota
      security:
      - OAuth:
        - batches:read
        - reports:read
  /validateExperienceLocation:
    post:
      description: Validates an experience location can be reached by ReSim.
      operationId: validateExperienceLocation
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/experienceLocation'
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/experienceLocationContents'
          description: OK
        "400":
          $ref: '#/components/responses/badRequest'
        "401":
          $ref: '#/components/responses/unauthenticated'
      security:
      - OAuth:
        - experiences:write
      tags:
      - experiences
servers:
- url: /v1
