Source: https://seerepo.com/docs/api-pages
Markdown source: https://seerepo.com/docs/api-pages.md
Description: Every page of the app as a person meets it: who gets in and what it handles.

# Get the pages

`GET https://seerepo.com/api/v1/repos/:repo/pages`

Returns the Pages folder as it reads in the app: every page with its name, its route, who gets in, and the states it handles or misses, each with the file and line that prove it. The pages are grouped by the map's top-level modules, in the map's order.

## Request

| Parameter | Where | Description |
|---|---|---|
| `repo` | path | The repo's id, or owner/name with %2F. |

```sh
curl "https://seerepo.com/api/v1/repos/6ad79fd8e89233277ded17c9/pages" \
  -H "Authorization: Bearer $SEEREPO_KEY"
```

## Response

| Field | Type | Description |
|---|---|---|
| `data.repo` | object | The repo: its id and its name. |
| `data.summary` | object | How many pages, how many were read, how many states are missing or halfway, and how many are ready (`ready`): the ones that handle every state they show, the same figure as Arreglos' ring in the app. `ready` is null with no page read. |
| `data.columns[]` | object | One per top-level module: its `key` (the module's path, or `/` for the pages in no module: the root's own and Data's, which the folder shows last as «Outside the modules»), its `name` and its pages' paths. |
| `data.screens[].name` | string | What a person calls the page. |
| `data.screens[].route` | string | Its address, like `/checkout`. |
| `data.screens[].who` | string | Who gets in: `anyone`, `people` (the door wasn't seen: a repo with its own sign-in where no page was proved private, a Python view, or a page of SvelteKit, TanStack, React Router, Vue, Nuxt or Angular whose guard isn't read yet; it doesn't say they ask for a session), `with-link`, `signed-in`, `member`, `owner` or `operator` (only those who run the product). |
| `data.screens[].whoBy` | string | `haiku` when who gets in was read by the AI, whose line proved a narrower door than the rules saw. Absent when the rules said it. |
| `data.screens[].states[]` | object | Each state: its name, `ok`, `half` or `missing`, and its proof (its path, line and `url` on GitHub at the scanned commit). |
| `data.screens[].does` | string\|null | What it does, in one sentence. |
| `data.screens[].dropped` | number | How many things the AI said of the page and the scan threw out: a state the rules already read, one said twice or with no line that proves it, or who gets in without a line that proves it. They are never shown as true. Absent with none. `data.summary.dropped` is their sum. |
| `data.rules` | object | The version of the rules its last scan judged the states with, the current one, and each change with its date (since the 21st of October, loading is asked only of a screen that waits on data): a figure that moves because a rule changed says so. |
| `data.locked` | boolean | A repo on the free look: its states come as shapes (how many and how many are missing, not which), with no proof, what it does or its last change, as in the app. |
| `data.screens[].redirects` | object | Only when the page just takes whoever opens it somewhere else: its normal path ends in a redirect and all it draws is its error, or an effect navigates with no condition. The line that does it (`path`, `line` and its `url` on GitHub) and `to` when the code names the route. Absent on a page. |
| `data.apart[]` | object | The page files that aren't pages, by why: `why` (`next.devPage`, a page only development serves; `next.flagPage`, one behind a flag; `next.redirectPage`, one that only sends you to another; `next.errorPage`, the one shown when something went wrong), `n` (how many) and `routes` (the first five, in order). Absent with none. |
| `data.unread` | string | `python` in a Python repo: Python has no Pages yet, its views are read by file and who gets in to each isn't known. Absent otherwise. |

### Example

```json
{
  "status": "success",
  "data": {
    "summary": { "screens": 2, "read": 2, "missing": 1, "half": 0, "ready": 1 },
    "columns": [{ "key": "/checkout", "name": "Checkout", "screens": ["app/checkout/page.tsx"] }],
    "screens": [
      {
        "path": "app/checkout/page.tsx",
        "route": "/checkout",
        "name": "Pay",
        "who": "anyone",
        "statesRead": true,
        "states": [{ "key": "error", "name": "Error", "status": "missing", "by": "rule" }]
      }
    ],
    "rules": { "version": 2, "current": 2, "changes": [{ "folder": "pages", "version": 1, "d": "2026-10-21", "id": "pages-1", "what": "Each screen's states read by rules with their proof: loading, error, empty, signed out and phone" }, { "folder": "pages", "version": 2, "d": "2026-10-21", "id": "pages-2", "what": "Loading is asked only of a screen that waits on data; a static page no longer misses it" }] },
    "locked": false
  }
}
```

## Authentication

An API key as `Authorization: Bearer sr_…`. See [Authentication](/docs/api#authentication).

## Errors

The ones every endpoint has (401, 404, 429), see [Errors](/docs/api#errors).
