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

# Release a host's claim on a work item

> Marks the caller's own lease released, optionally with an `outcome`, the `stage` the attempt ended in, its `exitCode`, a one-line `reason` (at most 200 characters, no line break), and an `environment` recording what the attempt ran in: its `isolation` (`container`, `vm` or `shared-user`), the recipe and image, up to 200 hosts reached and the refusals with their ranges, the names, never the values, of the variables passed in, the names of up to 20 destinations the build called, never an address or a secret, and the kinds of repository token the build used (`credentials`, `read` and `push`). `incomplete` is a command that exited 0 while the item's checks still failed or had no result; like `ok`, it uses up the build request. It is stored with the release and returned on `GET /v1/work-items/{workItemId}`. Releasing an already-released lease is a no-op that returns the stored values and stores nothing new. `claim_not_held` (403) when the calling key is not the holder of the item's newest lease, live or not. The holder is the key that took the lease; `host` is a label the request carries and decides nothing.



## OpenAPI

````yaml /openapi.yaml post /v1/work-items/{workItemId}/claim/release
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/work-items/{workItemId}/claim/release:
    post:
      tags:
        - Work Items
      summary: Release a host's claim on a work item
      description: >-
        Marks the caller's own lease released, optionally with an `outcome`, the
        `stage` the attempt ended in, its `exitCode`, a one-line `reason` (at
        most 200 characters, no line break), and an `environment` recording what
        the attempt ran in: its `isolation` (`container`, `vm` or
        `shared-user`), the recipe and image, up to 200 hosts reached and the
        refusals with their ranges, the names, never the values, of the
        variables passed in, the names of up to 20 destinations the build
        called, never an address or a secret, and the kinds of repository token
        the build used (`credentials`, `read` and `push`). `incomplete` is a
        command that exited 0 while the item's checks still failed or had no
        result; like `ok`, it uses up the build request. It is stored with the
        release and returned on `GET /v1/work-items/{workItemId}`. Releasing an
        already-released lease is a no-op that returns the stored values and
        stores nothing new. `claim_not_held` (403) when the calling key is not
        the holder of the item's newest lease, live or not. The holder is the
        key that took the lease; `host` is a label the request carries and
        decides nothing.
      operationId: release-work-item-claim
      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:
                environment:
                  additionalProperties: false
                  properties:
                    agentVersion:
                      maxLength: 100
                      minLength: 1
                      type: string
                    cliVersion:
                      maxLength: 100
                      minLength: 1
                      type: string
                    commitIdentity:
                      additionalProperties: false
                      description: >-
                        Who authored the commits the build made and whether the
                        member who asked for it was credited. `author` is `app`
                        when the claim named the GitHub App's bot account and
                        `host` when it named no identity, so the host's own git
                        identity applied. `coAuthor` is `credited` when the
                        runner added a `Co-authored-by` line for the requester
                        and `none` otherwise.
                      properties:
                        author:
                          enum:
                            - app
                            - host
                          type: string
                        coAuthor:
                          enum:
                            - credited
                            - none
                          type: string
                      required:
                        - author
                        - coAuthor
                      type: object
                    credentials:
                      description: >-
                        The kinds of repository token the build held or used:
                        `read` once the runner handed the build its read token,
                        `push` once a push was forwarded with the push token.
                        Names, never the tokens.
                      items:
                        enum:
                          - read
                          - push
                        type: string
                      maxItems: 2
                      type: array
                    destinations:
                      items:
                        pattern: ^[a-z0-9][a-z0-9-]{0,62}$
                        type: string
                      maxItems: 20
                      type: array
                    hostsReached:
                      items:
                        maxLength: 255
                        minLength: 1
                        type: string
                      maxItems: 200
                      type: array
                    hostsReachedMore:
                      maximum: 2147483647
                      minimum: 0
                      type: integer
                    ignoredProperties:
                      items:
                        additionalProperties: false
                        properties:
                          property:
                            maxLength: 255
                            minLength: 1
                            type: string
                          source:
                            maxLength: 255
                            minLength: 1
                            type: string
                        required:
                          - property
                          - source
                        type: object
                      maxItems: 500
                      type: array
                    imageId:
                      maxLength: 200
                      minLength: 1
                      type: string
                    isolation:
                      enum:
                        - container
                        - vm
                        - shared-user
                      type: string
                    recipe:
                      additionalProperties: false
                      properties:
                        key:
                          maxLength: 100
                          minLength: 1
                          type: string
                        path:
                          maxLength: 500
                          minLength: 1
                          type: string
                        sourceCommit:
                          maxLength: 100
                          minLength: 1
                          type: string
                      required:
                        - sourceCommit
                        - key
                        - path
                      type: object
                    refusals:
                      items:
                        additionalProperties: false
                        properties:
                          address:
                            maxLength: 100
                            minLength: 1
                            type: string
                          host:
                            maxLength: 255
                            minLength: 1
                            type: string
                          range:
                            maxLength: 100
                            minLength: 1
                            type: string
                        required:
                          - host
                          - address
                          - range
                        type: object
                      maxItems: 200
                      type: array
                    refusalsMore:
                      maximum: 2147483647
                      minimum: 0
                      type: integer
                    variables:
                      items:
                        maxLength: 255
                        minLength: 1
                        type: string
                      maxItems: 100
                      type: array
                  required:
                    - isolation
                    - cliVersion
                  type: object
                exitCode:
                  maximum: 2147483647
                  minimum: -2147483648
                  type: integer
                host:
                  maxLength: 255
                  minLength: 1
                  type: string
                outcome:
                  enum:
                    - ok
                    - incomplete
                    - failed
                    - timed_out
                    - idle
                    - lease_lost
                    - interrupted
                    - stopped
                  type: string
                reason:
                  maxLength: 200
                  type: string
                stage:
                  enum:
                    - provision
                    - command
                    - sync
                    - cleanup
                    - report
                  type: string
              required:
                - host
              type: object
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    properties:
                      exitCode:
                        nullable: true
                        type: integer
                      id:
                        type: string
                      outcome:
                        enum:
                          - ok
                          - incomplete
                          - failed
                          - timed_out
                          - idle
                          - lease_lost
                          - interrupted
                          - stopped
                          - null
                        nullable: true
                        type: string
                      reason:
                        nullable: true
                        type: string
                      releasedAt:
                        type: string
                      stage:
                        enum:
                          - provision
                          - command
                          - sync
                          - cleanup
                          - report
                          - null
                        nullable: true
                        type: string
                    required:
                      - id
                      - releasedAt
                      - outcome
                      - stage
                      - exitCode
                      - reason
                    type: object
                required:
                  - data
                type: object
          description: The lease is released (now, or already).
        '400':
          content:
            application/json:
              schema:
                properties:
                  error:
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    required:
                      - code
                      - message
                    type: object
                required:
                  - error
                type: object
          description: Invalid request parameters (validation failed).
        '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: The calling key does not hold the item's newest lease.
        '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: The item is withdrawn.
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.