---
title: "Search Template Pages"
method: GET
path: "/templates/pages"
tags: ["canvas-actions"]
---

# Search Template Pages

`GET /templates/pages`

## Request

- Base URL: `https://api.moda.app/v1`
- URL: `https://api.moda.app/v1/templates/pages`
- Auth: HTTP bearer

Search the reusable items of the team's templates and themes (hybrid keyword + meaning).

An item is one slide or page (a deck slide, a carousel slide), or a whole document (a 2-page
resume). Find the one you need ("our timeline slide"), LOOK at its thumbnail, then copy it
into a canvas with ``POST /v1/canvases/{canvas_ref}/import-pages`` (``source`` = ``canvas_id``,
``page_ids`` = the item's ``page_ids`` — all of them). To start from a WHOLE template
instead, use ``GET /v1/templates``.

Pass ``query``, ``category``, ``item_kind``, or a combination. Team-scoped with the same
visibility as ``GET /v1/templates``: another team's items, and canvases you cannot view,
never appear.

## Query parameters

- `query` string: What the item is, in words (``timeline slide``, ``resume``, ``meet the team``). Omit to browse by ``category`` / ``item_kind``.
- `category` 'presentation' | 'resume' | 'document' | 'menu' | 'print' | 'social' | 'other'
- `item_kind` 'title' | 'agenda' | 'section' | 'text' | 'comparison' | 'timeline' | 'process' | 'chart' | 'table' | 'pricing' | 'team' | 'quote' | 'gallery' | 'closing' | 'report' | 'proposal' | 'fact_sheet' | 'one_pager' | 'guidelines' | 'ebook' | 'letter' | 'invoice' | 'flyer' | 'poster' | 'brochure' | 'card' | 'invitation' | 'certificate' | 'post' | 'carousel' | 'story' | 'other'
- `kind` 'template' | 'theme': The ``canvases.template_type`` values whose pages the library indexes.
- `limit` integer: Max items. Defaults to 10, caps at 50.

## Headers

- `Moda-Version` '2026-04-12' | '2026-05-01'

## Response `200`

Successful Response

- SearchTemplatePagesResponse: Best-first item hits (not paginated — narrow the query or category instead).
  - `data` TemplatePageItem[], required: Matching items, best match first.
    - `canvas_id` string, required: Wire id (``cvs_...``) of the template or theme canvas the item belongs to — the ``source`` of ``POST /v1/canvases/{canvas_ref}/import-pages``.
    - `page_ids` string[], required: Every page of the item, in order — pass ALL of them as ``page_ids`` to import the item (one id for a slide; several for a multi-page document or carousel). An import takes at most 100 page ids: import a longer item in order, in batches.
    - `page_id` string, required: The item's first page (``page_ids[0]``).
    - `page_index` integer, required: Zero-based position of the item's first page in its canvas.
    - `page_count` integer, required: Number of pages in the item.
    - `label` string, nullable: What the item is, as a functional name (``comparison slide``, ``2-page resume``, ``quote post``); ``null`` until classified.
    - `title` string, required: The literal page name (``Slide N`` / ``Page N`` when unnamed), or the template name for an unnamed multi-page item.
    - `canvas_name` string, required: Name of the template or theme the item belongs to.
    - `kind` 'template' | 'theme', required: The ``canvases.template_type`` values whose pages the library indexes.
    - `category` 'presentation' | 'resume' | 'document' | 'menu' | 'print' | 'social' | 'other'
    - `item_kind` 'title' | 'agenda' | 'section' | 'text' | 'comparison' | 'timeline' | 'process' | 'chart' | 'table' | 'pricing' | 'team' | 'quote' | 'gallery' | 'closing' | 'report' | 'proposal' | 'fact_sheet' | 'one_pager' | 'guidelines' | 'ebook' | 'letter' | 'invoice' | 'flyer' | 'poster' | 'brochure' | 'card' | 'invitation' | 'certificate' | 'post' | 'carousel' | 'story' | 'other'
    - `excerpt` string, required: The start of the item's text, to tell similar items apart.
    - `match_type` 'keyword' | 'semantic' | 'hybrid', nullable: Which search arm matched; ``null`` when browsing by category without a query.
    - `thumbnail_url` string, nullable: Signed thumbnail URL of the item's first page (bounded lifetime) — download it to LOOK before choosing; ``null`` when not rendered yet. Use-and-discard: never persist this URL.
    - `thumbnail_unavailable` boolean: ``true`` when a thumbnail EXISTS but could not be signed right now (transient) — retry.
  - `returned` integer, required: Number of items in ``data``.
  - `keyword_only` boolean, required: ``true`` when meaning-based matching was unavailable for this request and only literal keywords were matched — an empty or thin result is then NOT proof the item doesn't exist; retry.

## Other responses

- `401`: Authentication required.
- `402`: Insufficient credits for a metered operation.
- `403`: Permission denied for this scope.
- `404`: Resource not found.
- `409`: Conflict (idempotency / resource state).
- `422`: Request validation failed.
- `429`: Rate limit exceeded.
- `500`: Internal error.

## Changes

- **2026-11-03** `9ac6a3abc0f8`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/moda/apis/moda-public-api/changes/templates/pages/get.md)

---

[API](https://skmtc.dev/moda/apis/moda-public-api.md) - [All operations](https://skmtc.dev/moda/apis/moda-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/moda/apis/moda-public-api/revisions/9ac6a3abc0f8?raw)
