# API de resultados de laboratorio: HL7 v2, FHIR y LOINC

> Cómo viajan los resultados de laboratorio como datos HL7 v2 y FHIR, qué debe contener un resultado y cómo recibir informes de laboratorio en un registro FHIR, con un ejemplo real.

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

**Una API de resultados de laboratorio entrega los resultados de laboratorio como datos estructurados —código de prueba, valor, unidad, rango de referencia, estado y hora— en lugar de un PDF, para que el software pueda almacenarlos, compararlos, graficarlos y compartirlos.** Hoy en día, esos datos viajan en tres formatos: mensajes HL7 v2 ORU^R01 (todavía la columna vertebral entre laboratorios y hospitales), recursos HL7 FHIR R4 `Observation` y `DiagnosticReport` (el formato de las APIs modernas), y exportaciones CSV, JSON o PDF específicas del laboratorio. Esta página explica cómo encajan las piezas, qué debe contener una buena API de resultados de laboratorio y cómo recibir datos de laboratorio en el registro FHIR de un paciente con Anpheros.

## Quién intercambia resultados de laboratorio y en qué formato

| De → a | Formato habitual hoy | Notas |
|---|---|---|
| Laboratorio → sistema hospitalario o clínico | HL7 v2 ORU^R01 (en EE. UU. a menudo según la guía HL7 v2.5.1 Laboratory Results Interface) | Los pedidos van en la otra dirección como mensajes ORM/OML |
| Laboratorio → agencia de salud pública | Informes electrónicos de laboratorio HL7 v2, cada vez más FHIR | Solo condiciones reportables |
| Sistema clínico → aplicación para pacientes | FHIR R4 a través de una API de acceso para pacientes | En EE. UU., los EHR certificados exponen los resultados de laboratorio como FHIR (US Core); en la UE, el Espacio Europeo de Datos Sanitarios enumera los resultados de laboratorio entre sus categorías de datos prioritarias |
| Laboratorio → paciente | Informe en PDF, portal, a veces CSV | El formato que la mayoría de los pacientes reciben realmente |
| Aplicación → modelo de IA | Contexto estructurado construido a partir de Observations | Necesita códigos y unidades para ser fiable |

La dirección importa: un sistema de información de laboratorio (LIS) es la fuente de verdad para un resultado, y cada sistema posterior mantiene una copia. Lo que hace que las copias sean confiables es que cada una conserva el código, la unidad, el rango y el origen del valor.

## Qué debe contener un resultado de laboratorio

Un resultado que solo dice "Glucosa 126" no se puede interpretar de forma segura. Un resultado completo tiene:

- **Un código estándar.** LOINC identifica el analito, la muestra y el método: `2345-7` es glucosa en suero o plasma, `2339-0` es glucosa en sangre total. El código propio del laboratorio puede viajar junto a él.
- **Un valor con una unidad.** Idealmente una unidad UCUM (`mg/dL`, `mmol/L`, `10*3/uL`), para que los valores de dos laboratorios puedan convertirse y compararse.
- **El rango de referencia** que utilizó el laboratorio, y un indicador de **interpretación** (H, L, N…) cuando el laboratorio proporciona uno.
- **Estado:** preliminar, final, corregido o enmendado. Las correcciones ocurren; una API debe permitirle ver la nueva versión sin perder la antigua.
- **Fechas:** cuándo se recolectó la muestra (`effectiveDateTime`) y cuándo se publicó el resultado (`issued`).
- **Origen:** qué laboratorio lo produjo y a qué informe u orden pertenece.

En FHIR R4 cada resultado es una `Observation` con `category = laboratory`, y el informe que los agrupa es un `DiagnosticReport` que lista las Observaciones en `result`. Ejemplos válidos de ambos, con los errores que los validadores reportan con mayor frecuencia, se encuentran en los [ejemplos JSON de FHIR R4](https://developers.anpheros.com/tools/fhir-examples/observation-lab-result) — vea también el [ejemplo de DiagnosticReport](https://developers.anpheros.com/tools/fhir-examples/diagnostic-report).

## HL7 v2 y FHIR lado a lado

El mismo resultado de panel lipídico, como lo envían la mayoría de los laboratorios hoy en día y como debería almacenarlo una API:

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

| Campo HL7 v2 | Significado | Elemento Observation de FHIR R4 |
|---|---|---|
| OBX-3 `2093-3^Cholesterol^LN` | Prueba, codificada en LOINC | `code.coding` (sistema `http://loinc.org`) |
| OBX-5 `212`, OBX-2 `NM` | Valor numérico | `valueQuantity.value` |
| OBX-6 `mg/dL` | Unidad | `valueQuantity.unit` |
| OBX-7 `<200` | Rango de referencia | `referenceRange.high` |
| OBX-8 `H` | Indicador de anormalidad | `interpretation` |
| OBX-11 `F` | Resultado final | `status = final` |
| OBX-14 | Hora de la observación | `effectiveDateTime` |

La conversión entre ambos es principalmente un mapeo de campos. Las partes difíciles están en otro lugar: laboratorios que envían sus propios códigos en lugar de LOINC, números escritos como texto (`"6,4"`, `"<5"`), rangos en varias notaciones e informes que se envían nuevamente después de un tiempo de espera. [Cómo normalizar datos médicos](https://developers.anpheros.com/es/guides/normalize-medical-data) cubre esos aspectos en detalle.

## Recepción de resultados de laboratorio en un registro FHIR con Anpheros

Anpheros almacena el registro de cada paciente como HL7 FHIR R4 y tiene un [conector de laboratorio](https://developers.anpheros.com/es/guides/lab-connector): una solicitud toma un informe completo como HL7 v2, CSV o JSON y devuelve Observaciones de laboratorio con códigos LOINC, rangos de referencia, interpretación y procedencia.

```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
```

Para un panel lipídico de tres líneas (colesterol, HDL, triglicéridos), la respuesta, de una ejecución local de la plataforma, es:

```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"}
  ]
}
```

Cada resultado almacenado es una Observación FHIR R4 estándar, legible por cualquier cliente 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"}}]
}
```

Enviar el mismo mensaje nuevamente no crea nada nuevo (`"created": 0, "skipped": 3`): cada fila obtiene un identificador estable del ID del informe, código, fecha y valor. Los marcadores que la plataforma no puede mapear a LOINC conservan el código del laboratorio y regresan en `unmapped`, para que pueda corregir el mapeo en la fuente.

Leer resultados de vuelta es una búsqueda FHIR estándar:

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

Otras formas de entrada y salida de los mismos datos:

- **FHIR directamente:** `POST /fhir/R4/Observation`, o un Bundle de transacción con el `DiagnosticReport` y sus Observaciones juntas.
- **Eventos:** un [webhook](https://developers.anpheros.com/es/guides/webhooks) `resource.created` por Observación, para que una clínica o una aplicación pueda reaccionar cuando lleguen los resultados.
- **Para personas e IA:** el paciente ve los resultados en su aplicación; las aplicaciones a las que consienten leerlos; `POST /v1/context` proporciona a un modelo de IA un resumen etiquetado por fuente que incluye valores de laboratorio recientes.
- **Procedencia:** cada resultado importado registra `author_type = import`, el sistema de origen y el ID del informe ([procedencia de datos médicos](https://developers.anpheros.com/es/guides/medical-data-provenance)).

El recorrido completo, con un informe CSV, un mensaje HL7 v2, marcadores no mapeados e informes reenviados en un paciente sintético, es el tutorial [Cómo importar resultados de laboratorio en un registro FHIR](https://developers.anpheros.com/es/guides/import-lab-results-fhir).

## Comprobar resultados antes de enviarlos

El [validador FHIR R4 gratuito](https://developers.anpheros.com/tools/fhir-validator) comprueba la estructura de una Observation y los conjuntos de valores requeridos, y con el perfil `eu-lab` también comprueba lo que un resultado de laboratorio debe contener: la categoría `laboratory`, un código LOINC, un sujeto, un estado final-type, una hora, un valor, una unidad UCUM y un rango de referencia. Las mismas comprobaciones se ejecutan en la plataforma a través de `POST /fhir/R4/Observation/$validate?profile=eu-lab`.

## Elección de una API de resultados de laboratorio: una lista de verificación

- ¿Almacena los resultados como Observaciones FHIR R4 con códigos LOINC, o como filas en su propio esquema?
- ¿Puede aceptar los formatos que envían realmente los laboratorios (HL7 v2 en la mayoría de los hospitales, CSV o PDF de laboratorios más pequeños)?
- ¿Qué sucede con un marcador que no puede mapear: se rechaza, se descarta o se conserva con el código del laboratorio?
- ¿Son seguras las reintentos, o un informe reenviado crea duplicados?
- ¿Se versionan los resultados corregidos, y el valor anterior sigue siendo legible?
- ¿Se registra el origen de cada valor y es visible para el paciente?
- ¿Quién puede leer los resultados y se decide eso por el consentimiento del paciente?

## Lo que Anpheros no hace

Anpheros no es un sistema de información de laboratorio ni está conectado a redes de laboratorios comerciales: el laboratorio, la clínica o la aplicación del paciente envía el informe. No enruta pedidos de laboratorio, no lee informes en PDF a través de esta API (la aplicación Anpheros Daily extrae resultados de fotos y PDF en el lado del paciente) y no interpreta los resultados clínicamente. Las unidades se almacenan tal como las envía el laboratorio; su conversión a códigos UCUM corresponde al remitente, como se describe en [Cómo normalizar datos médicos](https://developers.anpheros.com/es/guides/normalize-medical-data).

## Preguntas frecuentes

### ¿Qué es una API de resultados de laboratorio?
Una interfaz que permite al software enviar o recibir resultados de laboratorio como datos estructurados —una prueba codificada, un valor con una unidad, un rango de referencia, un estado y una hora— en lugar de como un documento. Las API modernas de resultados de laboratorio utilizan los recursos Observation y DiagnosticReport de HL7 FHIR R4; la mayoría de los laboratorios todavía emiten mensajes HL7 v2 ORU^R01.

### ¿Qué sistema de codificación identifica las pruebas de laboratorio?
LOINC. Cada código LOINC nombra el analito, la muestra y, a menudo, el método, por lo que `2345-7` (glucosa en suero o plasma) y `2339-0` (glucosa en sangre total) son resultados diferentes. Las unidades se expresan mejor en UCUM.

### ¿Cuál es la diferencia entre un Observation y un DiagnosticReport?
Un Observation es un resultado, como colesterol 212 mg/dL. Un DiagnosticReport es el informe en su conjunto —el panel que se solicitó, quién lo emitió y cuándo— y enumera sus Observations en `result`.

### ¿Puedo importar mensajes HL7 v2 de laboratorio a un servidor FHIR?
Sí. Cada segmento OBX se mapea a una Observation (OBX-3 a `code`, OBX-5 y OBX-6 a `valueQuantity`, OBX-7 a `referenceRange`, OBX-8 a `interpretation`). El conector de laboratorio Anpheros hace esto en una sola solicitud y mantiene el ID del informe del laboratorio en Provenance.

### ¿Cómo evito duplicar resultados de laboratorio cuando se reenvía un informe?
Asigne a cada resultado un identificador estable derivado del informe, la prueba, la hora y el valor, y omita las filas cuyo identificador ya exista. El conector de laboratorio Anpheros hace esto automáticamente e informa el recuento como `skipped`.

## Relacionado

- [Mapeo de HL7 v2 a FHIR](https://developers.anpheros.com/es/guides/hl7-v2-to-fhir-mapping): cada segmento y campo OBX
- [Cómo importar resultados de laboratorio a un registro FHIR](https://developers.anpheros.com/es/guides/import-lab-results-fhir): el tutorial paso a paso
- [Conector de laboratorio](https://developers.anpheros.com/es/guides/lab-connector): la referencia del endpoint
- [Cómo normalizar datos médicos](https://developers.anpheros.com/es/guides/normalize-medical-data): LOINC, UCUM, fechas, rangos y duplicados
- [Explicación de la procedencia de los datos médicos](https://developers.anpheros.com/es/guides/medical-data-provenance)
- [Sistemas de códigos FHIR](https://developers.anpheros.com/es/guides/fhir-code-systems)
- [Cómo integrar sistemas de clínica con un backend FHIR](https://developers.anpheros.com/es/guides/integrate-clinic-systems-fhir)
- [FHIR vs HL7 v2: diferencias prácticas](https://developers.anpheros.com/es/guides/fhir-vs-hl7-v2)
- [HL7 v2 y FHIR para paneles clínicos](https://developers.anpheros.com/es/guides/clinical-dashboard-hl7-fhir): de un mensaje de laboratorio a un mosaico del panel
