---
title: "Re-stitch the finished pitch deck master from its current chapters and audio, or copy it for YouTube or X."
method: POST
path: "/pitch-decks/{jobId}/video-export"
tags: ["Pitch Deck"]
---

# Re-stitch the finished pitch deck master from its current chapters and audio, or copy it for YouTube or X.

`POST /pitch-decks/{jobId}/video-export`

## Request

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

Rebuilds the finished MP4 by re-running the composition over the finished chapter cuts, narration and music ALREADY on the job. Generates nothing and renders no take, so it is the supported way to fold in a music bed or a narration track that landed after the finish. `target` says where the video is going: `site` (the default) re-stitches the master as it plays here, at -18.6 LUFS; `youtube` and `x` make a COPY of the finished master levelled to -14 LUFS integrated with its true peak at or under -1 dBTP (a final two-pass loudness pass on the copy only: the picture is copied, never re-encoded, and the master itself never changes). A copy is made from the current master; when the master is out of date or being rebuilt, it is rebuilt first and the copy follows. Free: no price and nothing to confirm. The copy's link and its measured loudness are on the read's `platformExports` (and on the answer's `platformExport`) once it is ready. Only a complete deck exports — a 480p preview is never the deliverable; finish the deck first (`finish`, priced). A queued or rendering export short-circuits rather than stacking. Requires `Idempotency-Key`. Scope: `story:write`.

## Headers

- `Idempotency-Key` string, required

## Request body

- VideoExportRequest: Where the export is going. `target` says where the video is going: `site` (the default) re-stitches the master as it plays here, at -18.6 LUFS; `youtube` and `x` make a COPY of the finished master levelled to -14 LUFS integrated with its true peak at or under -1 dBTP (a final two-pass loudness pass on the copy only: the picture is copied, never re-encoded, and the master itself never changes). A copy is made from the current master; when the master is out of date or being rebuilt, it is rebuilt first and the copy follows. Free: no price and nothing to confirm. The copy's link and its measured loudness are on the read's `platformExports` (and on the answer's `platformExport`) once it is ready.
  - `target` 'site' | 'youtube' | 'x': Where the video is going: `site` (the default), `youtube` or `x`.

## Response `200`

Master re-stitch queued (poll `renderedVideoStatus`), or the platform copy (`platformExport`; poll the chapters read's `platformExports`).

- PitchDeckExportAck: The finished-master re-stitch, queued (or already queued / rendering) — or, for a platform `target`, the master's status and the copy.
  - `target` 'site' | 'youtube' | 'x', required
  - `renderedVideoStatus` string, required: The master's status: `queued` or `rendering` for a re-stitch; for a platform copy, the master as read (`complete` when the copy is made from it now).
  - `platformExport` VideoPlatformExport, required: One copy of the master levelled for another platform. `target` says where the video is going: `site` (the default) re-stitches the master as it plays here, at -18.6 LUFS; `youtube` and `x` make a COPY of the finished master levelled to -14 LUFS integrated with its true peak at or under -1 dBTP (a final two-pass loudness pass on the copy only: the picture is copied, never re-encoded, and the master itself never changes). A copy is made from the current master; when the master is out of date or being rebuilt, it is rebuilt first and the copy follows. Free: no price and nothing to confirm. The copy's link and its measured loudness are on the read's `platformExports` (and on the answer's `platformExport`) once it is ready.
    - `target` 'youtube' | 'x', required
    - `status` 'waiting' | 'queued' | 'rendering' | 'complete' | 'failed', required: `waiting` while the master it is made from is rebuilt; `queued`, `rendering`; `complete` with its link; `failed` with `error` (ask again).
    - `url` string, nullable, required: The levelled copy, once `complete`.
    - `current` boolean, required: False once a newer master replaced the one the copy was made from: export again for a copy of the new one.
    - `loudness` object, nullable, required: What the delivered copy measured on the EBU R128 meter: within 0.5 LU of `targetLufs`, its true peak at or under `truePeakCeilingDbtp`. Null until complete, and for a master with no sound.
      - `integratedLufs` number, required
      - `truePeakDbtp` number, required
      - `loudnessRangeLu` number, nullable, required
      - `levelling` 'linear' | 'dynamic', required: `linear`: one gain, the master's dynamics kept. `dynamic`: the peaks left no room for one gain, so the loudness pass limited them.
    - `targetLufs` number, required: The integrated loudness the copy is levelled to.
    - `truePeakCeilingDbtp` number, required: The true peak the copy never goes over.
    - `error` string, nullable, required
    - `updatedAt` string, date-time, nullable, required

## 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.
- `409`: The pitch deck exists and the request is well-formed, but the deck, its chapter, its cast or its plates are not in a state that allows it (`pitch_deck_state_invalid`), and nothing was reserved: a plan approved outside draft, a take chosen, a chapter edited or rendered outside review/complete, an export before the finish, a finish while a call has no selected take or a footage chapter has not rendered, a text-only chapter asked for footage, a changed chapter asked for one call, a delivery class changed mid-pass, a render the compile blocked, or a finish while the master failed its video coverage (`pitch_deck_video_coverage_failed`, with `details.videoCoverage`). `details.refusal` is `{ code, action, fix }` (see PitchDeckRefusalDetails): `action` is what unblocks it — `recast_figure`, `add_signature_items`, `recast_voice` or `remake_location_plate` — and `fix` names the MCP tool and CLI command that take it; `details.blocked[]` lists every chapter a blocked compile could not render. The identical request succeeds once the deck is put right.
- `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)
