L'API Claude (/_claude/*)

Une surface REST interne, côté 4D, destinée à un agent automatisé : lire et écrire des blocs, exécuter une méthode hôte, inspecter Storage, recharger le projet. C'est la façon de modifier une page par programme — jamais en éditant à la main un fichier d'export.

L'appeler

curl -sk -X POST "https://127.0.0.1:<port>/_claude/ping" \
  -H "Host: <domain>" -H "Content-Type: application/json" -d '{}'

Quatre points qui ne sont pas facultatifs :

  • curl, pas un outil qui met les réponses en cache. Une réponse en cache issue d'un état précédent est pire que pas de réponse.
  • Un corps, même vide (-d '{}'). Sans lui, 4D répond 411 Length Required.
  • L'en-tête Host dès que vous visez 127.0.0.1, pour que le domaine soit résolu.
  • -k sur le certificat auto-signé. Sous Windows, Invoke-WebRequest de PowerShell échoue contre lui quoi que vous tentiez ; utilisez le curl.exe de System32.

Les réponses sont parfois en base64, et occasionnellement encodées deux fois :

… | sed 's/^base64://' | base64 -d | sed 's/^base64://' | base64 -d

Envoyez les valeurs accentuées depuis un fichier, pas en ligne. Un vt_FieldLabel accentué écrit directement dans une charge -d '{…}' revient corrompu. Utilisez curl --data-binary @payload.json -H "Content-Type: application/json; charset=utf-8".

Autorisation

Un appel distant exige un jeton, généré par ClaudeAPI.generateToken($minutes). Le jeton vit dans Storage : il n'y en a jamais qu'un, et un redémarrage de 4D le perd.

Attention : le jeton ouvre exec et tout le Storage ; sur un site public, ce sont les clés de la maison. Gardez une durée de vie courte et révoquez-le. N'exposez pas /_claude sur Internet.

Les routes

RouteCe qu'elle fait
pingVérifie que le serveur répond, et indique le build
execExécute une méthode hôte via BSPH_EXECUTE_METHOD
reloadRELOAD PROJECT — code de l'hôte uniquement
storageLit Storage, ou le rafraîchit
data/<TABLE>/<action>Accès ORDA, voir plus bas
admin/get|setLit ou écrit les gabarits d'administration chiffrés, par slug

exec ne prend aucun paramètre

Il appelle une méthode hôte par son nom et renvoie son résultat Texte, s'il y en a un. Il n'y a aucun moyen de passer des arguments : une méthode qui a besoin d'une entrée doit la lire ailleurs. Et n'exécutez jamais sur un serveur une méthode qui appelle ALERT : la boîte de dialogue bloque le process sans personne pour cliquer.

Les actions data

Lecture : query, get, all, first, validate, render-fields, render-style, page-tree, template-tree, export-template, files-integrity, migration-report.

Écriture : create, update, delete, set-property, place-template, import-template, capture-template, migration-apply, migration-files.

L'écriture est limitée par une liste blanche, claude-api-write-tables.json, à la racine du projet hôte. Une table absente de la liste répond Write not allowed for table: … Check claude-api-write-tables.json — c'est une réponse de configuration, pas un bug.

Il n'y a pas de tri

La pagination se fait par limit (20 par défaut) et offset. Il n'y a pas d'orderBy, et all renvoie les enregistrements dans l'ordre de stockage. Demander « le plus récent » avec limit=1 renvoie donc un enregistrement quelconque — de quoi conclure à tort sur un état ancien. Parcourez les pages et triez côté client.

Les pièges à connaître avant d'écrire

  • admin/get lit la mémoire, pas le disque. Le gabarit renvoyé vient de Storage. Si une fonction dynamique l'a corrompu en place, un get suivi d'un set écrit définitivement cette corruption sur le disque. Travaillez sur une .copy().
  • Ne générez jamais les uuid à l'avance. Créez le parent, lisez l'uuidKey renvoyé par l'API, puis utilisez-le comme parentUuid des enfants. Un parentUuid de 32 espaces donne une page vide.
  • Les champs objet doivent valoir {}, jamais null — properties, cssProperties, events. Un null à cet endroit a déjà fait planter la génération du CSS au démarrage.
  • Créer des blocs par l'API n'extrait pas les classes Tailwind. La page s'affiche sans style tant que la liste des classes n'est pas reconstruite. Voir Le style : cube CSS et Tailwind.
  • Les valeurs de texte longues (vt_Content) voyagent encodées en base64.

Voir aussi