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

# Report what a runner's code review of a build did

> Records what a runner's code review of the build did, in the run log of the Code review automation: `reviewed` with the commit and the number of problems, `failed` when the code review could not run, with the runner's reason, or `skipped` with the reason the runner did not review. The row belongs to the build, so a second report for the same build updates it. `recorded` is `false` when the Code review automation is off: the gateway then stores no row. When the problems of a `reviewed` report cannot be stored, the answer is 503 (`review_not_stored`). Send the same report again: a review of one lease and commit is stored once. Other refusals: `claim_not_held` (403, another key holds the lease), `claim_expired` (410, no live lease) and `invalid_request_body` (400, the reason does not belong to the result).



## OpenAPI

````yaml /openapi.yaml post /v1/work-items/{workItemId}/claim/code-review
openapi: 3.0.3
info:
  contact:
    email: hello@outerlayer.ai
    url: https://www.outerlayer.ai
  description: >-
    The OuterLayer Gateway API lets you ingest coding-agent sessions and record
    evidence of work programmatically.


    Most teams reach it through the `outerlayer` CLI, which calls it for them.

    Call it directly to build your own integration or to automate what the
    dashboard does.


    Versioning: every endpoint is prefixed with `/v1/`. Breaking changes ship
    under a new version prefix (`/v2/`, etc.) with a 90-day-minimum deprecation
    window; anything additive lands on the current prefix.


    Vocabulary: the dashboard calls this API's `app` a **factory** — the unit
    that owns a set of repositories, the agent sessions worked on them, and the
    evidence they produce. They are the same entity. The API keeps `app` in its
    paths, headers, and field names because those are a published contract; only
    the product surface was renamed.
  title: OuterLayer Gateway API
  version: '1.0'
servers:
  - description: Production (OuterLayer Cloud)
    url: https://api.outerlayer.ai
  - description: Local dev server (self-hosted gateway)
    url: http://localhost:9418
security:
  - AppId: []
    BearerAuth: []
tags:
  - description: >-
      What a CLI login token can read about its owner without naming a factory,
      such as the factories they can use.
    name: Account
  - description: >-
      The route a fleet machine asks for its next managed build on. A fleet
      machine is a machine OuterLayer operates.
    name: Fleet
  - description: >-
      The CLI version a gateway names to its runners, set with the gateway's
      runner version key.
    name: Runner version
  - description: >-
      Coding-agent session ingest (outerlayer sync) and content-addressed
      session images.
    name: Agents
  - description: >-
      Evidence artifacts (screenshots, recordings, reports, logs) emitted as
      proof of a change and anchored to pull requests.
    name: Artifacts
  - description: >-
      Pass/fail outcomes of checks run in your own CI or compute, anchored to
      pull requests with the run URL as proof.
    name: Emitted Results
  - description: >-
      The acceptance criteria of a work item, recorded as one list. The Criteria
      tab, its count and the item status read that list.
    name: Criteria
  - description: >-
      What any agent found wrong about a change under review or about a rule it
      ran on, recorded on a work item.
    name: Findings
  - description: >-
      Find, file and edit the issue a spec lives in, through OuterLayer, with no
      tracker credential on the caller's side.
    name: Specs
  - description: >-
      Add or remove a source's statement that it is working on an issue or pull
      request, and read what is currently live.
    name: Work Items
  - description: >-
      What the factory's GitHub App installation lets builds do on each
      connected repository, and whether each default branch requires a pull
      request.
    name: Repositories
  - description: >-
      The runs of a schedule automation: a runner claims a run, asks for its
      read token and ends it, and the run's agent reports each issue it found or
      that it found nothing.
    name: Schedule runs
  - description: >-
      A runner host's heartbeat — its CLI version, slots and last request for
      work — and the factory's list of hosts with a derived status.
    name: Hosts
  - description: Query server feature availability.
    name: Capabilities
  - description: Per-model LLM pricing data. Public, unauthenticated.
    name: Pricing
  - description: >-
      Create, list, and revoke factory API keys. Plaintext returned exactly once
      at creation.
    name: API Keys
  - description: >-
      Factory CRUD — a factory is owned by an organization and is the unit every
      other resource hangs off. Lets a headless agent provision one without the
      dashboard.
    name: Apps
  - description: >-
      Agent-coding session list and full transcript reads, with actor-privacy
      controls for machine keys.
    name: Sessions
  - description: >-
      Per-model token spend and fleet-wide agent behavior tiles, including
      two-window comparisons.
    name: Metrics
  - description: Synced-commit history of the app's `.outerlayer/` context tree.
    name: Context
  - description: >-
      Session→PR attribution: which agent sessions produced which pull requests,
      and what each attributed PR cost.
    name: PRs
  - description: Service health checks.
    name: Health
  - description: >-
      Org member and role administration, authenticated with an org-scoped
      management API key (`olk_…`) minted in the dashboard's settings.
    name: Org Management
  - description: OAuth 2.1 discovery metadata for MCP connector clients.
    name: OAuth
paths:
  /v1/work-items/{workItemId}/claim/code-review:
    post:
      tags:
        - Work Items
      summary: Report what a runner's code review of a build did
      description: >-
        Records what a runner's code review of the build did, in the run log of
        the Code review automation: `reviewed` with the commit and the number of
        problems, `failed` when the code review could not run, with the runner's
        reason, or `skipped` with the reason the runner did not review. The row
        belongs to the build, so a second report for the same build updates it.
        `recorded` is `false` when the Code review automation is off: the
        gateway then stores no row. When the problems of a `reviewed` report
        cannot be stored, the answer is 503 (`review_not_stored`). Send the same
        report again: a review of one lease and commit is stored once. Other
        refusals: `claim_not_held` (403, another key holds the lease),
        `claim_expired` (410, no live lease) and `invalid_request_body` (400,
        the reason does not belong to the result).
      operationId: report-claim-code-review
      parameters:
        - in: path
          name: workItemId
          required: true
          schema:
            type: string
        - description: >-
            HTTP Message Signature (RFC 9421) made with the runner key's host
            key: `runner=:<base64>:`.
          in: header
          name: Signature
          required: false
          schema:
            description: >-
              HTTP Message Signature (RFC 9421) made with the runner key's host
              key: `runner=:<base64>:`.
            type: string
        - description: >-
            The signature's covered components and parameters:
            `runner=("@method" "@path" "@query" "content-digest");created=<unix
            seconds>;nonce="<random>";keyid="<host key
            fingerprint>";alg="ed25519"`.
          in: header
          name: Signature-Input
          required: false
          schema:
            description: >-
              The signature's covered components and parameters:
              `runner=("@method" "@path" "@query"
              "content-digest");created=<unix
              seconds>;nonce="<random>";keyid="<host key
              fingerprint>";alg="ed25519"`.
            type: string
        - description: >-
            RFC 9530 digest of the request body, always sent, including for a
            request with none: `sha-256=:<base64>:`.
          in: header
          name: Content-Digest
          required: false
          schema:
            description: >-
              RFC 9530 digest of the request body, always sent, including for a
              request with none: `sha-256=:<base64>:`.
            type: string
      requestBody:
        content:
          application/json:
            schema:
              properties:
                commit:
                  description: >-
                    The commit the code review covers, or the commit that
                    already has a review.
                  pattern: ^[0-9a-f]{40}$
                  type: string
                problems:
                  description: The problems the code review found. Only with `reviewed`.
                  maximum: 100000
                  minimum: 0
                  type: integer
                reason:
                  description: >-
                    `reviewed` for a review, `review_not_run` for a failure, or
                    the reason the runner did not review.
                  enum:
                    - reviewed
                    - review_not_run
                    - nothing_new
                    - already_reviewed
                    - several_pull_requests
                    - other_repository
                    - own_provision_hook
                    - sandbox
                    - variables_lost
                    - review_stopped
                  type: string
                result:
                  description: >-
                    `reviewed`: the code review ran. `failed`: it could not run.
                    `skipped`: the runner chose not to review.
                  enum:
                    - reviewed
                    - failed
                    - skipped
                  type: string
                review:
                  description: >-
                    The problems, reviewers and files of the code review. Only
                    with `reviewed`.
                  properties:
                    files:
                      properties:
                        notRead:
                          description: The changed files no reviewer read in full.
                          items:
                            maxLength: 1024
                            type: string
                          maxItems: 2000
                          type: array
                        read:
                          description: The changed files the reviewers read in full.
                          items:
                            maxLength: 1024
                            type: string
                          maxItems: 2000
                          type: array
                      required:
                        - read
                        - notRead
                      type: object
                    instructions:
                      description: >-
                        What produced the review. Sent by a review job. A review
                        at the end of a build sends none.
                      properties:
                        cliVersion:
                          description: The version of the CLI that ran the review.
                          maxLength: 100
                          minLength: 1
                          type: string
                        sha256:
                          description: >-
                            The sha256 of the `outerlayer-review` instructions
                            the review ran with.
                          pattern: ^[0-9a-f]{64}$
                          type: string
                      required:
                        - cliVersion
                        - sha256
                      type: object
                    problems:
                      items:
                        properties:
                          excerpt:
                            description: >-
                              The code from five lines above to five lines below
                              the line, at the reviewed commit. `null` when the
                              file or line is not there.
                            nullable: true
                            properties:
                              startLine:
                                minimum: 1
                                type: integer
                              text:
                                maxLength: 4000
                                type: string
                            required:
                              - startLine
                              - text
                            type: object
                          id:
                            description: >-
                              The check item id of the problem. A later review
                              gives the same id to the same problem.
                            maxLength: 200
                            minLength: 1
                            type: string
                          inDiff:
                            description: >-
                              Whether the line is in the diff of the pull
                              request.
                            type: boolean
                          kind:
                            description: What the problem is about.
                            enum:
                              - bug
                              - security
                              - data
                              - test
                              - docs
                              - comment
                            type: string
                          line:
                            description: >-
                              The line in the file at the reviewed commit.
                              `null` for a problem about the whole file.
                            minimum: 1
                            nullable: true
                            type: integer
                          path:
                            description: >-
                              The file, relative to the repository root. Empty
                              for a problem with no place.
                            maxLength: 1024
                            type: string
                          reason:
                            description: Why it is a problem.
                            maxLength: 1000
                            type: string
                          reviewer:
                            description: The reviewer that found it.
                            maxLength: 60
                            type: string
                          title:
                            description: A short name for the problem.
                            maxLength: 300
                            type: string
                        required:
                          - id
                          - kind
                          - title
                          - reason
                          - path
                          - line
                          - inDiff
                          - excerpt
                          - reviewer
                        type: object
                      maxItems: 200
                      type: array
                    reviewers:
                      items:
                        properties:
                          answered:
                            description: '`false` when the reviewer wrote no answer.'
                            type: boolean
                          costUsd:
                            description: '`null` when the agent does not report cost.'
                            minimum: 0
                            nullable: true
                            type: number
                          name:
                            maxLength: 60
                            minLength: 1
                            type: string
                          seconds:
                            minimum: 0
                            type: number
                          turns:
                            description: '`null` when the agent does not report turns.'
                            minimum: 0
                            nullable: true
                            type: integer
                        required:
                          - name
                          - turns
                          - seconds
                          - costUsd
                          - answered
                        type: object
                      maxItems: 10
                      type: array
                    verdicts:
                      description: >-
                        What this review found of each problem an earlier review
                        reported.
                      items:
                        properties:
                          id:
                            description: The id the earlier review gave the problem.
                            maxLength: 200
                            minLength: 1
                            type: string
                          verdict:
                            enum:
                              - fixed
                              - open
                            type: string
                        required:
                          - id
                          - verdict
                        type: object
                      maxItems: 200
                      type: array
                  required:
                    - reviewers
                    - files
                    - problems
                    - verdicts
                  type: object
                runnerReason:
                  description: >-
                    Why the code review could not run. Only with `failed`.
                    OuterLayer keeps the first 200 characters, on one line.
                  maxLength: 2000
                  type: string
              required:
                - result
                - reason
              type: object
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    properties:
                      recorded:
                        description: >-
                          `false` when the Code review automation is off or the
                          write failed, so no row was written.
                        type: boolean
                    required:
                      - recorded
                    type: object
                required:
                  - data
                type: object
          description: The report is handled.
        '400':
          content:
            application/json:
              schema:
                properties:
                  error:
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                    type: object
                required:
                  - error
                type: object
          description: >-
            A malformed body, or a reason that does not belong to the result
            (`invalid_request_body`).
        '401':
          content:
            application/json:
              schema:
                properties:
                  error:
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                    type: object
                required:
                  - error
                type: object
          description: >-
            Missing or invalid API key, or a runner key's signature was refused:
            `runner_key_signature_required` (the request carries no signature),
            `runner_key_signature_invalid` (it does not verify against the host
            key the key is bound to, or the body does not match its digest),
            `runner_key_signature_stale` (`created` is more than five minutes
            from the gateway's clock) or `runner_key_signature_replayed` (the
            nonce was accepted in the last five minutes).
        '403':
          content:
            application/json:
              schema:
                properties:
                  error:
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                    type: object
                required:
                  - error
                type: object
          description: Another key holds the item's lease (`claim_not_held`).
        '404':
          content:
            application/json:
              schema:
                properties:
                  error:
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                    type: object
                required:
                  - error
                type: object
          description: No such work item.
        '410':
          content:
            application/json:
              schema:
                properties:
                  error:
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                    type: object
                required:
                  - error
                type: object
          description: The item has no live lease (`claim_expired`).
        '503':
          content:
            application/json:
              schema:
                properties:
                  error:
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                    type: object
                required:
                  - error
                type: object
          description: >-
            The problems of the review were not stored. Send the same report
            again (`review_not_stored`).
components:
  securitySchemes:
    AppId:
      description: Factory id the request is scoped to.
      in: header
      name: X-Outerlayer-App-Id
      type: apiKey
    BearerAuth:
      description: API key (sk_outerlayer_*)
      scheme: bearer
      type: http

````

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