---
title: "Quote a recording of every shipped feature that has none yet."
method: POST
path: "/story-projects/{projectId}/tours/record-missing"
tags: ["Sources"]
---

# Quote a recording of every shipped feature that has none yet.

`POST /story-projects/{projectId}/tours/record-missing`

## Request

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

A tour is a JSON walkthrough of one product feature — what to open, where to click and type, and how to mark the moments a take is cut on — that a screen recording is made from. No tour on the wire: the project's readiness decides which shipped features have no ready recording, and each is recorded from the newest of its tours that checks. A recording is priced at its tour's own time limit, rounded up to whole minutes. Writes one `quoted` job per tour through the one recording quote and holds nothing — no credits move until the confirm posts the job ids. A feature left out answers in `skipped` with its reason (no tour yet, a tour that does not check, or a recording already booked or recording). The body may be omitted or empty. 409 `project_not_product` for a story project.

## Request body

- object

## Response `200`

The quote (`quotedOnly: true`): one job per tour, the total and the balance. Nothing was bought.

- MissingTourRecordingsQuote: One quoted job per shipped feature without a ready recording that can be recorded now, the total, the balance, and the features left out with their reasons. Nothing was bought.
  - `quotedOnly` true, required
  - `projectId` string, required
  - `jobs` MissingTourRecordingJob[], required
    - `jobId` string, required: The recording job, to book or give back.
    - `tourId` string, required
    - `featureId` string, required
    - `featureName` string, required: The feature as the Series Bible names it.
    - `minutes` integer, required: The tour's own time limit, rounded up to whole minutes.
    - `credits` integer, required
  - `totalMinutes` integer, required
  - `totalCredits` integer, required
  - `balance` number, required: The Studio Credits the booking would be charged against.
  - `skipped` object[], required
    - `featureId` string, required
    - `featureName` string, required
    - `code` 'no_tour' | 'tour_does_not_check' | 'already_booked', required
    - `reason` string, required: The reason in one sentence.
  - `note` string, required: The quote in one sentence, to read out.

## 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`: `project_not_product` — the project is a story project. Nothing was quoted.
- `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)
