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

# Read one verified screenshot, video or trace

> Requires current run.read. Reads only an exact capture member from the selected immutable bundle; never serves report HTML or arbitrary archive paths. Each member is at most 64 MiB. The complete canonical archive and member digest are verified, followed by fresh authorization, evidence identity and expiry checks. PNG and WebM may be previewed inline; ZIP is always an attachment. download=1 forces attachment. Supports one inclusive byte range after verification. A missing, expired, deleted or digest-mismatched selection returns 404; an invalid range returns 416. Video and traces are not redacted. Responses are private, no-store, nosniff and no-referrer.



## OpenAPI

````yaml /api-reference/openapi.json get /v1/projects/{projectId}/browser-runs/{runId}/artifacts/{artifactPath}
openapi: 3.1.0
info:
  title: Firedrill Control API
  version: 1.0.0
  description: >-
    The control plane for drills, drill runs, and the worlds they run in. Errors
    always carry the canonical envelope; unsafe operations require an
    Idempotency-Key; long work returns an operation resource.
servers:
  - url: https://api.firedrill.run
security:
  - controlCredential: []
tags:
  - name: authentication
    description: Sessions, CLI exchange, credentials, and verification keys.
    x-group: Authentication
  - name: organizations
    description: Organization members, billing, usage, retention, audit, and exports.
    x-group: Organizations
  - name: projects
    description: Project lifecycle, access, grants, and repository bindings.
    x-group: Projects
  - name: builds
    description: Immutable builds, uploads, source drafts, and world definitions.
    x-group: Builds and source
  - name: tools
    description: Project Tool discovery, approval, source, and revocation.
    x-group: Tool library
  - name: worlds
    description: >-
      Managed environments, world sessions, state, time, reset, faults, forks,
      and snapshots.
    x-group: Environments and sessions
  - name: runs
    description: >-
      Hosted runs, comparisons, attachments, reports, evidence bundles, sharing,
      and exports.
    x-group: Runs and evidence
  - name: browser
    description: Managed browser tests, runs, messages, streams, frames, and artifacts.
    x-group: Browser testing
  - name: callbacks
    description: Callback receiver approval, revocation, and signing material.
    x-group: Callbacks
  - name: github-ci
    description: >-
      GitHub installations, repository automation, CI suites, cases, evidence,
      and checks.
    x-group: GitHub and CI
  - name: authoring
    description: Authoring sessions, proposals, turns, and scenario proposals.
    x-group: Cloud authoring
paths:
  /v1/projects/{projectId}/browser-runs/{runId}/artifacts/{artifactPath}:
    get:
      tags:
        - browser
      summary: Read one verified screenshot, video or trace
      description: >-
        Requires current run.read. Reads only an exact capture member from the
        selected immutable bundle; never serves report HTML or arbitrary archive
        paths. Each member is at most 64 MiB. The complete canonical archive and
        member digest are verified, followed by fresh authorization, evidence
        identity and expiry checks. PNG and WebM may be previewed inline; ZIP is
        always an attachment. download=1 forces attachment. Supports one
        inclusive byte range after verification. A missing, expired, deleted or
        digest-mismatched selection returns 404; an invalid range returns 416.
        Video and traces are not redacted. Responses are private, no-store,
        nosniff and no-referrer.
      operationId: browserRuns.downloadCapture
      parameters:
        - name: projectId
          in: path
          required: true
          schema:
            type: string
            pattern: ^prj_[0-9a-z]{12,32}$
        - name: runId
          in: path
          required: true
          schema:
            type: string
            pattern: ^brun_[a-z0-9]{12,64}$
        - name: artifactPath
          in: path
          required: true
          schema:
            type: string
            pattern: ^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$
        - name: bundleSha256
          in: query
          required: true
          schema:
            type: string
            pattern: ^[a-f0-9]{64}$
        - name: download
          in: query
          required: false
          schema:
            type: string
            enum:
              - '1'
        - name: Range
          in: header
          required: false
          schema:
            type: string
            pattern: ^bytes=[0-9]+-[0-9]*$
      responses:
        '200':
          description: Exact verified capture bytes
          content:
            image/png:
              schema:
                type: string
                format: binary
            video/webm:
              schema:
                type: string
                format: binary
            application/zip:
              schema:
                type: string
                format: binary
        '206':
          description: >-
            Verified capture byte range; Content-Range identifies the inclusive
            range and complete byte size
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary
        '400':
          description: Canonical error envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: Canonical error envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Canonical error envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '404':
          description: Canonical error envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '409':
          description: Canonical error envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '416':
          description: >-
            Range is invalid or outside the complete capture; Content-Range
            contains bytes */size
        '429':
          description: Canonical error envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        default:
          description: Canonical error envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
components:
  schemas:
    ErrorEnvelope:
      type: object
      properties:
        code:
          type: string
          pattern: ^(control|world)\.[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$
        message:
          type: string
          minLength: 1
        correlationId:
          type: string
          minLength: 1
        retryable:
          type: boolean
        retryAfterMs:
          type: integer
          exclusiveMinimum: 0
          maximum: 9007199254740991
        operationId:
          type: string
        source:
          type: string
          enum:
            - platform
            - simulated_provider
        issues:
          type: array
          items:
            type: object
            properties:
              path:
                type: string
              code:
                type: string
              message:
                type: string
            required:
              - path
              - code
              - message
            additionalProperties: false
        details:
          type: object
          propertyNames:
            type: string
          additionalProperties: {}
        evidence:
          type: object
          properties:
            sessionId:
              type: string
            runId:
              type: string
            journalSeq:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            buildHash:
              type: string
          additionalProperties: false
      required:
        - code
        - message
        - correlationId
        - retryable
        - source
      additionalProperties: true
  securitySchemes:
    controlCredential:
      type: http
      scheme: bearer
      description: Opaque control credential

````