---
title: "Generate professional script coverage for a table read artifact."
method: POST
path: "/artifacts/{artifactId}/coverage"
tags: ["Artifacts"]
---

# Generate professional script coverage for a table read artifact.

`POST /artifacts/{artifactId}/coverage`

## Request

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

Recommended first development round once a screenplay-backed table-read artifact exists; use the report for a revision pass before finalization, pitch packaging, or later-installment work.  Runs a queued, async coverage analysis of the screenplay backing this `table_read` artifact: logline, premise, structure, characters, dialogue, pacing, market fit, an overall score, top fixes, and comparables.  Returns `{ reportId, status }` immediately (`status: "generating"`). Poll GET /artifacts/{artifactId}/coverage (optionally `?reportId=<id>`) until `status` is `complete` or `failed`.  Coverage produces a separate report — it does NOT change the artifact, its revision, or its share URLs. Free-plan accounts may generate one coverage report; additional reports require an upgrade (403 `plan_limit_reached`). Every plan has a monthly cap on coverage reports: past it the request is refused with 403 `usage_limit_reached`, whose `details.resetsAt` says when it resets — do not retry before then.  Requires `Idempotency-Key`. Scope: `story:write`.

## Headers

- `Idempotency-Key` string, required

## Request body

- object
  - `focusPrompt` string: Optional free-form lens the analysis should weave throughout (e.g. "focus on whether the second act earns its midpoint").
  - `confirmed` boolean: Omit to get the price WITHOUT running anything: the request is checked the same way and answers what a new report would use (a report costs no Studio Credits — it is metered by the plan) and starts NOTHING. Pass true only once the writer has seen that and said go.

## Response `200`

Coverage generation queued. Poll GET /artifacts/{artifactId}/coverage until terminal.

- CoverageDispatchAck: Acknowledgement that a coverage report has been queued. Poll GET /artifacts/{artifactId}/coverage with the returned `reportId`.
  - `artifactId` string, required
  - `reportId` string, required
  - `status` 'generating' | 'complete' | 'failed', required: Lifecycle of an async coverage report. Poll GET /artifacts/{id}/coverage until `complete` or `failed`.
  - `version` integer, required: Sequential coverage version for the backing script (increments per report).

## 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)
