---
title: "Read a waiting plan's advice."
method: GET
path: "/story-plans/{planId}/advice"
tags: ["Plans"]
---

# Read a waiting plan's advice.

`GET /story-plans/{planId}/advice`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/story-plans/{planId}/advice`
- Auth: HTTP bearer

A waiting plan's advice is never a gate: the plan stays approvable either way. `openingNovelty` says when its opening echoes an earlier film of the same product and the one change that avoids it (`alternative.field` and `alternative.value`); `signatureDeviceAgreement` says which capture beats show a different device from the one the story's cast is always seen with (`mismatchedBeatIds`). Applying one changes only the beat it names and nothing else. Free. The same advice the plan review card shows. Both fields are null on a plan that no longer waits for approval, or has nothing to advise.

## Response `200`

The plan's advice.

- PlanAdviceResponse: A waiting plan's advice is never a gate: the plan stays approvable either way. `openingNovelty` says when its opening echoes an earlier film of the same product and the one change that avoids it (`alternative.field` and `alternative.value`); `signatureDeviceAgreement` says which capture beats show a different device from the one the story's cast is always seen with (`mismatchedBeatIds`). Applying one changes only the beat it names and nothing else. Free.
  - `planId` string, required
  - `openingNovelty` PlanAdviceOpeningNovelty, required: The plan opens the way an earlier film of the same product did: the sentence naming it, and the one change that avoids it.
    - `trope` string, required
    - `nearestPriorFilmIds` string[], required: The same product's matching earlier plans, nearest first.
    - `sentence` string, required
    - `alternative` object, required: Send it back as `{ kind: "opening", field, value }` to make the change.
      - `field` 'firstWorldStaging' | 'firstScreenCapture', required
      - `value` string, required
  - `signatureDeviceAgreement` PlanAdviceDeviceAgreement, required: The device the story's cast is always seen with, read against each capture beat's frame. Send `mismatchedBeatIds` back as `{ kind: "device", beatIds }` to settle them.
    - `signatureDevice` 'laptop' | 'phone', nullable, required
    - `stated` boolean, required
    - `mismatchedBeatIds` string[], required
    - `agrees` boolean, required
    - `summary` string, required
    - `note` string, nullable, required
    - `verdicts` object[], required
      - `beatId` string, required
      - `verdict` 'AGREES' | 'DERIVED' | 'NO_DEVICE' | 'MISMATCH', required
      - `frameKind` string, required
      - `sentence` string, nullable, required

## Other responses

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