Design des projets
101 routes. Chemins relatifs à https://api.nexus-engine.eu/api/v1.
GET
/projects/:projectId/repere
Les lieux Repère du projet, limités aux 200 plus récents ; truncated indique une liste incomplète.
Réponse{ places: ReperePlace[], truncated: boolean }
NoteDroits du projet ; mode aveugle réservé aux personnes. Aucun signal radio ni secret.
GET
/repere/lieux
Les lieux Repère visibles dans toute l’entreprise (500 au plus), nom du projet compris.
Réponse{ places, truncated, ecartesAveugle }
NoteSans les projets couverts pour un agent.
GET
/projects/:projectId/repere/:itemId
Le lieu associé à une création du Studio, ou null.
Réponse{ place: ReperePlace | null }
GET
/projects/:projectId/repere/:itemId/versions
Les 100 dernières révisions du lieu ; truncated indique les révisions plus anciennes.
Réponse{ versions: ReperePlaceVersion[], truncated: boolean }
PUT
/projects/:projectId/repere/:itemId
Crée ou versionne le lieu et son alignement, sans écraser une révision concurrente.
CorpsbaseRevision (0 à la création), basePlaceId (identifiant du lieu requis pour modifier), data { name, floor, geometry, notes, alignment, threshold, zones }
Réponse{ place: ReperePlace } ; 409 si la révision a changé
DELETE
/projects/:projectId/repere/:itemId
Supprime le lieu et son historique, conserve la création 3D. Refuse une révision périmée.
CorpsplaceId, baseRevision
Réponse{ deleted: true, creationPreserved: true } ; 409 si le lieu a changé
GET
/me/creations-cloud
« Garder toutes mes créations dans le cloud » : la préférence du compte, ce que le serveur tient déjà de mes créations et ce qui attend un poste, la capacité cloud de l’espace.
RéponseCreationsCloudDto { actif, conserves { fichiers, octets }, enAttente { fichiers, octets }, capaciteOctets, occupeOctets, choix?, parDefaut?, plein? }
PUT
/me/creations-cloud
session de l’application seulement
Régler la préférence : vrai, le serveur retient la version courante de chaque création de la personne et fait signe aux postes de déposer ce qui manque ; faux, rien n’est supprimé, le ménage ordinaire reprend.
Corpsactif (booléen)
RéponseCreationsCloudDto
NoteUne PRÉFÉRENCE, pas un achat (7 novembre 2026) : la personne, ou l’agent qu’elle conduit (assistant, discussion de projet ou d’application) — journalisé avec son acteur ; jamais une clé, une tâche d’application ni une routine. Acheter du stockage en plus reste le geste d’une personne (paiement). Un poste ne retire de son magasin que ce que le serveur CONFIRME tenir.
GET
/projects/:id/design
Le design d’un projet : ses livrables (brief, références, territoire de marque, logos, maquettes, tokens, assets) avec leur DERNIÈRE version, sans aucun contenu. Les mêmes lignes pour un développeur et pour un designer : le mode n’est qu’une vue d’écran.
Requêtearchives=1 (inclure les archivés), sorte (BRIEF, REFERENCE, TERRITOIRE, LOGO, MAQUETTE, IMAGE, VIDEO, SON, TOKENS, ASSET), exploitable=1 (la vue du développement : seulement ce qui est validé ou envoyé en dev, et c’est CETTE version qui est rendue à la place de la dernière)
RéponseDesignProjetDto { aveugle, items: DesignItemDto[], dossiers: DesignDossierDto[], limites }
NoteProjet en mode aveugle : pour une clé ou un agent la liste est vide par construction, et `aveugle` le dit. Chaque livrable porte `commentairesATraiter` : les retours de tiers (lien de partage) ni traités ni refusés — absent d’un serveur d’avant.
GET
/projects/:id/design/resume
Le résumé du design d’un projet : combien de livrables par sorte, combien à valider, quel territoire de marque fait foi, quel brief. C’est ce que `get_project` porte.
RéponseDesignResumeDto { aveugle, total, parSorte, aValider, territoire, brief }
POST
/projects/:id/direct
Le direct du Studio : le poste dit qu’il est dans une création (`presence`), où est son curseur (`curseur`) ou ce que son fichier de travail vient de devenir (`travail`, cliché texte de 512 Ko au plus) ; le serveur complète qui, d’où et quand, puis REDIFFUSE sur le flux du projet sans rien stocker.
Corpsgenre (presence | curseur | travail), itemId, puis selon le genre : dedans ; x, y (parts 0..1 de la boîte de l’éditeur), selection? ; fichier, cliche? (null = trop gros ou binaire), coedition? { id, parents, epoque, baseRev, depuis } (l’envoi à l’arbitre de la co-édition)
Réponse204 ; `presence` entrant : ReponseDirectPresence { coedition } ; `travail` porteur de `coedition` : ReponseDirectTravail { accuse } | { refus, courante }
NoteSilencieuse et plafonnée par membre (25 événements par seconde, fenêtre glissante) : au-delà, 429 muet — c’est une cadence, pas une attaque. Rien n’est stocké en base : la co-édition (22 septembre 2026) tient le texte VIVANT d’une création en mémoire du serveur, le temps que plusieurs y travaillent (oublié après 15 minutes sans nouvelles), fusionne chaque envoi et diffuse le texte fusionné avec sa révision. La version figée reste la vérité d’équipe.
POST
/projects/:id/design
Crée un livrable avec sa première version : un FICHIER (base64, 20 Mo décodés au plus), une ADRESSE https (frame Figma, design Canva) ou, pour un territoire de marque et des tokens, un DOCUMENT structuré.
Corpssorte, titre, description?, statut? (BROUILLON, A_VALIDER, A_REPRENDRE), dossierId? ou dossier? (un NOM — créé s’il n’existe pas), version { fileName?, dataBase64?, sha256? + size? (fichier gardé sur les postes : seule sa carte d’identité est déposée), pieces? [{ nom, mime, taille, sha256 }], vignetteBase64?, externalUrl?, json?, note? }
RéponseDesignEcritureDto { item: DesignItemDetailDto, existait, recouverts, refuses }
NoteLe type vient du NOM du fichier ; une police, un nom de secret, un SVG actif et un format inconnu sont refusés en disant pourquoi (`refus`). Fermé à une clé et à un agent sur un projet en mode aveugle. OÙ VIVENT LES OCTETS : jusqu’à 256 Ko le serveur garde le contenu (`stockage: SERVEUR`) ; au-dessus, il n’en tient que l’empreinte et la vignette (`POSTES`) — des octets reçus en base64 partent alors au relais de passage, où les postes viennent les prendre. Une adresse Figma met à jour le lien Figma de la fiche du projet.
GET
/design/:id
Un livrable et TOUTES ses versions (qui, quand, quoi, note), sans leur contenu.
RéponseDesignItemDetailDto
GET
/projects/:id/design/corbeille
La corbeille du Studio d’un projet : les créations supprimées depuis moins de trente jours, avec la date de leur suppression et de leur effacement définitif.
NoteRéservée à une personne et à l’agent de sa discussion : une clé d’API est refusée (403).
POST
/design/:id/restaurer
Sort une création de la corbeille : elle retrouve sa place, ses versions et ses liens.
NotePassé le délai de trente jours, la création n’existe plus : 404.
GET
/design/:id/corbeille/apercu
L’aperçu d’une création À LA CORBEILLE : la vignette de sa version courante, sinon le fichier lui-même s’il est une petite image (PNG, JPEG, WebP, GIF, 2 Mo au plus).
RéponseDesignCorbeilleApercuDto { mimeType, dataBase64, source: vignette | fichier, version }
NoteRéservé à une personne : une clé d’API et un agent sont refusés (403, `GESTE_DE_PERSONNE`). Une création vivante, d’une autre entreprise ou sans image : 404.
POST
/design/:id/garder-variante
Garde cette variante et ARCHIVE ses sœurs nées du même lot de génération (même projet, encore dans la galerie). Rien n’est supprimé.
RéponseDesignGarderVarianteDto { gardee, ecartees: [{ id, titre }] }
NoteUne création qui n’est pas née d’un lot de variantes : 409 `PAS_DE_VARIANTES`. Fermé à une clé et à un agent sur un projet en mode aveugle. Rejouer le geste rend une liste vide.
GET
/design/:id/journal
Le journal d’une création : qui a fait quoi, quand (versions, validations, partages, suppressions, restaurations), lu dans le journal d’audit.
GET
/projects/:id/design/rangement
Le rangement des créations d’un projet : leurs étiquettes, les favoris du membre qui demande, et les verrous d’édition vivants.
NoteLes favoris sont personnels : chacun ne lit que les siens.
GET
/projects/:id/design/recherche
Cherche dans les créations d’un projet par le paramètre `q` : titre, étiquettes, texte des contenus indexés.
NoteUne recherche vide ou illisible est refusée (400) plutôt que lue « tout ».
POST
/design/:id/etiquettes
Ajoute ou retire des étiquettes sur une création ; rend l’état APRÈS et ce qui a été écarté.
Corpsajouter?, retirer? (listes de mots ; au moins une des deux)
RéponseDesignEtiquettesEcritesDto { itemId, etiquettes, ecartees, plafond }
POST
/design/:id/favori
Marque ou retire une création des favoris du membre qui demande.
Corpsfavori (booléen)
NotePersonnel : rien ne change chez les collègues.
POST
/design/:id/verrou
Pose ou redit le verrou d’édition d’une création pour le poste qui demande ; rend qui le tient quand c’est un autre.
NoteUn verrou qui n’est plus redit se périme tout seul : il ordonne les écritures, il ne retient jamais un travail.
DELETE
/design/:id/verrou
Relâche le verrou d’édition qu’on tient sur une création.
GET
/design/:id/validation
Le circuit de validation d’une création : les valideurs désignés, l’échéance, l’avis de chacun et la version qu’il a jugée.
PUT
/design/:id/validation
session de l’application seulement
Désigne les valideurs d’une création (la liste entière) et l’échéance ; une liste vide retire le circuit.
Corpsvalideurs (identifiants de membres), echeance? (date ISO ou null)
POST
/design/:id/validation/avis
session de l’application seulement
Rend son avis de valideur sur la version courante : VALIDE, ou REPRISE avec un mot.
Corpsdecision (VALIDE | REPRISE), note? (obligatoire pour une reprise)
NoteUn avis rendu sur une version plus ancienne que la courante ne compte plus.
POST
/design/lien-partage/creation
La création qu’un lien de partage tiers (`/c/<apercu>#<jeton>`, ou `/c#<jeton>`) désigne : son identifiant, la version que le lien montre, et s’il est révoqué ou échu. C’est par elle qu’un agent à qui l’on colle ce lien retrouve la création.
Corpsjeton (les dix caractères après « # »), apercu? (les douze du chemin, quand il y en a)
RéponseCreationDuLienDto { id, version, ferme (REVOQUE | EXPIRE | null) }
NoteLe jeton voyage dans le corps, jamais dans l’adresse ; son EMPREINTE est comparée à celle du lien, et l’aperçu, public, ne fait que la confirmer. Mêmes gardes que `GET /design/:id` : un lien d’une autre entreprise, un jeton faux ou un aperçu qui ne va pas avec lui répondent 404 ; un projet non affecté 403 ; le mode aveugle ferme un agent et une clé. Un lien révoqué ou échu désigne encore sa création : la personne la lit par ses droits, pas par ceux du lien. Une désignation, pas une consultation : ni vue, ni visite, ni réclamation, rien n’est écrit.
GET
/design/:id/discussions
Les discussions d’ÉDITION de ce livrable qui appartiennent à l’appelant (ni archivées, ni supprimées), de la plus récemment active à la plus ancienne — dix au plus, sans aucun contenu.
Réponse{ discussions: DiscussionDeCreationDto[] } (id, engine, claudeSessionId, startedAt, endedAt, lastHeartbeatAt, archivedAt)
NoteC’est par elle que la fenêtre du Studio REPREND la discussion d’une création au lieu d’en ouvrir une de plus. Une discussion devient celle d’une création quand le poste l’ouvre avec `designItemId` (`POST /sessions`) ; une création d’un autre projet n’y est pas retenue.
PATCH
/design/:id
Renomme, décrit, déclare un statut, archive ou désarchive un livrable. `valider` pose (ou lève) la validation de la version COURANTE.
Corpstitre?, description?, statut? (BROUILLON, A_VALIDER, A_REPRENDRE), archive?, valider?, dossierId? (null = à la racine du projet), position?
RéponseDesignItemDetailDto
Note`valider` est refusé (403, refus VALIDATION_HUMAINE) à une CLÉ D’API seulement : une personne, ou l’agent de sa discussion quand elle le lui demande, marque un livrable finale (décision du 22 septembre 2026). Une version plus récente fait retomber le livrable sur son statut.
POST
/design/:id/versions
Met à jour un livrable en lui AJOUTANT une version : rien ne s’écrase, les numéros ne sont jamais renumérotés. Pour un territoire de marque ou des tokens, le document proposé est FUSIONNÉ champ par champ dans la version courante.
CorpsfileName?, dataBase64?, sha256? + size?, pieces?, vignetteBase64?, externalUrl?, json?, baseVersion? (la version lue avant d’écrire), note?, niveau? (correctif | evolution | majeure — le libellé XX.XX.XX de la version, correctif par défaut)
RéponseDesignEcritureDto { item, existait, recouverts, refuses }
NoteDeux écritures différentes du même champ : une personne recouvre un agent (nommé dans `recouverts`) ; un agent ne recouvre rien (`refuses` lui rend le champ et sa valeur courante) ; deux personnes reçoivent 409 (refus CONFLIT, `conflits`). Le même contenu redéposé rend `existait` sans créer de version.
GET
/design/:id/versions/:n/contenu
Le contenu d’une version, en base64 — `null` pour une version qui n’est qu’une adresse.
RéponseDesignContenuDto { id, number, fileName, mimeType, size, externalUrl, dataBase64, stockage, sha256 }
Note`dataBase64` est `null` pour un fichier gardé sur les postes (`stockage: POSTES`) : ses octets se prennent au relais (`GET /design/relais/:sha`) ou dans le magasin du poste.
GET
/design/:id/versions/:n
Une version précise d’une création, sans contenu — la vue du développement montre la version exploitable, pas la dernière.
POST
/projects/:id/design/dossiers
Crée un dossier dans le design du projet (ou rend celui qui porte déjà ce nom) — un NOM, ou un CHEMIN « Clients/Lenoir/Logos » dont les niveaux manquants naissent (trente-deux niveaux au plus). `parentId` : le créer DANS ce dossier.
Corpsnom (ou chemin), parentId?
RéponseDesignDossierDto { id, nom, position, createdAt }
PATCH
/design/dossiers/:id
Renomme un dossier (un nom, sans « / »), le déplace sous un autre (`parentId`, `null` = la racine — un cycle ou un niveau de trop est refusé en le disant) ou change son rang.
Corpsnom?, parentId?, position?
RéponseDesignDossierDto
DELETE
/design/dossiers/:id
Supprime un dossier. Rien de ce qu’il range n’est supprimé : ses créations et ses sous-dossiers REMONTENT chez son parent (à la racine pour un dossier de la racine).
POST
/design/:id/envoyer-en-dev
Envoie une création au développement : date le fait sur la version courante, crée (une seule fois) la tâche du projet, et — quand c’est une personne — VALIDE la version du même geste.
Corpsconsigne?
RéponseDesignItemDetailDto (avec envoiEnDev { at, parNom, parAgent, version, tacheId })
NoteUn agent ou une clé qui relaie la demande ne valide rien : `parAgent` est vrai et le statut passe à A_VALIDER. La vue du développement (`exploitable=1`) montre alors la création avec cette mention.
POST
/design/:id/retirer-du-dev
Retire une création de la vue du développement : lève l’envoi en dev ET la validation (la vue montre l’un OU l’autre).
RéponseDesignItemDetailDto
NoteLa tâche née de l’envoi n’est PAS supprimée — elle est peut-être affectée, peut-être commencée ; son lien reste, et un renvoi en dev la retrouve au lieu d’en créer une seconde.
POST
/design/fichiers/etat
L’état de fichiers gardés sur les postes, par leur empreinte : au relais de passage ? chez quels postes ? en ligne ?
Corpsempreintes: string[] (SHA-256)
Réponse{ fichiers: DesignFichierEtatDto[] { sha256, taille, auRelais, conserve?, porteurs[], drive?: { fileId, par }[] } }
NoteUne lecture, en POST pour son corps. N’émet aucun événement. `drive` nomme les copies que des collègues ont posées dans LEUR Google Drive (hors celles de ce poste) : un poste les lit avec son propre compte Google, et relit l’empreinte.
PUT
/me/google-drive
session de l’application seulement
Le poste annonce l’adresse Google qu’il a reliée (ou `null`, il n’en a plus) : c’est à elle que les postes des collègues ouvrent, en lecture, leurs dossiers Drive de projet.
Corpsemail: string | null
Réponse{ ok: true }
NoteRéservé à une personne sur son application (en-tête x-nexus-appareil) : ni une clé, ni un agent. L’adresse vient de l’`id_token` de Google sur le poste, jamais d’une saisie. Aucun jeton ne transite.
GET
/design/webhooks
Les adresses que l’entreprise a posées pour être prévenue des faits du Studio (création née, version figée, finale posée, commentaire posé, lien de partage ouvert).
Réponse{ webhooks: WebhookStudioDto[] { id, libelle, indice, faits[], projectId, actif, suspenduA, raisonSuspension, derniereLivraisonA, dernierCode } }
NoteRéservé à un administrateur. Ni l’adresse entière ni le secret ne sont rendus : seulement un indice (hôte et fin du chemin).
POST
/design/webhooks
session de l’application seulement
Pose une adresse HTTPS prévenue des faits du Studio. Chaque livraison est signée (HMAC-SHA256, en-têtes nexus-webhook-id, -timestamp, -signature, -event : les mêmes que ceux de Transfert).
Corpslibelle: string ; url: string (https) ; faits?: ("creation"|"version"|"finale"|"commentaire"|"partage")[] (vide : tous) ; projectId?: string
Réponse201 { webhook: WebhookStudioDto, secret } — le secret n’est rendu qu’ici
NoteGeste d’une personne en session, administrateur : ni une clé, ni un agent. L’adresse est refusée si elle mène à la boucle locale, à un réseau privé ou réservé ; elle est rejugée à chaque envoi, sans suivre de redirection. Dix adresses au plus par entreprise. Un projet en mode aveugle n’émet rien. Le corps ne porte aucun contenu : identifiants, fait, titre, auteur, numéro de version.
PATCH
/design/webhooks/:id
session de l’application seulement
Active (et lève une suspension) ou désactive une adresse.
Corpsactif: boolean
RéponseWebhookStudioDto
NoteRéactivée, une adresse ne rattrape pas ce qui a été abandonné.
DELETE
/design/webhooks/:id
session de l’application seulement
Retire une adresse et son journal de livraisons.
POST
/design/webhooks/:id/essai
session de l’application seulement
Envoie tout de suite un essai signé (genre ESSAI) à l’adresse, et rend le verdict.
Réponse{ code: number | null, erreur: string | null }
GET
/design/webhooks/:id/livraisons
Le journal d’une adresse : ses cent dernières livraisons, avec l’état, le nombre d’essais, le dernier code et la dernière erreur.
Réponse{ livraisons: LivraisonWebhookStudioDto[] }
NoteHuit essais au plus sur un peu plus d’une journée, puis abandon ; vingt abandons d’affilée (ou un 410) suspendent l’adresse. Les livraisons closes sont purgées après trente jours.
GET
/design/drive/plan
session de l’application seulement
L’arbre que le poste sauvegarde dans le Google Drive de son membre : les projets qu’il voit, leurs dossiers, leurs créations (dernière version), et les adresses Google avec qui partager chaque dossier de projet.
RéponseDriveStudioPlanDto { projets[] { id, nom, dossiers[], creations[], partages[] }, aveugles, limites[] }
NoteUne PROJECTION, recalculée à chaque lecture. Les projets en mode aveugle n’y entrent jamais (comptés dans `aveugles`) ; projets et créations archivés non plus.
PUT
/design/drive/copies
session de l’application seulement
Le poste remplace en entier le lot des copies qu’il a posées dans son Google Drive : une empreinte et un identifiant de fichier Drive par ligne.
Corpscopies: { sha256, fileId, taille }[]
Réponse{ retenues, ecartees }
NoteDes POINTEURS, aucun octet. Une empreinte qui n’appartient à aucune version de l’entreprise est écartée. Réservé à un poste (en-tête x-nexus-appareil).
POST
/design/fichiers/porteur
Un poste annonce les fichiers qu’il porte dans son magasin (et ceux qu’il ne porte plus), et reçoit la liste de ceux que d’autres postes réclament.
Corpslibelle (le nom du poste), empreintes?: string[], retirees?: string[]
Réponse{ poses, aFournir: string[] }
NoteRéservé à un poste : demande l’en-tête x-nexus-appareil. N’émet aucun événement.
POST
/design/fichiers/reclamer
Un poste réclame des fichiers qu’il n’a pas et qui ne sont pas au relais : le premier poste porteur qui se reconnecte les y dépose.
Corpsempreintes: string[]
Réponse{ reclames }
NoteSeules les empreintes d’une version de cette entreprise sont retenues. Réservé à un poste.
PUT
/design/relais/:sha
Dépose les octets d’un fichier au RELAIS DE PASSAGE (corps brut, application/octet-stream) : sur le disque du serveur, 30 jours au plus, sous un plafond par entreprise. C’est ce qui fait arriver un fichier chez un collègue alors que la machine de son auteur est éteinte.
Corpsles octets du fichier
Réponse{ taille, existait, conserve }
NoteL’empreinte est vérifiée à l’arrivée : des octets qui ne lui correspondent pas sont refusés (400, refus EMPREINTE). 404 quand l’empreinte n’appartient à aucune version de cette entreprise ; 413 trop lourd ; 507 relais plein. `conserve` : une création PUBLIÉE ou un template retient ce fichier, et le serveur le garde désormais durablement (il quitte le relais).
GET
/design/relais/:sha
Prend les octets d’un fichier sur le serveur : gardés par une création publiée ou un template, sinon de passage au relais.
Réponseapplication/octet-stream
Note404 quand le fichier n’est ni gardé ni au relais — le poste le réclame alors (`/design/fichiers/reclamer`). Une empreinte d’une autre entreprise est indiscernable d’une empreinte inconnue.
GET
/design/:id/versions/:n/vignette
La vignette d’une version : ce qu’une galerie charge à la place du fichier. 404 quand la version n’en a pas.
Réponse{ mimeType, dataBase64 }
DELETE
/design/:id
session de l’application seulement
Supprime un livrable et toutes ses versions, définitivement.
Réponse204
NoteLe geste d’une personne. Un agent ou une clé ARCHIVE (`PATCH`, archive: true), et l’archive se défait.
GET
/design
TOUTES les créations de l’entreprise, tous projets confondus — l’écran « Studio » de la barre du haut. Filtres : `q` (titre et description), `sorte`, `etat` (l’état VISIBLE, validé compris), `projet`. Chaque ligne porte le nom de son projet.
Requêteq, sorte, etat, projet
RéponseDesignAgenceDto { items, projets, dossiers, dossiersDesProjets, limites }
NoteLe cloisonnement est DANS la requête : un développeur ne voit que ses projets, et un projet en mode aveugle n’y entre pas — ce qu’il couvre, il le couvre partout.
GET
/design/dossiers-studio
Les dossiers du Studio de l’entreprise, dans leur ordre. Ils rangent les MÊMES créations pour la vitrine (onglet Studio de la bibliothèque) et pour l’écran Studio — et ne remplacent pas les dossiers d’un PROJET.
RéponseDesignStudioDossierDto[]
POST
/design/dossiers-studio
Créer un dossier du Studio de l’entreprise — un NOM, ou un CHEMIN « Clients/Lenoir » dont les niveaux manquants naissent. Un dossier du même nom, chez le même parent, est REPRIS (200), jamais doublé.
Corps{ nom (ou chemin), parentId? }
RéponseDesignStudioDossierDto
NoteUn dossier n’ouvre AUCUN droit : ranger une création ne la montre à personne de plus. D’où l’absence de garde de rôle.
PATCH
/design/dossiers-studio/:id
Renommer un dossier du Studio (un nom, sans « / »), le déplacer sous un autre (`parentId`, `null` = la racine ; cycles et profondeur refusés), ou changer son rang.
Corps{ nom?, parentId?, position? }
RéponseDesignStudioDossierDto
DELETE
/design/dossiers-studio/:id
Supprimer un dossier du Studio. Ses créations et ses sous-dossiers REMONTENT chez son parent : rien n’est supprimé avec lui.
PATCH
/design/:id/dossier-studio
Ranger une création dans un dossier du Studio de l’entreprise (`dossierId: null` la remet à la racine) — le glisser-déposer des deux écrans.
Corps{ dossierId }
Réponse204
NoteDistinct de `dossierId` d’une création, qui range DANS un projet : les deux coexistent, et les confondre rangerait chez le client.
POST
/design/:id/projet
Relier une création à un AUTRE projet : la même création change de maison, versions, commentaires, liens de partage et publication compris. Son dossier de projet ne la suit pas ; son dossier du Studio reste.
Corps{ projectId }
RéponseDesignDeplacementDto { item, depuis }
NoteIl faut voir les DEUX projets (404 sinon). Un projet « code non recopié hors du projet » ne laisse pas partir ses créations (403 `CONFIDENTIEL`) ; un agent est refusé sur un projet en mode aveugle (403 `AVEUGLE`). Déjà dans ce projet : rien ne bouge, `depuis` vaut `null`.
POST
/design/sans-projet
Le projet caché « Sans projet » de l’espace, créé au premier besoin : une création du Studio y naît quand on ne la lie à aucun projet.
Réponse{ id, nom }
NoteL’espace est celui du membre en session, jamais un paramètre. Absent de GET /projects ; ses créations paraissent dans la galerie du Studio sous « Sans projet ».
GET
/design/templates
Les templates du Studio publiés dans l’entreprise (onglet « Studio » de la bibliothèque), les plus récents d’abord : la version publiée, qui l’a publiée, quand. Toute l’entreprise les voit ; le nom du projet d’origine n’est rendu qu’à qui y est affecté.
RéponseDesignTemplatesDto { templates, limites }
NoteLa seule porte du design ouverte au-delà du projet — et ÉTROITE : la version publiée, sa vignette, son contenu, l’installation. Un projet en mode aveugle n’en publie aucun.
GET
/design/templates/:id/contenu
Le contenu de la version PUBLIÉE d’un template, en base64 quand le serveur la garde (sinon le poste la prend au relais ou chez un collègue).
GET
/design/templates/:id/vignette
La vignette de la version publiée d’un template — ce que la carte de la bibliothèque charge.
Réponse{ mimeType, dataBase64 } (comme la vignette d’une version) ; l’image brute seulement si `Accept` demande une image ; 404 sans vignette
POST
/design/:id/template
session de l’application seulement
Publie une création comme TEMPLATE de la bibliothèque : une version précise, sinon la validée, sinon la courante. Toute l’entreprise la retrouve et l’installe sur ses projets.
Corpsversion? (le numéro à publier)
RéponseDesignItemDetailDto (avec `template`) et `stockage` (DesignStockageEtatDto) : un template est gardé par le serveur, et `manquants` dit ce qu’un poste doit encore envoyer
NoteLe geste d’une personne, devant la création : ce qui devient visible de toute l’entreprise ne se délègue ni à une clé ni à un agent. Refusé sur un projet en mode aveugle.
DELETE
/design/:id/template
session de l’application seulement
Retire une création des templates : la bibliothèque ne la montre plus. Les copies déjà installées restent.
RéponseDesignItemDetailDto
POST
/design/:id/publier
PUBLIE une création : le serveur garde ses fichiers (version courante, finale, envoyée en dev), lisibles même quand le poste de son auteur est éteint. Idempotent : republier redit l’état et promeut ce qui est arrivé entre-temps.
RéponseDesignPublicationDto (conserves, manquants — les empreintes qu’un poste doit encore envoyer —, refus NON_REGLE | QUOTA, occupation de l’entreprise)
NoteRefusé (403) à une CLÉ D’API seulement : une personne, ou l’agent de sa discussion, publie — comme pour marquer une finale. Seuls les fichiers des postes sont gardés (les petits sont déjà en base), une fois par contenu dans l’entreprise, le texte compressé. Plafond : dix gigaoctets par membre actif ; au plafond rien n’est supprimé ni bloqué en lecture.
DELETE
/design/:id/publier
Retire la publication : la création redevient une création des postes. Ses fichiers sont rendus par le ménage après un jour de grâce, sauf ceux qu’une autre publication, un template ou un lien vivant retiennent.
RéponseDesignPublicationDto (publiee: false)
NoteRefusé (403) à une CLÉ D’API, comme la publication.
GET
/design/:id/portail
Ce que « Envoyer au portail client » ferait de cette création : le client du projet, la version qui partirait (l’exploitable, sinon la courante), les contacts actifs qui seraient prévenus, et l’envoi déjà fait (version, historique, annonce, retrait).
RéponsePortailCreationEtatDto (refus SANS_CLIENT | AVEUGLE | ARCHIVEE | CLIENT_SORTI, ou null)
NoteLire est ouvert à une clé et à un agent : savoir ce que le client voit, avant de retoucher une création. Une création d’une autre entreprise est introuvable (404).
POST
/design/:id/portail
session de l’application seulement
ENVOIE la création au portail de son client — ou une version de plus. Elle paraît dans l’onglet « Studio » du client ; le premier envoi lui écrit un courriel (une fois par création, jamais à chaque version), chaque envoi sonne sa cloche.
Corpsversion? (absente : l’exploitable, sinon la courante)
RéponsePortailCreationEnvoiDto — geste AJOUTEE | VERSION | INCHANGEE, prevenus (cloches), courriels (acceptés par le relais)
NoteLe geste d’une personne (`ROUTES_SESSION_SEULE`) : ce qui part chez un client et lui écrit ne se délègue ni à une clé, ni à un agent. Refusé sans client (409 `SANS_CLIENT`), client sorti (409), création archivée (409), version inconnue (404), montage (400 `FORMAT`), projet en mode aveugle (403 `AVEUGLE`). Les versions envoyées sont RETENUES par le serveur tant que l’envoi vit. Journal `design.portail-envoyee` / `design.portail-version`.
DELETE
/design/:id/portail
Retire la création du portail de son client : il ne la voit plus, et son lien de consultation ne s’ouvre plus. Rien n’est effacé ; ses commentaires restent à traiter.
RéponsePortailCreationEtatDto
NoteOuvert à une clé et à un agent : couper se fait de partout. Idempotent. Un renvoi ultérieur ne réécrit pas de courriel au client. Journal `design.portail-retiree`.
GET
/design/:id/social
Ce que la création sait de SOCIAL HUB : son brouillon de publication (format du réseau, pages retenues dans l’ordre du carrousel, légende, hashtags, comptes visés, groupe client) et ses envois, chacun avec l’état de sa publication LU À L’INSTANT chez Social Hub (destinations, liens, erreurs, validation en attente).
RéponseDesignSocialDto — brief, enregistre, rendus (page → création-diapositive), envois[] (publication: null quand elle a disparu ou qu’un de ses comptes vous est fermé)
NoteL’état se lit avec les yeux de l’appelant : Social Hub ne montre une publication qu’à qui voit tous ses comptes. Une clé lit le brouillon et les envois, jamais l’état. Mode aveugle : 403 `AVEUGLE` pour un agent ou une clé. Une création d’une autre entreprise : 404.
PATCH
/design/:id/social
Enregistre le BROUILLON DE PUBLICATION de la création, gardé avec elle au serveur. Un champ absent garde sa valeur : un agent qui ne parle que des hashtags n’efface pas la légende écrite par une personne.
Corpsformat? (carre | portrait | story | paysage | lien | epingle | miniature | banniere | couverture), genre? (VISUEL | CARROUSEL | VIDEO), pages?[] (≤ 10, dans l’ordre), legende?, hashtags?[] (sans #), variantes? {PLATEFORME: texte}, compteIds?[], groupeId?, titre?, textesAlternatifs?[], note?
RéponseDesignSocialDto
NoteRien ne part : c’est un brouillon du Studio, pas une publication. Un compte ou un groupe d’une autre entreprise, ou que Social Hub ne vous ouvre pas (attributions) : 404, comme à l’envoi. Journal `design.social-brouillon`.
POST
/design/:id/social/envois
ENVOIE la création vers Social Hub : crée la publication (médias `source: "studio"` — la création ou ses diapositives rendues, dans l’ordre), puis la laisse en brouillon, la publie ou la programme. Social Hub juge CHAQUE compte avec l’appelant réel : PERMIS, A_VALIDER (une personne valide dans Social Hub) ou REFUSE.
Corpsmedias[] {creationId, version? (XX.XX.XX), page?, texteAlternatif?} (1 à 10, du même projet), texte?, hashtags?[], destinations[] {compteId, texte?, titre?}, groupeId?, mode (BROUILLON | MAINTENANT | PROGRAMMER), a? (ISO 8601, PROGRAMMER seulement), fuseau?, version? (de la création source), cle (obligatoire)
RéponseResultatEnvoiSocialDto — envoi (avec l’état lu chez Social Hub), verdict, message, rejoue, publieesPourLEnvoi[], avertissements[] (201 ; 200 quand la clé avait déjà servi)
NoteRefusé (403) à une CLÉ D’API : une personne, ou l’agent de sa discussion — qui garde ses bornes et sa file de validation. IDEMPOTENT par `cle` : la même clé relit l’envoi et ne redemande RIEN à Social Hub (une issue inconnue ne se rejoue jamais). Une création média non publiée l’est pour l’occasion (Studio › Publier, dit dans `message`). Fichier pas encore au serveur : 409 `FICHIERS_MANQUANTS` {manquants, creations} — le poste les pousse au relais, puis réessaie avec la MÊME clé. Un SVG, un HTML : 400 `FORMAT` (rendre en JPEG/MP4 d’abord). Les versions parties en média sont RETENUES au serveur le temps qu’une plateforme les télécharge. Mode aveugle : 403. Journal `design.social-envoyee`.
POST
/design/dossiers/:id/template
session de l’application seulement
Publie TOUT un dossier du studio comme templates : chaque création non archivée (sa version validée, sinon la courante), rangée sous le nom du dossier. La bibliothèque les montre ensemble et les installe en entier.
Réponse{ publies: number, manquants: string[] } — les empreintes qu’un poste doit encore envoyer au serveur, qui garde les templates
NoteLe geste d’une personne, comme pour une seule création. Refusé sur un projet en mode aveugle, et sur un dossier vide (400).
DELETE
/design/dossiers/:id/template
session de l’application seulement
Retire des templates toutes les créations publiées avec ce dossier. Les copies déjà installées restent.
Réponse{ retires: number }
GET
/design/dossiers/:id/liens-import
Les liens de dépôt ouverts sur ce dossier : ce qu’ils demandent, jusqu’à quand ils valent, et ce qui est arrivé par chacun (nombre, poids, dernier dépôt).
RéponseLienImportDto[] — 50 au plus, du plus récent au plus ancien
NoteLe JETON n’y est JAMAIS rendu : il n’existe que dans la réponse qui crée le lien. Un lien fermé porte son motif, calculé comme sur la page publique — sans quoi la fiche afficherait « ouvert » un lien que la page refuse. Lire reste ouvert à une clé et à un agent : c’est ce qu’il faut savoir avant de travailler sur ce qui est arrivé.
POST
/design/dossiers/:id/lien-import
session de l’application seulement
Ouvre ce dossier en DÉPÔT à quelqu’un sans compte Nexus : il pourra y créer des sous-dossiers et y importer des fichiers, sans voir ce que le dossier contient déjà.
Corpstitre, consigne?, heures (24, 168 ou 720 ; null : sans durée, ouvert jusqu’à « Fermer »)
RéponseLienImportDto, et son `url` — la seule fois où le jeton paraît
NoteLe geste d’une personne (`ROUTES_SESSION_SEULE`) : c’est le partage d’une création retourné, et il fait ENTRER des fichiers dans le Studio d’un client. Refusé sur un projet en mode aveugle (403 `AVEUGLE`). Le jeton n’est pas stocké, seulement son empreinte : l’adresse ne se relit jamais.
POST
/design/liens-import/:id/revoquer
Ferme un lien de dépôt. Ce qui est déjà arrivé reste dans le dossier.
RéponseLienImportDto (fermé, motif REVOQUE)
NoteIdempotent. Ouvert à une clé et à un agent, comme la révocation d’un partage : couper se fait de partout, vite.
POST
/design/templates/:id/installer
Installe un template sur des projets : une COPIE de la version publiée dans chacun, qui vit ensuite sa vie. Chaque projet est jugé à part (affectation, mode aveugle) et ce qui n’a pas été posé est nommé avec sa raison.
CorpsprojectIds (1 à 50), dossier? (nom du dossier où ranger la copie, créé s’il n’existe pas)
RéponseDesignInstallationTemplateDto { installes, refuses }
NoteL’identifiant peut aussi être celui d’une création DIFFUSÉE par la communauté (`GET /design/diffusions`) : sa copie figée est installée, publiée, et ses fichiers passent chez votre espace — réservé alors à une personne en session (403 pour une clé ou un agent).
GET
/design/diffusions
Les créations diffusées à TOUS les espaces de travail de Nexus (Bibliothèque › Studio › Communauté) : celles que l’éditeur a validées, plus celles que votre espace attend de voir validées. Un administrateur de l’éditeur reçoit aussi ce qu’il doit décider.
RéponseDesignDiffusionsDto { diffusions, enAttente, editeur, limites }
NoteChaque entrée a la forme d’un template (`DesignDiffuseDto`) : son identifiant est celui de la DIFFUSION, et son contenu, sa vignette et son installation passent par `/design/templates/:id/…`. Le projet d’origine n’est jamais nommé ; l’auteur se lit « Prénom · Espace ».
GET
/design/:id/diffusion
L’état de la diffusion d’une création de votre espace : la version au catalogue de tous les espaces, celle qui attend l’éditeur, la version qu’un geste diffuserait, et si vous avez la main.
RéponseDesignDiffusionEtatDto
POST
/design/:id/diffusion
session de l’application seulement
DIFFUSE une création à TOUS les espaces de travail de Nexus : une COPIE FIGÉE de la version (finale, sinon courante), que l’éditeur valide avant qu’elle paraisse chez les autres. Rediffuser une version neuve la propose à nouveau ; l’ancienne reste au catalogue jusqu’à la décision.
Corpsconfirmation (le titre de la création, recopié), version?
RéponseDesignDiffusionResultatDto { refus, manquants?, etat? } — 200 dans les deux cas : `refus` vide = écrite, sinon tous les refus ; 403 sans la main
NoteLe geste d’une personne (`ROUTES_SESSION_SEULE`) : ce qui sort vers d’autres entreprises ne se délègue ni à une clé, ni à un agent, ni à l’assistant. Main : l’auteur, qui l’a publiée en template, un administrateur. Refusée sur un projet en mode aveugle ou « code non recopié hors du projet », pour une adresse seule, une création archivée, sans éditeur sur le serveur. `manquants` : les empreintes que le serveur n’a pas encore — le poste les pousse au relais et réessaie.
POST
/design/diffusions/:id/decision
Owner et Admin session de l’application seulement
L’ÉDITEUR de Nexus valide une création diffusée (elle paraît chez tous les espaces, et remplace la version qu’elle met à jour) ou la refuse (elle ne paraît nulle part ; l’ancienne version reste au catalogue). L’auteur est prévenu.
Corpsdecision (VALIDER | REFUSER), motif?
RéponseDesignDiffusionInfoDto
NoteUn administrateur de l’espace éditeur seulement (403 sinon). 404 : rien n’attend sous cet identifiant.
DELETE
/design/diffusions/:id
session de l’application seulement
Retire une création du catalogue de tous les espaces (la version au catalogue ET celle qui attend). Les copies déjà installées dans d’autres projets restent.
Réponse{ retirees: number }
NoteQui l’a diffusée, un administrateur de son espace, ou l’éditeur (modération). Une diffusion d’un autre espace est introuvable (404) pour tout autre.
POST
/projects/:id/design/copies
Copie une création dans ce projet — depuis un autre projet (« duplique cette création et adapte-la à ce projet ») ou depuis le même. La copie est une création neuve (version 01.00.00) qui désigne les mêmes octets : rien ne voyage.
Corpssource (identifiant de la création), version? (la courante par défaut ; la publiée pour un template), titre?, dossierId? | dossier?
RéponseDesignEcritureDto (201)
NoteLa source se lit sous l’affectation au projet, sauf un template. 403 CONFIDENTIEL : le projet source est marqué « code non recopié hors du projet ». 403 AVEUGLE : un agent ou une clé, source ou destination en mode aveugle. Le lien Figma de la fiche ne suit pas une copie.
GET
/design/:id/partages
Les liens de partage à un tiers d’une création, les plus récents d’abord : état (PRET, ATTENTE, FERME), version partagée, expiration, affichages. Jamais le jeton.
RéponsePartageCreationDto[]
Note`ATTENTE` n’est pas une fermeture : le fichier vit sur un poste qui ne l’a pas encore déposé au relais, et la ligne NOMME qui le porte.
POST
/design/:id/partage
session de l’application seulement
Crée un lien web qui montre la création à un tiers, sans compte (`https://nexus-engine.eu/c/<apercu>#<jeton>`), pour 24 h, 7 jours ou 30 jours.
CorpsdureeH (24 | 168 | 720, 168 par défaut ; null : sans durée, ouvert jusqu’à révocation)
RéponsePartageCreationCreeDto
NoteLe geste d’une personne : ce qui sort de l’entreprise ne se délègue ni à une clé ni à un agent. Le lien n’est rendu qu’ici, une fois ; le serveur n’en garde que l’empreinte. Il fige la version COURANTE. Aucun octet n’est copié : le fichier reste sur les postes, et le relais de passage le garde le temps du lien — 30 jours au plus, ou tant qu’un lien SANS DURÉE vit (échéance glissante). Refusé pour un montage vidéo (exportez le film) et sur un projet en mode aveugle.
POST
/design/:id/partages/suivre
session de l’application seulement
Fait suivre les liens OUVERTS d’une création qui montrent la version `de` vers la version `vers`, plus récente : la page du tiers montre la création telle qu’elle est maintenant, sous le même lien.
Corpsde (numéro de version), vers (numéro de version plus récent)
RéponsePartagesSuivisDto { version, partages[] { id, expiresAt } }
NoteLe geste d’une personne, comme la création du lien. Ni le jeton, ni la durée, ni l’auteur ne changent ; les téléchargements déclarés et la miniature de l’ancienne version sont retirés (l’application redéclare les siens). Aucun lien ouvert sur `de` : liste vide. 403 `AVEUGLE` sur un projet en mode aveugle, 404 pour une version introuvable.
POST
/design/:id/courriel/essai
session de l’application seulement
Envoie À SOI-MÊME l’essai d’un courriel du Studio (une maquette dont la racine porte `data-nexus="courriel"`), pour le voir dans une vraie messagerie. L’objet est marqué « [Essai] ».
Corpshtml (le HTML que l’écran montre, 408 Ko au plus) — aucune adresse : l’essai part à l’adresse PROUVÉE du compte
RéponseEssaiCourrielReponse { ok, adresse, erreur, restants, avertissements[] }
NoteLe geste d’une personne, depuis son application : ni une clé, ni un agent. Douze essais par heure et par personne, comptés au journal des courriels (sorte `STUDIO_ESSAI`). Refus nommés (`refus`) : 400 `PAS_UN_COURRIEL` ou `SCRIPT`, 413 `TROP_LOURD`, 429 `PLAFOND`, 409 `MODE_AVEUGLE` ou `SANS_ADRESSE`. `ok` dit que le relais a PRIS le message, jamais qu’il est arrivé.
DELETE
/design/partages/:id
Révoque un lien de partage d’une création : la page du tiers le dit aussitôt.
RéponsePartageCreationDto
POST
/design/partages/:id/telechargements
session de l’application seulement
Déclare le vrai PDF et le HTML autonome qu’un lien offre au tiers : fabriqués par le poste qui partage, rangés dans son magasin, puis déposés au relais.
Corpstelechargements[] { format (pdf | html), sha256, taille } — un fichier par format, au plus
RéponsePartageCreationDto (avec `telechargements[] { format, nom, taille, sha256, disponible }`)
NoteLe geste d’une personne, comme la création du lien. La déclaration passe AVANT le dépôt : c’est elle qui ouvre le relais à ces empreintes. Un format redéclaré remplace le précédent ; le nom du fichier se compose depuis le titre de la création. 409 sur un lien fermé, 403 `AVEUGLE` sur un projet en mode aveugle, 404 pour un lien d’une autre entreprise.
PUT
/design/partages/:id/apercu
session de l’application seulement
Pose la MINIATURE de l’aperçu riche d’un lien (1200 × 630, PNG ou JPEG, 512 Ko au plus) : l’image que lisent les robots des messageries sur `/c/<apercu>`. Fabriquée par le poste qui partage.
Corpsmime (image/jpeg | image/png), donnees (base64)
RéponsePartageCreationDto (avec `apercu { id, url, image }`)
NoteLe geste d’une personne, comme la création du lien. L’image est jugée sur ses OCTETS : le type annoncé doit être celui qu’ils disent, dimensions entre 200 et 4096 px. Une miniature reposée remplace la précédente. 409 sur un lien fermé ou un lien d’avant l’aperçu (sans identifiant), 403 `AVEUGLE` sur un projet en mode aveugle, 404 pour un lien d’une autre entreprise.
GET
/design/partages/:id/visites
Ce que les tiers ont fait d’un lien de partage : ouvertures, visiteurs, durée, pages vues, clics, téléchargements — et le détail des visites.
RéponseStatistiquesPartageDto
NoteSous la garde de la création (404 ailleurs). Rien n’identifie une personne : appareil en classe, visiteur en empreinte courte.