Aller au contenu

Enregistrer ou mettre à jour un salarié

POST
/entreprise/v1/entreprises/{entrepriseId}/salaries:upsert
curl --request POST \
--url https://example.com/entreprise/v1/entreprises/example/salaries:upsert \
--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" }, "personneDeclaree": { "nomNaissance": "example", "nomUsage": "example", "prenoms": [ "example" ], "dateNaissance": "2026-04-15", "lieuNaissance": { "codePays": "example", "codeCommune": "example" }, "identifiantsDeclares": [ { "type": "example", "valeur": "example", "niveauVerification": "example" } ] }, "emploi": { "etablissementId": "example", "matricule": "example", "natureLien": "example", "dateDebut": "2026-04-15", "dateFin": "2026-04-15", "statut": "example", "categorie": "example", "college": "example" }, "donneesSociales": { "periode": "example", "remunerationBrute": { "montant": "example", "devise": "example" } }, "modeMiseAJour": "DELTA", "dateEffet": "2026-04-15" }'

Au moins personneDeclaree ou emploi doit être présent. Pour créer un lien sans epargnantId connu, les attributs minimaux de résolution sont exigés. Le tenant vient du contexte sécurisé, jamais du corps.

entrepriseId
required
string
>= 1 characters

L’entreprise portant le lien d’emploi — résolue dans le tenant courant.

X-Tenant-Id
required
string
>= 1 characters

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.

X-Correlation-Id
required
string
>= 1 characters

La corrélation de bout en bout — propagée jusqu’aux événements.

Idempotency-Key
required
string
>= 1 characters

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.

Media typeapplication/json

Au moins personneDeclaree ou emploi est présent. Les montants sont des chaînes décimales ; les dates sont ISO 8601 et les instants portent leur décalage.

object
source
required
object
systeme
required

La source déclarée et autorisée — par exemple DSN, SIRH_GROUPE.

string
emetteurId
string
referenceSalarie
required

L’identifiant stable du salarié dans la source (matricule).

string
version
required

La version ou séquence comparable selon la politique de la source.

string
dateObservation
string format: date-time
personneDeclaree

Les données transmises au domaine Épargnant pour la résolution. Elles ne deviennent jamais des colonnes métier de personne dans Entreprise.

object
nomNaissance
string
nomUsage
string
prenoms
Array<string>
dateNaissance
string format: date
lieuNaissance
object
codePays
string
codeCommune
string
identifiantsDeclares

Un identifiant sensible (NIR) est chiffré au repos et masqué dans les interfaces et les journaux ; il n’apparaît jamais en clair.

Array<object>
object
type
required
string
valeur
required
string
niveauVerification
string
emploi
object
etablissementId
string
matricule
string
natureLien
string
dateDebut
string format: date
dateFin

Une date de fin ne supprime pas le lien : elle clôt sa période (RM-018).

string | null format: date
statut
string
categorie
string
college
string
donneesSociales
object
periode

La période de référence, par exemple 2026-07.

string
remunerationBrute
object
montant

Chaîne décimale — jamais un flottant, pour éviter la perte de précision.

string
devise
string
modeMiseAJour
required

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.

string
Allowed values: DELTA FULL_SNAPSHOT
dateEffet
required

La date à laquelle le fait métier est valable.

string format: date

La demande est validée et enregistrée ; le traitement se poursuit. Le rejeu d’une même clé et d’un même corps retourne cette même réponse.

Media typeapplication/json
object
operationId
required
string
statut
required
string
Allowed values: RECU VALIDE RESOLUTION_PERSONNE ARBITRAGE_REQUIS APPLICATION TERMINE TERMINE_PARTIELLEMENT REJETE ECHEC_REPRENABLE ECHEC_DEFINITIF
recuLe
required
string format: date-time
liens
object
statut
string
Example
{
"statut": "RECU"
}
Location
string

Le lien de suivi de l’opération.

JSON invalide ou champ obligatoire absent (INVALID_REQUEST).

Media typeapplication/problem+json

Le format d’erreur du § 21.2 — application/problem+json.

object
type
string
title
string
status
required
integer
code
required
string
detail
string
instance
string
correlationId
string
errors
Array<object>
object
path
string
code
string
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).

Media typeapplication/problem+json

Le format d’erreur du § 21.2 — application/problem+json.

object
type
string
title
string
status
required
integer
code
required
string
detail
string
instance
string
correlationId
string
errors
Array<object>
object
path
string
code
string
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.

Media typeapplication/problem+json

Le format d’erreur du § 21.2 — application/problem+json.

object
type
string
title
string
status
required
integer
code
required
string
detail
string
instance
string
correlationId
string
errors
Array<object>
object
path
string
code
string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"code": "example",
"detail": "example",
"instance": "example",
"correlationId": "example",
"errors": [
{
"path": "example",
"code": "example"
}
]
}

BUSINESS_RULE_VIOLATION ou IMPORT_SCOPE_VIOLATION — demande syntaxiquement valide mais incohérente au regard du métier ou du périmètre annoncé.

Media typeapplication/problem+json

Le format d’erreur du § 21.2 — application/problem+json.

object
type
string
title
string
status
required
integer
code
required
string
detail
string
instance
string
correlationId
string
errors
Array<object>
object
path
string
code
string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"code": "example",
"detail": "example",
"instance": "example",
"correlationId": "example",
"errors": [
{
"path": "example",
"code": "example"
}
]
}

Capacité momentanément dépassée (RATE_LIMITED).

Demande non enregistrable ; le client peut rejouer (SERVICE_UNAVAILABLE). Une indisponibilité survenant APRÈS l’enregistrement n’est jamais rendue ici : elle conduit à ECHEC_REPRENABLE.