monsiteo aide

Format JSON des sections

Structure d'une section (id, type, variant, data, style), règles de nettoyage appliquées par le serveur et catalogue complet des types de sections, généré depuis le code.

Le contenu d'une page est un tableau ordonné de sections. C'est ce tableau que vous lisez et écrivez dans le champ sections des pages. Le même format est utilisé par l'éditeur, par le générateur IA et par le rendu des sites.

Bon à savoir Le catalogue ci-dessous est généré automatiquement à partir du fichier de définition utilisé par le serveur : il est toujours à jour. La même source est disponible en JSON via GET /v1/catalog.

Structure d'une section#

{
  "id": "1b7c3f2e-5a4d-4e8b-9c0f-2d6e8a1b3c5d",
  "type": "hours",
  "variant": "table",
  "data": {
    "title": "Horaires",
    "days": [
      { "day": "Mo", "hours": "Fermé" },
      { "day": "Tu", "hours": "11:30-14:00, 17:30-22:00" },
      { "day": "Sa", "hours": "11:30-22:30" }
    ],
    "note": "Ouvert les jours fériés."
  },
  "style": {
    "background": "surface",
    "spacing": "md",
    "image": null,
    "hidden_mobile": false,
    "anchor": "horaires"
  }
}
Clé Type Description
id chaîne Identifiant stable de la section (UUID conseillé). 1 à 64 caractères parmi lettres, chiffres et tirets ; sinon un UUID est attribué.
type chaîne Type de section, voir le catalogue.
variant chaîne Variante d'affichage du type ; inconnue ou absente = la première variante.
data objet Contenu, selon les champs du type.
style objet Mise en forme commune à toutes les sections.

Style#

Clé Valeurs Par défaut Effet
background default, surface, primary, dark, image default Fond de la section : fond du site, fond secondaire (couleur surface du thème), couleur principale, sombre, ou image.
spacing sm, md, lg md Espacement vertical (petit, moyen, grand).
image URL ou null null Image de fond, utilisée avec background: "image".
hidden_mobile booléen false Masque la section sur téléphone.
anchor chaîne ou null null Ancre de la section (normalisée en minuscules et tirets) : un lien #horaires y fait défiler la page.

Règles de nettoyage#

Chaque fois que vous envoyez des sections (création ou modification de page, aperçu), le serveur les nettoie sans renvoyer d'erreur : vérifiez donc la réponse pour constater ce qui a été conservé.

  • Les éléments qui ne sont pas des objets, ou dont le type est inconnu, sont ignorés.
  • Au-delà de 60 sections, les suivantes sont ignorées (et PATCH /pages/{page} refuse plus de 60 éléments avec un 422).
  • Dans data, seuls les champs définis pour le type sont conservés ; les autres sont retirés. Un champ absent reste absent (le rendu utilise alors une valeur vide).
  • Selon le type de champ :
    • text : HTML retiré, 300 caractères max. ;
    • textarea : HTML retiré, 4 000 caractères max. (les retours à la ligne sont conservés) ;
    • richtext : HTML filtré, seules les balises p, br, strong, b, em, i, u, a, ul, ol, li, h3, h4 et blockquote sont gardées, sans aucun attribut sauf href sur les liens (et seulement si le lien est accepté), 20 000 caractères max. ;
    • image et url : seuls les liens commençant par http://, https://, /, #, mailto: ou tel: sont acceptés, sinon null (2 000 caractères max.) ;
    • toggle : converti en booléen ;
    • color : #RRGGBB ou null ;
    • select : la valeur est conservée comme un texte court (choisissez une valeur de la liste du champ pour un affichage correct) ;
    • list : chaque élément est nettoyé avec les sous-champs de la liste, les éléments qui ne sont pas des objets sont retirés, et la liste est tronquée à son maximum (50 si aucun maximum n'est indiqué).
  • style : toute valeur non autorisée est remplacée par la valeur par défaut.

Attention Les valeurs d'un champ select ne sont pas contrôlées par le serveur. Par exemple rating des avis attend "5", "4" ou "3" (des chaînes), et day des horaires attend Mo, Tu, We, Th, Fr, Sa ou Su.

Exemple de nettoyage#

Envoyé :

[
  { "type": "text", "data": { "title": "<b>Notre histoire</b>", "body": "<p onclick=\"x()\">Depuis 1987 <a href=\"javascript:alert(1)\">ici</a></p><script>x()</script>", "couleur": "rouge" } },
  { "type": "inconnu", "data": {} }
]

Conservé :

[
  {
    "id": "c0a8012e-7f3b-4b1e-9d2a-6e5f4c3b2a10",
    "type": "text",
    "variant": "default",
    "data": { "title": "Notre histoire", "body": "<p>Depuis 1987 <a>ici</a></p>x()" },
    "style": { "background": "default", "spacing": "md", "image": null, "hidden_mobile": false, "anchor": null }
  }
]

Icônes#

Valeurs possibles des champs icon (noms d'icônes Lucide) :

sparkles, heart, check, star, scissors, flower, utensils, coffee, truck, phone, map-pin, clock, hammer, wrench, paintbrush, home, leaf, gift, shield-check, smile, award, calendar, camera, users, shopping-bag, euro, zap, sun, baby, dog, car, dumbbell, graduation-cap, stethoscope, music, pizza

Catalogue complet#

Pour chaque type : sa catégorie dans l'éditeur, ses variantes, ses champs (les sous-champs d'une liste sont notés liste[].champ) et un exemple de section créée avec les valeurs par défaut.

hero : Bannière d'accueil#

Catégorie : Accueil. Icône : star. Variantes (variant) : centered (Centré), split (Texte et image), image (Image plein fond). La première est la valeur par défaut.

Clé Type Libellé Contraintes
eyebrow text Petit titre 300 caractères max., HTML retiré
title text Titre obligatoire ; 300 caractères max., HTML retiré
subtitle textarea Sous-titre 4 000 caractères max., HTML retiré
image image Image http(s)://, chemin /..., #ancre, mailto: ou tel:
button_label text Texte du bouton 300 caractères max., HTML retiré
button_link url Lien du bouton http(s)://, chemin /..., #ancre, mailto: ou tel:
secondary_label text Texte du 2e bouton 300 caractères max., HTML retiré
secondary_link url Lien du 2e bouton http(s)://, chemin /..., #ancre, mailto: ou tel:

Exemple avec les valeurs par défaut :

{
    "id": "6f1c2a9e-0b7d-4c55-9d8e-f04af61b3f33",
    "type": "hero",
    "variant": "centered",
    "data": {
        "title": "Bienvenue chez nous",
        "subtitle": "Présentez votre activité en une phrase claire.",
        "button_label": "Nous contacter",
        "button_link": "#contact"
    },
    "style": {
        "background": "default",
        "spacing": "md",
        "image": null,
        "hidden_mobile": false,
        "anchor": null
    }
}

text : Texte#

Catégorie : Contenu. Icône : notes. Variantes (variant) : default (Standard), narrow (Colonne étroite), two_columns (Deux colonnes). La première est la valeur par défaut.

Clé Type Libellé Contraintes
title text Titre 300 caractères max., HTML retiré
body richtext Texte HTML filtré : p, br, strong, b, em, i, u, a[href], ul, ol, li, h3, h4, blockquote

Exemple avec les valeurs par défaut :

{
    "id": "6f1c2a9e-0b7d-4c55-9d8e-1cb251ec0d56",
    "type": "text",
    "variant": "default",
    "data": {
        "title": "Notre histoire",
        "body": "<p>Racontez votre parcours, vos valeurs et ce qui vous rend unique.</p>"
    },
    "style": {
        "background": "default",
        "spacing": "md",
        "image": null,
        "hidden_mobile": false,
        "anchor": null
    }
}

image_text : Image et texte#

Catégorie : Contenu. Icône : image. Variantes (variant) : image_left (Image à gauche), image_right (Image à droite). La première est la valeur par défaut.

Clé Type Libellé Contraintes
title text Titre 300 caractères max., HTML retiré
body richtext Texte HTML filtré : p, br, strong, b, em, i, u, a[href], ul, ol, li, h3, h4, blockquote
image image Image http(s)://, chemin /..., #ancre, mailto: ou tel:
image_alt text Description de l'image 300 caractères max., HTML retiré
button_label text Texte du bouton 300 caractères max., HTML retiré
button_link url Lien du bouton http(s)://, chemin /..., #ancre, mailto: ou tel:

Exemple avec les valeurs par défaut :

{
    "id": "6f1c2a9e-0b7d-4c55-9d8e-fe6d9b1272ef",
    "type": "image_text",
    "variant": "image_left",
    "data": {
        "title": "Un savoir-faire local",
        "body": "<p>Expliquez ce que vous faites et pourquoi vos clients vous choisissent.</p>"
    },
    "style": {
        "background": "default",
        "spacing": "md",
        "image": null,
        "hidden_mobile": false,
        "anchor": null
    }
}

services : Services#

Catégorie : Contenu. Icône : grid. Variantes (variant) : cards (Cartes), list (Liste), icons (Icônes). La première est la valeur par défaut.

Clé Type Libellé Contraintes
title text Titre 300 caractères max., HTML retiré
subtitle textarea Introduction 4 000 caractères max., HTML retiré
items list Services tableau d'objets, min. 1, max. 12
items[].icon select Icône une icône du catalogue (icons)
items[].title text Nom 300 caractères max., HTML retiré
items[].text textarea Description 4 000 caractères max., HTML retiré
items[].price text Prix (facultatif) 300 caractères max., HTML retiré
items[].image image Image (facultatif) http(s)://, chemin /..., #ancre, mailto: ou tel:

Exemple avec les valeurs par défaut :

{
    "id": "6f1c2a9e-0b7d-4c55-9d8e-10cd395cf71c",
    "type": "services",
    "variant": "cards",
    "data": {
        "title": "Nos services",
        "items": [
            {
                "icon": "sparkles",
                "title": "Service 1",
                "text": "Une phrase qui explique le bénéfice."
            },
            {
                "icon": "heart",
                "title": "Service 2",
                "text": "Une phrase qui explique le bénéfice."
            },
            {
                "icon": "check",
                "title": "Service 3",
                "text": "Une phrase qui explique le bénéfice."
            }
        ]
    },
    "style": {
        "background": "default",
        "spacing": "md",
        "image": null,
        "hidden_mobile": false,
        "anchor": null
    }
}

Catégorie : Commerce. Icône : restaurant. Variantes (variant) : columns (Colonnes), compact (Compact). La première est la valeur par défaut.

Clé Type Libellé Contraintes
title text Titre 300 caractères max., HTML retiré
subtitle textarea Introduction 4 000 caractères max., HTML retiré
categories list Catégories tableau d'objets, max. 20
categories[].name text Catégorie 300 caractères max., HTML retiré
categories[].items list Plats tableau d'objets, max. 60
categories[].items[].name text Nom 300 caractères max., HTML retiré
categories[].items[].description text Description 300 caractères max., HTML retiré
categories[].items[].price text Prix 300 caractères max., HTML retiré
categories[].items[].tag text Étiquette (ex. Maison, Végétarien) 300 caractères max., HTML retiré
note text Note (allergènes, etc.) 300 caractères max., HTML retiré

Exemple avec les valeurs par défaut :

{
    "id": "6f1c2a9e-0b7d-4c55-9d8e-8d6ab84ca2af",
    "type": "menu",
    "variant": "columns",
    "data": {
        "title": "Notre carte",
        "categories": [
            {
                "name": "Entrées",
                "items": [
                    {
                        "name": "Plat",
                        "description": "Description",
                        "price": "9,50"
                    }
                ]
            }
        ]
    },
    "style": {
        "background": "default",
        "spacing": "md",
        "image": null,
        "hidden_mobile": false,
        "anchor": null
    }
}

Catégorie : Médias. Icône : photo_library. Variantes (variant) : grid (Grille), masonry (Mosaïque), carousel (Carrousel). La première est la valeur par défaut.

Clé Type Libellé Contraintes
title text Titre 300 caractères max., HTML retiré
images list Photos tableau d'objets, max. 40
images[].src image Photo http(s)://, chemin /..., #ancre, mailto: ou tel:
images[].alt text Description 300 caractères max., HTML retiré
images[].caption text Légende 300 caractères max., HTML retiré

Exemple avec les valeurs par défaut :

{
    "id": "6f1c2a9e-0b7d-4c55-9d8e-2767cc3ede75",
    "type": "gallery",
    "variant": "grid",
    "data": {
        "title": "En images",
        "images": []
    },
    "style": {
        "background": "default",
        "spacing": "md",
        "image": null,
        "hidden_mobile": false,
        "anchor": null
    }
}

testimonials : Avis clients#

Catégorie : Confiance. Icône : format_quote. Variantes (variant) : cards (Cartes), single (Un grand avis). La première est la valeur par défaut.

Clé Type Libellé Contraintes
title text Titre 300 caractères max., HTML retiré
items list Avis tableau d'objets, max. 12
items[].quote textarea Avis 4 000 caractères max., HTML retiré
items[].author text Nom 300 caractères max., HTML retiré
items[].role text Précision (ville, métier...) 300 caractères max., HTML retiré
items[].rating select Note valeurs : 5, 4, 3

Exemple avec les valeurs par défaut :

{
    "id": "6f1c2a9e-0b7d-4c55-9d8e-9c514e654794",
    "type": "testimonials",
    "variant": "cards",
    "data": {
        "title": "Ils nous font confiance",
        "items": [
            {
                "quote": "Un service impeccable, je recommande.",
                "author": "Marie",
                "role": "Cliente",
                "rating": "5"
            }
        ]
    },
    "style": {
        "background": "default",
        "spacing": "md",
        "image": null,
        "hidden_mobile": false,
        "anchor": null
    }
}

stats : Chiffres clés#

Catégorie : Confiance. Icône : insights. Variantes (variant) : default (Standard). La première est la valeur par défaut.

Clé Type Libellé Contraintes
title text Titre 300 caractères max., HTML retiré
items list Chiffres tableau d'objets, max. 6
items[].value text Valeur 300 caractères max., HTML retiré
items[].label text Libellé 300 caractères max., HTML retiré

Exemple avec les valeurs par défaut :

{
    "id": "6f1c2a9e-0b7d-4c55-9d8e-446501053769",
    "type": "stats",
    "variant": "default",
    "data": {
        "items": [
            {
                "value": "15 ans",
                "label": "d'expérience"
            },
            {
                "value": "2 000",
                "label": "clients satisfaits"
            }
        ]
    },
    "style": {
        "background": "default",
        "spacing": "md",
        "image": null,
        "hidden_mobile": false,
        "anchor": null
    }
}

team : Équipe#

Catégorie : Contenu. Icône : groups. Variantes (variant) : grid (Grille). La première est la valeur par défaut.

Clé Type Libellé Contraintes
title text Titre 300 caractères max., HTML retiré
members list Membres tableau d'objets, max. 24
members[].photo image Photo http(s)://, chemin /..., #ancre, mailto: ou tel:
members[].name text Nom 300 caractères max., HTML retiré
members[].role text Fonction 300 caractères max., HTML retiré

Exemple avec les valeurs par défaut :

{
    "id": "6f1c2a9e-0b7d-4c55-9d8e-f894427cc1c5",
    "type": "team",
    "variant": "grid",
    "data": {
        "title": "L'équipe",
        "members": []
    },
    "style": {
        "background": "default",
        "spacing": "md",
        "image": null,
        "hidden_mobile": false,
        "anchor": null
    }
}

pricing : Tarifs#

Catégorie : Commerce. Icône : sell. Variantes (variant) : cards (Cartes), table (Tableau). La première est la valeur par défaut.

Clé Type Libellé Contraintes
title text Titre 300 caractères max., HTML retiré
subtitle textarea Introduction 4 000 caractères max., HTML retiré
plans list Offres tableau d'objets, max. 6
plans[].name text Nom 300 caractères max., HTML retiré
plans[].price text Prix 300 caractères max., HTML retiré
plans[].period text Période (ex. /mois) 300 caractères max., HTML retiré
plans[].features textarea Avantages (un par ligne) 4 000 caractères max., HTML retiré
plans[].highlight toggle Mettre en avant booléen
plans[].button_label text Texte du bouton 300 caractères max., HTML retiré
plans[].button_link url Lien du bouton http(s)://, chemin /..., #ancre, mailto: ou tel:

Exemple avec les valeurs par défaut :

{
    "id": "6f1c2a9e-0b7d-4c55-9d8e-59aab28b5459",
    "type": "pricing",
    "variant": "cards",
    "data": {
        "title": "Nos formules",
        "plans": []
    },
    "style": {
        "background": "default",
        "spacing": "md",
        "image": null,
        "hidden_mobile": false,
        "anchor": null
    }
}

faq : Questions fréquentes#

Catégorie : Confiance. Icône : help. Variantes (variant) : accordion (Accordéon), two_columns (Deux colonnes). La première est la valeur par défaut.

Clé Type Libellé Contraintes
title text Titre 300 caractères max., HTML retiré
items list Questions tableau d'objets, max. 30
items[].question text Question 300 caractères max., HTML retiré
items[].answer textarea Réponse 4 000 caractères max., HTML retiré

Exemple avec les valeurs par défaut :

{
    "id": "6f1c2a9e-0b7d-4c55-9d8e-da75cd652254",
    "type": "faq",
    "variant": "accordion",
    "data": {
        "title": "Questions fréquentes",
        "items": [
            {
                "question": "Quels sont vos horaires ?",
                "answer": "Nous sommes ouverts du mardi au samedi."
            }
        ]
    },
    "style": {
        "background": "default",
        "spacing": "md",
        "image": null,
        "hidden_mobile": false,
        "anchor": null
    }
}

hours : Horaires#

Catégorie : Infos pratiques. Icône : schedule. Variantes (variant) : table (Tableau), card (Carte). La première est la valeur par défaut.

Clé Type Libellé Contraintes
title text Titre 300 caractères max., HTML retiré
days list Jours tableau d'objets, max. 7
days[].day select Jour valeurs : Mo, Tu, We, Th, Fr, Sa, Su
days[].hours text Horaires (ex. 11:30-14:00, 18:00-22:00 ou Fermé) 300 caractères max., HTML retiré
note text Note 300 caractères max., HTML retiré

Exemple avec les valeurs par défaut :

{
    "id": "6f1c2a9e-0b7d-4c55-9d8e-73cdddd7730a",
    "type": "hours",
    "variant": "table",
    "data": {
        "title": "Horaires",
        "days": [
            {
                "day": "Mo",
                "hours": "Fermé"
            },
            {
                "day": "Tu",
                "hours": "09:00-18:00"
            },
            {
                "day": "We",
                "hours": "09:00-18:00"
            },
            {
                "day": "Th",
                "hours": "09:00-18:00"
            },
            {
                "day": "Fr",
                "hours": "09:00-18:00"
            },
            {
                "day": "Sa",
                "hours": "09:00-17:00"
            },
            {
                "day": "Su",
                "hours": "Fermé"
            }
        ]
    },
    "style": {
        "background": "default",
        "spacing": "md",
        "image": null,
        "hidden_mobile": false,
        "anchor": null
    }
}

contact : Contact#

Catégorie : Infos pratiques. Icône : mail. Variantes (variant) : split (Formulaire et coordonnées), simple (Coordonnées seules). La première est la valeur par défaut.

Clé Type Libellé Contraintes
title text Titre 300 caractères max., HTML retiré
text textarea Texte 4 000 caractères max., HTML retiré
show_form toggle Afficher le formulaire booléen
show_map toggle Afficher la carte booléen

Exemple avec les valeurs par défaut :

{
    "id": "6f1c2a9e-0b7d-4c55-9d8e-2f8a6bf31f3b",
    "type": "contact",
    "variant": "split",
    "data": {
        "title": "Contactez-nous",
        "text": "Une question ? Écrivez-nous, nous répondons rapidement.",
        "show_form": true,
        "show_map": true
    },
    "style": {
        "background": "default",
        "spacing": "md",
        "image": null,
        "hidden_mobile": false,
        "anchor": null
    }
}

cta : Appel à l'action#

Catégorie : Accueil. Icône : campaign. Variantes (variant) : banner (Bandeau), card (Carte). La première est la valeur par défaut.

Clé Type Libellé Contraintes
title text Titre 300 caractères max., HTML retiré
text textarea Texte 4 000 caractères max., HTML retiré
button_label text Texte du bouton 300 caractères max., HTML retiré
button_link url Lien du bouton http(s)://, chemin /..., #ancre, mailto: ou tel:

Exemple avec les valeurs par défaut :

{
    "id": "6f1c2a9e-0b7d-4c55-9d8e-06ce7d44db01",
    "type": "cta",
    "variant": "banner",
    "data": {
        "title": "Envie de passer nous voir ?",
        "button_label": "Itinéraire",
        "button_link": "#contact"
    },
    "style": {
        "background": "default",
        "spacing": "md",
        "image": null,
        "hidden_mobile": false,
        "anchor": null
    }
}

video : Vidéo#

Catégorie : Médias. Icône : play_circle. Variantes (variant) : default (Standard). La première est la valeur par défaut.

Clé Type Libellé Contraintes
title text Titre 300 caractères max., HTML retiré
url url Lien YouTube ou Vimeo http(s)://, chemin /..., #ancre, mailto: ou tel:
caption text Légende 300 caractères max., HTML retiré

Exemple avec les valeurs par défaut :

{
    "id": "6f1c2a9e-0b7d-4c55-9d8e-421b47ffd946",
    "type": "video",
    "variant": "default",
    "data": {
        "title": "En vidéo",
        "url": ""
    },
    "style": {
        "background": "default",
        "spacing": "md",
        "image": null,
        "hidden_mobile": false,
        "anchor": null
    }
}

Mis à jour le 26 octobre 2026