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

# Begin explicitly confirmed immutable local report upload

> Requires evidence.upload for the exact project. The selected gzip archive is limited to 64 MiB. Upload authority expires after 15 minutes. Replay the same idempotency key and exact digests after uncertainty; no report content is verified on this request path.



## OpenAPI

````yaml /api-reference/openapi.json post /v1/projects/{projectId}/local-reports
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}/local-reports:
    post:
      tags:
        - runs
      summary: Begin explicitly confirmed immutable local report upload
      description: >-
        Requires evidence.upload for the exact project. The selected gzip
        archive is limited to 64 MiB. Upload authority expires after 15 minutes.
        Replay the same idempotency key and exact digests after uncertainty; no
        report content is verified on this request path.
      operationId: localReports.beginUpload
      parameters:
        - name: projectId
          in: path
          required: true
          schema:
            type: string
            pattern: ^prj_[0-9a-z]{12,32}$
        - name: Idempotency-Key
          in: header
          required: true
          schema:
            type: string
            minLength: 8
            maxLength: 128
            pattern: ^[A-Za-z0-9._:-]+$
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BeginLocalReportUploadRequest'
      responses:
        '200':
          description: Existing upload
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocalReportUpload'
        '201':
          description: Upload reserved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocalReportUpload'
        default:
          description: Canonical error envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
components:
  schemas:
    BeginLocalReportUploadRequest:
      type: object
      properties:
        submissionDigest:
          type: string
          pattern: ^sha256:[0-9a-f]{64}$
          description: >-
            SHA-256 of the exact compressed archive selected and confirmed by
            the uploader.
        manifestDigest:
          type: string
          pattern: ^sha256:[0-9a-f]{64}$
          description: >-
            SHA-256 of the original manifest.json bytes, independently rechecked
            after extraction.
        bytes:
          type: integer
          minimum: 0
          exclusiveMinimum: true
          maximum: 67108864
      required:
        - submissionDigest
        - manifestDigest
        - bytes
      additionalProperties: false
    LocalReportUpload:
      type: object
      properties:
        report:
          type: object
          properties:
            schemaVersion:
              type: number
              enum:
                - 1
            localReportId:
              type: string
              pattern: ^lrep_[a-f0-9]{32}$
            organizationId:
              type: string
              pattern: ^org_[0-9a-z]{12,32}$
            projectId:
              type: string
              pattern: ^prj_[0-9a-z]{12,32}$
            submissionDigest:
              type: string
              pattern: ^sha256:[0-9a-f]{64}$
            manifestDigest:
              type: string
              pattern: ^sha256:[0-9a-f]{64}$
            archiveBytes:
              type: integer
              minimum: 0
              exclusiveMinimum: true
              maximum: 67108864
            state:
              type: string
              enum:
                - awaiting_upload
                - queued
                - verifying
                - available
                - failed
                - deleting
                - deleted
            provenance:
              type: object
              properties:
                origin:
                  type: string
                  enum:
                    - user_produced
                trust:
                  type: string
                  enum:
                    - unattested
                uploadedBy:
                  type: string
                  minLength: 1
                  maxLength: 255
              required:
                - origin
                - trust
                - uploadedBy
              additionalProperties: false
              description: >-
                Format/hash verification proves stored byte consistency only.
                Firedrill did not observe or attest this execution.
            summary:
              type: object
              properties:
                runId:
                  type: string
                  minLength: 1
                  maxLength: 255
                drillId:
                  type: string
                  minLength: 1
                  maxLength: 96
                  pattern: ^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$
                scenarioId:
                  type: string
                  minLength: 1
                  maxLength: 96
                  pattern: ^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$
                targetId:
                  type: string
                  minLength: 1
                  maxLength: 96
                  pattern: ^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$
                reportedBuildHash:
                  type: string
                  pattern: ^sha256:[0-9a-f]{64}$
                  description: >-
                    A user-produced report claim, not a hosted build
                    registration or execution attestation.
                reportedPackageLockHash:
                  type: string
                  pattern: ^sha256:[0-9a-f]{64}$
                seed:
                  type: string
                  minLength: 1
                  maxLength: 32
                reportedStatus:
                  type: string
                  minLength: 1
                  maxLength: 64
                reportedVerdict:
                  type: string
                  enum:
                    - passed
                    - failed
                    - inconclusive
                artifactCount:
                  type: integer
                  minimum: 6
                  maximum: 1024
                expandedBytes:
                  type: integer
                  minimum: 0
                  exclusiveMinimum: true
                  maximum: 268435456
                redacted:
                  type: boolean
              required:
                - runId
                - drillId
                - targetId
                - reportedBuildHash
                - reportedPackageLockHash
                - seed
                - reportedStatus
                - artifactCount
                - expandedBytes
                - redacted
              additionalProperties: false
            operationId:
              type: string
              pattern: ^op_[0-9a-z]{12,32}$
            failureCode:
              type: string
              maxLength: 128
            uploadExpiresAtMs:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            createdAtMs:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            updatedAtMs:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            verifiedAtMs:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            deletedAtMs:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
          required:
            - schemaVersion
            - localReportId
            - organizationId
            - projectId
            - submissionDigest
            - manifestDigest
            - archiveBytes
            - state
            - provenance
            - uploadExpiresAtMs
            - createdAtMs
            - updatedAtMs
          additionalProperties: false
        upload:
          type: object
          properties:
            method:
              type: string
              enum:
                - PUT
            uploadUrl:
              type: string
              format: uri
            headers:
              type: object
              additionalProperties:
                type: string
            expiresAtMs:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
          required:
            - method
            - uploadUrl
            - headers
            - expiresAtMs
          additionalProperties: false
      required:
        - report
      additionalProperties: false
    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

````