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

# List the factory's runner hosts

> Every host that has sent at least one heartbeat, ordered by host name. Each carries the CLI version, the runner protocol and slots it last reported, its last heartbeat time, its last successful request for work, its last error, its last self-update (the versions it moved between, how it ended, and why when it did not succeed; null until it reports one), its low-disk state (`lowDisk`: the free bytes and the bytes it needs, set while the host holds off new work for want of disk and null otherwise), whether it is taking work (`blocked`: the reason, set while the host claims nothing because it cannot run the work it would be given, and null otherwise), and a status derived at read time — never stored — from those timestamps: `stale` when the last heartbeat is older than three times the host's own `pollSeconds`; otherwise `outdated` when the last heartbeat carried a runner protocol below the gateway's minimum; otherwise `failing` when the last request for work failed and no later success cleared it; otherwise `ok`. Unpaginated.



## OpenAPI

````yaml /openapi.yaml get /v1/hosts
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/hosts:
    get:
      tags:
        - Hosts
      summary: List the factory's runner hosts
      description: >-
        Every host that has sent at least one heartbeat, ordered by host name.
        Each carries the CLI version, the runner protocol and slots it last
        reported, its last heartbeat time, its last successful request for work,
        its last error, its last self-update (the versions it moved between, how
        it ended, and why when it did not succeed; null until it reports one),
        its low-disk state (`lowDisk`: the free bytes and the bytes it needs,
        set while the host holds off new work for want of disk and null
        otherwise), whether it is taking work (`blocked`: the reason, set while
        the host claims nothing because it cannot run the work it would be
        given, and null otherwise), and a status derived at read time — never
        stored — from those timestamps: `stale` when the last heartbeat is older
        than three times the host's own `pollSeconds`; otherwise `outdated` when
        the last heartbeat carried a runner protocol below the gateway's
        minimum; otherwise `failing` when the last request for work failed and
        no later success cleared it; otherwise `ok`. Unpaginated.
      operationId: list-hosts
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    items:
                      properties:
                        blocked:
                          nullable: true
                          properties:
                            reason:
                              type: string
                          required:
                            - reason
                          type: object
                        cliVersion:
                          type: string
                        host:
                          type: string
                        lastError:
                          nullable: true
                          properties:
                            at:
                              type: string
                            code:
                              type: string
                            message:
                              type: string
                          required:
                            - code
                            - message
                            - at
                          type: object
                        lastHeartbeatAt:
                          type: string
                        lastSuccessAt:
                          nullable: true
                          type: string
                        lastUpdate:
                          nullable: true
                          properties:
                            at:
                              nullable: true
                              type: string
                            from:
                              type: string
                            outcome:
                              enum:
                                - updated
                                - rolled_back
                                - verification_failed
                                - not_published
                                - retrying
                              type: string
                            reason:
                              nullable: true
                              type: string
                            to:
                              type: string
                          required:
                            - from
                            - to
                            - outcome
                            - reason
                            - at
                          type: object
                        lowDisk:
                          nullable: true
                          properties:
                            free:
                              type: integer
                            needed:
                              type: integer
                          required:
                            - free
                            - needed
                          type: object
                        pollSeconds:
                          type: integer
                        runnerProtocol:
                          type: integer
                        slotsTotal:
                          type: integer
                        slotsUsed:
                          type: integer
                        status:
                          enum:
                            - ok
                            - failing
                            - outdated
                            - stale
                          type: string
                      required:
                        - host
                        - cliVersion
                        - runnerProtocol
                        - pollSeconds
                        - slotsUsed
                        - slotsTotal
                        - lastHeartbeatAt
                        - lastSuccessAt
                        - lastError
                        - lastUpdate
                        - lowDisk
                        - blocked
                        - status
                      type: object
                    type: array
                required:
                  - data
                type: object
          description: The factory's hosts.
        '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.
        '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 caller lacks hosts.read.
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.