TL;DR
EHR-APIs ermöglichen den Zugriff auf Patientenakten in Systemen wie Epic, Cerner und Athenahealth. Moderne EHRs unterstützen FHIR (Fast Healthcare Interoperability Resources), ein Standardformat für Gesundheitsdaten. Die Authentifizierung erfolgt über OAuth 2.0 mit SMART on FHIR-Erweiterungen. Nutzen Sie für Entwicklung und Test Apidog, um FHIR-Ressourcen zu validieren, Sandboxes zu testen und Ihre Integration abzusichern, bevor Sie mit Produktionsdaten arbeiten.
Einleitung
Elektronische Gesundheitsakten (EHRs) speichern alle relevanten Patientendaten: Diagnosen, Medikamente, Laborwerte, Allergien und Behandlungspläne. Anbieter wie Epic, Cerner und Athenahealth nutzen diese Systeme.
Für die Entwicklung von Gesundheitsanwendungen ist eine stabile API-Anbindung an diese Systeme unerlässlich. CSV-Exporte sind keine Option – APIs sind Standard. Gesundheits-APIs müssen jedoch den Schutz sensibler Daten (PHI) und regulatorische Vorgaben (z.B. HIPAA) gewährleisten.
Die meisten Anbieter unterstützen nun FHIR – ein standardisiertes API-Format. Herausforderungen bleiben: Authentifizierung, Autorisierung und Datenmapping.
Mit Apidog können Sie Ihre FHIR-Anbindung testen, Datenstrukturen validieren und Integrationen gegen öffentliche Sandboxes prüfen, bevor Sie mit echten Krankenhäusern arbeiten.
Am Ende dieses Guides können Sie:
- Die FHIR-Ressourcentypen und deren Struktur verstehen
- Authentifizieren mit SMART on FHIR
- Patientendaten und klinische Ressourcen abfragen
- Patientenressourcen erstellen und aktualisieren
- Gegen EHR-Sandboxes testen
FHIR verstehen
FHIR (Fast Healthcare Interoperability Resources) ist der aktuelle Standard für Gesundheits-APIs. Er definiert:
- Ressourcen: Datentypen für Gesundheitskonzepte (z.B. Patient, Observation, Medication)
- REST-API: Standardisierte CRUD-Operationen auf Ressourcen
- Formate: JSON und XML
Basis-URL-Struktur
https://ehr.example.com/fhir/r4/{resource-type}/{id}
Beispiel:
GET https://ehr.example.com/fhir/r4/Patient/123
FHIR-Version
Die meisten Systeme nutzen FHIR R4 (Release 4). Ältere Systeme können DSTU2 verwenden. Dieser Leitfaden behandelt R4.
Ressourcentypen
| Ressource | Zweck |
|---|---|
| Patient | Demografische/administrative Daten |
| Practitioner | Gesundheitsdienstleister |
| Organization | Einrichtungen (Krankenhaus, Klinik) |
| Observation | Laborergebnisse, Vitalwerte |
| MedicationRequest | Verschreibungen |
| Condition | Diagnosen, Probleme |
| Encounter | Besuche, Aufnahmen |
| DocumentReference | Klinische Dokumente |
| AllergyIntolerance | Allergien, unerwünschte Reaktionen |
FHIR-Ressourcenstruktur
Beispiel: Patientenressource
{
"resourceType": "Patient",
"id": "123",
"active": true,
"name": [
{
"use": "official",
"family": "Smith",
"given": ["John", "Michael"]
}
],
"gender": "male",
"birthDate": "1985-03-15",
"address": [
{
"use": "home",
"line": ["123 Main St"],
"city": "Boston",
"state": "MA",
"postalCode": "02101",
"country": "USA"
}
],
"telecom": [
{
"system": "phone",
"value": "555-123-4567",
"use": "home"
},
{
"system": "email",
"value": "john.smith@example.com"
}
],
"identifier": [
{
"system": "http://hospital.example.org/mrn",
"value": "MRN-123456"
}
]
}
Beispiel: Beobachtungsressource
{
"resourceType": "Observation",
"id": "obs-123",
"status": "final",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/observation-category",
"code": "vital-signs",
"display": "Vital Signs"
}
]
}
],
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8480-6",
"display": "Systolic blood pressure"
}
]
},
"subject": {
"reference": "Patient/123"
},
"effectiveDateTime": "2026-03-24T09:30:00Z",
"valueQuantity": {
"value": 120,
"unit": "mmHg",
"system": "http://unitsofmeasure.org",
"code": "mm[Hg]"
}
}
Authentifizierung mit SMART on FHIR
SMART on FHIR erweitert OAuth 2.0 für den Healthcare-Bereich. Es unterstützt Patientenkontext und spezifische Scopes.
OAuth-Flow für Patientenzugriff
Schritt 1: Autorisierungs-URL abrufen
GET https://ehr.example.com/fhir/r4/.well-known/smart-configuration
Antwort:
{
"authorization_endpoint": "https://ehr.example.com/oauth2/authorize",
"token_endpoint": "https://ehr.example.com/oauth2/token",
"scopes_supported": [
"patient/*.read",
"patient/*.write",
"user/*.read",
"launch/patient"
]
}
Schritt 2: Benutzer zur Autorisierung umleiten
https://ehr.example.com/oauth2/authorize?
response_type=code&
client_id=YOUR_CLIENT_ID&
redirect_uri=https://yourapp.com/callback&
scope=patient/*.read&
state=random_state_value
Schritt 3: Code gegen Token tauschen
curl -X POST "https://ehr.example.com/oauth2/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "code=AUTHORIZATION_CODE" \
-d "redirect_uri=https://yourapp.com/callback" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET"
Antwort:
{
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "patient/*.read",
"patient": "123"
}
Das Feld patient gibt die Patienten-ID für den Kontext zurück.
SMART-Scopes
| Scope | Zugriff |
|---|---|
patient/*.read |
Alle Patientendaten lesen |
patient/Patient.read |
Nur Patientendemografie lesen |
patient/Observation.read |
Nur Beobachtungen lesen |
user/*.read |
Alle Daten für autorisierten Benutzer lesen |
launch/patient |
App mit Patientenkontext starten |
Patientendaten abfragen
Patientendemografie abrufen
curl -X GET "https://ehr.example.com/fhir/r4/Patient/123" \
-H "Authorization: Bearer ACCESS_TOKEN"
Nach Beobachtungen suchen
curl -X GET "https://ehr.example.com/fhir/r4/Observation?patient=123&category=vital-signs" \
-H "Authorization: Bearer ACCESS_TOKEN"
Antwort (Bundle):
{
"resourceType": "Bundle",
"type": "searchset",
"total": 5,
"entry": [
{
"resource": { ... Observation resource ... }
}
]
}
Häufige Suchparameter
# Laborergebnisse nach Datumsbereich
GET /Observation?patient=123&category=laboratory&date=gt2026-01-01
# Spezifischer LOINC-Code
GET /Observation?patient=123&code=http://loinc.org|8480-6
# Medikamente
GET /MedicationRequest?patient=123&status=active
# Diagnosen
GET /Condition?patient=123&clinical-status=active
# Begegnungen
GET /Encounter?patient=123&type=AMB
Paginierung
Bei großen Ergebnismengen:
GET /Observation?patient=123&_count=20
Antwort enthält Links zur nächsten Seite:
{
"link": [
{
"relation": "next",
"url": "https://ehr.example.com/fhir/r4/Observation?patient=123&_count=20&page=2"
}
]
}
Ressourcen erstellen und aktualisieren
Eine Beobachtung erstellen
curl -X POST "https://ehr.example.com/fhir/r4/Observation" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-H "Content-Type: application/fhir+json" \
-d '{
"resourceType": "Observation",
"status": "final",
"code": {
"coding": [{
"system": "http://loinc.org",
"code": "8480-6",
"display": "Systolic blood pressure"
}]
},
"subject": {
"reference": "Patient/123"
},
"effectiveDateTime": "2026-03-24T09:30:00Z",
"valueQuantity": {
"value": 118,
"unit": "mmHg",
"system": "http://unitsofmeasure.org",
"code": "mm[Hg]"
}
}'
Einen Patienten aktualisieren
curl -X PUT "https://ehr.example.com/fhir/r4/Patient/123" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-H "Content-Type: application/fhir+json" \
-d '{
"resourceType": "Patient",
"id": "123",
"name": [{
"family": "Smith",
"given": ["John", "Michael"]
}],
"telecom": [{
"system": "phone",
"value": "555-999-8888",
"use": "home"
}]
}'
EHR-Anbieterspezifika
Epic
- Basis-URL:
https://fhir.epic.com/interconnect-fhir-oauth/api/FHIR/R4/ - Sandbox:
https://fhir.epic.com/test/api/FHIR/R4/ - Dokumentation: https://fhir.epic.com
App-Registrierung im Epic-Marktplatz für Produktionszugang erforderlich.
Cerner
- Basis-URL:
https://fhir-myrecord.cerner.com/r4/{tenant-id} - Sandbox:
https://fhir-deprecated.cerner.com/r4/ec2458f2-1e24-41c8-b71b-0e701af7583d - Dokumentation: https://docs.oracle.com/en/health/health-cerner/
Athenahealth
- Basis-URL:
https://api.platform.athenahealth.com/fhir/r4/{practice-id} - Sandbox: Über Entwicklerprogramm verfügbar
- Dokumentation: https://docs.athenahealth.com
Testen mit Apidog
Gesundheits-APIs erfordern präzise Tests – Patientendaten sind sensibel.
1. Öffentliche Sandboxes nutzen
Testen Sie gegen öffentliche FHIR-Sandboxes:
# HAPI FHIR (Open Source)
https://hapi.fhir.org/baseR4
# SMART Health IT Sandbox
https://launch.smarthealthit.org
2. FHIR-Ressourcen validieren
Nutzen Sie Tests, um die Struktur zu prüfen:
pm.test('Resource is valid Patient', () => {
const response = pm.response.json()
pm.expect(response.resourceType).to.eql('Patient')
pm.expect(response.id).to.exist
pm.expect(response.name).to.be.an('array')
})
pm.test('Observation has required fields', () => {
const resource = pm.response.json()
pm.expect(resource.status).to.exist
pm.expect(resource.code).to.exist
pm.expect(resource.subject).to.exist
})
3. Authentifizierungs-Flow testen
SMART-Konfigurationsvariablen als Umgebung speichern:
AUTHORIZATION_ENDPOINT: https://ehr.example.com/oauth2/authorize
TOKEN_ENDPOINT: https://ehr.example.com/oauth2/token
CLIENT_ID: your_client_id
CLIENT_SECRET: your_client_secret
SCOPE: patient/*.read
Compliance-Aspekte
HIPAA
Für US-Healthcare-Apps ist HIPAA-Compliance Pflicht:
- Datenübertragung: Verwenden Sie TLS 1.2 oder höher
- Datenspeicherung: Verschlüsselung (at rest)
- Zugriffskontrolle: Audit-Logs, minimaler Zugriff
- Business Associate Agreement (BAA): Mit EHR-Anbietern abschließen
SMART on FHIR-Sicherheit
- Tokens laufen ab (typisch: 1 Stunde)
- Refresh-Tokens für längere Sitzungen verwenden
- Patientenkontext ist im Token-Scope verankert
- Abmeldung erfordert Token-Widerruf
Datenminimierung
Fordern Sie nur notwendige Scopes an:
- Empfohlen:
patient/Observation.read - Vermeiden Sie
patient/*.read, falls nicht erforderlich
Häufige Fehler und Behebungen
401 Nicht autorisiert
Ursache: Token abgelaufen/ungültig
Lösung: Token mit Refresh-Token aktualisieren.
403 Verboten
Ursache: Angeforderte Ressource nicht im Scope
Lösung: Scopes überprüfen und ggf. erweitern.
404 Nicht gefunden
Ursache: Patient/Ressource existiert nicht
Lösung: Ressourcen-ID kontrollieren, Patientenkontext prüfen.
422 Unverarbeitbare Entität
Ursache: FHIR-Ressourcenvalidierung fehlgeschlagen
Lösung: Pflichtfelder und Terminologien prüfen:
{
"resourceType": "OperationOutcome",
"issue": [{
"severity": "error",
"code": "required",
"details": {
"text": "Observation.status is required"
}
}]
}
Alternativen und Vergleiche
| Merkmal | Epic | Cerner | Athenahealth | OpenEMR |
|---|---|---|---|---|
| FHIR R4 | ✓ | ✓ | ✓ | Teilweise |
| SMART on FHIR | ✓ | ✓ | ✓ | Nein |
| Sandbox-Zugriff | ✓ | ✓ | Begrenzt | Selbst gehostet |
| API-Dokumentation | Exzellent | Gut | Gut | Grundlegend |
| Marktanteil | Große KHs | Gesundheitssys | Kleine Praxen | Open Source |
Epic und Cerner dominieren große Systeme. Athenahealth ist für kleinere Praxen. OpenEMR ist Open Source, aber API-Support eingeschränkt.
Praktische Anwendungsfälle
- Patientenportal: Patienten erhalten Live-Zugriff auf Laborergebnisse, Medikamente und Termine aus Epic. FHIR-APIs und SMART on FHIR steuern Authentifizierung und Datenfluss.
- Klinische Forschung: Pharmaunternehmen suchen gezielt Patienten für Studien. FHIR-APIs filtern geeignete Kandidaten über mehrere EHRs hinweg – stets mit Einwilligungsmanagement.
- Fernüberwachung: Telemedizin-Anbieter übermitteln Vitaldaten direkt an EHR-Systeme. Beobachtungen werden via FHIR-API erstellt und sind für Ärzte sofort sichtbar.
Zusammenfassung
Das haben Sie gelernt:
- FHIR ist der Standard für moderne Gesundheits-APIs
- Ressourcen repräsentieren medizinische Konzepte (Patient, Observation, usw.)
- SMART on FHIR ergänzt OAuth um Patientenkontext
- Jeder EHR-Anbieter erfordert eigene Implementierungsdetails
- Testen Sie Integrationen zuerst in Sandboxes
Nächste Schritte:
- Nutzen Sie die HAPI FHIR Sandbox für eigene Tests
- Analysieren Sie FHIR-Ressourcentypen für Ihre Anforderungen
- Melden Sie sich für EHR-Entwicklerprogramme an
- Testen Sie mit Apidog und Mock-Daten
- Beachten Sie HIPAA-Compliance für Datenverarbeitung
Video: API-Dokumentation mit Apidog
FAQ
Was ist der Unterschied zwischen FHIR und HL7 v2?
HL7 v2 ist ein älterer Messaging-Standard, v.a. für Schnittstellen. FHIR ist ein moderner REST-API-Standard. Neue Integrationen nutzen meist FHIR; HL7 v2 bleibt in Legacy-Systemen verbreitet.
Brauche ich ein BAA für EHR-APIs?
Ja, wenn Sie PHI verarbeiten. Ein Business Associate Agreement ist Voraussetzung – sprechen Sie mit dem Compliance-Team des EHR-Anbieters.
Wie bekomme ich Zugriff auf Epics FHIR-API?
Registrieren Sie Ihre Anwendung im Epic App Orchard. Für Sandbox-Tests nutzen Sie die öffentliche FHIR-Sandbox. Produktionszugriff erfordert Genehmigung durch das betreffende Krankenhaus.
Was ist Patientenkontext?
SMART on FHIR-Tokens enthalten eine Patienten-ID. Damit sind API-Calls auf diesen Patienten beschränkt – das schützt die Autonomie und Privatsphäre.
Kann ich Daten in EHRs schreiben?
Mit Einschränkungen: Beobachtungen und Patientendaten lassen sich meist schreiben. Für Diagnosen/Medikationen ist oft eine klinische Freigabe notwendig.
Wie gehe ich mit Terminologie-Codes um?
FHIR nutzt Standard-Terminologien:
- LOINC für Labortests und Beobachtungen
- SNOMED CT für klinische Konzepte
- ICD-10 für Diagnosen
- RxNorm für Medikamente
Nutzen Sie diese Codes konsequent in Ihren Ressourcen.
Internationales Gesundheitswesen?
FHIR ist weltweit im Einsatz. Jedes Land kann eigene Implementierungsleitfäden haben. In den USA ist das US Core-Profil Standard. Prüfen Sie die Spezifikationen Ihrer Zielregion.

Top comments (0)