# API de résultats de laboratoire : HL7 v2, FHIR et LOINC

> Comment les résultats de laboratoire circulent en tant que données HL7 v2 et FHIR, ce qu'un résultat doit contenir, et comment recevoir des rapports de laboratoire dans un enregistrement FHIR, avec un exemple concret.

Source: https://developers.anpheros.com/fr/guides/lab-results-api

**Une API de résultats de laboratoire délivre les résultats de laboratoire sous forme de données structurées — code de test, valeur, unité, intervalle de référence, statut et heure — au lieu d'un PDF, afin que les logiciels puissent les stocker, les comparer, les représenter graphiquement et les partager.** Aujourd'hui, ces données circulent sous trois formes : messages HL7 v2 ORU^R01 (toujours l'épine dorsale entre les laboratoires et les hôpitaux), ressources HL7 FHIR R4 `Observation` et `DiagnosticReport` (le format des API modernes), et exportations CSV, JSON ou PDF spécifiques au laboratoire. Cette page explique comment les éléments s'assemblent, ce qu'une bonne API de résultats de laboratoire doit contenir, et comment recevoir des données de laboratoire dans l'enregistrement FHIR d'un patient avec Anpheros.

## Qui échange les résultats de laboratoire, et dans quel format

| De → à | Format habituel aujourd'hui | Notes |
|---|---|---|
| Laboratoire → système hospitalier ou clinique | HL7 v2 ORU^R01 (aux États-Unis, souvent selon le guide HL7 v2.5.1 Laboratory Results Interface) | Les commandes vont dans l'autre sens sous forme de messages ORM/OML |
| Laboratoire → agence de santé publique | Rapports électroniques de laboratoire HL7 v2, de plus en plus FHIR | Conditions signalables uniquement |
| Système clinique → application patient | FHIR R4 via une API d'accès patient | Aux États-Unis, les EHR certifiés exposent les résultats de laboratoire sous forme de FHIR (US Core) ; dans l'UE, l'Espace européen des données de santé liste les résultats de laboratoire parmi ses catégories de données prioritaires |
| Laboratoire → patient | Rapport PDF, portail, parfois CSV | Le format que la plupart des patients reçoivent réellement |
| Application → modèle IA | Contexte structuré construit à partir d'Observations | Nécessite des codes et des unités pour être fiable |

La direction est importante : un système d'information de laboratoire (LIS) est la source de vérité pour un résultat, et chaque système en aval en conserve une copie. Ce qui rend les copies fiables, c'est que chacune conserve le code, l'unité, la plage et l'origine de la valeur.

## Ce qu'un résultat de laboratoire doit contenir

Un résultat qui dit simplement "Glucose 126" ne peut pas être interprété en toute sécurité. Un résultat complet comprend :

- **Un code standard.** LOINC identifie l'analyte, le spécimen et la méthode : `2345-7` est le glucose dans le sérum ou le plasma, `2339-0` est le glucose dans le sang total. Le code propre au laboratoire peut l'accompagner.
- **Une valeur avec une unité.** Idéalement une unité UCUM (`mg/dL`, `mmol/L`, `10*3/uL`), afin que les valeurs de deux laboratoires puissent être converties et comparées.
- **La plage de référence** utilisée par le laboratoire, et un indicateur d'**interprétation** (H, L, N…) lorsque le laboratoire en fournit un.
- **Statut :** préliminaire, final, corrigé ou modifié. Les corrections arrivent ; une API doit vous permettre de voir la nouvelle version sans perdre l'ancienne.
- **Horodatages :** quand le spécimen a été collecté (`effectiveDateTime`) et quand le résultat a été publié (`issued`).
- **Origine :** quel laboratoire l'a produit et à quel rapport ou quelle commande il appartient.

Dans FHIR R4, chaque résultat est une `Observation` avec `category = laboratory`, et le rapport qui les regroupe est un `DiagnosticReport` qui liste les Observations dans `result`. Des exemples valides des deux, avec les erreurs que les validateurs signalent le plus souvent, se trouvent dans les [exemples JSON FHIR R4](https://developers.anpheros.com/tools/fhir-examples/observation-lab-result) — voir aussi l' [exemple DiagnosticReport](https://developers.anpheros.com/tools/fhir-examples/diagnostic-report).

## HL7 v2 et FHIR côte à côte

Le même résultat d'analyse lipidique, tel que la plupart des laboratoires l'envoient aujourd'hui et tel qu'une API devrait le stocker :

```
OBX|1|NM|2093-3^Cholesterol^LN||212|mg/dL|<200|H|||F|||20261002074500
```

| Champ HL7 v2 | Signification | Élément FHIR R4 Observation |
|---|---|---|
| OBX-3 `2093-3^Cholesterol^LN` | Test, codé en LOINC | `code.coding` (système `http://loinc.org`) |
| OBX-5 `212`, OBX-2 `NM` | Valeur numérique | `valueQuantity.value` |
| OBX-6 `mg/dL` | Unité | `valueQuantity.unit` |
| OBX-7 `<200` | Plage de référence | `referenceRange.high` |
| OBX-8 `H` | Indicateur d'anomalie | `interpretation` |
| OBX-11 `F` | Résultat final | `status = final` |
| OBX-14 | Heure de l'observation | `effectiveDateTime` |

La conversion entre les deux est principalement un mappage de champs. Les difficultés se situent ailleurs : les laboratoires qui envoient leurs propres codes au lieu de LOINC, les nombres écrits sous forme de texte (`"6,4"`, `"<5"`), les plages dans plusieurs notations, et les rapports qui sont renvoyés après un délai d'attente. [Comment normaliser les données médicales](https://developers.anpheros.com/fr/guides/normalize-medical-data) couvre ces aspects en détail.

## Réception des résultats de laboratoire dans un enregistrement FHIR avec Anpheros

Anpheros stocke l'enregistrement de chaque patient au format HL7 FHIR R4 et dispose d'un [connecteur de laboratoire](https://developers.anpheros.com/fr/guides/lab-connector) : une requête prend un rapport complet en HL7 v2, CSV ou JSON et renvoie des Observations de laboratoire avec des codes LOINC, des plages de référence, une interprétation et une provenance.

```bash
curl -s -X POST "https://platform.anpheros.com/v1/patients/$PID/labs/import" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: x-application/hl7-v2+er7" \
  -H "X-Anpheros-Source-System: springfield-lis" \
  --data-binary @lipid-panel.hl7
```

Pour un panel lipidique à trois lignes (cholestérol, HDL, triglycérides), la réponse, issue d'une exécution locale de la plateforme, est :

```json
{
  "created": 3, "skipped": 0, "unmapped": [], "warnings": [],
  "observations": [
    {"id": "26ed9219-…", "marker": "Cholesterol", "code": "2093-3", "system": "http://loinc.org",
     "value": 212.0, "unit": "mg/dL", "date": "2026-10-02T07:45:00Z"},
    {"id": "2633d1d4-…", "marker": "HDL cholesterol", "code": "2085-9", "system": "http://loinc.org",
     "value": 48.0, "unit": "mg/dL", "date": "2026-10-02T07:45:00Z"},
    {"id": "a02520bb-…", "marker": "Triglyceride", "code": "2571-8", "system": "http://loinc.org",
     "value": 165.0, "unit": "mg/dL", "date": "2026-10-02T07:45:00Z"}
  ]
}
```

Chaque résultat stocké est une Observation FHIR R4 standard, lisible par n'importe quel client FHIR :

```json
{
  "resourceType": "Observation",
  "status": "final",
  "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "laboratory"}]}],
  "code": {"coding": [{"system": "http://loinc.org", "code": "2093-3",
                        "display": "Cholesterol [Mass/volume] in Serum or Plasma"}], "text": "Cholesterol"},
  "subject": {"reference": "Patient/4c3062d9-…"},
  "effectiveDateTime": "2026-10-02T07:45:00Z",
  "valueQuantity": {"value": 212.0, "unit": "mg/dL"},
  "interpretation": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", "code": "H"}]}],
  "referenceRange": [{"high": {"value": 200.0, "unit": "mg/dL"}}]
}
```

L'envoi du même message à nouveau ne crée rien de nouveau (`"created": 0, "skipped": 3`) : chaque ligne obtient un identifiant stable à partir de l'ID du rapport, du code, de la date et de la valeur. Les marqueurs que la plateforme ne peut pas mapper à LOINC conservent le code du laboratoire et reviennent dans `unmapped`, vous permettant de corriger le mappage à la source.

La lecture des résultats est une recherche FHIR standard :

```bash
curl -s "https://platform.anpheros.com/fhir/R4/Observation?patient=$PID&category=laboratory&code=http://loinc.org|2093-3" \
  -H "Authorization: Bearer $KEY"
```

Autres méthodes d'entrée et de sortie des mêmes données :

- **FHIR directement :** `POST /fhir/R4/Observation`, ou un Bundle de transaction avec le `DiagnosticReport` et ses Observations ensemble.
- **Événements :** un [webhook](https://developers.anpheros.com/fr/guides/webhooks) `resource.created` par Observation, afin qu'une clinique ou une application puisse réagir lorsque les résultats arrivent.
- **Pour les personnes et l'IA :** le patient voit les résultats dans son application ; les applications auxquelles il consent les lisent ; `POST /v1/context` fournit à un modèle d'IA un résumé étiqueté par source qui inclut les valeurs de laboratoire récentes.
- **Provenance :** chaque résultat importé enregistre `author_type = import`, le système source et l'ID du rapport ([provenance des données médicales](https://developers.anpheros.com/fr/guides/medical-data-provenance)).

La présentation complète, avec un rapport CSV, un message HL7 v2, des marqueurs non mappés et des rapports renvoyés sur un patient synthétique, se trouve dans le tutoriel [Comment importer des résultats de laboratoire dans un enregistrement FHIR](https://developers.anpheros.com/fr/guides/import-lab-results-fhir).

## Vérifier les résultats avant de les envoyer

Le [valideur FHIR R4 gratuit](https://developers.anpheros.com/tools/fhir-validator) vérifie la structure d'une Observation et les jeux de valeurs requis. Avec le profil `eu-lab`, il vérifie également ce qu'un résultat de laboratoire doit contenir : la catégorie `laboratory`, un code LOINC, un sujet, un statut final (final-type), une heure, une valeur, une unité UCUM et une plage de référence. Les mêmes vérifications sont effectuées sur la plateforme via `POST /fhir/R4/Observation/$validate?profile=eu-lab`.

## Choisir une API de résultats de laboratoire : une liste de contrôle

- Stocke-t-elle les résultats sous forme d'Observations FHIR R4 avec des codes LOINC, ou sous forme de lignes dans son propre schéma ?
- Peut-elle accepter les formats que vos laboratoires envoient réellement (HL7 v2 dans la plupart des hôpitaux, CSV ou PDF de laboratoires plus petits) ?
- Que se passe-t-il pour un marqueur qu'elle ne peut pas mapper : est-il rejeté, ignoré ou conservé avec le code du laboratoire ?
- Les nouvelles tentatives sont-elles sûres, ou un rapport renvoyé crée-t-il des doublons ?
- Les résultats corrigés sont-ils versionnés, la valeur précédente restant lisible ?
- L'origine de chaque valeur est-elle enregistrée et visible par le patient ?
- Qui peut lire les résultats, et cette décision est-elle prise par le consentement du patient ?

## Ce que Anpheros ne fait pas

Anpheros n'est pas un système d'information de laboratoire et n'est pas connecté aux réseaux de laboratoires commerciaux : le laboratoire, la clinique ou l'application du patient envoie le rapport. Il ne route pas les ordres de laboratoire, ne lit pas les rapports PDF via cette API (l'application Anpheros Daily extrait les résultats à partir de photos et de PDF côté patient), et n'interprète pas les résultats cliniquement. Les unités sont stockées telles que le laboratoire les envoie ; leur conversion en codes UCUM incombe à l'expéditeur, comme décrit dans [Comment normaliser les données médicales](https://developers.anpheros.com/fr/guides/normalize-medical-data).

## Foire aux questions

### Qu'est-ce qu'une API de résultats de laboratoire ?
Une interface qui permet aux logiciels d'envoyer ou de recevoir des résultats de laboratoire sous forme de données structurées — un test codé, une valeur avec une unité, une plage de référence, un statut et une heure — plutôt qu'un document. Les API modernes de résultats de laboratoire utilisent les ressources Observation et DiagnosticReport de HL7 FHIR R4 ; la plupart des laboratoires émettent encore des messages HL7 v2 ORU^R01.

### Quel système de codage identifie les tests de laboratoire ?
LOINC. Chaque code LOINC nomme l'analyte, le spécimen et souvent la méthode, ainsi `2345-7` (glucose dans le sérum ou le plasma) et `2339-0` (glucose dans le sang total) sont des résultats différents. Les unités sont mieux exprimées en UCUM.

### Quelle est la différence entre une Observation et un DiagnosticReport ?
Une Observation est un résultat, tel que le cholestérol 212 mg/dL. Un DiagnosticReport est le rapport dans son ensemble — le panel qui a été commandé, qui l'a émis et quand — et liste ses Observations dans `result`.

### Puis-je importer des messages de laboratoire HL7 v2 dans un serveur FHIR ?
Oui. Chaque segment OBX est mappé à une Observation (OBX-3 à `code`, OBX-5 et OBX-6 à `valueQuantity`, OBX-7 à `referenceRange`, OBX-8 à `interpretation`). Le connecteur de laboratoire Anpheros fait cela en une seule requête et conserve l'identifiant du rapport du laboratoire dans Provenance.

### Comment éviter les doublons de résultats de laboratoire lorsqu'un rapport est renvoyé ?
Donnez à chaque résultat un identifiant stable dérivé du rapport, du test, de l'heure et de la valeur, et ignorez les lignes dont l'identifiant existe déjà. Le connecteur de laboratoire Anpheros fait cela automatiquement et rapporte le nombre comme `skipped`.

## Liens Utiles

- [Mapping HL7 v2 vers FHIR](https://developers.anpheros.com/fr/guides/hl7-v2-to-fhir-mapping) : chaque segment et champ OBX
- [Comment importer des résultats de laboratoire dans un enregistrement FHIR](https://developers.anpheros.com/fr/guides/import-lab-results-fhir) : le tutoriel étape par étape
- [Connecteur de laboratoire](https://developers.anpheros.com/fr/guides/lab-connector) : la référence du point d'accès (endpoint)
- [Comment normaliser les données médicales](https://developers.anpheros.com/fr/guides/normalize-medical-data) : LOINC, UCUM, dates, plages et doublons
- [Provenance des données médicales expliquée](https://developers.anpheros.com/fr/guides/medical-data-provenance)
- [Systèmes de codes FHIR](https://developers.anpheros.com/fr/guides/fhir-code-systems)
- [Comment intégrer des systèmes cliniques avec un backend FHIR](https://developers.anpheros.com/fr/guides/integrate-clinic-systems-fhir)
- [FHIR vs HL7 v2 : différences pratiques](https://developers.anpheros.com/fr/guides/fhir-vs-hl7-v2)
- [HL7 v2 et FHIR pour les tableaux de bord cliniques](https://developers.anpheros.com/fr/guides/clinical-dashboard-hl7-fhir) : d'un message de laboratoire à une tuile de tableau de bord
