---
title: "List page assignments"
method: GET
path: "/projects/{projectId}/pages"
tags: ["Pages"]
---

# List page assignments

`GET /projects/{projectId}/pages`

## Request

- Base URL: `https://studio.weaverse.io/api/v1/content`
- URL: `https://studio.weaverse.io/api/v1/content/projects/{projectId}/pages`
- Auth: HTTP bearer

Returns the page assignments of a project, oldest first. Each assignment maps a page `type` + `handle` + `locale` to a `pageId`; several assignments can share one template page.

- Treat `type` + `handle` as an opaque pair and pass them unchanged to `GET /projects/{projectId}/pages/{type}/{handle}`. Custom page handles may contain `/`: an entry with `type: "CUSTOM"` and `handle: "pages/gift-shop"` is fetched at `/projects/{projectId}/pages/CUSTOM/pages/gift-shop`.
- The `locale` filter is an exact match with no fallback. An empty `locale` value returns `400`.
- An unknown `type` filter or an invalid cursor returns `400 INVALID_PARAMS`.
- `updatedAt` is the owning page's revision timestamp (the same value the page detail endpoint returns), so changed pages can be detected without one request per page. Assignments that share a template page report the same value. List responses are cached, so the value may briefly lag.
- `isTemplateMarker` is `true` for internal alias rows Weaverse creates to wire a custom template to its page. Markers are labelled, never filtered, so pagination stays stable; filter them client-side when you only want real storefront pages.
- Inherited pages from a parent project are not listed.
- Paginate with `limit` (default `50`, max `100`) and `after` (the previous `nextCursor`).

Required scope: `content:read`

## Path parameters

- `projectId` string, required

## Query parameters

- `type` 'INDEX' | 'PRODUCT' | 'ALL_PRODUCTS' | 'COLLECTION' | 'COLLECTION_LIST' | 'PAGE' | 'BLOG' | 'ARTICLE' | 'CART' | 'CUSTOMER' | 'NOT_FOUND' | 'PASSWORD' | 'SEARCH' | 'CUSTOM'
- `locale` string
- `after` string
- `limit` integer

## Response `200`

Paginated list of page assignments

- object
  - `object` 'list'
  - `data` PageAssignment[]
    - `id` string
    - `type` string
    - `handle` string
    - `locale` string, nullable
    - `pageId` string
    - `updatedAt` string, date-time, nullable: Last update time of the owning Page (the content revision), matching the page detail endpoint's `updatedAt`. Use it to detect changed pages without a request per page. `null` when no page row backs the assignment. List responses are cached, so this value may be stale; no freshness guarantee is provided.
    - `isTemplateMarker` boolean: `true` when this entry is an internal alias row Weaverse creates to wire a custom template to its page, not a real storefront resource. Markers are always returned (filtering them would change pagination), so filter client-side when listing real pages. A bulk delete naming a marker handle is rejected.
  - `nextCursor` string, nullable

## Other responses

- `400`: Invalid params
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Project not found

---

[API](https://skmtc.dev/weaverse/apis/weaverse-content-api.md) - [All operations](https://skmtc.dev/weaverse/apis/weaverse-content-api/llms.txt) - [OpenAPI document](https://skmtc.dev/weaverse/apis/weaverse-content-api/revisions/d189794169bb?raw)
