---
title: "Check a variant against its destination spec."
method: POST
path: "/story-projects/{projectId}/deliverables/{deliverableId}/variants/{variantKey}/check"
tags: ["Projects"]
---

# Check a variant against its destination spec.

`POST /story-projects/{projectId}/deliverables/{deliverableId}/variants/{variantKey}/check`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/story-projects/{projectId}/deliverables/{deliverableId}/variants/{variantKey}/check`
- Auth: HTTP bearer

Check a variant against its destination's spec. `{variantKey}` is the variant's `destinationKey`; `attestations` is an optional array of strings, passed to the check untouched. A destination whose row fails its own spec check refuses the run as 409 `video_destination_unavailable` (`details.reason` names the field).

## Request body

- VideoDeliverableCheckRequest: The material the check runs with. `attestations` is threaded to the check untouched: the statement keys a human has genuinely signed off on (the LEAD rule: an attestation is never invented).
  - `attestations` string[]: The statement keys a human has attested to; a `human_attest` check fails unless every declared statement is here.

## Response `200`

The check report, the destination key it ran against and the spec version.

- VideoDeliverableCheckResult
  - `report` VideoDestinationCheckReport, required: The deterministic check run against the destination's own row spec.
    - `ok` boolean, required: False when any BLOCK check failed. A warn-only failure still reports `ok: true`.
    - `results` object[], required: Every check, in row order.
      - `kind` string, required: One check kind, straight from the destination row spec.
      - `severity` 'block' | 'warn', required
      - `passed` boolean, required
      - `detail` string, required: One line a reviewer can read on the checklist card.
    - `blocked` string[], required: The block failures, in row order.
  - `destinationKey` string, required
  - `specVersion` integer, required: The destination row spec's version the check ran against.

## 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.
- `409`: The destination's spec fails its check (`video_destination_unavailable`, `details.reason`).
- `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)
