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

# Record a batch of findings on a work item

> Accepts a batch of 1 to 500 findings — problems an agent hit in the factory, each with a category — and links every one to one or more factory-level problems. A finding joins the problem that owns one of its strict keys; otherwise it links the problems it names with a reason, or records a new one with `new`. When none of that applies, the three closest problems in the factory are returned as candidates with outcome `needs_choice` and that finding is not stored; the rest of the batch is. A re-emitted id replaces that finding in place and keeps its problems. A schemaVersion 1 or 2 batch is refused with a message to upgrade the CLI. Validated against the same contract the CLI checks before it ever sends a byte. Every finding anchors to a work item, named directly by `item.number` — never inferred from a session link — and a request naming none is refused outright, with nothing stored. Unlike an emitted check, a session may record findings on the work item it was launched for.



## OpenAPI

````yaml /openapi.yaml post /v1/findings
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: >-
      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: >-
      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/findings:
    post:
      tags:
        - Findings
      summary: Record a batch of findings on a work item
      description: >-
        Accepts a batch of 1 to 500 findings — problems an agent hit in the
        factory, each with a category — and links every one to one or more
        factory-level problems. A finding joins the problem that owns one of its
        strict keys; otherwise it links the problems it names with a reason, or
        records a new one with `new`. When none of that applies, the three
        closest problems in the factory are returned as candidates with outcome
        `needs_choice` and that finding is not stored; the rest of the batch is.
        A re-emitted id replaces that finding in place and keeps its problems. A
        schemaVersion 1 or 2 batch is refused with a message to upgrade the CLI.
        Validated against the same contract the CLI checks before it ever sends
        a byte. Every finding anchors to a work item, named directly by
        `item.number` — never inferred from a session link — and a request
        naming none is refused outright, with nothing stored. Unlike an emitted
        check, a session may record findings on the work item it was launched
        for.
      operationId: post-findings
      requestBody:
        content:
          application/json:
            schema:
              properties:
                contextSourceSha:
                  minLength: 1
                  type: string
                findings:
                  items:
                    additionalProperties: false
                    properties:
                      category:
                        enum:
                          - context
                          - flaky-test
                          - tooling
                          - environment
                          - defect
                          - other
                        type: string
                      cause:
                        maxLength: 1000
                        minLength: 1
                        type: string
                      command:
                        maxLength: 500
                        minLength: 1
                        type: string
                      detail:
                        maxLength: 4000
                        minLength: 1
                        type: string
                      endedAt:
                        additionalProperties: false
                        properties:
                          at:
                            format: date-time
                            type: string
                          id:
                            maxLength: 64
                            minLength: 1
                            type: string
                        required:
                          - id
                          - at
                        type: object
                      error:
                        maxLength: 1000
                        minLength: 1
                        type: string
                      file:
                        maxLength: 512
                        minLength: 1
                        type: string
                      id:
                        pattern: ^[A-Za-z0-9._-]{1,64}$
                        type: string
                      line:
                        maximum: 2147483647
                        minimum: 1
                        nullable: true
                        type: integer
                      linkReason:
                        maxLength: 1000
                        minLength: 1
                        type: string
                      new:
                        enum:
                          - true
                        type: boolean
                      problems:
                        items:
                          format: uuid
                          type: string
                        maxItems: 5
                        minItems: 1
                        type: array
                      rule:
                        additionalProperties: false
                        nullable: true
                        properties:
                          line:
                            maximum: 2147483647
                            minimum: 1
                            nullable: true
                            type: integer
                          path:
                            maxLength: 512
                            minLength: 1
                            type: string
                          quote:
                            maxLength: 500
                            minLength: 1
                            type: string
                          relation:
                            enum:
                              - wrong
                              - broken
                              - missing
                            type: string
                        required:
                          - path
                          - relation
                        type: object
                      startedAt:
                        additionalProperties: false
                        properties:
                          at:
                            format: date-time
                            type: string
                          id:
                            maxLength: 64
                            minLength: 1
                            type: string
                        required:
                          - id
                          - at
                        type: object
                      suggestion:
                        maxLength: 1000
                        minLength: 1
                        type: string
                      symbol:
                        maxLength: 300
                        minLength: 1
                        type: string
                      test:
                        maxLength: 500
                        minLength: 1
                        type: string
                      title:
                        maxLength: 200
                        minLength: 1
                        type: string
                      where:
                        properties:
                          label:
                            maxLength: 200
                            minLength: 1
                            type: string
                          round:
                            minimum: 0
                            type: integer
                          traceId:
                            maxLength: 128
                            minLength: 1
                            type: string
                          turnIndex:
                            minimum: 0
                            type: integer
                        required:
                          - label
                        type: object
                    required:
                      - id
                      - category
                      - title
                      - file
                      - where
                    type: object
                  maxItems: 500
                  minItems: 1
                  type: array
                headSha:
                  minLength: 1
                  type: string
                item:
                  properties:
                    number:
                      exclusiveMinimum: true
                      minimum: 0
                      type: integer
                  required:
                    - number
                  type: object
                schemaVersion:
                  enum:
                    - 3
                  type: number
                sessionId:
                  type: string
              required:
                - schemaVersion
                - findings
              type: object
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    properties:
                      count:
                        type: integer
                      results:
                        items:
                          properties:
                            candidates:
                              items:
                                properties:
                                  id:
                                    type: string
                                  reportCount:
                                    type: integer
                                  reports:
                                    items:
                                      properties:
                                        cause:
                                          nullable: true
                                          type: string
                                        file:
                                          nullable: true
                                          type: string
                                        title:
                                          type: string
                                      required:
                                        - title
                                      type: object
                                    type: array
                                  title:
                                    type: string
                                required:
                                  - id
                                  - title
                                  - reportCount
                                  - reports
                                type: object
                              type: array
                            id:
                              type: string
                            method:
                              enum:
                                - strict_key
                                - agent_link
                                - new
                                - no_candidates
                                - kept
                              type: string
                            outcome:
                              enum:
                                - stored
                                - needs_choice
                              type: string
                            overridden:
                              items:
                                properties:
                                  id:
                                    type: string
                                  title:
                                    type: string
                                required:
                                  - id
                                  - title
                                type: object
                              type: array
                            problems:
                              items:
                                properties:
                                  id:
                                    type: string
                                  title:
                                    type: string
                                required:
                                  - id
                                  - title
                                type: object
                              type: array
                          required:
                            - id
                            - outcome
                          type: object
                        type: array
                      workItemId:
                        type: string
                    required:
                      - workItemId
                      - count
                      - results
                    type: object
                required:
                  - data
                type: object
          description: >-
            The work item, how many findings were stored, and one result per
            finding: stored with its problems, or needs_choice with candidates.
        '400':
          content:
            application/json:
              schema:
                properties:
                  error:
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                    type: object
                required:
                  - error
                type: object
          description: >-
            Malformed body, an unsupported schemaVersion, a problem that is not
            in this factory, session events with no session, or nothing to
            attach the batch to.
        '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.
        '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.
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.