Créer un import et annoncer son périmètre
const url = 'https://example.com/entreprise/v1/imports/signaletiques-salaries';const options = { method: 'POST', headers: { 'X-Tenant-Id': 'example', 'X-Correlation-Id': 'example', 'Idempotency-Key': 'example', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: '{"source":{"systeme":"example","emetteurId":"example","referenceSalarie":"example","version":"example","dateObservation":"2026-04-15T12:00:00Z"},"perimetre":{"type":"ENTREPRISE","entrepriseId":"example","groupeId":"example","dateReference":"2026-04-15"},"format":"CSV_UTF8","modeMiseAJour":"DELTA","nomFichier":"example","tailleDeclaree":1,"empreinteSha256":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/entreprise/v1/imports/signaletiques-salaries \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'Idempotency-Key: example' \ --header 'X-Correlation-Id: example' \ --header 'X-Tenant-Id: example' \ --data '{ "source": { "systeme": "example", "emetteurId": "example", "referenceSalarie": "example", "version": "example", "dateObservation": "2026-04-15T12:00:00Z" }, "perimetre": { "type": "ENTREPRISE", "entrepriseId": "example", "groupeId": "example", "dateReference": "2026-04-15" }, "format": "CSV_UTF8", "modeMiseAJour": "DELTA", "nomFichier": "example", "tailleDeclaree": 1, "empreinteSha256": "example" }'Autorisations
Section intitulée « Autorisations »Paramètres
Section intitulée « Paramètres »Paramètres (header)
Section intitulée « Paramètres (header) »Le teneur de compte — injecté et signé par la passerelle, dérivé de l’identité authentifiée. Il n’est jamais fourni comme valeur libre dans l’URL ou le corps.
La corrélation de bout en bout — propagée jusqu’aux événements.
La clé d’idempotence, de portée tenant + appelant + route + clé. Même clé et même corps : la réponse initiale. Même clé, corps différent : 409.
Corps de la requêterequired
Section intitulée « Corps de la requêterequired »object
object
La source déclarée et autorisée — par exemple DSN, SIRH_GROUPE.
L’identifiant stable du salarié dans la source (matricule).
La version ou séquence comparable selon la politique de la source.
Un import a exactement un périmètre dans un seul tenant (RM-021). En GROUPE, chaque ligne désigne son entreprise, vérifiée membre à la date de référence ; une entreprise extérieure fait rejeter la ligne, sans jamais élargir le périmètre.
object
Des formats à lecture séquentielle seulement — CSV_UTF8 est obligatoire. Le service ne construit jamais un arbre complet en mémoire.
En DELTA, un champ absent ne modifie rien et un null explicite efface si le champ l’autorise. En FULL_SNAPSHOT, le contenu est l’état complet connu de la source pour le périmètre annoncé. Dans les deux modes, une absence ne supprime jamais implicitement une personne ni un lien d’emploi.
Réponses
Section intitulée « Réponses »L’import est créé, en attente du fichier. Le rejeu d’une même clé de fichier et d’une même empreinte retourne l’import initial (RM-026).
object
Un import a exactement un périmètre dans un seul tenant (RM-021). En GROUPE, chaque ligne désigne son entreprise, vérifiée membre à la date de référence ; une entreprise extérieure fait rejeter la ligne, sans jamais élargir le périmètre.
object
Les compteurs par statut de ligne, agrégés depuis les partitions — jamais obtenus en rechargeant les lignes.
object
Example
{ "statut": "EN_ATTENTE_FICHIER", "perimetre": { "type": "ENTREPRISE" }}JSON invalide ou champ obligatoire absent (INVALID_REQUEST).
Le format d’erreur du § 21.2 — application/problem+json.
object
object
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "code": "example", "detail": "example", "instance": "example", "correlationId": "example", "errors": [ { "path": "example", "code": "example" } ]}Identité absente ou invalide (UNAUTHENTICATED).
Droit insuffisant (FORBIDDEN) — les 403 croisés entre familles sont prouvés par les tests d’assemblage.
Ressource absente dans le tenant courant — y compris une ressource d’un autre tenant, dont l’existence n’est jamais confirmée (404, jamais 403).
Le format d’erreur du § 21.2 — application/problem+json.
object
object
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "code": "example", "detail": "example", "instance": "example", "correlationId": "example", "errors": [ { "path": "example", "code": "example" } ]}IDEMPOTENCY_KEY_REUSED (même clé, corps différent), SOURCE_VERSION_CONFLICT (version incompatible) ou conflit d’empreinte d’import.
Le format d’erreur du § 21.2 — application/problem+json.
object
object
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "code": "example", "detail": "example", "instance": "example", "correlationId": "example", "errors": [ { "path": "example", "code": "example" } ]}Taille de fichier ou de ligne supérieure à la limite (FILE_TOO_LARGE).
Format ou encodage non pris en charge (UNSUPPORTED_FILE_FORMAT).
BUSINESS_RULE_VIOLATION ou IMPORT_SCOPE_VIOLATION — demande syntaxiquement valide mais incohérente au regard du métier ou du périmètre annoncé.
Le format d’erreur du § 21.2 — application/problem+json.
object
object
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "code": "example", "detail": "example", "instance": "example", "correlationId": "example", "errors": [ { "path": "example", "code": "example" } ]}