AnpherosAnpheros PlatformDevelopers

Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card

Cómo integrar sistemas de clínicas con un backend FHIR

Tutorial: conectar un EMR de clínica a los registros FHIR R4 de los pacientes — directorio de médicos, coincidencia por número de registro, una visita como una transacción con el médico como autor, informes de laboratorio, datos de otros proveedores y webhooks.

Este tutorial conecta el software de una clínica (un EMR, un sistema de gestión de consultorios o una herramienta de reserva) a los registros HL7 FHIR R4 de pacientes en Anpheros: la clínica y sus médicos se registran en el directorio, los pacientes se emparejan por el número de registro de la clínica, una visita se registra como una transacción con el médico nombrado como autor, y la clínica se entera de los datos que otros proveedores agregan. Cada solicitud se curl contra el sandbox gratuito, y las respuestas son propias de la plataforma.

La integración se ejecuta en el servidor de la clínica, con una clave API de proyecto para los pacientes que la clínica registra y, para las personas que ya tienen un registro Anpheros, una concesión OAuth que aprueban.

Qué se mapea a qué

En el sistema de la clínica En FHIR R4
la clínica, sus departamentos Organization
un médico o enfermero Practitioner
esa persona trabajando en esa clínica, con una especialidad PractitionerRole
el archivo del paciente y su número Patient con un identifier en el sistema de la clínica
una visita Encounter
signos vitales, resultados medidos durante la visita Observation vinculados a la Encounter
un diagnóstico Condition (ICD-10), con verificationStatus provisional o confirmado
una prescripción, tratamiento actual MedicationStatement (ATC)
una carta, un resumen de alta, un escaneo DocumentReference con el archivo
resultados de laboratorio el conector de laboratorio, en Observation

Paso 1: registrar la clínica y sus médicos

Los recursos de directorio no tienen pacientes. Otros proyectos en el mismo entorno pueden leerlos, por lo que otros proveedores de un paciente ven quién escribió qué, pero solo su proyecto puede modificarlos.

export BASE=https://platform.anpheros.com/fhir/R4
export KEY=sk_test_…
H=(-H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json")

curl -X POST $BASE/Organization "${H[@]}" -d '{"resourceType": "Organization", "active": true, "name": "Clinica Cardio Nord",
  "identifier": [{"system": "https://clinic.example/org", "value": "CCN"}]}'

curl -X POST $BASE/Practitioner "${H[@]}" -d '{"resourceType": "Practitioner", "active": true,
  "name": [{"family": "Popescu", "given": ["Ana"], "prefix": ["Dr."]}]}'

curl -X POST $BASE/PractitionerRole "${H[@]}" -d '{"resourceType": "PractitionerRole", "active": true,
  "practitioner": {"reference": "Practitioner/'$PRACTITIONER'"},
  "organization": {"reference": "Organization/'$ORG'"},
  "code": [{"text": "Cardiologist"}]}'

Conserve los IDs devueltos junto a los registros de su personal. Cuando alguien se marche, establezca su PractitionerRole a "active": false; sus escritos anteriores conservan su nombre y ya no podrán actuar a través de su sistema.

Paso 2: emparejar pacientes

Para los pacientes que la clínica registra, cree el Patient con el número de registro de la clínica como identificador:

curl -X POST $BASE/Patient "${H[@]}" -d '{"resourceType": "Patient",
  "identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-20981"}],
  "name": [{"family": "Dinu", "given": ["Andrei"]}], "gender": "male", "birthDate": "1968-11-05"}'

A partir de entonces, busque al paciente por ese número, nunca por nombre y fecha de nacimiento:

curl "$BASE/Patient?identifier=https://clinic.example/mrn|MRN-20981" -H "Authorization: Bearer $KEY"

Cuando la persona ya tiene un registro en Anpheros, desde su propia aplicación u otro proveedor, la clínica no crea un segundo. Solicita a la persona acceso con OAuth, desde una tableta en el mostrador de recepción o un enlace enviado antes de la visita, utilizando una aplicación confidencial (el servidor de la clínica mantiene el secreto). La persona elige su registro y por cuánto tiempo la clínica puede acceder a él. Los pasos se encuentran en Cómo implementar el consentimiento del paciente con SMART on FHIR; el campo patient del token es el id a almacenar con su archivo.

Paso 3: Escribir una visita como una transacción

Una visita produce varios recursos que pertenecen juntos. Envíelos en una transaction para que se almacenen todos a la vez o ninguno, y especifique quién está trabajando: X-Anpheros-Acting-As nombra el rol del médico. Se convierte en el autor en Provenance, se escribe en el registro de acceso y se muestra al paciente por nombre.

curl -X POST $BASE "${H[@]}" \
  -H "X-Anpheros-Acting-As: PractitionerRole/$ROLE" \
  -H "X-Anpheros-Author-Type: practitioner" \
  -H "X-Anpheros-Source-System: ccn-emr" -d '{
  "resourceType": "Bundle", "type": "transaction",
  "entry": [
    {"fullUrl": "urn:uuid:aa000000-0000-4000-8000-000000000001",
     "resource": {"resourceType": "Encounter", "status": "finished",
       "class": {"system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", "code": "AMB", "display": "ambulatory"},
       "subject": {"reference": "Patient/'$PID'"},
       "serviceProvider": {"reference": "Organization/'$ORG'"},
       "participant": [{"individual": {"reference": "PractitionerRole/'$ROLE'"}}],
       "period": {"start": "2026-10-09T10:00:00Z", "end": "2026-10-09T10:30:00Z"}},
     "request": {"method": "POST", "url": "Encounter"}},
    {"resource": {"resourceType": "Observation", "status": "final",
       "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
       "code": {"coding": [{"system": "http://loinc.org", "code": "8867-4", "display": "Heart rate"}]},
       "subject": {"reference": "Patient/'$PID'"},
       "encounter": {"reference": "urn:uuid:aa000000-0000-4000-8000-000000000001"},
       "effectiveDateTime": "2026-10-09T10:10:00Z",
       "valueQuantity": {"value": 92, "unit": "/min", "system": "http://unitsofmeasure.org", "code": "/min"}},
     "request": {"method": "POST", "url": "Observation"}},
    {"resource": {"resourceType": "Condition",
       "subject": {"reference": "Patient/'$PID'"},
       "encounter": {"reference": "urn:uuid:aa000000-0000-4000-8000-000000000001"},
       "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "active"}]},
       "verificationStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", "code": "provisional"}]},
       "code": {"coding": [{"system": "http://hl7.org/fhir/sid/icd-10", "code": "I48.0", "display": "Paroxysmal atrial fibrillation"}]}},
     "request": {"method": "POST", "url": "Condition"}}
  ]}'

El transaction-response tiene 201 Created para el Encounter, el Observation y el Condition. El Observation y el Condition ahora apuntan al Encounter/0ca25459-… real. La Provenance de cada uno nombra el rol del médico, la clínica y el sistema de origen:

"agent": [{"who": {"reference": "PractitionerRole/e6d8c227-…",
                   "identifier": {"system": "https://anpheros.com/fhir/CodeSystem/author-type", "value": "practitioner"}},
           "onBehalfOf": {"reference": "Organization/c3a56a4b-…", "display": "Clinica Cardio Nord"}}],
"entity": [{"role": "source", "what": {"identifier": {"system": "ccn-emr"}}}]

El diagnóstico está provisional hasta que se confirme. Actualícelo a confirmed más tarde, y el historial conserva ambos. El significado de cada campo se explica en Explicación de la procedencia de datos médicos.

Paso 4: Resultados de laboratorio y documentos

Los resultados del laboratorio propio de la clínica, o los informes que trae el paciente, pasan por el conector de laboratorio en una solicitud por informe:

curl -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: ccn-lab" --data-binary @oru.hl7

Las cartas y los resúmenes de alta son documentos: cree un DocumentReference a través de /v1/patients/{id}/documents y cargue el PDF. El archivo original nunca se modifica, y los valores extraídos de él apuntan de vuelta a él. Consulte Cómo importar resultados de laboratorio a un registro FHIR y API de datos médicos.

Paso 5: Lea lo que otros proveedores escribieron y manténgase en su carril

Con el consentimiento del paciente, la clínica lee el registro completo dentro de sus alcances, incluyendo lo que otras clínicas, laboratorios y el paciente agregaron. Solo puede cambiar lo que escribió. Una actualización o eliminación de un recurso de otra organización responde 403, y el original permanece como estaba. Para corregir algo que otro proveedor escribió, escriba su propio recurso (por ejemplo, un nuevo Condition con su evaluación) y deje que el registro muestre ambos, cada uno con su autor.

Antes de una visita, GET $BASE/Patient/$PID/$summary proporciona el Resumen Internacional del Paciente del registro: problemas, medicamentos, alergias y signos vitales recientes, de todas las fuentes.

Paso 6: Recibir notificaciones de nuevos datos

Registre un webhook una vez para el proyecto de la clínica:

curl -X POST https://platform.anpheros.com/v1/webhooks -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
     -d '{"url": "https://ccn.example/anpheros/hook", "events": ["resource.created", "resource.updated", "consent.revoked"]}'

Cuando otro proyecto escribe en un registro al que su clínica puede acceder, el evento lo indica con data.external: true y la fuente, de modo que su EMR pueda mostrar "nuevos resultados de otro laboratorio" sin necesidad de sondeos. Un evento consent.revoked significa que la persona ha revocado el acceso de la clínica: deje de sincronizar ese registro. Las firmas, reintentos y cargas útiles se cubren en Webhooks.

Lo que ve el paciente

El paciente ve la visita, la frecuencia cardíaca y el diagnóstico provisional en su registro, cada uno marcado como añadido por la Dra. Ana Popescu en la Clínica Cardio Nord. En sus conexiones, la aplicación de la clínica enumera cada acceso, por nombre cuando un profesional estaba actuando. Esa transparencia es lo que hace que los pacientes estén dispuestos a conceder acceso a la siguiente clínica.

Lista de verificación para la puesta en marcha

Preguntas frecuentes

¿Anpheros tiene un conector prefabricado para mi EMR?

No. No existen conectores prefabricados para EMRs o sistemas de laboratorio específicos; la integración se construye contra las API REST y FHIR R4, generalmente como un pequeño servicio junto al EMR. Los mensajes de laboratorio HL7 v2 se aceptan tal cual.

¿Puede un médico trabajar para dos clínicas?

Sí. Un Practitioner puede tener un PractitionerRole en cada organización. El rol nombrado en X-Anpheros-Acting-As decide para qué clínica se registra cada escritura.

¿Qué sucede cuando el paciente revoca el acceso de la clínica?

Las llamadas de la clínica para ese registro responden 401, y se envía un webhook consent.revoked. Lo que la clínica escribió permanece en el registro del paciente con su procedencia; la clínica simplemente ya no puede leerlo ni modificarlo.

Relacionado

Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card

Product updates by email

New features, guides and the end of the beta. One email a month at most.

Send me occasional Anpheros Platform updates by email (new features, API changes, guides). I'll confirm by email and can unsubscribe in one click from any email. Privacy