---
title: "Check a tour document without storing it."
method: POST
path: "/story-projects/{projectId}/tours/check"
tags: ["Sources"]
---

# Check a tour document without storing it.

`POST /story-projects/{projectId}/tours/check`

## Request

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

Exactly one of the document to check (`tour`, as it would be sent to create) or the stored tour to check again (`tourId`) — both, or neither, is 400 `validation_failed`. Answers the SAME problems `capture record`'s own check raises, VERBATIM, plus what a recording of it needs (its `secretRefs`) and what it hears; errors and warnings together are a normal answer. Writes nothing, so no Idempotency-Key. `tourId` naming a tour this project does not hold is 404 `tour_not_found`. Free.

## Request body

- union: CHECK A DOCUMENT: exactly one of `tour` (the one standing in the writer's hand) or `tourId` (the one stored). Nothing is written.
  - object
    - `tour` object, required: The document to check, exactly as it would be sent to create.
  - object
    - `tourId` string, required: The stored tour to check again. 404 `tour_not_found` when it is not this project's.

## Response `200`

The check, and nothing else — nothing was written.

- object
  - `check` TourCheckResult, required: What the document check answers about one tour: the same problems `capture record`'s own check raises, verbatim — plus what recording this tour needs and what it hears.
    - `ok` boolean, required: True when the tour can be recorded (`errors` is empty).
    - `errors` string[], required: One readable line per problem, exactly as the recorder's check says them.
    - `warnings` string[], required: What is true but needs saying (app sound, secrets to resolve). Never a refusal.
    - `secretRefs` string[], required: The `secretRef` ids the tour's type steps name: a recording must resolve each one.
    - `sound` 'off' | 'app', nullable, required: What the take hears; null when the tour does not parse.
    - `stepCount` integer, nullable, required: How many recording steps the tour has; null when it does not parse.

## 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`: No tour with that id in this project (`tour_not_found`), or the project is not yours (`project_not_found`). Nothing was checked against the stored document.
- `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)
