> ## Documentation Index
> Fetch the complete documentation index at: https://weaverse.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Weaverse component configuration uses `settings`. `inspector` is deprecated; never generate it.
> Weaverse Hydrogen themes use React Router v7: import from `react-router`, never `react-router-dom` or `@remix-run/*`.
> Define component schemas with `createSchema()` from `@weaverse/hydrogen` (React Router themes) or `@weaverse/next` (Next.js themes).
> These docs cover @weaverse/hydrogen, @weaverse/react and @weaverse/core 5.x, and @weaverse/next 1.x. Do not use APIs from other major versions.
> For live project data (pages, theme settings, translations), use the Weaverse MCP server: https://docs.weaverse.io/developer-tools/weaverse-mcp

# List page assignments

> 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`



## OpenAPI

````yaml https://studio.weaverse.io/api/v1/content/openapi.json get /projects/{projectId}/pages
openapi: 3.1.0
info:
  title: Weaverse Content API
  version: 1.0.0
  description: >-
    Authenticated REST API for querying Weaverse-managed content (projects,
    pages, theme settings, languages) and for reading and writing per-locale
    translations.
servers:
  - url: https://studio.weaverse.io/api/v1/content
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Projects
    description: List, read, rename, create, copy and delete projects.
  - name: Pages
    description: List, read, create, update and delete the pages of a project.
  - name: Drafts and publishing
    description: >-
      Edit page drafts, then publish, schedule, restore and manage page
      versions.
  - name: Global sections
    description: Read, edit and publish sections shared across pages.
  - name: Page settings
    description: Read and edit page-level settings such as SEO metadata.
  - name: Assignments
    description: Map Shopify resources and routes to Weaverse pages and templates.
  - name: Theme settings
    description: Read and update a project's theme settings.
  - name: Languages and localization
    description: List project languages and manage locales, static text and glossary.
  - name: Translations
    description: >-
      Read and write per-locale translations, built for external translation
      agents.
  - name: Project structure
    description: Manage project variants and the project hierarchy.
  - name: Backups and portability
    description: Back up, restore, export and import project content.
  - name: Previews and hostnames
    description: Create preview links and manage the hostnames a project accepts.
  - name: Specification
    description: This OpenAPI document.
paths:
  /projects/{projectId}/pages:
    get:
      tags:
        - Pages
      summary: List page assignments
      description: >-
        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`
      operationId: listPages
      parameters:
        - name: projectId
          in: path
          required: true
          schema:
            type: string
        - name: type
          in: query
          schema:
            type: string
            enum:
              - INDEX
              - PRODUCT
              - ALL_PRODUCTS
              - COLLECTION
              - COLLECTION_LIST
              - PAGE
              - BLOG
              - ARTICLE
              - CART
              - CUSTOMER
              - NOT_FOUND
              - PASSWORD
              - SEARCH
              - CUSTOM
        - name: locale
          in: query
          schema:
            type: string
          description: >-
            Exact locale match (e.g. "en-us"). No fallback applied on list
            endpoint.
        - name: after
          in: query
          schema:
            type: string
        - name: limit
          in: query
          schema:
            type: integer
            default: 50
            maximum: 100
      responses:
        '200':
          description: Paginated list of page assignments
          content:
            application/json:
              schema:
                type: object
                properties:
                  object:
                    type: string
                    enum:
                      - list
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/PageAssignment'
                  nextCursor:
                    type:
                      - string
                      - 'null'
              example:
                object: list
                data:
                  - id: clz4m5n6p0006qrst7890uvwx
                    type: PRODUCT
                    handle: blue-shirt
                    locale: en-us
                    pageId: clz2r7t5w0002mnop9012qrst
                    updatedAt: '2026-10-18T14:22:05.000Z'
                    isTemplateMarker: false
                  - id: clz4m6p7q0007qrst1234yzab
                    type: CUSTOM
                    handle: pages/gift-shop
                    locale: ''
                    pageId: clz2r8u6x0003mnop3456uvwx
                    updatedAt: '2026-10-19T08:03:41.000Z'
                    isTemplateMarker: false
                nextCursor: null
        '400':
          description: Invalid params
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Project not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    PageAssignment:
      type: object
      description: >-
        A page assignment as returned by the list endpoint. `updatedAt` is the
        owning Page's revision timestamp, so assignments that share one template
        page report the same value. `isTemplateMarker` distinguishes internal
        template-alias rows from real storefront resources.
      properties:
        id:
          type: string
        type:
          type: string
        handle:
          type: string
        locale:
          type:
            - string
            - 'null'
        pageId:
          type: string
        updatedAt:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            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:
          type: boolean
          description: >-
            `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.
    Error:
      type: object
      required:
        - object
        - code
        - message
        - status
      properties:
        object:
          type: string
          enum:
            - error
        code:
          type: string
          enum:
            - UNAUTHORIZED
            - FORBIDDEN
            - INSUFFICIENT_SCOPE
            - PROJECT_NOT_FOUND
            - PAGE_NOT_FOUND
            - STALE_PAGE
            - STALE_PROJECT
            - STALE_TRANSLATION
            - TRANSLATION_UNIT_NOT_FOUND
            - SERVICE_UNAVAILABLE
            - CONFLICT
            - PRECONDITION_REQUIRED
            - INVALID_PARAMS
            - INTERNAL_ERROR
        message:
          type: string
        status:
          type: integer
        details:
          description: >-
            Optional machine-readable context, for example the clashing handles
            of a 409 CONFLICT.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: WEAVERSE_API_KEY
      description: >-
        Bearer authentication: a shop API key (WEAVERSE_API_KEY), a scoped API
        key, a delegated MCP OAuth token, or (translation-unit routes only) a
        project-bound translation agent token. Scopes: content:read — Read
        projects, pages, theme settings, versions, drafts and translation units.
        content:write — Save drafts and make non-destructive edits (page items,
        metadata, SEO, assignments, languages, glossary). Never publishes or
        deletes. content:publish — Publish drafts, schedule/reschedule/cancel
        publications, restore versions, publish global sections. content:delete
        — Delete pages, global sections, languages, static keys, override
        reverts; required with project:manage for project deletion.
        project:manage — Create/copy/delete projects, settings, variants,
        hierarchy, backups, restore-as-new, previews, hostname policy.
        translations:read — Read translation units only (no general content
        access). translations:write — Apply translation units only; never
        mutates page content. A legacy unscoped API key keeps
        read/write/translation baseline access and every pre-scope endpoint, but
        never gains publish/delete/project-manage implicitly.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.