Aurora Nexus
Aurora NexusRéférence technique

API — Intégrations M2M V1

contrat serveur-à-serveur pour scopes opaques, Media V1, projections et KG workspace

Cette référence décrit le contrat V1 permettant à un backend partenaire de provisionner un périmètre opaque, publier des projections métier, gérer des médias autorisés et construire ou lire un Knowledge Graph isolé.

Les schémas exhaustifs restent dans openapi.json.

Invariants de sécurité

  • Authentification OIDC OAuth2 client_credentials obligatoire.
  • Le principal doit être classé machine et lié au caller_app par NEXUS_M2M_CALLER_APP_CLIENTS.
  • Dans le contrat actuel, source_app doit être égal à caller_app.
  • nexus.ingest et can_write protègent les mutations.
  • nexus.query et can_read protègent les lectures.
  • external_scope_id est un UUID opaque appartenant à l'application cliente. Nexus résout seul le workspace canonique.
  • Le client ne fournit jamais de tenant_id et ne choisit pas un workspace Nexus arbitraire.
  • Une ressource d'un autre tenant, caller ou scope est non énumérable.

Séquence recommandée

  1. Obtenir un bearer M2M à durée courte.
  2. Vérifier le principal avec GET /api/auth/oidc/me.
  3. Appeler POST /api/v1/integration-scopes/ensure.
  4. Utiliser le même external_scope_id pour les médias, projections et routes KG workspace.
  5. Réconcilier périodiquement les projections, sans lire les stores internes de Nexus.

Périmètres d'intégration

MéthodeEndpointScopeEffet
POST/api/v1/integration-scopes/ensurenexus.ingestCrée ou rejoue le mapping opaque et les projets canoniques
GET/api/v1/integration-scopes/{external_scope_id}nexus.queryLit un mapping actif du caller courant

Exemple de provisioning :

{
  "caller_app": "partner_app",
  "source_app": "partner_app",
  "external_scope_id": "8e02a671-8604-49d1-9ebf-28a60475e91e",
  "projects": ["entities", "relations", "media"]
}

ensure est rejouable. Une liste de projets invalide renvoie 422. Un scope inactif ou inaccessible reste masqué par 404. L'absence de binding M2M côté Nexus renvoie 503 et doit être corrigée par un opérateur, pas contournée par le client.

Media V1

MéthodeEndpointScopeUsage
POST/api/v1/media/upload/initnexus.ingestInitialise un upload présigné
POST/api/v1/media/upload/directnexus.ingestUpload multipart serveur-à-serveur
POST/api/v1/media/upload/commitnexus.ingestVérifie et finalise l'objet
GET/api/v1/media/{external_scope_id}/{media_id}nexus.queryLit le statut et les métadonnées sûres
GET/api/v1/media/{external_scope_id}/{media_id}/contentnexus.queryDiffuse une variante autorisée
POST/api/v1/media/{media_id}/accessnexus.queryProduit un accès signé court
POST/api/v1/media/{media_id}/revokenexus.ingestRévocation logique avec version optimiste

Les usages V1 sont profile et content. Les types déclarables sont exposés dans OpenAPI ; les limites opérationnelles sont contrôlées côté Nexus et résumées dans le guide API général. Le format réel est validé à partir du contenu lors du commit. expected_checksum_sha256, expected_byte_size, object_id et object_version_id empêchent de confondre deux versions.

Disponibilité actuelle

Le chemin est générique, mais l'adaptateur Media V1 actuellement livré réutilise le stockage privé Narrélia et son autorisation M2M. Il est donc exploitable par le client Narrélia autorisé. L'ouverture à une autre application nécessite une validation Nexus dédiée de son binding, de ses usages, limites et règles de stockage ; le seul changement de caller_app dans le payload ne suffit pas.

Les routes historiques /api/narrelia/media/* restent disponibles pour compatibilité. Les nouvelles intégrations ne doivent pas les utiliser.

Projections domaine

MéthodeEndpointScopeEffet
POST/api/v1/domain-projections/entitiesnexus.ingestUpsert d'une entité reconstruisible
POST/api/v1/domain-projections/relationsnexus.ingestUpsert d'une relation entre entités actives
GET/api/v1/domain-projections/{projection_kind}/{aggregate_type}/{aggregate_id}nexus.queryLecture de l'état courant
POST.../{aggregate_id}/retractnexus.ingestRetrait logique versionné
POST.../{aggregate_id}/restorenexus.ingestRestauration logique versionnée
POST/api/v1/domain-projections/reconcilenexus.queryRéconciliation bornée à 500 références

Chaque mutation utilise contract_version="1.0", command_id, idempotency_key, aggregate_version et le scope opaque. Un replay strictement identique retourne le résultat initial. Nexus renvoie notamment :

  • 409 idempotency_conflict si une clé est réutilisée avec une autre commande ;
  • 409 version_conflict pour une version ancienne ou incohérente ;
  • 409 projection_reference_unavailable si une relation référence une entité inactive ou hors scope ;
  • 404 projection_unavailable pour une projection non visible.

Une projection est une copie reconstruisible ; l'application cliente reste propriétaire de la vérité métier.

Knowledge Graph workspace

MéthodeEndpointScopeEffet
POST/api/v1/knowledge-graph/rebuildnexus.ingestReconstruit une version du workspace résolu
GET/api/v1/knowledge-graph/overviewnexus.queryMétadonnées de la dernière version prête
GET/api/v1/knowledge-graph/searchnexus.queryRecherche textuelle d'entités
GET/api/v1/knowledge-graph/subgraphnexus.querySous-graphe filtré et borné
GET/api/v1/knowledge-graph/neighbors/{node_id}nexus.queryVoisinage d'un nœud du scope

Toutes les lectures portent caller_app, source_app et external_scope_id. Nexus dérive une clé de graphe workspace ; aucune absence de graphe workspace ne retombe sur le graphe global. Une reconstruction building ou failed ne remplace pas la dernière version ready.

Le détail du modèle de graphe est dans 55-Knowledge-Graph.md.

Erreurs et reprise

StatutInterprétation client
401bearer absent ou invalide ; renouveler le token
403principal, scope OAuth ou permission source insuffisant
404ressource inexistante ou volontairement non énumérable
409conflit de version/idempotence, graphe désactivé ou état incompatible
422payload hors contrat ; ne pas retenter sans correction
503binding M2M Nexus absent ; intervention opérateur nécessaire

Ne jamais journaliser le bearer, le secret client, les contenus médias ou les payloads métier complets. Les preuves d'intégration doivent se limiter aux IDs opaques, statuts, codes d'erreur contrôlés et identités de client non secrètes.

On this page