{post.title}
+ + + + {post.source?.[0] && ( +Source : {post.source[0].title}
+ )} + + {post.tags?.length > 0 && ( +diff --git a/src/modules/posts/docs/admin-api.md b/src/modules/posts/docs/admin-api.md
new file mode 100644
index 0000000..78eda05
--- /dev/null
+++ b/src/modules/posts/docs/admin-api.md
@@ -0,0 +1,19 @@
+# API d'administration — Module Posts
+
+Authentification requise.
+
+| Méthode | Route | Description |
+|---|---|---|
+| `GET` | `/zen/api/admin/posts/config` | Config complète de tous les types |
+| `GET` | `/zen/api/admin/posts/search?type={type}&q={query}` | Recherche pour le sélecteur de relation |
+| `GET` | `/zen/api/admin/posts/posts?type={type}` | Liste des posts d'un type |
+| `GET` | `/zen/api/admin/posts/posts?type={type}&withRelations=true` | Liste avec relations |
+| `GET` | `/zen/api/admin/posts/posts?type={type}&id={id}` | Post par ID (relations toujours incluses) |
+| `POST` | `/zen/api/admin/posts/posts?type={type}` | Créer un post |
+| `PUT` | `/zen/api/admin/posts/posts?type={type}&id={id}` | Modifier un post |
+| `DELETE` | `/zen/api/admin/posts/posts?type={type}&id={id}` | Supprimer un post |
+| `POST` | `/zen/api/admin/posts/upload-image` | Upload d'image |
+| `GET` | `/zen/api/admin/posts/categories?type={type}` | Liste des catégories |
+| `POST` | `/zen/api/admin/posts/categories?type={type}` | Créer une catégorie |
+| `PUT` | `/zen/api/admin/posts/categories?type={type}&id={id}` | Modifier une catégorie |
+| `DELETE` | `/zen/api/admin/posts/categories?type={type}&id={id}` | Supprimer une catégorie |
diff --git a/src/modules/posts/docs/api.md b/src/modules/posts/docs/api.md
new file mode 100644
index 0000000..50be9d7
--- /dev/null
+++ b/src/modules/posts/docs/api.md
@@ -0,0 +1,108 @@
+# API publique — Module Posts
+
+Pas d'authentification requise.
+
+## Config
+
+```
+GET /zen/api/posts/config
+```
+
+Retourne la liste de tous les types configurés avec leurs champs.
+
+---
+
+## Liste de posts
+
+```
+GET /zen/api/posts/{type}
+```
+
+| Paramètre | Défaut | Description |
+|---|---|---|
+| `page` | `1` | Page courante |
+| `limit` | `20` | Résultats par page |
+| `category_id` | — | Filtrer par catégorie |
+| `sortBy` | `created_at` | Trier par (nom de champ du type) |
+| `sortOrder` | `DESC` | `ASC` ou `DESC` |
+| `withRelations` | `false` | `true` pour inclure les champs relation |
+
+`withRelations=true` exécute une requête SQL supplémentaire par post. Garder un `limit` raisonnable (20 maximum). Sur une page de détail, préférer `/posts/{type}/{slug}` qui charge toujours les relations.
+
+**Réponse sans relations (défaut) :**
+
+```json
+{
+ "success": true,
+ "posts": [
+ {
+ "id": 1,
+ "post_type": "actualite",
+ "slug": "faille-critique-openssh",
+ "title": "Faille critique dans OpenSSH",
+ "date": "2026-03-14T10:30:00.000Z",
+ "resume": "Une faille critique...",
+ "image": "blog/1234567890-image.webp",
+ "created_at": "2026-03-14T12:00:00Z",
+ "updated_at": "2026-03-14T12:00:00Z"
+ }
+ ],
+ "total": 42,
+ "totalPages": 3,
+ "page": 1,
+ "limit": 20
+}
+```
+
+**Réponse avec `withRelations=true` :**
+
+```json
+{
+ "success": true,
+ "posts": [
+ {
+ "id": 1,
+ "slug": "faille-critique-openssh",
+ "title": "Faille critique dans OpenSSH",
+ "date": "2026-03-14T10:30:00.000Z",
+ "source": [
+ { "id": 3, "slug": "cert-fr", "post_type": "source", "title": "CERT-FR" }
+ ],
+ "tags": [
+ { "id": 7, "slug": "openssh", "post_type": "tag", "title": "OpenSSH" },
+ { "id": 8, "slug": "vulnerabilite", "post_type": "tag", "title": "Vulnérabilité" }
+ ]
+ }
+ ]
+}
+```
+
+---
+
+## Post par slug
+
+```
+GET /zen/api/posts/{type}/{slug}
+```
+
+Les relations sont toujours incluses sur un post individuel.
+
+---
+
+## Catégories
+
+```
+GET /zen/api/posts/{type}/categories
+```
+
+Retourne les catégories actives du type (pour alimenter un filtre).
+
+---
+
+## Images
+
+Les clés d'image s'utilisent avec la route de stockage :
+
+```jsx
+
+```
diff --git a/src/modules/posts/docs/integration.md b/src/modules/posts/docs/integration.md
new file mode 100644
index 0000000..5def351
--- /dev/null
+++ b/src/modules/posts/docs/integration.md
@@ -0,0 +1,125 @@
+# Intégration Next.js — Module Posts
+
+## Liste de posts
+
+```js
+// app/actualites/page.js
+export default async function ActualitesPage() {
+ const res = await fetch(
+ `${process.env.NEXT_PUBLIC_URL}/zen/api/posts/actualite?limit=10&sortBy=date&sortOrder=DESC`
+ );
+ const { posts, total, totalPages } = await res.json();
+
+ return (
+
{post.resume}
+ {post.image &&Source : {post.source[0].title}
+ )} + + {post.tags?.length > 0 && ( +