---
title: "Read one version's manifest and clips."
method: GET
path: "/pitch-decks/{jobId}/versions/{number}"
tags: ["Pitch Deck"]
---

# Read one version's manifest and clips.

`GET /pitch-decks/{jobId}/versions/{number}`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/pitch-decks/{jobId}/versions/{number}`
- Auth: HTTP bearer

Returns one version: every chapter in journey order with its cut before the film finish and the take each shot played (`takeUrl`, its `trim`, the finished `deliveryUrl` on a finished master), each with its `path` in the version's folder and its `archivedUrl` once copied (a scene group's takes sit under the chapter that holds them: `takesHeldBy`); its narration, speech clips, music, sound effects and text layer; the deck's audio timeline, interludes and title flashes; the finish, camera and motion blur it was laid with; every file of the folder (`files`, `manifest.json` first); and its zip. A number the deck does not have is 404 `pitch_deck_version_not_found`. Every time a deck's master is published (a preview, an early look or the finished deck) it is kept as a numbered version: the master, and for every chapter in order the take each shot played (with its trim, and its finished copy on a finished deck), the chapter's cut before the film finish, its narration, speech, music, sound effects and text layer, and the finish it was laid with. Each version's cuts and takes are copied, untouched, into a folder of their own, one per chapter (pitch-decks/<deck>/versions/<n>-<YYYYMMDD-HHMM>/chapters/<NN>-<title>/), with a manifest.json, so a later re-render never loses the clips an earlier version played. Reading versions is free, and a zip of a version's clips is made on request, free. Scope: `story:read`.

## Response `200`

The version.

- PitchDeckVersionRead
  - `jobId` string, required
  - `version` object, required: Every time a deck's master is published (a preview, an early look or the finished deck) it is kept as a numbered version: the master, and for every chapter in order the take each shot played (with its trim, and its finished copy on a finished deck), the chapter's cut before the film finish, its narration, speech, music, sound effects and text layer, and the finish it was laid with. Each version's cuts and takes are copied, untouched, into a folder of their own, one per chapter (pitch-decks/<deck>/versions/<n>-<YYYYMMDD-HHMM>/chapters/<NN>-<title>/), with a manifest.json, so a later re-render never loses the clips an earlier version played. Reading versions is free, and a zip of a version's clips is made on request, free.
    - `number` integer, required: The version's number: 1, 2, 3… in the order the deck's masters were published.
    - `stage` 'preview' | 'finished' | 'current', required: The master's stage: a 480p `preview`, the `finished` deck, or `current` (one recorded after the fact).
    - `earlyLook` boolean, required: True when the master was an early look (published while a newer cut was being assembled).
    - `publishedAt` string, date-time, required
    - `masterUrl` string, nullable, required
    - `masterDurationMs` integer, nullable, required
    - `masterResolution` string, nullable, required
    - `chapterCount` integer, required: Chapters the master played.
    - `takeCount` integer, required: Takes their cuts played (a scene group's counted once).
    - `folder` string, required: The version's folder in storage: `pitch-decks/<jobId>/versions/<n>-<YYYYMMDD-HHMM>/`.
    - `archive` object, required: Where the copy of its clips into the folder stands.
      - `status` 'pending' | 'archiving' | 'archived' | 'partial' | 'failed', required: `partial`: a clip was already gone when it was copied (the manifest lists it).
      - `files` integer, required
      - `missing` integer, required
      - `bytes` integer, nullable, required
      - `archivedAt` string, date-time, nullable, required
      - `error` string, nullable, required
    - `zip` VideoVersionZip, required: A version's zip: its manifest.json and every clip of its folder, stored as they are. Made on request, then kept.
      - `status` 'none' | 'queued' | 'building' | 'ready' | 'failed', required: `none` until asked for; `queued` / `building` while it is made; `ready`; `failed` (ask again).
      - `bytes` integer, nullable, required
      - `builtAt` string, date-time, nullable, required
      - `error` string, nullable, required: Why it could not be made (`failed` only).
      - `url` string, nullable, required: A signed download link while `ready` (it expires: read again for a fresh one).
      - `expiresAt` string, date-time, nullable, required
    - `label` string, required: "Version 3 · Finished 1080p · 2026-10-09 14:02 UTC".
    - `finish` object, required: The finish (`finish`, its `key`), camera and motion blur the master was laid with, as stored then, and what they laid.
    - `chapters` object[], required: Every chapter in journey order: `cut` (before the film finish; `lookedUrl` the finished one the master played), `takes` (each call's take as played: `takeUrl`, `trim`, `deliveryUrl`, `path`, `archivedUrl`), `narration`, `speechClips`, `music`, `sfx`, `textLayer`, `takesHeldBy` (a scene group's member).
    - `audio` object, required: The deck's audio timeline as played: music clips, sound effects, the bell, the score.
    - `interludes` object[], required
    - `titleFlashes` object[], required
    - `files` PitchDeckVersionFile[], required
      - `path` string, required: Relative to the version's folder (`chapters/03-the-cell/take-c_…-2.mp4`).
      - `role` 'manifest' | 'cut' | 'take' | 'delivery', required
      - `chapterNumber` integer, nullable, required
      - `chapterIndex` integer, nullable, required
      - `callId` string, nullable, required
      - `take` integer, nullable, required
      - `sourceUrl` string, nullable, required: Where the file was when the version was recorded.
      - `archivedUrl` string, nullable, required: The copy in the version's folder; null until it is made, or when its source was already gone.
    - `external` object[], required: Clips stored on another host: listed by URL, never copied.

## Other responses

- `400`: Request payload failed validation. The error message names the offending field.
- `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/4534f5d25540?raw)
