Documentation

L'API des agents.

Version 1, 57 routes, huit rôles. Elle permet à un programme de construire et modifier un site JEIKO — pages, catalogue, menus, questionnaires, e-mails, identité visuelle.

Le premier appel

Le mode d'emploi vit à la racine de l'API. Il est généré depuis le code — les routes sont lues dans le routeur, les permissions sur les classes de vue, les options des blocs dans les constantes que le rendu applique. Il ne peut donc pas décrire une route qui n'existe pas, ni taire une permission.

GET https://votresite.fr/api/agent/v1/
Authorization: Bearer jk_ag__

{
  "version": { "numero": "1" },
  "points_d_entree": [ … 57 routes, chacune avec sa permission … ],
  "catalogue_des_blocs": { … 23 types de contenu … },
  "champs_de_page": { … },
  "interdits": [ … ]
}

Authentification

Un jeton porteur, et lui seul. Sept gardes s'empilent avant qu'un appel n'atteigne une vue.

  • HTTPS obligatoire — un jeton ne circule pas en clair
  • En-tête Authorization uniquement : jamais dans l'URL, où il finirait dans les journaux du serveur et l'historique du navigateur
  • La session n'authentifie pas. Un administrateur connecté sans jeton est refusé comme un inconnu — c'est ce qui rend l'exemption CSRF de ces vues légitime au lieu d'être un trou
  • Comparaison à temps constant, agent actif, expiration, liste d'adresses autorisées, plafond d'appels
  • Le secret n'est jamais enregistré — seule son empreinte SHA-256 l'est. Une base lue ne livre aucun accès

Les refus ne s'expliquent pas : même message, même code, quelle que soit la cause. Le motif précis va au journal, qui est pour l'exploitant — le distinguer apprendrait à un appelant hostile où il en est.

Les routes

Chacune annonce la permission qu'elle exige : un agent sait avant d'appeler s'il en a le droit, plutôt que de le découvrir sur un refus.

MéthodeCheminRôlePermission
GET/Ce mode d'emploi. À lire en premier.aucune — un jeton valide suffit
GET/qui-suis-je/Qui je suis et ce que j'ai le droit de faire.aucune — un jeton valide suffit
GET/pages/La liste des pages du site.administration_pages.view_page
POST/pages/creer/Créer une page. Elle naît en brouillon.administration_pages.add_page
GET, PATCH/pages//L'arbre complet d'une page ; PATCH modifie ses champs.administration_pages.view_page
POST/pages//sections/Ajouter une section à une page.administration_pages.change_page
GET/pages//mesures/Scores PageSpeed, Core Web Vitals et audits ratés. Lecture seule.administration_pages.view_page
GET, PATCH, DELETE/sections//Une section et ses paramètres.administration_pages.change_page
POST/sections//lignes/Ajouter une ligne à une section.administration_pages.change_page
GET, PATCH, DELETE/lignes//Une ligne et ses paramètres.administration_pages.change_page
POST/lignes//blocs/Ajouter un bloc dans une colonne de la ligne.administration_pages.change_page
GET, PATCH, DELETE/blocs//Un bloc et ses paramètres.administration_pages.change_page
PUT/blocs//contenu/Poser ou remplacer le contenu d'un bloc.administration_pages.change_page
PATCH/categories//menus/Affecter les menus d'une catégorie — c'est ce qui fait les sous-sites.administration_menu.change_menu
GET/categories/Les catégories et sous-catégories, avec leurs slugs.administration_pages.view_page
POST/categories/creer/Créer une catégorie. « afficher_dans_l_url » la met dans l'adresse des pages.administration_pages.add_page
GET, PATCH/categories//Corriger une catégorie. Le slug ne change pas : il est dans les adresses.administration_pages.change_page
GET/menus/Les menus, leur arborescence et les catégories qu'ils servent.administration_menu.view_menu
POST/menus/creer/Créer un menu — « copie_de » duplique un existant, arborescence comprise.administration_menu.add_menu
GET, PATCH/menus//Un menu ; envoyer « elements » REMPLACE son arborescence.administration_menu.view_menu
GET/images/La médiathèque, en lecture. Donne les identifiants à réutiliser.administration_pages.view_page
GET, PATCH/identite/Les couleurs du thème et les polices du site. Modification partielle.administration.view_website
GET/modeles/Les types de fiches et leurs champs. À lire avant d'en créer une.custom_objects.view_customobject
POST/modeles/creer/Créer un type de fiche avec ses champs, et marquer sa page gabarit.custom_objects.add_customobjectmodel
GET, PATCH/modeles//Un type de fiche ; PATCH AJOUTE des champs, n'en renomme aucun.custom_objects.view_customobject
GET/objets/Les fiches existantes. `?modele=` pour filtrer.custom_objects.view_customobject
POST/objets/creer/Créer une fiche. Elle naît non publiée.custom_objects.add_customobject
GET, PATCH/objets//Une fiche et ses valeurs ; PATCH en modifie une partie.custom_objects.view_customobject
GET/types-de-produit/Les types de produit — la couche commerciale.shop.view_producttype
POST/types-de-produit/creer/Créer un type de produit. « expedition » décide s'il consomme du stock.shop.add_producttype
GET, PATCH/types-de-produit//Corriger un type de produit. Le code ne change pas : il est dans les URL.shop.view_producttype
GET/produits/Les produits.shop.view_product
POST/produits/creer/Créer un produit sur une fiche existante.shop.add_product
GET, PATCH/produits//Un produit : référence, prix, TVA, stock.shop.view_product
GET/questionnaires/Les questionnaires experts.questionnaires_expert.view_experttest
POST/questionnaires/creer/Créer un questionnaire. Il naît INACTIF.questionnaires_expert.add_experttest
GET, PATCH/questionnaires//L'arbre complet : profils, questions, réponses, poids, combinaisons.questionnaires_expert.view_experttest
POST/questionnaires//profils/Ajouter un profil — un résultat possible, avec sa page.questionnaires_expert.change_experttest
POST/questionnaires//questions/Ajouter une question, ses réponses et leurs poids.questionnaires_expert.change_experttest
POST/questionnaires//combinaisons/Ajouter une combinaison — l'arbitrage entre deux profils proches.questionnaires_expert.change_experttest
PATCH/profils//Un profil. Son slug ne se modifie pas : il est dans l'URL du résultat.questionnaires_expert.change_experttest
PATCH/questions//Une question ; envoyer « reponses » REMPLACE la liste, poids compris.questionnaires_expert.change_experttest
PATCH/combinaisons//Une combinaison et ses critères.questionnaires_expert.change_experttest
GET/emails/evenements/Les 67 événements d'e-mail et LEURS CLÉS. À lire avant d'écrire un e-mail.emailing.view_emailtemplate
GET/emails/Les e-mails configurés.emailing.view_emailtemplate
POST/emails/creer/Habiller un événement : sujet, page de corps. Naît INACTIF.emailing.add_emailtemplate
GET, PATCH/emails//Un e-mail : sujet, corps, expéditeur, activation.emailing.view_emailtemplate
GET/rdv/types/Les types de rendez-vous. Leur durée découpe les disponibilités.calendars.view_appointmenttype
POST/rdv/types/creer/Créer un type de rendez-vous.calendars.add_appointmenttype
GET, PATCH/rdv/types//Un type : durée, capacité, prix, liste d'attente.calendars.view_appointmenttype
GET/rdv/disponibilites/Les plages déclarées disponibles.calendars.view_availability
POST/rdv/disponibilites/creer/Déclarer une plage — elle GÉNÈRE ses créneaux.calendars.add_availability
GET, PATCH, DELETE/rdv/disponibilites//Une plage. La suppression est refusée si des rendez-vous y sont pris.calendars.view_availability
GET/rdv/creneaux/Les créneaux générés — LECTURE SEULE. Filtres : type, depuis, jusqu_a, ouverts.calendars.view_availability
GET/rdv/Les rendez-vous pris. Lecture seule, permission à part : données personnelles.calendars.view_appointment
POST/deplacer///Monter ou descendre une section, une ligne ou un bloc.administration_pages.change_page
GET/guide/Le même mode d'emploi, à une adresse qui se retient.aucune — un jeton valide suffit

Les huit rôles

Un mandat par domaine, accordé et retiré séparément. On ne donne pas à un agent qui rédige des pages le droit de lire les rendez-vous pris.

  • Agent éditeur de pages — créer et modifier des pages. Jamais en supprimer
  • Agent fiches et boutique — types de fiche, fiches, produits, types de produit
  • Agent menus — navigation et affectation aux catégories, ce qui permet des sous-sites
  • Agent design — couleurs et polices. Une erreur ici abîme toutes les pages à la fois : c'est un mandat à part
  • Agent e-mails — sujet et corps des messages transactionnels. Aucun accès aux journaux d'envoi
  • Agent questionnaires — construire un test. Aucun accès aux passages ni aux prospects
  • Agent calendrier — types de rendez-vous et disponibilités
  • Agent agenda (lecture) — lire les rendez-vous pris, nom et adresse compris. Rôle distinct, parce que ce sont des données personnelles

Ce que l'API refuse, et pourquoi

Les refus ne sont pas des précautions décoratives : chacun ferme un cas où la base aurait accepté quelque chose d'inexploitable.

  • Aucune suppression de page. Ni route, ni permission — deux barrières, parce qu'une seule finit par céder
  • Une clé inconnue est refusée, jamais ignorée. Un appelant ne peut pas se corriger si personne ne lui dit qu'il s'est trompé
  • Rien n'est publié à la création — pages, fiches, produits, questionnaires naissent en brouillon
  • Un jeton d'e-mail que l'événement ne fournit pas est refusé : il partirait en clair chez le destinataire
  • Un poids vers le profil d'un autre questionnaire est refusé : le calcul deviendrait faux sans rien signaler

Voir la fonctionnalité