# List contents

**Publié le** : 2026-05-12
**Catégorie** : Content

## `GET /contents`

**List contents**

List published content entries for the site. Supports pagination,
locale filter, tag and category filters, slug lookup, and date
ranges. Reads pass through the public-field serializer; admin-only
fields (author_id, organization_id, internal flags) are stripped.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `page` | query | number | No | Number |
| `limit` | query | number | No | Number <= 200 |
| `search` | query | string | No | Full-text search query |
| `type` | query | string | No | Resource type |
| `status` | query | "draft" \| "published" \| "archived" \| "scheduled" | No | One of: draft, published, archived, scheduled |
| `contentMode` | query | "standard" \| "structured" | No | One of: standard, structured |
| `sortBy` | query | "created_at" \| "updated_at" \| "published_at" \| "title" \| "slug" \| "display_order" | No | One of: created_at, updated_at, published_at, title, slug, display_order |
| `sortOrder` | query | "asc" \| "desc" | No | One of: asc, desc |
| `categoryIds` | query | string[] | No | Array of strings |
| `tagIds` | query | string[] | No | Array of strings |
| `authorId` | query | string | No | Author user ID |
| `dateFrom` | query | string | No | Filter from date (ISO 8601) |
| `dateTo` | query | string | No | Filter until date (ISO 8601) |
| `publishedFrom` | query | string | No | Filter by publish date from (ISO 8601) |
| `publishedTo` | query | string | No | Filter by publish date until (ISO 8601) |
| `slug` | query | string | No | URL-friendly identifier, unique per site and locale |
| `slugs` | query | string[] | No | Array of strings |
| `ids` | query | string[] | No | Array of strings |
| `excludeIds` | query | string[] | No | Array of strings |
| `hasCategory` | query | boolean | No | Boolean |
| `hasTag` | query | boolean | No | Boolean |
| `locale` | query | string | No | BCP 47 locale code (e.g. "en", "fr") |
| `translationGroupId` | query | string | No | Translation group UUID (links translations across locales) |
| `groupByTranslation` | query | boolean | No | Boolean |


### Responses

| Status | Description |
| --- | --- |
| `200` | Successful response |


> **Notes:** Cache: `Cache-Control: public, max-age=60`. Rate-limit bucket:
> general (~600 rpm per IP).

### Examples

```curl
curl "https://api.lynkow.com/public/{siteId}/contents?page=1&limit=10&locale=en"
```

```javascript
const res = await fetch(`https://api.lynkow.com/public/${siteId}/contents?page=1&limit=10&locale=en`)
const { data, meta } = await res.json()
```

### Response Example

```json
"{\n  \"data\": [\n    {\n      \"id\": \"01J9P1B5N4XZRWQEKM2H6A3T8C\",\n      \"title\": \"How we set our pricing\",\n      \"slug\": \"how-we-set-our-pricing\",\n      \"excerpt\": \"A behind-the-scenes look at the pricing model.\",\n      \"locale\": \"en\",\n      \"categoryId\": \"01J9PA0NZK7BX4HQ7M2DC9V5T8\",\n      \"tags\": [\"pricing\", \"company\"],\n      \"publishedAt\": \"2026-05-05T08:00:00.000Z\",\n      \"updatedAt\": \"2026-05-05T08:00:00.000Z\",\n      \"imageUrl\": \"https://cdn.lynkow.com/sites/acme/pricing-cover.jpg\"\n    }\n  ],\n  \"meta\": { \"total\": 32, \"page\": 1, \"totalPages\": 4, \"perPage\": 10 }\n}\n"
```

---