---
title: "List demo accounts (admins only)."
method: GET
path: "/admin/demo-accounts"
tags: ["Admin"]
---

# List demo accounts (admins only).

`GET /admin/demo-accounts`

## Request

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

Admins only. A demo account is a dedicated non-admin account that agents produce Sleeper's own showcase videos with; it is on the allowlist only while an admin keeps it there, and every use is recorded. Every account on the allowlist, the sessions agents signed in with as it, and the newest audit rows. 403 `admin_required` unless the credential's account is an admin right now. Scope: `account:read`. Free.

## Response `200`

The allowlist, its live sessions and the audit.

- DemoAccounts
  - `settingKey` string, required: The SiteSetting holding the allowlist (`demo_accounts.user_ids`).
  - `accounts` object[], required
    - `userId` string, required
    - `name` string, nullable, required
    - `email` string, nullable, required
    - `usable` boolean, required: False when the account is gone, banned or an admin: nothing works for it.
    - `sessions` DemoSession[], required
      - `id` string, required: The session id. Never its token.
      - `demoUserId` string, required
      - `mintedById` string, nullable, required: The admin who minted it.
      - `createdAt` string, date-time, required
      - `expiresAt` string, date-time, required: The hard end: never extended.
  - `events` object[], required: The newest audit rows: who did what for which demo account, and when. Never a token.
    - `id` string, required
    - `action` 'allowlist_added' | 'allowlist_removed' | 'session_minted' | 'session_used' | 'session_revoked' | 'session_expired' | 'oauth_consent_approved' | 'oauth_consent_denied' | 'terms_accepted' | 'capture_grant_issued' | 'capture_grant_revoked', required
    - `demoUserId` string, required
    - `actorUserId` string, nullable, required
    - `sessionId` string, nullable, required
    - `clientId` string, nullable, required
    - `via` string, required
    - `detail` string, nullable, required
    - `createdAt` string, date-time, required

## 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/4534f5d25540?raw)
