Pages
Lister, créer, lire, modifier (sections, SEO, menu, page d'accueil), supprimer, dupliquer et réordonner les pages, et obtenir l'aperçu HTML.
Chaque page possède un brouillon (sections) et une version en ligne (copiée au moment de la publication). Modifier une page ne change rien en ligne tant que le site n'est pas republié (Publier).
L'objet page#
| Champ | Type | Description |
|---|---|---|
id |
entier | Identifiant. |
site_id |
entier | Site parent. |
title |
chaîne | Titre (utilisé dans le menu). |
slug |
chaîne | Adresse de la page : carte donne /carte. Vide pour la page d'accueil. |
path |
chaîne | Chemin public : / pour l'accueil, sinon /<slug>. |
is_home |
booléen | Page d'accueil (une seule par site). |
in_nav |
booléen | Affichée dans le menu (vrai par défaut). |
position |
entier | Ordre dans le menu (0 = premier). |
sections |
tableau | Sections du brouillon, voir Format des sections. |
meta_title |
chaîne ou null |
Titre pour Google (160 caractères max.). |
meta_description |
chaîne ou null |
Description pour Google (320 caractères max.). |
og_image |
chaîne ou null |
Image de partage sur les réseaux sociaux. |
published_at |
date ou null |
Dernière publication de cette page. |
has_unpublished_changes |
booléen | Le brouillon diffère-t-il de la version en ligne ? |
updated_at |
date | Dernière modification : à renvoyer pour le verrou optimiste. |
Lister les pages#
GET /v1/sites/{site}/pages · Jeton
Toutes les pages du site, dans l'ordre du menu.
curl https://api.monsiteo.com/v1/sites/7/pages \
-H "Accept: application/json" \
-H "Authorization: Bearer 1|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789abcd"
{
"data": [
{ "id": 18, "site_id": 7, "title": "Accueil", "slug": "", "path": "/", "is_home": true, "in_nav": true, "position": 0, "sections": [], "meta_title": null, "meta_description": null, "og_image": null, "published_at": "2026-10-25T17:45:03+00:00", "has_unpublished_changes": false, "updated_at": "2026-10-25T17:44:10+00:00" },
{ "id": 19, "site_id": 7, "title": "Notre carte", "slug": "notre-carte", "path": "/notre-carte", "is_home": false, "in_nav": true, "position": 1, "sections": [], "meta_title": "Carte de la Friterie William à Namur", "meta_description": "Frites, fricadelles, mitraillettes et sauces maison : découvrez nos prix.", "og_image": null, "published_at": null, "has_unpublished_changes": true, "updated_at": "2026-10-26T09:20:00+00:00" }
]
}
(tableaux sections vidés pour la lisibilité). Erreurs : 403, 404.
Créer une page#
POST /v1/sites/{site}/pages · Jeton
La page est ajoutée en dernière position du menu.
| Paramètre | Type | Obligatoire | Règles |
|---|---|---|---|
title |
chaîne | oui | 150 caractères max. |
slug |
chaîne | non | 120 caractères max. ; normalisée (minuscules, sans accents) ; par défaut tirée du titre |
sections |
tableau | non | sections initiales, nettoyées selon le format des sections |
template |
chaîne | non | un type de section du catalogue (hero, menu...) |
Sans sections, la page contient une section Texte dont le titre est celui de la page.
Attention Le paramètre
templateest validé (il doit être un type de section existant) mais n'a pour l'instant aucun effet sur le contenu créé. Pour créer une page avec une section précise, envoyez-la danssections.
Gestion de l'adresse : si la valeur est déjà prise sur le site, un suffixe -2, -3... est ajouté. Les adresses sitemap.xml, robots.txt, contact, api et admin sont réservées et reçoivent le suffixe -page.
curl -X POST https://api.monsiteo.com/v1/sites/7/pages \
-H "Accept: application/json" -H "Content-Type: application/json" \
-H "Authorization: Bearer 1|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789abcd" \
-d '{
"title": "Notre carte",
"slug": "carte",
"sections": [
{ "type": "menu", "variant": "columns", "data": {
"title": "Notre carte",
"categories": [
{ "name": "Frites", "items": [
{ "name": "Petite frite", "price": "3,20" },
{ "name": "Grande frite", "price": "4,20", "tag": "Maison" }
] },
{ "name": "Snacks", "items": [
{ "name": "Fricadelle", "price": "3,00" },
{ "name": "Mitraillette poulet", "description": "Baguette, frites, poulet pané, crudités", "price": "8,50" }
] }
],
"note": "Allergènes disponibles au comptoir."
} }
]
}'
Réponse 201 : la page dans data (la section reçoit un id et un style par défaut).
Erreurs :
402: « Votre formule est limitée à 5 pages. » (5 pages en Gratuit, 30 en Site, 100 en Site + Novadesko, par site) ;403,404,422.
Lire une page#
GET /v1/pages/{page} · Jeton
curl https://api.monsiteo.com/v1/pages/19 \
-H "Accept: application/json" \
-H "Authorization: Bearer 1|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789abcd"
Réponse 200 : la page dans data. Erreurs : 403, 404.
Modifier une page#
PATCH /v1/pages/{page} · Jeton
C'est la route qu'utilise la sauvegarde automatique de l'éditeur. Envoyez seulement ce qui change.
| Paramètre | Type | Obligatoire | Règles |
|---|---|---|---|
title |
chaîne | non | non vide, 150 caractères max. |
slug |
chaîne ou null |
non | 120 caractères max. ; ignoré pour la page d'accueil ; vide = tiré du titre |
in_nav |
booléen | non | afficher ou non dans le menu |
is_home |
booléen | non | seule la valeur true est acceptée : la page devient l'accueil |
sections |
tableau | non | remplace tout le brouillon ; 60 sections max. |
meta_title |
chaîne ou null |
non | 160 caractères max. |
meta_description |
chaîne ou null |
non | 320 caractères max. |
og_image |
chaîne ou null |
non | URL, 2000 caractères max. |
updated_at |
date | non | verrou optimiste, voir ci-dessous |
Quand une page devient l'accueil ("is_home": true), son adresse devient vide (/) et l'ancienne page d'accueil reçoit une adresse tirée de son titre.
Verrou optimiste#
Envoyez dans updated_at la valeur reçue lors de votre dernière lecture. Si la page a été enregistrée depuis (par un autre appareil, un collègue ou un script), la mise à jour est refusée avec un 409 au lieu d'écraser silencieusement le travail d'un autre :
{ "message": "Cette page a été modifiée depuis un autre appareil. Rechargez-la.", "conflict": true }
Une tolérance d'une seconde est appliquée. Sans updated_at, la mise à jour s'applique toujours (« le dernier qui écrit gagne »).
curl -X PATCH https://api.monsiteo.com/v1/pages/19 \
-H "Accept: application/json" -H "Content-Type: application/json" \
-H "Authorization: Bearer 1|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789abcd" \
-d '{
"meta_title": "Carte de la Friterie William à Namur",
"meta_description": "Frites, fricadelles, mitraillettes et sauces maison : découvrez nos prix.",
"in_nav": true,
"updated_at": "2026-10-26T09:20:00+00:00"
}'
Réponse 200 : la page à jour, avec un nouveau updated_at. Erreurs : 403, 404, 409, 422.
Bon à savoir Pour modifier une seule section, relisez la page, modifiez la section dans le tableau puis renvoyez tout le tableau
sections. Les sections absentes du tableau envoyé sont supprimées du brouillon.
Supprimer une page#
DELETE /v1/pages/{page} · Jeton
curl -X DELETE https://api.monsiteo.com/v1/pages/19 \
-H "Accept: application/json" \
-H "Authorization: Bearer 1|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789abcd"
{ "ok": true }
La page disparaît aussi de la version en ligne. La page d'accueil ne peut pas être supprimée (422) : choisissez d'abord une autre page d'accueil.
{ "message": "La page d'accueil ne peut pas être supprimée.", "errors": { "page": ["La page d'accueil ne peut pas être supprimée."] } }
Dupliquer une page#
POST /v1/pages/{page}/duplicate · Jeton
Crée une copie du brouillon, intitulée «
curl -X POST https://api.monsiteo.com/v1/pages/19/duplicate \
-H "Accept: application/json" \
-H "Authorization: Bearer 1|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789abcd"
Réponse 201 : la nouvelle page ("title": "Notre carte (copie)", "slug": "notre-carte-copie").
Attention La duplication ne vérifie pas la limite de pages de la formule.
Réordonner les pages#
POST /v1/sites/{site}/pages/reorder · Jeton
| Paramètre | Type | Obligatoire | Règles |
|---|---|---|---|
ids |
tableau d'entiers | oui | identifiants de pages de ce site, dans le nouvel ordre |
La position de chaque page devient son rang dans le tableau (0, 1, 2...). Les pages non citées gardent leur position.
curl -X POST https://api.monsiteo.com/v1/sites/7/pages/reorder \
-H "Accept: application/json" -H "Content-Type: application/json" \
-H "Authorization: Bearer 1|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789abcd" \
-d '{"ids":[18,21,19,20]}'
Réponse 200 : la liste des pages dans le nouvel ordre (même forme que Lister les pages). Erreur 422 si un identifiant n'appartient pas au site.
Aperçu HTML#
POST /v1/pages/{page}/preview · Jeton
Renvoie la page rendue en HTML complet, comme sur le site public, à partir du brouillon ou de sections et d'un thème envoyés dans la requête (rien n'est enregistré). C'est ce qu'affiche l'aperçu de l'éditeur pendant que vous tapez.
| Paramètre | Type | Obligatoire | Règles |
|---|---|---|---|
sections |
tableau | non | sections à afficher (60 max.), nettoyées ; absent = brouillon enregistré |
theme |
objet | non | clés du thème à essayer (primary, heading_font...) ; les autres clés sont ignorées |
curl -X POST https://api.monsiteo.com/v1/pages/18/preview \
-H "Accept: text/html" -H "Content-Type: application/json" \
-H "Authorization: Bearer 1|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789abcd" \
-d '{"theme":{"primary":"#E63946"}}' \
-o apercu.html
Réponse 200 avec Content-Type: text/html; charset=utf-8 et X-Robots-Tag: noindex. Erreurs (en JSON) : 403, 404, 422.
Mis à jour le 26 octobre 2026