---
title: "Confirm, reject or reopen one claim (the founder's decision)."
method: POST
path: "/story-projects/{projectId}/claims-ledger/{claimId}"
tags: ["Projects"]
---

# Confirm, reject or reopen one claim (the founder's decision).

`POST /story-projects/{projectId}/claims-ledger/{claimId}`

## Request

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

Record the founder's decision on one claim: `confirm` (true, and may be said), `reject` (must never be said) or `reopen` (take the decision back). Only on the founder's explicit word, never on your own judgement. A decision is kept by the claim's wording, so it survives a refresh of the site. The next product Bible written from the ledger follows it. Free. 404 `claim_not_found` for an id the ledger does not list; 409 `project_not_product` for a story project.

## Request body

- DecideClaimBody
  - `decision` 'confirm' | 'reject' | 'reopen', required: `confirm` (true, and may be said), `reject` (must never be said) or `reopen` (take the decision back).
  - `note` string: Why, or the exact wording that may be used.

## Response `200`

The claim as it now stands, and the ledger's version.

- DecideClaimResult
  - `projectId` string, required
  - `entry` ClaimsLedgerEntry, required
    - `id` string, required: Stable for the claim's wording (`claim-…`): the same claim keeps its id across refreshes of the site.
    - `statement` string, required
    - `status` 'declared' | 'inferred' | 'confirmed' | 'rejected', required: `declared` (a page says it), `inferred` (read between the lines), `confirmed` (the founder said it may be said) or `rejected` (never to be said). Only the founder confirms or rejects.
    - `caveats` string, required: The conditions the site attaches, or what makes it risky to repeat.
    - `sources` object[], required: The pages it was read from: addresses and titles, never page text.
      - `url` string, required
      - `title` string, nullable, required
    - `onSite` boolean, required: Whether the newest inventory still lists it. A decided claim the site dropped stays, `false`.
    - `decidedAt` string, date-time, nullable, required: When the founder decided it; null while undecided.
    - `note` string, required: The founder's note on the decision.
  - `version` integer, required: The ledger's version after the decision. The same decision twice writes nothing and answers the same version.

## 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`: `project_not_found` or `claim_not_found`. Nothing changed.
- `409`: `project_not_product` — the project is a story project. Nothing changed.
- `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)
