# Pages · Content Delivery API

> Content Delivery API reference for pages: GET /pages, GET /pages/{slug}.

> Markdown version of https://kanorio.com/en/developers/delivery-api/pages. Append `.md` to any developer docs URL for this format. Index: https://kanorio.com/llms.txt · MCP: https://app.kanorio.com/api/mcp

Base URL: `https://{site}/api/v1` · [Errors](https://kanorio.com/en/developers/basics/errors) · [Pagination](https://kanorio.com/en/developers/basics/pagination)

### Published pages and hierarchy tree (paths, parentSlug, breadcrumbs, SEO)

`GET /pages`

- Stability: beta
- Authentication: none

**Parameters**

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `locale` | query | string | no | Locale for page titles and SEO fields. One of the site's locales from /site (a code such as `en-US` or the URL prefix such as `en`); omit it for the primary locale. Other values, including locales that are still translating, return 400 UNSUPPORTED_LOCALE. Untranslated fields fall back to the primary locale. On multilingual sites each page carries resolvedLocale and availableLocales. Slugs stay in the primary locale's path space; prefix them with the locale's pathPrefix. |
| `limit` | query | integer | no | Maximum number of items to return, 1-100. Defaults to 20. |
| `cursor` | query | string | no | Opaque cursor from the previous page's nextCursor. Omit for the first page. |

**Response** (200)

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | object[] | yes | — |
| `data[].resolvedLocale` | string | no | Multilingual sites only: the locale this page was delivered in (the requested locale when it has a published translation, otherwise the primary locale). |
| `data[].availableLocales` | string[] | no | Multilingual sites only: locales with a published translation of this page (the primary locale is not listed). Use it for hreflang and canonical. |
| `data[].localePaths` | object | no | Multilingual sites only: this page's path in every live locale, keyed by locale code, without the locale prefix (each locale can have its own translated slug). Use it for hreflang, a language switcher and sitemap alternates. |
| `data[].id` | string | yes | — |
| `data[].slug` | string | yes | — |
| `data[].path` | string | yes | — |
| `data[].parentSlug` | string \| null | yes | — |
| `data[].isDirectory` | boolean | yes | — |
| `data[].depth` | integer | yes | — |
| `data[].ancestors` | object[] | yes | — |
| `data[].ancestors[].slug` | string | yes | — |
| `data[].ancestors[].path` | string | yes | — |
| `data[].ancestors[].title` | string | yes | — |
| `data[].breadcrumbs` | object[] | yes | — |
| `data[].breadcrumbs[].label` | string | yes | — |
| `data[].breadcrumbs[].href` | string | yes | — |
| `data[].breadcrumbSource` | "path" \| "override" | yes | — |
| `data[].title` | string | yes | — |
| `data[].pageType` | string | yes | — |
| `data[].isHomePage` | boolean | yes | — |
| `data[].order` | integer | yes | — |
| `data[].globalHeaderId` | string \| null | no | — |
| `data[].globalFooterId` | string \| null | no | — |
| `data[].seo` | object | yes | — |
| `data[].seo.ogImageFraming` | object \| null | no | Optional presentation framing for the share image (fitMode, padColor, focus, screens). |
| `data[].publishedAt` | string \| null | no | — |
| `data[].updatedAt` | string | no | — |
| `hasMore` | boolean | yes | True when another page exists; pass nextCursor to fetch it. |
| `nextCursor` | string \| null | yes | Cursor for the next page, or null on the last page. |

**Errors**

| Code | Status | When |
| --- | --- | --- |
| `UNSUPPORTED_LOCALE` | 400 | — |
| `INVALID_CURSOR` | 400 | — |

```bash
curl -X GET "https://{site}/api/v1/pages"
```

### One published page by slug (supports 2-level path and 'home' alias) with sections and assets map

`GET /pages/{slug}`

- Stability: beta
- Authentication: none

**Parameters**

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `slug` | path | string | yes | — |
| `locale` | query | string | no | Locale for the page title, SEO fields and section text. One of the site's locales from /site (a code such as `en-US` or the URL prefix such as `en`); omit it for the primary locale. Other values, including locales that are still translating, return 400 UNSUPPORTED_LOCALE. Untranslated fields fall back to the primary locale. On multilingual sites the page carries resolvedLocale and availableLocales (use them for canonical and hreflang). Slugs and in-content links stay in the primary locale's path space; prefix them with the locale's pathPrefix. |

**Response** (200)

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `page` | any | yes | — |
| `assets` | object | yes | — |

**Errors**

| Code | Status | When |
| --- | --- | --- |
| `PAGE_NOT_FOUND` | 404 | — |
| `UNSUPPORTED_LOCALE` | 400 | — |

```bash
curl -X GET "https://{site}/api/v1/pages/{slug}"
```
