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

# Emit a check result (pass/fail evidence for a work item)

> Accepts one emitted result — one recorded pass or fail, named after the validator that declares it. A check that ran in your own CI or compute carries its run URL as the proof link. A person recording a judgment carries the one sentence they typed instead. A failing result needs one of the two. Every emitted result anchors to a work item, named directly (`emit.item`: tracker, repository and issue number) — always required outside a recorded session. Inside a recorded session, omitting `item` resolves it to that session's OWN linked item, and the check is stored with source `session` and the session's trace id. A request naming neither `item` nor a session is refused outright, and nothing is stored in that case. Provenance (ci / local) and source (machine / session / human / host) are both derived from the credential and the submission path; neither can be supplied by the caller. A check a person recorded as failing is refused to anything but a person's own credential. A runner key that holds the work item's live claim may record a result too, stored with source `host` and the host's name; a runner key without that claim is refused. Retrying with the same clientEmitId returns the already-stored result; reusing one for a different check is refused.



## OpenAPI

````yaml /openapi.yaml post /v1/emitted-results
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: >-
      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/emitted-results:
    post:
      tags:
        - Emitted Results
      summary: Emit a check result (pass/fail evidence for a work item)
      description: >-
        Accepts one emitted result — one recorded pass or fail, named after the
        validator that declares it. A check that ran in your own CI or compute
        carries its run URL as the proof link. A person recording a judgment
        carries the one sentence they typed instead. A failing result needs one
        of the two. Every emitted result anchors to a work item, named directly
        (`emit.item`: tracker, repository and issue number) — always required
        outside a recorded session. Inside a recorded session, omitting `item`
        resolves it to that session's OWN linked item, and the check is stored
        with source `session` and the session's trace id. A request naming
        neither `item` nor a session is refused outright, and nothing is stored
        in that case. Provenance (ci / local) and source (machine / session /
        human / host) are both derived from the credential and the submission
        path; neither can be supplied by the caller. A check a person recorded
        as failing is refused to anything but a person's own credential. A
        runner key that holds the work item's live claim may record a result
        too, stored with source `host` and the host's name; a runner key without
        that claim is refused. Retrying with the same clientEmitId returns the
        already-stored result; reusing one for a different check is refused.
      operationId: emit-result
      requestBody:
        content:
          application/json:
            schema:
              properties:
                emit:
                  properties:
                    body:
                      maxLength: 2000
                      type: string
                    ci:
                      type: boolean
                    clientEmitId:
                      pattern: ^[A-Za-z0-9_.:-]{1,64}$
                      type: string
                    emittedAt:
                      type: string
                    item:
                      anyOf:
                        - properties:
                            issue:
                              exclusiveMinimum: true
                              minimum: 0
                              type: integer
                            repository:
                              minLength: 1
                              type: string
                            tracker:
                              enum:
                                - github
                                - linear
                                - jira
                              type: string
                          required:
                            - tracker
                            - repository
                            - issue
                          type: object
                        - properties:
                            number:
                              exclusiveMinimum: true
                              minimum: 0
                              type: integer
                          required:
                            - number
                          type: object
                    link:
                      maxLength: 500
                      minLength: 1
                      type: string
                    name:
                      pattern: ^[a-z][a-z0-9._-]{0,63}$
                      type: string
                    result:
                      enum:
                        - pass
                        - fail
                      type: string
                    sessionId:
                      type: string
                  required:
                    - clientEmitId
                    - name
                    - result
                    - emittedAt
                  type: object
                schemaVersion:
                  enum:
                    - 1
                  type: number
              required:
                - schemaVersion
                - emit
              type: object
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    properties:
                      body:
                        type: string
                      created:
                        type: boolean
                      id:
                        type: string
                      name:
                        type: string
                      provenance:
                        enum:
                          - ci
                          - local
                        type: string
                      recordedAt:
                        type: string
                      recordedBy:
                        type: string
                      result:
                        enum:
                          - pass
                          - fail
                        type: string
                      source:
                        enum:
                          - machine
                          - session
                          - human
                          - host
                        type: string
                      workItemId:
                        type: string
                    required:
                      - id
                      - name
                      - result
                      - source
                      - provenance
                      - workItemId
                      - body
                      - recordedBy
                      - recordedAt
                      - created
                    type: object
                required:
                  - data
                type: object
          description: The stored result (the existing row on an idempotent retry).
        '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, nothing to attach to, or a fail with nothing to act
            on.
        '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.
        '403':
          content:
            application/json:
              schema:
                properties:
                  error:
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                    type: object
                required:
                  - error
                type: object
          description: >-
            Only a person can record over a fail a person recorded, or the
            caller holds neither evidence.insert nor the work item's live claim.
        '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.
        '409':
          content:
            application/json:
              schema:
                properties:
                  error:
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                    type: object
                required:
                  - error
                type: object
          description: This clientEmitId already recorded a different check.
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.