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
Hostdès que vous visez127.0.0.1, pour que le domaine soit résolu. -ksur le certificat auto-signé. Sous Windows,Invoke-WebRequestde PowerShell échoue contre lui quoi que vous tentiez ; utilisez lecurl.exedeSystem32.
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
execet tout leStorage; 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/_claudesur Internet.
Les routes
| Route | Ce qu'elle fait |
|---|---|
ping | Vérifie que le serveur répond, et indique le build |
exec | Exécute une méthode hôte via BSPH_EXECUTE_METHOD |
reload | RELOAD PROJECT — code de l'hôte uniquement |
storage | Lit Storage, ou le rafraîchit |
data/<TABLE>/<action> | Accès ORDA, voir plus bas |
admin/get|set | Lit 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/getlit la mémoire, pas le disque. Le gabarit renvoyé vient deStorage. Si une fonction dynamique l'a corrompu en place, ungetsuivi d'unseté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'
uuidKeyrenvoyé par l'API, puis utilisez-le commeparentUuiddes enfants. UnparentUuidde 32 espaces donne une page vide. - Les champs objet doivent valoir
{}, jamaisnull—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
- Recharger ou redémarrer — ce que
reloadrecharge, et ce qu'il ne recharge pas - Le modèle de données — la forme de ce que vous écrivez

