Identité et espaces
42 routes. Chemins relatifs à https://api.nexus-engine.eu/api/v1.
GET
/me/licence
session de l’application seulement
Ma licence Nexus (par personne, valable dans tous mes espaces) : état calculé, droits, capacité, palier, échéance, paiements, et ce que l'espace courant garde.
RéponseLicenceDto
NoteUn compte dont l'adresse n'est pas prouvée (MemberDto.emailUnproven : un administrateur l'a tapée, ou a fixé le mot de passe) n'est pas servi par la licence de l'adresse : la réponse porte adresseAConfirmer, sans les faits ni les paiements de cette licence, et les gestes /me/licence/* répondent 403 jusqu'au lien reçu dans la boîte (POST /me/adresse/confirmer). La facturation de son propre espace le sert comme tout membre.
POST
/me/licence/souscrire
session de l’application seulement
Ouvre la page de paiement Stripe de ma licence — formule Essentiel (9 € HT/mois, 2 Go, sans palier) ou Pro (30 € HT/mois, 20 Go, palier de stockage), TVA 20 % en sus ; rien n'est servi avant l'encaissement.
Corpspalier (index de PALIERS_STOCKAGE, défaut 0 ; 0 seulement en Essentiel), formule (ESSENTIEL | PRO, défaut PRO)
POST
/me/licence/formule
session de l’application seulement
Change de formule : Essentiel → Pro est facturé tout de suite au prorata ; Pro → Essentiel prend effet au renouvellement (le palier tombe avec).
Corpsformule (ESSENTIEL | PRO)
POST
/me/licence/palier
session de l’application seulement
Change le palier de stockage : une hausse est facturée tout de suite, une baisse prend effet au renouvellement.
POST
/me/licence/portail
session de l’application seulement
Ouvre le portail Stripe (carte, factures, résiliation).
POST
/me/licence/resilier
session de l’application seulement
Résilie ma licence au terme payé (servie jusque-là).
POST
/me/licence/reprendre
session de l’application seulement
Annule une résiliation demandée.
POST
/auth/login
sans authentification
Ouvre une session par cookie (email + mot de passe ; second temps avec totpCode et challenge quand le second facteur est actif).
Corpsemail, password, totpCode, challenge
RéponseMemberDto, ou LoginChallengeDto { needsTotp: true, challenge }
NoteUn client d’API n’en a pas besoin : la clé remplace le cookie.
POST
/auth/accept-invite
sans authentification
Active un compte à partir d’un code d’invitation.
Corpstoken (le code ou le lien reçu), name, password (10 caractères au moins)
RéponseMemberDto
GET
/auth/inscription
sans authentification
L’inscription libre est-elle ouverte sur ce serveur ?
RéponseInscriptionEtatDto { ouverte }
NoteFermée par NEXUS_INSCRIPTION_LIBRE=0 : l’invitation redevient la seule voie, et l’écran ne propose plus « Créer un compte ».
POST
/auth/inscription
sans authentification
Demande la création d’un compte (inscription libre, sans clé ni invitation) : un code à six chiffres part par courriel.
Corpsemail, password (10 caractères au moins), name (facultatif)
RéponseInscriptionDemandeeDto { email, expireDansS } — 202
NoteRien n’est créé à ce temps-là. La réponse est la MÊME que l’adresse ait déjà un compte ou non : c’est le courriel qui le dit, à la seule personne qui le lit. Dix demandes par heure et par adresse IP, cinq codes par heure et par adresse ; une nouvelle demande remplace la précédente. 503 si le courriel n’a pas pu partir (la même phrase dans les deux cas).
POST
/auth/inscription/confirmer
sans authentification
Fait naître le compte avec le code reçu : une entreprise à soi (nom provisoire), le rôle de propriétaire, une session.
Corpsemail, code (6 chiffres)
RéponseMemberDto
NoteLe code vaut quinze minutes, une fois, et cinq essais faux le brûlent. L’adresse PROUVÉE est ce qui rend l’inscription sûre : une identité Nexus se relie par l’adresse. 409 si un compte est né entre-temps pour cette adresse. Le compte reçoit ses premiers pas EN COURS.
POST
/auth/logout
sans authentification
Ferme la session ouverte par cookie (sans effet sur une clé).
POST
/auth/password-reset
sans authentification
Demande un lien de réinitialisation par courriel. Répond toujours 204.
POST
/auth/password-reset/confirm
sans authentification
Choisit un nouveau mot de passe avec le jeton reçu par courriel.
POST
/auth/password-handoff/reveal
sans authentification
Révèle une fois le mot de passe fixé par un administrateur (lien reçu par courriel).
Corpstoken
Réponse{ email, password }
GET
/auth/me
Qui je suis : le membre que la clé ou le cookie représente.
GET
/me/workspaces
Les entreprises où mon adresse a un compte.
RéponseWorkspaceDto[]
NoteLe compte courant, plus les comptes de la même adresse qui sont PROUVÉS : un compte dont l’adresse ou le mot de passe ont été tapés par un administrateur (MemberDto.emailUnproven) ne voit que lui-même, et n’apparaît chez personne. Une clé est liée à UN compte, donc à une entreprise : en changer se fait dans l’application. Le logo n’y est pas — ni en adresse, que la fenêtre ne chargerait pas, ni en octets, qui pèseraient jusqu’à deux méga-octets par espace dans une liste relue à chaque bascule : il se demande ligne par ligne.
GET
/me/invitations
Les invitations qui attendent mon adresse : entreprise, rôle, qui a invité, échéance.
RéponseInvitationRecueDto[]
NoteJamais le code : rejoindre passe par le code reçu par courriel et POST /auth/accept-invite. Seulement ce que cette acceptation accepterait — ouverte, non expirée, entreprise non suspendue, compte invité qui attend encore —, une par entreprise.
GET
/me/workspaces/:memberId/logo
L’image d’avatar d’un de mes espaces (son favicon, sinon son logo blanc), en image intégrée (data:).
Réponse{ dataUrl, source }
NoteLe FAVICON d’abord (10 novembre 2026, « source: favicon ») : l’icône carrée qui dit dans quel espace on est, barre du haut et sélecteur d’espaces ; à défaut le logo blanc (« source: logo »). Même garde que la bascule : mon adresse, et un compte actif. La fenêtre de Nexus tourne sous « img-src 'self' data: » et refuse en silence toute image distante — d’où les octets. La variante BLANCHE, et elle seule : cette fenêtre est sombre, et on ne se rabat jamais sur le logo noir, qui n’y serait qu’un rectangle vide. « dataUrl: null » quand l’entreprise n’a pas de logo blanc — ce n’est pas une erreur, l’écran écrit ses initiales.
POST
/me/workspaces/:memberId
session de l’application seulement
Bascule la session vers un autre de mes espaces.
CorpstotpCode, challenge (si le compte visé porte un second facteur)
RéponseMemberDto
Note404 quand le compte visé n’est pas la même personne : autre adresse, ou adresse non prouvée de part ou d’autre (changée ou mot de passe fixé par un administrateur, tant que la boîte n’a pas répondu).
POST
/me/adresse/confirmer
session de l’application seulement
Envoie à l’adresse du compte courant le lien qui la prouve (sept jours) : la personne y choisit un mot de passe que personne d’autre ne connaît, et le compte rejoint ses autres espaces.
Réponse202 { courriel: envoye | non-envoye } ; 204 si l’adresse est déjà prouvée
GET
/me/portails
session de l’application seulement
Les portails clients que des agences ont ouverts à MON adresse, à ouvrir depuis Nexus sans second mot de passe (vide quand l’adresse a été changée par un administrateur et n’est pas reprouvée).
POST
/me/portails/:contactId/passage
session de l’application seulement
Remet un passage à usage unique (deux minutes) vers un de mes portails clients ; la fenêtre du portail l’échange par POST /portail/passage. 404 pour tout portail qui n’est pas à mon adresse.
POST
/me/workspaces
session de l’application seulement
Crée une entreprise neuve dont je suis le propriétaire.
Corpsname
RéponseMemberDto
GET
/me/premiers-pas
Mes premiers pas : la progression du parcours guidé d’un compte neuf.
RéponsePremiersPasDto { premiersPas }
Note`premiersPas: null` pour tout compte d’avant ce parcours : on ne l’impose pas à un compte déjà actif.
PUT
/me/premiers-pas
Écrit ma progression (étape, écrans faits ou reportés, premier projet).
Corpsetat (EN_COURS | TERMINE), etape (OUTILS | QUESTION | PERIMETRE | ANALYSE | PLAN | MISE_EN_PLACE, ou ESPACE | CODE | PROJET pour une application d’avant), faites[], reportees[], projetId, visiteBureau (A_VOIR | VUE, facultatif)
RéponsePremiersPasDto
NoteLa version et les dates sont posées par le serveur. Un projet d’une autre entreprise est simplement oublié.
POST
/me/mise-en-place/connus
session de l’application seulement
Ce que l’espace connaît déjà de ce que le poste a trouvé : les dépôts portés par un projet de l’entreprise qui ne m’est pas confié, et mes discussions déjà dans Nexus.
Corpsdepots[] (1 000 au plus), discussions[] : { engine, id } (5 000 au plus)
RéponseConnusDto { depotsNonConfies[], discussions[] : { engine, id, projetId, projetNom } }
NoteUne lecture, mais réservée à une session : pour un agent ou une clé, ce serait un oracle sur les dépôts de l’entreprise. Un projet qui ne m’est pas confié n’est jamais nommé (`projetNom: null`, et pas même listé pour un dépôt).
DELETE
/me/mise-en-place/projets/:id
session de l’application seulement
Défait une mise en place : retire un projet qui n’a reçu aucun travail, hors les discussions que je viens d’y importer.
Réponse{ ok, discussions, sitesConserves, secretsATourner }
Note409 `TRAVAIL` dès qu’il y a autre chose : une tâche, une création, une discussion d’un collègue, une discussion conduite ici ou reprise. Un développeur n’efface pas un projet partagé (403 `ROLE`).
GET
/me/totp
session de l’application seulement
État du second facteur de mon compte.
POST
/me/totp/enroll
session de l’application seulement
Commence l’enrôlement du second facteur (graine et codes de secours, montrés une fois).
POST
/me/totp/confirm
session de l’application seulement
Active le second facteur avec un premier code valide.
Corpscode (6 chiffres)
RéponseTotpStateDto
POST
/me/totp/disable
session de l’application seulement
Désactive le second facteur, contre le mot de passe.
Corpspassword
RéponseTotpStateDto
GET
/me/devices
session de l’application seulement
Mes sessions ouvertes (appareils).
DELETE
/me/devices/:id
session de l’application seulement
Ferme une session ouverte.
POST
/me/devices/revoke-all
session de l’application seulement
Ferme toutes mes sessions sauf celle-ci.
POST
/postes/annonce
application de bureau seulement
Le poste signale qu’il est allumé, et ce qui y tourne.
Corpsversion, nom (nom d’hôte de la machine), pilotable, projetsOuverts (liste), sessions (liste)
NoteAppelée toutes les 25 s par l’application de bureau. Rien n’est persisté : le registre vit en mémoire et s’oublie après 80 s sans annonce. Le nom d’hôte annoncé devient le libellé du poste ; sans lui, « Nexus <version> sur <système> » (en-tête x-nexus-plateforme).
GET
/postes
session de l’application seulement
Mes machines reliées, et les sessions d’agent qui y tournent.
RéponsePosteDto[]
NoteJamais par clé d’API. Un agent du poste (l’assistant, un agent de projet) la lit sans clic (7 novembre 2026), comme il envoie l’ordre : elle ne rend que les machines de la personne.
POST
/postes/:deviceId/ordre
session de l’application seulement
Fait exécuter un ordre par une de mes machines (télécommande).
Corpscanal (liste blanche CANAUX_DISTANTS), projectId, charge
Réponse{ ok, resultat }
NoteLe relais attend la réponse du poste (20 s max) et la rend telle quelle. Jamais par clé d’API : une clé lit des données, elle ne conduit pas une machine. Un agent du poste (l’assistant, un agent de projet) peut l’envoyer à un de MES postes, sans clic (6 novembre 2026) : la route ne joint que les appareils de la personne. Un poste éteint refuse tout de suite plutôt que de mettre en file.
POST
/postes/reponse
application de bureau seulement
Le poste rend le résultat d’un ordre.
CorpsordreId, ok, resultat, erreur
GET
/projects/:id/postes
session de l’application seulement
Les machines allumées des membres de ce projet, et celles qui partagent leur dossier.
RéponsePosteDuProjetDto[]
NoteAucune ne dit où vivent ses dossiers. Un poste qui refuse le partage y figure avec partage: false, pour que son absence ne se lise pas « cette personne n’est pas connectée ».
POST
/projects/:id/postes/:deviceId/ordre
session de l’application seulement
Lit ou écrit le dossier de ce projet sur la machine d’un membre du projet.
Corpscanal (liste blanche CANAUX_POSTE_PROJET : fsx:* et les lectures du dépôt), charge
Réponse{ ok, resultat }
NoteJamais l’agent du poste visé (C4) : il tourne sur le compte Claude de son propriétaire. La racine est écrasée par nexus-poste://<appareil> et remplacée par le poste lui-même — un ordre ne nomme jamais un dossier (C2). Ni clé d’API, ni agent.