Aller au contenu

Public

82 routes. Chemins relatifs à https://api.nexus-engine.eu/api/v1.

POST /licence/stripe sans authentification

La notification signée de Stripe (encaissement, échec, résiliation, remboursement). S'authentifie par la signature ; idempotente.

POST /ventes/stripe sans authentification

La notification signée de Stripe CONNECT (événements des comptes connectés : paiement, abonnement, facture, remboursement, litige, compte mis à jour). Son propre secret ; idempotente ; 503 tant que la vente n'est pas activée.

GET /relais/:fournisseur/* sans authentification

Le relais des modèles en lecture : une requête GET du binaire (liste des modèles…) recopiée telle quelle chez le fournisseur.

RéponseLa réponse du fournisseur, telle quelle.
NoteMêmes règles que le POST : jeton de relais en porteur, chemins relayés seulement, rien de gardé. Seules GET et POST sont ouvertes sur cette route.
POST /relais/:fournisseur/* sans authentification

Le relais des modèles (D24) : le binaire officiel d’une session en mode crédits y envoie ses requêtes, et Nexus les transmet au fournisseur avec SA clé.

CorpsLe corps de la requête du binaire, tel quel (JSON Anthropic ou OpenAI).
RéponseLa réponse du fournisseur, telle quelle (flux SSE compris).
NoteGET et POST seulement (POST pour les requêtes au modèle, GET recopié tel quel). Authentifié par le JETON de relais en porteur (`Authorization: Bearer`), jamais un cookie. Chemins transmis : `/v1/messages` et `/v1/messages/count_tokens` (anthropic), `/v1/responses` et `/v1/chat/completions` (openai)… Une requête qui paie est RÉSERVÉE au contexte envoyé plus le plafond de sortie, DÉBITÉE au décompte rendu par le fournisseur, RENDUE sur un échec. Refus dans la forme du binaire : 401 `JETON_INVALIDE`, 400 `MODELE_INCONNU` / `SOLDE_INSUFFISANT`, 404 `CHEMIN_INCONNU`, 503 `FOURNISSEUR_INDISPONIBLE` (pas de clé, ou réserve prépayée insuffisante — D18), 429 par jeton. Le relais ne garde AUCUN contenu : des totaux sur le jeton.
GET /health sans authentification

Santé du service : base, sauvegarde, clé de chiffrement. Hors plafond de débit.

RéponseHealthDto
GET /mail/o/:id/:sig sans authentification

Le pixel d’ouverture d’un courriel : rend TOUJOURS une image GIF d’un pixel, et date la première ouverture si la signature (HMAC) est bonne. Ne stocke ni adresse IP ni user-agent.

NotePublic par nécessité : un client de messagerie va chercher l’image sans cookie, comme le logo. Signature fausse ou identifiant inconnu : la même image, rien d’écrit — qui sonde n’apprend rien.
GET /mail/c/:id/:position/:sig sans authentification

Le lien suivi d’un courriel d’application (suivi demandé à l’envoi) : compte le clic et redirige (302) vers l’adresse `u`, couverte par la signature (HMAC du message, de la position et de l’adresse). Ne stocke ni adresse IP ni user-agent.

NoteJamais un redirecteur ouvert : une adresse changée, une signature d’un autre lien ou du pixel, un schéma autre que http(s) → 400 et une page qui le dit, aucune redirection.
POST /lien-tiers sans authentification

L’enveloppe d’un accès partagé à un tiers : qui partage quoi, jusqu’à quand — rien qui serve à entrer. Ne compte ni n’écrit rien.

Corpsjeton
RéponsePartageTiersEnveloppeDto
NoteLe jeton voyage dans le corps, jamais dans l’adresse. 404 pour un jeton inconnu ; 410 avec `code` (EXPIRE, REVOQUE, ACCES_MODIFIE, ACCES_RETIRE) pour un lien qui ne vaut plus. Plafond par adresse.
POST /lien-tiers/consulter sans authentification

Le contenu d’un accès partagé à un tiers (adresse, identifiant, secret) : le clic « Afficher » de la page, compté et journalisé.

Corpsjeton
RéponsePartageTiersContenuDto
NoteMêmes refus que l’enveloppe. Chaque consultation va au journal de l’entreprise (acteur « Tiers », adresse IP comprise). Les notes de l’accès ne partent que si le partage les a jointes.
GET /lien-creation/page/:apercu sans authentification

La page publique d’un lien de partage à aperçu riche (`/c/<apercu>#<jeton>`, que nginx confie à cette route) : `site/c.html` avec le titre de la création, une phrase sobre et sa miniature dans les balises Open Graph et Twitter. Ne compte ni n’écrit rien.

Réponsetext/html (la page, qui lit son jeton dans le fragment comme `/c`)
NoteL’identifiant d’aperçu, dans le CHEMIN, ne donne que le titre, la phrase et la miniature, et seulement pour un lien ouvert : révoqué, expiré, fermé, projet en mode aveugle, ou identifiant inconnu rendent la page TELLE QUELLE (aperçu générique), même octet, même temps plancher. Le jeton reste dans le fragment. Pas d’`og:url` : il ne pourrait pas porter le jeton, et certaines messageries y enverraient le clic. 503 quand `c.html` est introuvable (`NEXUS_SITE_RACINE`) : nginx sert alors la page statique. `Cache-Control: private, max-age=300`.
GET /lien-creation/apercu/:apercu/image sans authentification

La miniature de l’aperçu riche d’un lien de partage OUVERT — l’`og:image` de sa page.

Réponseimage/jpeg ou image/png
Note404 pour un lien fermé, inconnu, sans miniature, ou d’un projet en mode aveugle. `X-Content-Type-Options: nosniff`, `Content-Security-Policy: sandbox`, `Cross-Origin-Resource-Policy: cross-origin`. Ni compteur ni journal. Plafond de 120 lectures par minute et par adresse.
POST /lien-creation sans authentification

L’enveloppe d’une création partagée à un tiers : qui partage quoi, jusqu’à quand, et comment la page saura l’afficher. Ne compte ni n’écrit rien.

Corpsjeton
RéponsePartageCreationEnveloppeDto
NoteLe jeton voyage dans le corps, jamais dans l’adresse. 404 pour un jeton inconnu ; 410 avec `code` (EXPIRE, REVOQUE, CREATION_RETIREE, AUTEUR_RETIRE) ; 503 `ATTENTE` quand le fichier n’est pas encore déposé au relais — le lien reste valable, il faut revenir. Plafond par adresse.
POST /lien-creation/consulter sans authentification

Le clic « Afficher » de la page : compté, journalisé, et il rend l’adresse SIGNÉE des octets et des pièces, valable douze heures.

Corpsjeton
RéponsePartageCreationContenuDto
NoteMêmes refus que l’enveloppe. Chaque affichage va au journal de l’entreprise (acteur « Tiers », adresse IP comprise). Le ticket n’ouvre que CE lien, et le jeton ne traverse jamais une adresse.
POST /lien-creation/deverrouiller sans authentification

Entrer dans un lien de partage protégé par un mot de passe : rend une preuve signée, jamais la création.

Corpsjeton, motDePasse
RéponseAccesPartageDto
NoteLa preuve (douze heures, jamais au-delà de la fin du lien) se remet ensuite dans l’en-tête `x-nexus-acces-partage`. 401 `MOT_DE_PASSE_FAUX` ; 429 `TROP_D_ESSAIS` après cinq essais faux sur CE lien, pour un quart d’heure, quelle que soit l’adresse IP. Sans preuve, l’enveloppe, la consultation et les commentaires d’un lien protégé répondent 401 `MOT_DE_PASSE_REQUIS` ou `ADRESSE_REQUISE`.
POST /lien-creation/code sans authentification

Demander le code à six chiffres d’un lien de partage réservé à des adresses ou à des domaines.

Corpsjeton, adresse
Réponse{ message }
NoteToujours 202 avec le même message, que l’adresse soit sur la liste ou non : la page n’est pas un annuaire. Le code vaut quinze minutes, cinq essais ; cinq codes par heure et par adresse, trente par heure et par lien.
POST /lien-creation/verifier sans authentification

Échanger le code reçu par courriel contre la preuve d’entrée d’un lien réservé.

Corpsjeton, adresse, code
RéponseAccesPartageDto
Note401 `CODE_INVALIDE` pour tout échec (adresse hors liste, code faux, expiré, déjà employé). L’adresse confirmée est notée sur chaque visite du lien, et la personne qui partage la voit.
GET /lien-creation/octets/:ticket sans authentification

Les octets d’une création partagée, par plages (`Range`) : c’est ce qu’une balise `<video>` ou `<img>` va chercher.

Réponseles octets (206 pour une plage, 416 hors du fichier)
NoteLe ticket est signé (HMAC) et expire en douze heures — jamais après la fin du lien ; il doit couvrir la LECTURE d’un document composé une fois, dont les images « lazy » ne partent que lorsqu’on descend. Le lien est REVALIDÉ à chaque lecture — révoqué entre l’affichage et la lecture, il cesse de servir. La réponse porte toujours `Content-Security-Policy: sandbox` et `X-Content-Type-Options: nosniff` ; un type hors de la liste servie en ligne part en `application/octet-stream`, en pièce jointe.
GET /lien-creation/piece/:ticket/* sans authentification

Un fichier posé à côté de la création partagée (une photo, une police, un son), par son NOM : ce que la page va chercher pour les images voisines d’une maquette. Le même ticket que les octets.

Réponseles octets de la pièce (206 pour une plage, 416 hors du fichier, 404 pour un nom que la version ne porte pas)
NoteLe dernier segment de l’adresse est le nom (`images/hero.jpg` désigne `hero.jpg`), retrouvé à la casse et à la forme Unicode près. Liste FERMÉE de types servis en ligne (images, vidéos, sons, polices) : un script ou une feuille part en `application/octet-stream` sous `nosniff`, jamais servi comme tel depuis l’origine du site. CORS ouvert (une police se charge en mode CORS, le document isolé est une origine opaque), `Content-Security-Policy: sandbox`, aucun cookie lu. Plafond de 600 lectures par minute et par adresse.
GET /lien-creation/telechargement/:ticket/:format sans authentification

Le vrai PDF (`pdf`) ou le HTML autonome (`html`) d’une création partagée, que le poste qui a partagé a fabriqués : le téléchargement direct de la page du tiers. Le même ticket que les octets.

Réponsele fichier, TOUJOURS en pièce jointe (`Content-Disposition: attachment`, au nom de la création)
NoteLe lien est REVALIDÉ à chaque appel. `application/pdf` ou `text/html`, jamais rendu depuis l’origine du site : pièce jointe, `Content-Security-Policy: sandbox`, `X-Content-Type-Options: nosniff`. 404 pour un format que le lien ne déclare pas ; 503 `ATTENTE` quand le fichier n’est pas au relais — il est alors réclamé au poste qui le porte. Plafond de 60 lectures par minute et par adresse.
GET /cookies/:fichier sans authentification

Le script de consentement d’un site (Cookie By Nexus) : `/cookies/<cle>.js`, à poser en tête du <head>, avant tout autre script. Consent Mode v2 par défaut refusé, bandeau, blocage des scripts tiers non consentis.

Requêteapercu=1 (affiche toujours le bandeau, n’écrit rien, ne garde aucune preuve)
Réponsetext/javascript
NoteAucun cookie posé par la réponse, aucune visite journalisée. `Cache-Control: public, max-age=300, stale-while-revalidate` et ETag ; `Cross-Origin-Resource-Policy: cross-origin`. Un site qui déclare une autre solution reçoit un script muet. Plafond par adresse.
POST /cookies/:cle/preuve sans authentification

La preuve d’un choix de consentement, déposée par le navigateur du visiteur.

Corpsen text/plain, du JSON : id (tiré au sort par le navigateur), version, geste (accepter-tout, refuser-tout, personnaliser), choix (mesure, publicite, fonctionnel, personnalisation)
Réponse204
NoteSchéma strict : un champ de plus (page, adresse) est refusé. Rien n’est gardé si le site a coupé les preuves ; au-delà de 50 000 par jour et par site, la preuve du jour n’est plus écrite. Plafond par adresse.
GET /cookies/:cle/apercu sans authentification

Une page d’aperçu du bandeau d’un site, sous une politique de contenu stricte : rien n’est enregistré.

Réponsetext/html
NoteSert aussi de preuve que le bandeau tient sous un CSP sans `unsafe-inline`.
POST /lien-import sans authentification

L’enveloppe d’un lien de DÉPÔT : ce qu’on demande au tiers, ce qu’il a déjà déposé par ce lien, et ce qui lui reste (fichiers, octets).

Corpsjeton, cle? (la clé du navigateur : elle dit lesquels sont « les miens »)
RéponseImportTiersDto
NoteLe jeton voyage dans le corps, jamais dans l’adresse. 404 pour un jeton inconnu ; 410 avec `code` (EXPIRE, REVOQUE, DOSSIER_RETIRE, AUTEUR_RETIRE). Le lien ne montre QUE ce qui est venu par lui : jamais le reste du dossier. Plafond par adresse.
POST /lien-import/dossier sans authentification

Crée un sous-dossier par un lien de dépôt, à la racine partagée ou dans un dossier déjà créé par ce lien.

Corpsjeton, prenom, nom, dansId?, cle
RéponseDossierImporteDto
NoteMêmes refus que l’enveloppe, plus 409 `PROFONDEUR` au-delà de la profondeur du Studio. `dansId` doit désigner un dossier venu de CE lien : un identifiant d’ailleurs est « introuvable », jamais « refusé ». Plafond par adresse.
POST /lien-import/deposer sans authentification

Dépose un fichier par un lien de dépôt. Il devient une création du dossier, gardée par le serveur.

Corpsjeton, prenom, nomFichier, dataBase64, dansId?, cle
Réponse{ fichier: FichierImporteDto, fichiers, octets } — ce que le lien a reçu en tout
NoteLe MÊME contrôle que pour un membre (nom de secret, exécutable, signature, SVG actif, poids) : jamais une seconde règle ici. 409 `PLAFOND_FICHIERS` / `PLAFOND_OCTETS` quand le lien est plein — les deux restes sont DITS dans chaque réponse, avant le geste. Les octets sont RETENUS par le serveur dès l’arrivée : personne d’autre ne les porte. Si le quota de l’entreprise refuse, le dépôt est DÉFAIT et la réponse est 507 `ESPACE` — un code à part de `FICHIER`, parce qu’un disque plein refusera aussi les fichiers suivants : recevoir un travail puis en perdre la seule copie serait le pire des deux refus. Plafond par adresse.
POST /lien-import/retirer sans authentification

Retire un fichier que CETTE personne vient de déposer — celui qu’on a envoyé par erreur.

Corpsjeton, id, cle
Réponse{ retire: true }
NoteLa clé du navigateur prouve, jamais le prénom : on ne retire que ce qu’on a déposé soi-même, et seulement ce qui est venu par ce lien. Le fichier d’un autre est « introuvable ». Plafond par adresse.
POST /lien-transfert sans authentification

L’enveloppe d’un lien de Transfert (`/t#<jeton>`) : entreprise, échéance, et — lien ouvert ou adresse confirmée — titre, message, expéditeur, première page des fichiers avec leur disponibilité. Ne compte ni n’écrit rien.

Corpsjeton, session?
RéponseEnveloppeTransfertDto
NoteLe jeton (24 caractères) voyage dans le corps, jamais dans l’adresse. Jeton inconnu, mal formé, transfert supprimé ou projet en mode aveugle : le MÊME 404. 410 `EXPIRE`, `REVOQUE` ou `EPUISE` pour un lien qui a existé. Partage vérifié sans session : `verification: REQUISE` et AUCUN contenu, pas même le titre. Jamais la liste des destinataires. `no-store`, `no-referrer`. Plafond par adresse.
POST /lien-transfert/fichiers sans authentification

La page suivante des entrées d’un lien de Transfert (500 par page), avec la disponibilité de chacune.

Corpsjeton, session?, curseur?
RéponsePageDto<FichierPublicDto>
NoteMêmes refus que l’enveloppe ; 401 `VERIFICATION_REQUISE` pour un partage vérifié sans session valide. Plafond par adresse.
POST /lien-transfert/visite sans authentification

La page d’un lien de Transfert s’est ouverte et une personne s’en sert : la page le dit sur un GESTE (un clic, une touche), jamais à l’affichage. Écrit un fait VISITE.

Corpsjeton, session?
Réponse202 { notee: true } — la même réponse, notée ou déjà notée
NoteUn fait distinct du téléchargement commencé et du reçu, et jamais une preuve de lecture. Le même appelant (la session d’un destinataire vérifié, sinon une empreinte liée au partage et à l’adresse — jamais l’adresse en clair) ne réécrit pas une visite avant 30 minutes. Mêmes refus que l’enveloppe ; 401 `VERIFICATION_REQUISE` pour un partage vérifié sans session. `no-store`, `no-referrer`. Plafond par adresse.
POST /lien-transfert/code sans authentification

Demande un code à six chiffres pour une adresse d’un partage vérifié : il part par courriel, vaut un quart d’heure, et seul le dernier demandé vaut.

Corpsjeton, adresse
Réponse202 { demande: true, message } — TOUJOURS la même réponse
NoteAnti-énumération : la réponse, son statut et son délai sont les mêmes que l’adresse fasse partie des destinataires ou non, et que le plafond soit atteint ou non (3 codes par heure et par adresse, 20 par partage — compteurs en base). Le courriel part sans être attendu. 409 `ETAT` (raison `VERIFICATION_INUTILE`) pour un lien ouvert. Plafond par adresse IP.
POST /lien-transfert/verifier sans authentification

Échange le code contre une SESSION de partage (2 h au plus, jamais au-delà du lien) — un jeton court, lié à CE partage, qui n’est pas un compte.

Corpsjeton, adresse, code
RéponseSessionTiersDto { session, expiresAt }
NoteUn seul refus, 400 `CODE_INVALIDE`, quelle que soit la cause (adresse inconnue, code faux, expiré, brûlé, déjà servi). Cinq essais faux brûlent le code. La session voyage dans le corps des appels suivants, jamais dans un cookie, et aucune route interne ne l’accepte. Plafond par adresse.
POST /lien-transfert/telecharger sans authentification

Autorise la lecture d’un lot de fichiers (1 à 100) : une URL signée par fichier, 5 minutes, UN objet, en pièce jointe — émise après relecture du lien, du transfert, de la session et de l’état du fichier.

Corpsjeton, session?, fichiers: string[]
RéponseAutorisationsDto { lectures: [{ fichier, url, expireA, nom, taille, sha256 }], refus: [{ fichier, code, raison? }] }
NoteCompte un « téléchargement commencé » par fichier — jamais une preuve de lecture ; une lecture redemandée par le même appelant dans les 10 minutes (reprise, Range, double clic) ne compte pas deux fois. Un fichier non publié, en analyse, non analysé ou infecté est refusé UN PAR UN. `maxTelechargements` borne les lectures de fichier commencées ; au-delà : `EPUISE`, sauf la REPRISE, dans les 10 minutes, de ce que le même appelant avait commencé. Les URL ne sont jamais journalisées. Plafond par adresse.
POST /lien-transfert/archive sans authentification

Demande l’archive ZIP de tout l’envoi (ou d’une sélection de 1 à 1 000 fichiers), ou en SUIT la préparation (`archive`). Rien n’est fabriqué par l’API : un worker à part écrit l’archive en flux dans le stockage.

Corpsjeton, session?, fichiers?: string[] | archive?: string
RéponseArchiveTransfertDto { id, etat: PREPARATION | PRETE | IMPOSSIBLE, raison, nom, fichiers, dossiers, exclus, octets, taille, fait, expireA }
NoteUne archive par CONTENU : deux demandes du même ensemble de fichiers n’en font qu’une (et qu’un travail). Seuls les fichiers diffusables y entrent ; `exclus` dit combien n’y sont pas. Au-delà de 20 000 entrées ou de 50 Go, ou quand le quota des archives de l’entreprise est plein : `IMPOSSIBLE`, et les fichiers se téléchargent un par un. Une archive vit 24 h après sa dernière demande, jamais au-delà du transfert. Mêmes refus que l’enveloppe ; 401 pour un partage vérifié sans session. Plafond par adresse.
POST /lien-transfert/historique sans authentification

L’HISTORIQUE de ce lien pour son destinataire (lot 20) : quand il a été créé et l’envoi publié, son adresse confirmée, et ce que CET appelant a fait — page ouverte, téléchargement commencé, réception confirmée.

Corpsjeton, session?
RéponseHistoriqueTiersDto { lignes[], niveau, expireA, limites[] }
NoteJamais ce qu’un autre destinataire du même lien a fait, jamais le détail d’un fait ni le nom d’un membre. Lecture seule : rien n’est écrit. Un lien révoqué ou échu ne le rend plus. Plafond par adresse ; `no-store`.
POST /lien-transfert/apercu sans authentification

L’APERÇU d’un fichier (lot 19) : le demande, ou en SUIT la préparation. Images (JPEG, PNG, GIF, WebP, AVIF, TIFF), PDF (les 3 premières pages en images), textes (les 64 premiers Kio) ; tout autre format : `IMPOSSIBLE FORMAT_NON_PRIS_EN_CHARGE`, et le téléchargement.

Corpsjeton, session?, fichier
RéponseApercuDto { fichier, etat: PREPARATION | PRET | IMPOSSIBLE, genre, raison, pages: [{ url, largeur, hauteur }] | null, pagesTotal, texte: { url, octets, tronque, encodage } | null, expireA }
NoteUn dérivé RÉ-ENCODÉ par un worker à part (WebP, texte), jamais le fichier : aucun script ni lien du document n’y survit. Mêmes contrôles que le téléchargement (lien rejugé, code exigé, révoqué, échu, épuisé) ; rien n’est compté. Les adresses (cinq minutes, en pièce jointe, `image/webp` ou `text/plain`) lisent le stockage, jamais l’API. Envoi confidentiel : `IMPOSSIBLE CONFIDENTIEL` (le serveur ne déchiffre pas). Plafond par adresse.
POST /lien-transfert/archive/telecharger sans authentification

L’adresse signée d’une archive PRÊTE : cinq minutes, en pièce jointe, téléchargée directement depuis le stockage.

Corpsjeton, session?, archive
RéponseLectureArchiveDto { archive, url, expireA, nom, taille }
NoteCompte UN « téléchargement commencé » (détail : l’archive et son nombre de fichiers), une fois par appelant dans les 10 minutes ; le plafond de téléchargements du lien compte une archive comme UN téléchargement. Une archive pas prête ou échue : 409 `ETAT`. Les fichiers reçus dans l’archive se confirment ensuite par `/lien-transfert/recu`. L’URL n’est jamais journalisée. Plafond par adresse.
POST /lien-transfert/recu sans authentification

Le destinataire confirme qu’il a reçu un lot de fichiers INTACTS : l’empreinte qu’il a relue est celle que Nexus a vérifiée.

Corpsjeton, session?, recus: [{ fichier, sha256 }]
Réponse{ confirmes, refus }
NoteUne déclaration, jamais une preuve de lecture. Acceptée seulement pour un fichier dont CE lien a autorisé la lecture ; une empreinte différente : `INCOHERENT` (le fichier reçu est abîmé). Accepté sur un lien épuisé (le dernier téléchargement l’a épuisé). Rejouée : écrite une fois. Plafond par adresse.
POST /lien-transfert/direct sans authentification

Lot 18 — le tiers demande le DIRECT pour UN fichier : le recevoir du poste de l’émetteur (WebRTC) plutôt que du stockage, quand le serveur, l’entreprise et le fichier le permettent.

Corpsjeton, session?, fichier
Réponse{ direct: SessionDirectDto | null, raison: RefusDirect | null, lecture, refus }
NoteL’autorisation de lecture est prise ICI (un téléchargement compté une fois) et `lecture` est l’adresse signée du REPLI vers le stockage : le repli ne compte rien de plus. `direct: null` n’est pas une erreur : `raison` dit pourquoi (DESACTIVE, DESACTIVE_ENTREPRISE, TIERS_INTERDIT, CONFIDENTIEL, PAS_PRET, TROP_GROS, SANS_POSTE, POSTE_HORS_LIGNE, PLAFOND). Seulement pour un fichier au stockage, analysé SAIN et dont l’empreinte a été relue. Plafond par adresse.
POST /lien-transfert/direct/signal sans authentification

Lot 18 — un message de la négociation (offre, candidat, connecté, fin) vers le poste de l’émetteur.

Corpsjeton, session?, direct, signal: { sorte, sdp?, candidat?, raison? }
Réponse{ livre }
NoteLe lien est revalidé à chaque appel ; une session d’un autre lien est INTROUVABLE. Aucun octet de fichier ne passe ici. Plafond par adresse.
POST /lien-transfert/direct/attente sans authentification

Lot 18 — la requête LONGUE du tiers : les messages que le poste lui destine, après le numéro `apres`.

Corpsjeton, session?, direct, apres
Réponse{ signaux: [{ n, signal }], close }
NoteAttend 20 s au plus. Une session fermée ou échue rend `close` : la page bascule vers le stockage.
POST /lien-transfert/direct/issue sans authentification

Lot 18 — le tiers déclare l’issue : par quelle voie le fichier est arrivé, combien d’octets par chacune, en combien de temps — la mesure comparative.

Corpsjeton, session?, direct, issue: { issue, octetsDirect, octetsStockage, dureeDirectMs, dureeStockageMs, candidat, raison? }
Réponse{ ok }
NoteÉcrit le fait DIRECT (jamais une adresse réseau) et ferme la session.
POST /lien-depot sans authentification

L’enveloppe d’un lien de DÉPÔT (lot 10) : la demande, ses règles utiles et — avec la clé du navigateur — SES dépôts.

Corpsjeton, session?, cle?
RéponseEnveloppeDepotDto { verification, entreprise, expiresAt, etat, contenu }
NoteJamais les autres déposants, leurs fichiers ni la place qui reste. Collecte FERMÉE : relisible (le reçu) ; lien révoqué ou échu : 410. Ne compte ni n’écrit rien.
POST /lien-depot/deposer sans authentification

Déclare 1 à 100 fichiers : chacun jugé SEUL, sa place RÉSERVÉE avant le premier octet.

Corpsjeton, session?, cle (43 caractères base64url), nom?, entrees: [{ chemin, taille, mime?, sha256? }]
RéponseDeclarationDto { deposant, entrees: [{ index, fichier, repris, renomme, refus }] }
NoteLe premier dépôt crée le DÉPOSANT, rangé sous `Nom déclaré (D-XXXXXX)`. Même chemin et même taille : REPRIS, jamais dupliqué ; autre contenu au même nom : « (2) ». Refus par entrée : `CHEMIN_REFUSE`, `TYPE_REFUSE`, `TROP_GROS`, `CAPACITE`, `QUOTA`. Collecte fermée : 410 `FERME`.
POST /lien-depot/envoi sans authentification

Ouvre (ou reprend) l’envoi d’UN fichier de ce déposant : taille de partie, nombre de parties.

Corpsjeton, session?, cle, fichier
RéponseEnvoiOuvert { taille, taillePartie, nombreParties, vide?, finalise? }
NoteUn fichier d’un AUTRE déposant, ou inventé : le MÊME 404 `INTROUVABLE`. Même moteur que l’envoi d’un membre (lot 04). Aucun octet ne passe par cette route.
POST /lien-depot/etat sans authentification

Les parties que le stockage a DÉJÀ reçues pour un fichier de ce déposant : la reprise n’envoie que les autres.

Corpsjeton, session?, cle, fichier
Réponse{ parties: [{ numero, taille }] }
NoteRelu au stockage, jamais déduit. Plafond par adresse.
POST /lien-depot/parties sans authentification

Signe un lot de parties (1 à 100) d’un fichier de ce déposant : URL d’ÉCRITURE de courte durée, à la taille EXACTE de chaque partie.

Corpsjeton, session?, cle, fichier, numeros: number[]
Réponse{ parties: PartieSigneeEnvoi[] }
NoteAucune URL de LECTURE n’est jamais rendue à un déposant. Les URL signées ne sont jamais journalisées. `no-store`. Plafond par adresse.
POST /lien-depot/finaliser sans authentification

Le fichier est complet : Nexus le relit au stockage, le met en quarantaine et en demande l’analyse.

Corpsjeton, session?, cle, fichier, sha256? (calculée par le navigateur — une déclaration)
Réponse{ deja, fichier: FichierDeposeDto }
NoteRejouée : `deja`. L’arrivée RÉELLE (finalisé ET jugé) est annoncée au demandeur (`TRANSFER_DEPOSIT`), au plus une fois par déposant et par quart d’heure.
POST /lien-depot/abandonner sans authentification

Abandonne l’envoi en cours d’un fichier de ce déposant (le fichier reste déclaré : un nouvel envoi repart de zéro).

Corpsjeton, session?, cle, fichier
Réponse{ abandonne }
NoteSert quand le navigateur constate que le fichier choisi n’est plus celui qu’il envoyait. Plafond par adresse.
POST /lien-depot/retirer sans authentification

Retire un fichier de ce déposant d’une collecte OUVERTE : effacé du stockage, sa place rendue.

Corpsjeton, session?, cle, fichier
Réponse{ retire: true }
NoteSeulement SES fichiers (404 sinon). Collecte fermée : 410 `FERME`. Plafond par adresse.
POST /lien-creation/commentaires sans authentification

Les commentaires posés par CE lien — jamais ceux d’un autre lien de la même création : prénom, texte, ce qu’ils désignent, et s’ils sont résolus.

Corpsjeton, cle? (la clé du navigateur : elle dit lesquels sont « les miens »)
RéponseCommentairesPublicsDto { commentaires }
NoteMêmes refus que l’enveloppe. Plafond par adresse.
POST /lien-creation/commenter sans authentification

Un tiers commente la création qu’un lien lui montre : son prénom (une fois, gardé par son navigateur), son texte, et ce qu’il désigne — une zone d’image, un instant de vidéo, un élément de page, ou la création entière.

Corpsjeton, prenom, texte, ancre (image | video | son | page | general), cle (32 caractères tirés au sort par la page)
RéponseCommentairePublicDto (201)
NoteLe lien est rejoué : on ne commente que ce qu’un lien VIVANT montre. 300 commentaires par lien au plus (409 TROP). Le texte est nettoyé (caractères de contrôle, marques de direction). La personne qui a partagé le lien est prévenue au premier commentaire d’un fil, pas à chacun. La clé n’est gardée qu’en empreinte ; elle seule permet de retirer le commentaire. Journalisé chez l’entreprise, adresse IP comprise.
POST /lien-creation/commentaires/modifier sans authentification

Le tiers modifie le texte de l’un de SES commentaires, sur la preuve de la clé qui l’a écrit.

Corpsjeton, id, cle, texte
RéponseCommentairePublicDto
NoteUn commentaire déjà traité ou refusé se ROUVRE (ce qui a été fermé n’est plus ce qui est écrit), et la personne qui a partagé le lien est prévenue. 403 PAS_A_VOUS sans la bonne clé ; 404 pour un commentaire d’un autre lien.
POST /lien-creation/commentaires/retirer sans authentification

Le tiers retire l’un de SES commentaires, sur la preuve de la clé qui l’a écrit.

Corpsjeton, id, cle
Réponse204
Note403 PAS_A_VOUS sans la bonne clé ; 404 pour un commentaire d’un autre lien, jamais « pas à vous » — la différence apprendrait qu’il existe.
POST /demande-acces sans authentification

L’enveloppe d’une demande « Recevoir un mot de passe » : qui demande quoi, jusqu’à quand, les types proposés — et le défi à rapporter. Ne compte ni n’écrit rien.

Corpsjeton
RéponseDemandeAccesEnveloppeDto
NoteLe jeton voyage dans le corps, jamais dans l’adresse ; rien n’est dit de la cible (ni projet, ni machine, ni environnement). 404 pour un jeton inconnu ; 410 avec `code` (EXPIRE, REVOQUE, DEJA_REMPLI, TROP_D_ESSAIS, INDISPONIBLE). Plafond par adresse.
POST /demande-acces/envoyer sans authentification

L’envoi d’un accès par un tiers sans compte : l’accès est créé dans le coffre visé, et le lien meurt.

Corpsjeton, defi, preuve, kind, label, host, port, username, url, database, secret, deLaPart, commentaire
RéponseDemandeAccesRecuDto
NoteExige le défi signé rendu par l’enveloppe et sa preuve de travail ; pot de miel, délai minimum et preuve fausse se refusent sous le même `code: VERIFICATION` (le vrai motif va au journal). Chaque refus compte : au plafond, le lien se brûle. L’écriture et la fermeture sont dans la même transaction — un rejeu ne crée jamais deux accès. Plafond par adresse, plus bas que la lecture.
POST /lien-fichier sans authentification

L’enveloppe d’un fichier IA partagé à un tiers : qui partage quoi, sa taille, la date de la copie, jusqu’à quand — aucun octet du fichier. Ne compte ni n’écrit rien.

Corpsjeton
RéponsePartageFichierEnveloppeDto
NoteLe jeton voyage dans le corps, jamais dans l’adresse. 404 pour un jeton inconnu (le lien purgé après sept jours y tombe aussi) ; 410 avec `code` (EXPIRE, REVOQUE, AUTEUR_RETIRE) pour un lien qui ne vaut plus. Plafond par adresse.
POST /lien-fichier/contenu sans authentification

Les octets d’un fichier IA partagé, en base64 : le clic « Afficher » de la page, compté et journalisé.

Corpsjeton
RéponsePartageFichierContenuDto
NoteAucun en-tête `Content-Type` du fichier n’est servi : un `text/html` rendu sur le domaine de Nexus serait du script de son origine. La page l’affiche dans un cadre isolé. Chaque consultation va au journal de l’entreprise (acteur « Tiers », adresse IP comprise).
GET /app/releases sans authentification

Les versions publiées de l’application, la plus récente d’abord.

GET /app/latest sans authentification

La dernière version publiée INSTALLABLE par le poste qui demande (lue par la mise à jour des postes).

Requêteplateforme : WINDOWS_X64, WINDOWS_ARM64, MACOS_APPLE_SILICON ou MACOS_INTEL ; absente ou inconnue = traitée comme un Mac
POST /crash-reports sans authentification

Dépôt d’un rapport de plantage par l’application (quota par adresse).

POST /figma/plugin/hello sans authentification

Le plugin Figma se présente. Il n’obtient RIEN de l’agence : un jeton qui ne sert qu’à sa propre session, et un code court à faire recopier par un humain dans Nexus. Aucune donnée du document ne remonte avant l’association.

CorpssessionId, protocole, version, editeur, mode, lectureSeule, nomFichier, capacites
Réponse{ jeton, code, appaire, protocole }
POST /figma/plugin/poll sans authentification

L’attente longue du plugin : la requête reste ouverte jusqu’à ce qu’une commande arrive, ou jusqu’à la borne. Le battement voyage dans le même appel. Un jeton invalide rend 401 NET, pour que le plugin cesse de marteler.

CorpssessionId, occupe, signalement
Réponse{ commandes: CommandeFigma[], appaire }
POST /figma/plugin/resultat sans authentification

Le résultat d’une commande : accusé, progrès, résultat, erreur ou annulation. Un plugin ne peut répondre que pour SA session. « Reçue » n’est pas « appliquée », qui n’est pas « vérifiée ».

CorpssessionId, reponse (kind: accuse | progres | resultat | erreur | annule)
Réponse{ ok }
POST /figma/plugin/adieu sans authentification

Le plugin s’en va — au mieux. S’il n’arrive pas (onglet fermé d’un coup, autre plugin lancé), le silence fera le travail : la session passe « déconnectée », jamais « fermée ».

CorpssessionId
Réponse{ ok }
OPTIONS /figma/plugin/* sans authentification

Le préalable CORS de l’iframe du plugin, dont l’origine est `null` (bac à sable Figma). Autorisée explicitement : un refus CORS ne produit aucune erreur lisible côté plugin, seulement une requête qui n’arrive jamais.

Réponse204
GET /audience/google/retour sans authentification

Le retour de Google après l’autorisation : échange le code, range le jeton chiffré, et rend une page à fermer.

Requêtecode, state, error
RéponsePage HTML
NotePublic par nécessité : c’est l’état tiré au sort (usage unique, dix minutes) qui tient le flux, avec PKCE.
POST /lien-creation/visite sans authentification

La page d’un lien de partage dit ce que le tiers fait APRÈS l’ouverture : temps actif, pages vues et leur durée, clics, téléchargements.

Corpsjeton, visite (la clé rendue par /lien-creation/consulter), actifMs, pages [{ cle, libelle, vues, dureeMs }], clics [{ libelle, cible, page, at }], gestes, appareil, visiteur, fin
Réponse204
NoteLe temps est borné au temps écoulé depuis le battement précédent. Ni IP ni user-agent ; le visiteur n’est qu’une empreinte d’une clé de son navigateur. 60 battements par minute et par adresse IP.
POST /hooks/formulaire sans authentification

La page de participation (`/p#<jeton>`) lit le formulaire qu’une application a déclaré sur un de ses webhooks : titre, intro, champs, phrase de remerciement.

Corpsjeton (celui du webhook, tenu par la page dans son fragment)
Réponse{ formulaire, application, espace }
NoteLe jeton voyage dans un CORPS, jamais dans l’adresse. Inconnu, ou adresse sans formulaire : 404 sans un mot de plus. 60 lectures par minute et par adresse IP.
POST /hooks/formulaire/envoyer sans authentification

Quelqu’un SANS COMPTE envoie ses réponses : Nexus juge chaque champ déclaré et dépose la réponse dans le webhook, remise à l’action de l’application comme un appel.

Corpsjeton, reponses (un objet : identifiant de champ → valeur)
Réponse202 { recu: true, merci }
NoteUn champ non déclaré est écarté ; obligatoire vide, adresse ou date mal formée, option inconnue : 400 avec `champ`. Corps remis : `{ formulaire, reponses }`, en-tête `x-event-type: formulaire`. 20 envois par minute et par adresse IP.
POST /hooks/a/:jeton sans authentification

L’adresse publique d’un webhook d’application : un service extérieur y dépose un appel, gardé TEL QUEL (256 Ko au plus) jusqu’à ce qu’un poste du membre le remette à l’application.

Corpsn’importe quel corps, gardé en texte octet pour octet
Réponse202 { recu: true } (200 si vérifiée ou signée ; le code déclaré — 204 sans corps ; 401 si mal signé) ; un DÉFI déclaré (Microsoft Graph `validationToken`, un paramètre) : 200 text/plain, rien de remis
NoteLe jeton (dans le chemin) est la seule clé ; inconnu, ou défi mal formé : 404 sans un mot de plus. Signature déclarée : un appel mal signé (`X-Hub-Signature-256`) est refusé et compté. Rien ne s’exécute au serveur. Seuls quelques en-têtes sont transmis (type de contenu, signatures connues) — jamais un cookie ni une autorisation. Plafond : 120 appels par minute et par adresse IP. Gardé sept jours.
GET /hooks/a/:jeton sans authentification

Les défis déclarés à la création (`reponse`) : Meta (`hub.challenge` pour le bon `hub.verify_token`), Microsoft Graph (`validationToken`), un paramètre recopié — en texte, sur-le-champ, sans rien remettre.

Requêtehub.mode=subscribe, hub.verify_token, hub.challenge | validationToken | le paramètre déclaré
Réponse200 text/plain (le défi)
NoteSinon 404 muet (défi absent, mal formé, texte non imprimable ou de plus de 1024 signes). Le jeton de Meta n’est gardé qu’en empreinte. 30 requêtes par minute et par adresse IP.
GET /social/oauth/retour sans authentification

Le retour d’un réseau après l’autorisation : range la connexion (jetons chiffrés) et tous ses comptes, rend une page à fermer.

Requêtecode, state, error
RéponsePage HTML
NotePublic par nécessité : l’état tiré au sort (usage unique, dix minutes) tient le flux, avec PKCE là où le réseau le permet.
GET /social/webhooks/meta sans authentification

La vérification d’abonnement des webhooks Meta.

Requêtehub.mode, hub.verify_token, hub.challenge
RéponseLe défi, en texte
POST /social/webhooks/meta sans authentification

Les évènements Meta (commentaires, mentions, messages) : signature X-Hub-Signature-256 vérifiée, envoi traité une seule fois.

Réponse{ ok, nouvelles, deja }
GET /social/public/meta/:id/confidentialite sans authentification

La politique de confidentialité de l’application Meta d’un espace, servie par Nexus (l’URL à coller chez Meta).

RéponseUne page HTML (français, puis anglais)
Note`id` : l’identifiant PUBLIC tiré au sort, jamais celui de l’entreprise. Inconnu : 404.
GET /social/public/meta/:id/suppression sans authentification

Les instructions de suppression des données de l’application Meta d’un espace.

RéponseUne page HTML
POST /social/public/meta/:id/suppression sans authentification

Le rappel de suppression des données de Meta : `signed_request` vérifiée (HMAC-SHA256, clé secrète de l’application), connexions de la personne effacées (identité, jetons).

Corpssigned_request (formulaire)
Réponse{ url, confirmation_code }
NoteSignature fausse : 400 et rien n’est effacé. Seule une EMPREINTE de l’identifiant est gardée, avec le code.
GET /social/public/suppression/:code sans authentification

Le statut d’une demande de suppression des données reçue de Meta, par son code de confirmation.

RéponseUne page HTML
GET /social/media/:ticket/:nom sans authentification

Le fichier d’une création du Studio, servi une heure à la plateforme qui le télécharge pour le publier.

RéponseLes octets du fichier
NoteLe ticket signé nomme un fichier d’une entreprise, pour une heure.
POST /dossier-client sans authentification

La page d’un dossier client (`/e#<jeton>`) : titre, texte, documents à consulter, et la demande de signature avec le lien du signataire tant que c’est à lui de signer. Date la première ouverture.

Corpsjeton
RéponsePageDossierClientDto
NoteLe jeton voyage dans le corps, jamais dans l’adresse. 404 pour un jeton inconnu ; 410 avec `code` (EXPIRE, REVOQUE). Plafond par adresse.
POST /dossier-client/paiement sans authentification

Le client d’un dossier clique « Payer » : rend l’adresse de la page Stripe Checkout, sur le compte Connect de l’espace.

Corpsjeton, paiementId
Réponse{ url }
NoteUne seule page ouverte à la fois par demande : la même adresse tant qu’elle vit, sinon la précédente est fermée chez Stripe avant d’en ouvrir une autre (409 `PAIEMENT_EN_CONFIRMATION` si elle venait d’être payée). « Payé » n’est écrit que par la notification signée de Stripe. Le jeton ne part jamais chez Stripe. Plafond par adresse.
POST /dossier-client/document sans authentification

Un document à consulter d’un dossier client, en pièce jointe.

Corpsjeton, documentId
Réponsele fichier (PDF, PNG, JPEG ou WebP)
NoteToujours en pièce jointe, `nosniff`, type lu sur les octets à la création. Plafond par adresse.