---
title: "List your My-Library characters, each once per project."
method: GET
path: "/library/cast"
tags: ["Library"]
---

# List your My-Library characters, each once per project.

`GET /library/cast`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/library/cast`
- Auth: HTTP bearer

Lists one page of the caller's My-Library characters, the read the Cast tab makes: each character ONCE per project (a script with no project counts as its own), however many episodes cast them, with every distinct `looks` entry (headshot, and the full-body figure when there is one) newest first. Grouped by project (the project with the newest picture first), A to Z within it. `query` keeps characters whose name or project name contains it; `projectId` (a project id or routeId) keeps one project's. `total` is how many characters match across every page; pass `nextCursor` back as `cursor` (with the same filters) for the next page (`null` on the last). `projects` lists every project the whole library's characters belong to, with how many each holds. Each look's `id` is a `libraryImageId` for the frame swap-from-library ops. Scope: `story:read`.

## Query parameters

- `query` string
- `projectId` string
- `limit` integer
- `cursor` string

## Response `200`

Your My-Library characters, each once per project.

- MyLibraryCast: One page of the caller's My-Library characters, each once per project, grouped by project and A to Z within it.
  - `characters` object[], required
    - `id` string, required: Stable for the character within its project; opaque.
    - `character` string, required: Their name as the newest episode cues it, without qualifiers like (V.O.).
    - `project` MyLibraryCastProject, required: The project a library character belongs to.
      - `id` string, required
      - `routeId` string, required: The project's address in the app: /dashboard/writing-lab/{routeId}.
      - `name` string, required
      - `kind` 'story' | 'product', required
    - `looks` object[], required: Every distinct picture of them. The first is the one to show: the newest single-person headshot, else the newest picture of any kind (a body figure or a character sheet); the rest follow newest first.
      - `id` string, required: The picture's id (use as libraryImageId).
      - `imageUrl` string, uri, required: The headshot portrait.
      - `figureUrl` string, nullable, required: The full-body theater figure (a transparent cutout); null when none was made.
      - `scriptTitle` string, nullable, required: The episode the picture was made for.
      - `createdAt` string, date-time, required
    - `episodeCount` integer, required: How many episodes cast them.
    - `latestAt` string, date-time, required: When their newest picture was made.
  - `projects` object[], required: Every project the whole library's characters belong to (whatever `query` and `projectId` narrowed), with how many characters each holds.
    - `id` string, required
    - `routeId` string, required: The project's address in the app: /dashboard/writing-lab/{routeId}.
    - `name` string, required
    - `kind` 'story' | 'product', required
    - `characterCount` integer, required
  - `nextCursor` string, nullable, required: Pass as `cursor` (with the same filters) for the next page; null on the last page.
  - `total` integer, required: How many characters match, across every page.

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