---
title: "List capture runners and the shared-host allow-list (admins only)."
method: GET
path: "/admin/capture-runners"
tags: ["Admin"]
---

# List capture runners and the shared-host allow-list (admins only).

`GET /admin/capture-runners`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/admin/capture-runners`
- Auth: HTTP bearer

Admins only. A shared-host capture runner (a roscoe) is a GPU recorder on a machine that also runs the owner's own work: it records only Sleeper's own takes and the app connections an admin puts on this allow-list, and opens only the app origins its own box config names. Every runner this deployment records on (CAPTURE_RUNNERS), what each says it can do right now or why it could not answer, and the allow-list. Never a token. 403 `admin_required` unless the credential's account is an admin right now. Scope: `account:read`. Free.

## Response `200`

The runners and the allow-list.

- CaptureRunners
  - `settingKey` string, required: The SiteSetting holding the shared-host allow-list (`capture.shared_host_connections`).
  - `runners` object[], required: Every runner in CAPTURE_RUNNERS, in order. Never a token.
    - `name` string, required
    - `url` string, required
    - `capabilities` CaptureRunnerCapabilities, required: What a runner says it can do right now (`GET /v1/capabilities` of sleeper.capture-runner/1).
      - `protocol` 'sleeper.capture-runner/1', required
      - `box` string, required
      - `recorderVersion` string, required
      - `platform` 'darwin' | 'linux', required
      - `gpu` 'metal' | 'nvidia' | 'none', required
      - `sound` string[], required: `app` when it records the app's own sound now.
      - `soundProblem` string, nullable, required
      - `isolation` 'vm' | 'container' | 'shared-host', required
      - `maxConcurrent` integer, required
      - `busy` boolean, required
      - `bench` object, nullable, required: Its self-bench: requestAnimationFrame callbacks a second on a heavy page.
        - `drawFps` number, required
        - `at` string, date-time, required
      - `minDrawFps` number, required
      - `degraded` boolean, required: Its bench is under `minDrawFps` (its GPU is busy with other work): no recordings go to it.
      - `appOrigins` string[], required: The only app origins it opens; empty means any.
    - `problem` string, nullable, required: Why it could not answer (unreachable, unsigned, misnamed), or null.
  - `allowList` CaptureSharedHostEntry[], required
    - `connectionId` string, required
    - `projectId` string, required
    - `approvedBy` string, required: The admin who allow-listed it.
    - `at` string, date-time, required
    - `note` string, nullable, required
  - `browserRun` object, required
    - `available` boolean, required
    - `note` string, required
  - `routing` string, required: How a take is routed, in one sentence.

## Other responses

- `401`: Missing, malformed, revoked, or expired API key.
- `403`: API key is valid but lacks the scope, is blocked by IP allowlist, or the account is disabled.
- `429`: Rate limit for this API key + IP + route family was exceeded.
- `500`: The API failed unexpectedly. Safe to retry with the same Idempotency-Key.

---

[API](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api.md) · [All operations](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api/revisions/64c1102ccb2f?raw)
