---
title: "Save ONE episode's outline."
method: PATCH
path: "/story-projects/{projectId}/outline-map"
tags: ["Projects"]
---

# Save ONE episode's outline.

`PATCH /story-projects/{projectId}/outline-map`

## Request

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

Replaces one season-map episode's outline with `outline` and leaves every other episode as stored — the same writer as the episode's Outline tab and Slug's save_episode_outline, so it is the outline outline coverage scores and the season planner hands the writer. Read the outline map first to carry over what should stay. A structure that is not three acts (six acts and a tag, a scene list) goes in `titleNotes` whole. An `episodeId` the season map does not plan is a 400. Free. Scope: `story:write`. A product project is refused with 409 `project_not_story` (`details.work: outline`): its Bible lists features, not episodes.

## Request body

- SaveEpisodeOutlineRequest
  - `episodeId` string, required: A season-map episode id, as the outline map lists it.
  - `outline` EpisodeOutlineInput, required: An episode outline: the Outline tab's fields, every one optional. It replaces the episode's outline. A structure that is not three acts goes in `titleNotes` whole.
    - `titleNotes` string: What the episode is about, or the whole outline act by act or scene by scene when it does not fit three acts.
    - `actOne` object
      - `incitingIncident` string
      - `plotPointOne` string
      - `notecards` OutlineSceneCard[]
        - `title` string: The scene or beat, in a few words.
        - `body` string: What happens in it.
    - `actTwo` object
      - `midpoint` string
      - `plotPointTwo` string
      - `notecards` OutlineSceneCard[]
        - `title` string: The scene or beat, in a few words.
        - `body` string: What happens in it.
    - `actThree` object
      - `climax` string
      - `denouement` string
      - `notecards` OutlineSceneCard[]
        - `title` string: The scene or beat, in a few words.
        - `body` string: What happens in it.

## Response `200`

The outline map, with the episode as saved.

- OutlineMapEnvelope
  - `outlineMap` OutlineMap, required
    - `projectId` string, required
    - `currentVersion` integer, required: The outline map's revision; it moves on every saved outline.
    - `episodes` OutlineMapEpisode[], required: Every planned episode, in season-map order.
      - `episodeId` string, required
      - `label` string, required
      - `title` string, required
      - `source` 'outline_map' | 'season_map', nullable, required: `outline_map`: written for the episode. `season_map`: its season-map note, standing in because it lays the episode out act by act or scene by scene. Null: no outline.
      - `outline` object, nullable, required: The outline document (the Outline tab's fields, with scene cards).
      - `words` integer, required
    - `progress` object, required
      - `total` integer, required
      - `outlined` integer, required
      - `missing` string[], required
      - `complete` boolean, required
    - `words` integer, required
    - `readiness` OutlineCoverageReadiness, required: What can be scored right now, read off the outlines GET /story-projects/{projectId}/outline-map returns. An episode is outlined once an outline is written for it (its Outline tab, Slug, or PATCH outline-map), or — with nothing written — when its season-map note lays it out act by act or scene by scene. A season-map synopsis or a written screenplay is not an outline. When `canScore` is false, a generate call refuses with 400 `validation_failed` carrying `reason` word for word, so read this first instead of queueing.
      - `plannedEpisodes` integer, required: Episodes in the Series Bible's season map.
      - `outlinedEpisodes` integer, required: Planned episodes with an outline: written for the episode, or its season-map note when that lays out acts or scenes.
      - `canScore` boolean, required: True when at least one planned episode is outlined, so a report can be queued.
      - `reason` string, nullable, required: Why a report cannot be queued yet; null when `canScore` is true.
    - `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.
- `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)
