---
title: "Read actual script content for a table read artifact."
method: GET
path: "/artifacts/{artifactId}/script"
tags: ["Artifacts"]
---

# Read actual script content for a table read artifact.

`GET /artifacts/{artifactId}/script`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/artifacts/{artifactId}/script`
- Auth: HTTP bearer

Returns the parsed backing entries used by theater playback, music, SFX, and coverage. Use `scope=page`, `scope=scene`, `scope=character`, or `scope=range` for focused reads. Terminal agents should call this before answering questions about what is on a page, which scene is strongest, or what a character says. Scope: `artifact:read`.

## Query parameters

- `scope` 'all' | 'page' | 'scene' | 'character' | 'range'
- `page` integer
- `sceneIndex` integer
- `character` string
- `startEntry` integer
- `endEntry` integer
- `limit` integer

## Response `200`

Script content envelope.

- ArtifactScriptContentEnvelope
  - `script` ArtifactScriptContent, required: Readable script-content view for a table_read artifact. Entries are the same parsed backing entries used by theater playback, music, SFX, and coverage.
    - `artifactId` string, required
    - `scriptUploadId` string, required
    - `title` string, nullable, required
    - `scope` 'all' | 'page' | 'scene' | 'character' | 'range', required
    - `pageCount` integer, required
    - `totalEntries` integer, required
    - `pages` object[], required
      - `pageNumber` integer, required
      - `startEntry` integer, required
      - `endEntry` integer, required
      - `wordCount` integer, required
    - `scenes` object[], required
      - `sceneIndex` integer, required
      - `heading` string, required
      - `startEntry` integer, required
      - `endEntry` integer, required
    - `characters` object[], required
      - `character` string, required
      - `lineCount` integer, required
      - `wordCount` integer, required
    - `selection` object, required
      - `pageNumber` integer
      - `sceneIndex` integer
      - `character` string
      - `startEntry` integer, required
      - `endEntry` integer, required
      - `entries` ArtifactScriptEntry[], required
        - `entryIndex` integer, required
        - `character` string, required
        - `text` string, required
        - `isNarration` boolean, required
        - `sceneHeading` string, nullable, required
        - `parenthetical` string, nullable, required
        - `page` integer, nullable, required
        - `overlap` object, nullable, required: Simultaneous dialogue: how the line meets the one before it. overlap = comes in before it stops; reaction = tucked into its pause, quieter; simultaneous = starts with it; unison = said with it, or, with speakers, a group line (ALL, BOTH, "A & B") every member says at once. Null for a plain turn.
          - `kind` 'overlap' | 'simultaneous' | 'unison' | 'reaction', required
          - `overlapMs` integer
          - `speakers` string[]
        - `concurrentSpeechMs` integer, nullable, required: Read-only. On an overlapping line of a finalized read: milliseconds both voices actually sound together in the recording (on a group line, every member), measured from each clip's speech rather than its file edges. Null when the line does not overlap or no measured recording exists yet.
        - `overlapNote` object, nullable, required: Read-only. A marker the guards dropped, adjusted or only warned about, with why: from the script (first-entry, previous-not-performable, same-character, narration, group-unresolved, scene-over-budget) or from the render (too-short, no-frame-format, voices-at-once, no-pause). message is the plain sentence the app shows. Null when nothing happened to the marker.
          - `requested` 'overlap' | 'simultaneous' | 'unison' | 'reaction', required
          - `outcome` 'dropped' | 'downgraded' | 'warned', required
          - `reason` 'first-entry' | 'previous-not-performable' | 'same-character' | 'narration' | 'group-unresolved' | 'scene-over-budget' | 'too-short' | 'no-frame-format' | 'voices-at-once' | 'no-pause', required
          - `detail` string
          - `message` string, 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 story artifact does not exist or is owned by another account.
- `409`: The artifact is not in a state where this operation is valid yet (e.g. requesting an MP4 render before the share link exists).
- `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)
