---
title: "Read project cast and episode casting progress."
method: GET
path: "/story-projects/{projectId}/cast"
tags: ["Projects"]
---

# Read project cast and episode casting progress.

`GET /story-projects/{projectId}/cast`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/story-projects/{projectId}/cast`
- Auth: HTTP bearer

## Query parameters

- `scriptUploadId` string

## Response `200`

Cast assets and optional episode status.

- ProjectCastReadEnvelope
  - `cast` object, required
    - `projectId` string, required
    - `people` object[], required
    - `drawn` integer, required
    - `total` integer, required
    - `redraw` ProjectCastRedrawJob: The project's newest picture redraw, picture by picture. A picture is charged only once the cast canon holds it.
      - `jobId` string, required
      - `status` 'queued' | 'running' | 'complete' | 'failed', required
      - `credits` integer, required: What the pictures drawn so far were charged.
      - `pictures` object[], required
        - `character` string, required
        - `image` 'body' | 'sheet', required
        - `castPersonId` string, nullable, required
        - `status` 'queued' | 'drawn' | 'failed', required
        - `url` string, nullable, required: The new picture, once the cast canon holds it.
        - `check` object, nullable, required: What the check against the headshot found (slot, status, retaken, scores, mismatches, note).
        - `error` string, nullable, required
      - `progressDetail` string, nullable, required
      - `error` string, nullable, required
      - `createdAt` string, required
    - `episode` object, nullable: Returned when scriptUploadId is supplied. Reads saved state without starting preparation or voice playback.
      - `job` object, nullable: Newest durable casting job or null; `pictures` names what it draws, and a finished redraw's `progressDetail` says what each check against the headshot found.
      - `readiness` EpisodeCastingReadiness
        - `ready` boolean, required
        - `castReady` boolean, required
        - `parseReady` boolean, required
        - `missingCount` integer, required
        - `reason` string, required
        - `members` EpisodeCastMember[], required
          - `id` string, required
          - `name` string, required
          - `displayName` string, required
          - `aliases` string[], required
          - `narrator` boolean, required
          - `face` string, nullable, required
          - `body` string, nullable, required
          - `sheet` string, nullable, required
          - `voiceId` string, nullable, required
          - `voiceName` string, nullable, required
          - `voiceProvider` string, nullable, required
          - `voiceGender` string, nullable, required: Gender of the assigned saved voice; never inferred from the character appearance.
          - `voiceSnippets` string[], required: Actual short spoken lines from this episode for this character, resolved through cue aliases. Narrator snippets contain narration only. Empty when parsed lines are unavailable; reading them does not generate audio.
          - `auditionSnippets` string[]: What a voice audition plays for this person: the narrator's first spoken narration line (script chrome excluded — the shared selection), or a character's own excerpts. Optional: when absent, readers fall back to voiceSnippets. Reading them does not generate audio.
          - `signatureItems` string[], required: The person's canon signature items (what only they wear or carry). Empty for the narrator.
          - `missing` string[], required
          - `ready` boolean, required
      - `read` EpisodeReadVoices: The episode's finished table read as the Cast page sees it.
        - `artifactId` string, nullable, required: The finished read (a `table_read` artifact) a re-voice speaks into; null while the episode has none.
        - `restorable` RestorableVoice[], required: Each character's newest voice change a restore would undo.
          - `character` string, required
          - `historyId` string, required
          - `at` string, date-time, required
          - `previousVoiceId` string, nullable, required: The voice a restore puts back; null when the character had none.
          - `previousVoiceName` string, nullable, required
          - `currentVoiceName` string, nullable, required
          - `recordingRecoverable` boolean, required: A restore also brings back the recording the read had before the recast.
        - `behindCanon` ReadVoiceBehindCanon[], required
          - `character` string, required: The name the read speaks them under (its cue).
          - `person` string, required: The cast canon person.
          - `canonVoice` object, required
            - `voiceId` string, required
            - `voiceName` string, nullable, required
          - `readVoice` object, required
            - `voiceId` string, required
            - `voiceName` string, nullable, 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.
- `404`: The named project or source does not exist or is owned by another account.
- `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/86e084144cef?raw)
