> For the complete Lynkow documentation index in agent-friendly format, see [llms.txt](/llms.txt).

# SDK Types: API Responses

**Publié le** : 2026-08-20
**Catégorie** : Types

# SDK Types: API Responses

## `CategoriesListResponse`

*Interface*

Response from `categories.list()`.
Returns all categories (flat list, not paginated) with their content counts.

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `blogUrlMode` | `string` | No | How blog content URLs are constructed for this site:<br>- `'flat'`: URLs use slug only, e.g. `/blog/my-article`<br>- `'nested'`: URLs include the category path, e.g. `/blog/tech/my-article`<br><br>This affects how you should build links to content articles.<br>Configured in the site's SEO settings. |
| `categories` | `CategoryWithCount[]` | No | Flat array of all categories with their published content count.<br>Not paginated -- all categories are returned in a single response. |
| `locale` | `string \| null` | No | Active locale code (e.g. `'en'`, `'fr'`) for the returned data, or `null`<br>when the site's default locale was used (no locale override was requested). |


---

## `CategoryDetailResponse`

*Interface*

Response from `categories.getBySlug()`.
Contains the full category details along with its paginated content list.

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `category` | `CategoryDetail` | No | Full category details including description, image, content count,<br>schema (for structured categories), and parent info. |
| `contents` | `{ data: ContentSummary[]; meta: PaginationMeta }` | No | Paginated list of published content summaries belonging to this category.<br>Supports the same pagination options as `contents.list()`. |
| `locale` | `string \| null` | No | Active locale code (e.g. `'en'`, `'fr'`) for the returned data, or `null`<br>when the site's default locale was used (no locale override was requested). |


---

## `CategoryResolveResponse`

*Interface*

Path resolution response when the resolved path matches a category.
Returned by `paths.resolve()` when the given URL corresponds to a category listing.

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `blogUrlMode` | `string` | No | Blog URL mode active on this site (`'flat'` or `'nested'`). |
| `category` | `CategoryDetail` | No | Full category details including description, image, content count,<br>and parent category reference. |
| `contents` | `{ data: ContentSummary[]; meta: PaginationMeta }` | No | Paginated list of published content summaries belonging to the resolved category.<br>Pagination can be controlled via query parameters on the resolve request. |
| `locale` | `string` | No | Locale that was resolved for this path (e.g. `'en'`, `'fr'`). |
| `type` | `"category"` | No | Discriminator field. Always `'category'` for this response type.<br>Use this to narrow the ResolveResponse union. |


---

## `CategoryTreeResponse`

*Interface*

Response from `categories.tree()`.
Returns categories organized in a parent-child hierarchy.

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `blogUrlMode` | `string` | No | How blog content URLs are constructed for this site:<br>- `'flat'`: URLs use slug only, e.g. `/blog/my-article`<br>- `'nested'`: URLs include the category path, e.g. `/blog/tech/my-article`<br><br>Use this to determine whether category slugs should appear in content URLs. |
| `locale` | `string \| null` | No | Active locale code (e.g. `'en'`, `'fr'`) for the returned data, or `null`<br>when the site's default locale was used (no locale override was requested). |
| `tree` | `CategoryTreeNode[]` | No | Root-level category nodes, each containing nested `children` arrays.<br>Categories with a `parentId` appear as children of their parent node. |


---

## `ConsentLogResponse`

*Interface*

Response from `cookies.logConsent()`.
Records the user's cookie consent preferences for GDPR compliance.

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `consentId` | `string` | No | Unique UUID identifying this consent record.<br>Can be stored client-side as proof of consent for auditing purposes.<br>Format: UUID v4 (e.g. `'550e8400-e29b-41d4-a716-446655440000'`). |
| `message` | `string` | No | Confirmation message (e.g. "Consent recorded"). |


---

## `ContentResolveResponse`

*Interface*

Path resolution response when the resolved path matches a content article.
Returned by `paths.resolve()` when the given URL corresponds to a published article.

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `blogUrlMode` | `string` | No | Blog URL mode active on this site (`'flat'` or `'nested'`).<br>Determines the URL structure used to build the resolved path. |
| `content` | `Content` | No | Full content object for the matched article, including body, SEO fields,<br>categories, tags, author, and customData. |
| `locale` | `string` | No | Locale that was resolved for this path (e.g. `'en'`, `'fr'`).<br>May differ from the requested locale if the content only exists in another locale. |
| `type` | `"content"` | No | Discriminator field. Always `'content'` for this response type.<br>Use this to narrow the ResolveResponse union. |


---

## `ContentsListResponse`

*Interface*

Response from `contents.list()`.
Returns content summaries (without body) for performance.
Use `contents.getBySlug()` to fetch the full content with body and relations.

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `data` | `ContentSummary[]` | No | Array of content summaries for the current page.<br>Each summary omits the full `body`, `customData`, and SEO fields.<br>Sorted by `publishedAt` descending by default. |
| `meta` | `PaginationMeta` | No | Pagination metadata for navigating through the result set. |


---

## `FormSubmitResponse`

*Interface*

Response from `forms.submit()`.
The `status` field determines whether the submission was immediately accepted
or requires further action (e.g. email confirmation for double opt-in).

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `message` | `string` | No | Human-readable message suitable for display to the user.<br>Corresponds to the form's configured `successMessage` when status is `'success'`. |
| `status` | `"pending" \| "success"` | No | Submission outcome:<br>- `'success'`: submission was accepted immediately and stored.<br>- `'pending'`: form uses double opt-in; a confirmation email was sent to the<br>  submitter and the submission will only be stored once they click the<br>  confirmation link. |
| `submissionId` | `number` | Yes | Auto-incremented submission ID.<br>Only present when `status` is `'success'`.<br>Not available for `'pending'` submissions (ID is assigned after confirmation). |


---

## `GlobalBlockResponse`

*Interface*

Response from `blocks.getBySlug()`.
Returns a single global block with its fully resolved data.

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `data` | `GlobalBlock` | No | The global block with all DataSource references resolved to actual data.<br>Check `_warnings` for any DataSources that failed to resolve. |


---

## `PagesListResponse`

*Interface*

Response from `pages.list()`.
Returns page summaries (without resolved data) in a single non-paginated response.

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `data` | `PageSummary[]` | No | Array of page summaries. Does not include the resolved `data` or `seo` fields.<br>Use `pages.getBySlug()` to fetch the full page with resolved data. |


---

## `PaginatedResponse`

*Interface*

Generic paginated response wrapping any item type.
Used internally by the SDK; most endpoints return a concrete typed response instead.

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `data` | `T[]` | No | Array of items for the current page. Empty array when no results match. |
| `meta` | `PaginationMeta` | No | Pagination metadata describing total count, page position, and navigation flags. |


---

## `PaginationMeta`

*Interface*

Pagination metadata returned with every paginated list response.
All numeric values are integers. Page numbering starts at 1.

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `currentPage` | `number` | No | 1-based index of the current page.<br>Always between 1 and lastPage inclusive. |
| `firstPage` | `number` | No | 1-based index of the first page. Always 1. |
| `hasMorePages` | `boolean` | No | `true` when `currentPage < lastPage`, meaning a subsequent page request<br>will return more results. |
| `hasPreviousPages` | `boolean` | No | `true` when `currentPage > 1`, meaning a previous page exists. |
| `lastPage` | `number` | No | 1-based index of the last page.<br>Computed as `Math.ceil(total / perPage)`. Equals 1 when total is 0. |
| `perPage` | `number` | No | Maximum number of items returned per page.<br>Corresponds to the `limit` (or deprecated `perPage`) filter sent in the request.<br>Defaults to 15 when not specified. Maximum allowed value is 100. |
| `total` | `number` | No | Total number of items matching the query across all pages.<br>Always >= 0. When 0, data is an empty array. |


---

## `PathsListResponse`

*Interface*

Response from `paths.list()`.
Used for static site generation (SSG/ISR) to discover all renderable paths.

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `blogUrlMode` | `string` | No | How blog content URLs are constructed for this site:<br>- `'flat'`: URLs use slug only, e.g. `/blog/my-article`<br>- `'nested'`: URLs include the category path, e.g. `/blog/tech/my-article`<br><br>Determines whether category segments appear in the generated paths. |
| `locale` | `string \| null` | No | Active locale code (e.g. `'en'`, `'fr'`), or `null` when the site's<br>default locale was used (no locale override was requested). |
| `paths` | `Path[]` | No | Array of all published content and category paths.<br>Includes every locale variant. Use this to generate static pages<br>with Next.js `generateStaticParams()` or similar SSG mechanisms. |


---

## `ResolveResponse`

*TypeAlias*

Union type for path resolution responses.
Use the `type` discriminator field to narrow to the specific response:

```typescript
type ResolveResponse = ContentResolveResponse | CategoryResolveResponse
```

---

## `ReviewsListResponse`

*Interface*

Response from `reviews.list()`.
Only approved reviews are returned through the public API.

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `data` | `Review[]` | No | Array of approved reviews for the current page.<br>Reviews with status other than `'approved'` are never included. |
| `meta` | `PaginationMeta` | No | Pagination metadata for navigating through the result set. |


---

## `ReviewSubmitResponse`

*Interface*

Response from `reviews.submit()`.
The `status` field depends on the site's review moderation settings.

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `message` | `string` | No | Human-readable message suitable for display to the user.<br>Content varies based on whether the review was auto-approved or queued for moderation. |
| `reviewId` | `number` | Yes | Auto-incremented review ID.<br>Only present when `status` is `'success'` (review was auto-approved).<br>Not available for `'pending'` reviews until they are approved. |
| `status` | `"pending" \| "success"` | No | Submission outcome:<br>- `'success'`: the review was auto-approved and is immediately visible on the site.<br>  This happens when `requireApproval` is `false` in the review settings.<br>- `'pending'`: the review was queued for moderation and will only appear publicly<br>  after a site admin approves it. |


---

## `SiteConfigResponse`

*Interface*

Response from `site.getConfig()`.
Contains basic site metadata and all resolved global blocks.
Typically fetched once at app initialization and cached.

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `data` | `{ globals: Record<string, GlobalBlock>; locale: string; site: { domain: string; favicon: string \| null; logo: string \| null; name: string } }` | No | Top-level data wrapper. |


---

## `TagsListResponse`

*Interface*

Response from `tags.list()`.
Paginated since SDK 1.32.2 (the wire was already returning `meta`; the SDK
type now exposes it). Server-side default is 20 items per page on
`/v1/tags` and `/storefront/.../tags`, with `maxLimit=100` (ADR-0022 D3).

| Property | Type | Optional | Description |
| --- | --- | --- | --- |
| `data` | `Tag[]` | No | Tags for the current page in the current locale.<br>Empty array when no tags match (or when paging past the last page). |
| `meta` | `PaginationMeta` | No | Pagination metadata describing total count, page position, and navigation<br>flags. See PaginationMeta. |