API

Publier dans le flux en direct

Les outils maison d'Apsov (audit, ardoise, studio, refonte, usine à maquettes) poussent leurs événements ici. Un événement apparaît aussitôt sur l'accueil, dans le flux RSS et dans GET /api/evenements. Jamais de donnée personnelle : pas d'adresse e-mail, pas de nom ni de site de client.

Authentification

Jeton partagé, en-tête Authorization: Bearer …. Sans jeton côté serveur : 503. Jeton absent ou faux : 401.

POST /api/evenements

ChampObligatoireFormatRôle
typeoui[a-z][a-z0-9_]{1,29}debut, etape, fin, outil, ou un type propre à l’outil
labeloui, sauf compteurs1 à 140 caractères, sans @phrase affichée telle quelle
slugnon[a-z0-9-]{1,40}maquette concernée ou nom de l’outil
atnonISO 8601 avec fuseauhorodatage réel, défaut : réception
refnon[A-Za-z0-9:_.-]{1,80}clé d’idempotence : même ref = mise à jour
metanonobjet, 10 clés au plusdétails libres, texte (200 car., sans @), nombre ou booléen

Réponses : 201 nouvel événement, 200 mis à jour (même ref), 422 corps invalide, 400 JSON illisible.

Compteurs des outils maison

Quatre types sont réservés aux outils. Le serveur fixe le libellé : l'outil n'envoie que le type et, au besoin, meta.quantite (entier de 1 à 1000). Tout autre champ est refusé, aucun texte libre ne passe. Chaque appel incrémente le compteur « En ce moment chez Apsov » de l'accueil.

OutilQuandtype
refonte.apsov.comRefonte fabriquéerefonte_fabriquee
audit.apsov.comAudit lancéaudit_lance
ardoise.apsov.comArdoise publiéeardoise_publiee
studio.apsov.comPièce 3D déposéepiece_deposee
fetch(`${process.env.DIRECT_URL}/api/evenements`, {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.DIRECT_EVENEMENTS_TOKEN}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({ type: 'audit_lance' }),
  signal: AbortSignal.timeout(3000),
}).catch(() => undefined);

Chronomètre en direct

Un type: "debut" sans fin postérieure pour le même slug, reçu depuis moins de six heures, fait tourner le chronomètre de l'accueil à partir de at. Un type: "fin" l'arrête.

Exemple

curl -X POST https://direct.apsov.com/api/evenements \
  -H "Authorization: Bearer $EVENEMENTS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"type":"debut","slug":"cedre","label":"Brief reçu : Menuiserie du Cèdre","ref":"cedre:debut"}'

GET /api/evenements

Public. ?limit=50 (100 au plus), ?avant=<ISO> pour paginer vers le passé.

GET /api/flux

Server-Sent Events, public : message bonjour à la connexion, puis un message evenement par enregistrement, battement toutes les 25 s.

POST /api/sync

Même jeton. Relance la lecture du dépôt de l'usine sans attendre la passe des dix minutes.

Référence complète : docs/api-evenements.md dans le dépôt du site.