---
title: "Read what Sleeper learned about the product from its site: the newest run and feature inventory."
method: GET
path: "/story-projects/{projectId}/feature-inventory"
tags: ["Sources"]
---

# Read what Sleeper learned about the product from its site: the newest run and feature inventory.

`GET /story-projects/{projectId}/feature-inventory`

## Request

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

The newest run (`learning`, `ready` or `failed` with `error`) and the newest saved inventory: the product's promise and audience, personas, features (each with an availability and the pages it was read from), claims, pricing, voice, brand colours, every page read and every gap. An older inventory stays readable, unchanged, while a refresh learns. A feature named on a page is declared, not proven: availability shipped, beta or planned needs a page that says so, and a feature or claim with no page behind it reads unknown or inferred. Nothing here is a confirmed claim yet. Reads only.

## Response `200`

The newest run and inventory (each null before the first).

- FeatureInventoryResponse
  - `projectId` string, required
  - `run` FeatureInventoryRun, required
    - `id` string, required
    - `status` 'learning' | 'ready' | 'failed', required: `learning` until the inventory is saved (`ready`) or the run stops (`failed`, with `error`). A run that stopped answering reads `failed`.
    - `siteUrl` string, required
    - `connectionId` string, nullable, required: The app connection the run signs in and walks the app's screens with; `null` learns the public site only.
    - `startedAt` string, date-time, required
    - `finishedAt` string, date-time, nullable, required
    - `error` string, nullable, required: Why it stopped, in words for the person. Null unless `failed`.
    - `pagesRead` integer, nullable, required
    - `documentVersion` integer, nullable, required: The inventory version this run saved.
    - `changeSummary` object, nullable, required: Which features are new and which are gone since the inventory before, by name.
      - `previousVersion` integer, nullable, required
      - `added` string[], required
      - `removed` string[], required
  - `inventory` FeatureInventory, required: What the product's public site says it is. A feature named on a page is declared, not proven: availability shipped, beta or planned needs a page that says so, and a feature or claim with no page behind it reads unknown or inferred. Nothing here is a confirmed claim yet.
    - `schemaVersion` integer, required
    - `site` object, required
      - `url` string, required
      - `origin` string, required
      - `name` string, required
    - `learnedAt` string, date-time, required
    - `product` object, required
      - `name` string, required
      - `promise` string, required
      - `problem` string, required
      - `audience` string, required
      - `category` string, required
    - `personas` object[], required
      - `id` string, required
      - `role` string, required
      - `needs` string, required
    - `features` object[], required
      - `id` string, required: Stable across refreshes: the name as a slug (`f-table-read`).
      - `name` string, required
      - `area` string, required: The product area or release it belongs to.
      - `outcome` string, required: What the user gets.
      - `availability` 'unknown' | 'shipped' | 'beta' | 'planned', required: `shipped`, `beta` or `planned` only when a page says so; otherwise `unknown`.
      - `evidenceIds` string[], required: The `evidence` ids (pages) it was read from. Never empty.
      - `filmableMoments` string[], required: Moments a screen recording could show. Ideas for a tour, never footage.
      - `confidence` 'high' | 'medium' | 'low', required
    - `claims` object[], required
      - `id` string, required
      - `statement` string, required
      - `evidenceIds` string[], required
      - `status` 'declared' | 'inferred', required: `declared` when a page states it; `inferred` otherwise (and always when no page backs it).
      - `caveats` string, required
    - `pricing` object, required
      - `summary` string, required
      - `plans` object[], required
        - `name` string, required
        - `price` string, required
        - `includes` string, required
    - `voice` object, required
      - `tone` string, required
      - `cta` string, required
    - `brand` object, required: Read from the site's own markup (theme-color, its web manifest), never guessed.
      - `colors` string[], required
      - `iconUrl` string, nullable, required
    - `evidence` object[], required
      - `id` string, required
      - `kind` 'page' | 'docs' | 'llms_txt' | 'llms_full_txt' | 'openapi' | 'app_screen', required
      - `url` string, required
      - `title` string, nullable, required
    - `gaps` object[], required
      - `kind` 'robots_disallowed' | 'robots_unreachable' | 'fetch_failed' | 'not_text' | 'off_site' | 'budget_exhausted' | 'page_truncated' | 'script_drawn' | 'no_llms_txt' | 'no_sitemap' | 'no_openapi' | 'sign_in_failed' | 'screen_skipped', required
      - `url` string, nullable, required
      - `detail` string, required
    - `questions` string[], required: What the site left unanswered, for the founder.
    - `stats` object, required
      - `pagesRead` integer, required
      - `pagesSkipped` integer, required
      - `bytesRead` integer, required
      - `durationMs` integer, required
  - `version` integer, nullable, required
  - `updatedAt` string, date-time, 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/64c1102ccb2f?raw)
