# Speichern von Krankenakten mit FHIR R4

> Tutorial: Erstellen Sie einen Patienten, eine Blutdruck-Observation und eine Condition, verwenden Sie eine Transaktion, suchen Sie, aktualisieren Sie mit Historie und lesen Sie die Provenienz – jede Anfrage mit curl und die tatsächliche Antwort, auf der kostenlosen Sandbox.

Source: https://developers.anpheros.com/de/guides/store-medical-records-fhir

**Dieses Tutorial speichert eine kleine Krankenakte als HL7 FHIR R4-Ressourcen: einen `Patient`, eine Blutdruck-`Observation` und eine Diagnose als `Condition`, dann einen Patienten und eine Messung zusammen in einer Transaktion. Es sucht diese, aktualisiert die Diagnose, ohne die frühere Version zu verlieren, und liest, wer was geschrieben hat.** Jede Anfrage ist ein einfacher `curl` gegen die kostenlose Anpheros-Sandbox, und jede gezeigte Antwort ist das, was die API zurückgibt.

Wenn Sie neu bei FHIR sind, lesen Sie zuerst [FHIR platform](https://developers.anpheros.com/de/guides/fhir) für die Konzepte. Diese Seite ist der praktische Teil.

## Die drei Ressourcen, mit denen die meisten Datensätze beginnen

| Ressource | Was sie enthält | Kodiert mit |
|---|---|---|
| `Patient` | Wer der Datensatz betrifft: Name, Geburtsdatum, Geschlecht, Identifikatoren aus anderen Systemen | Ihre Identifikationssysteme |
| `Observation` | Alles, was gemessen oder berichtet wird: Vitalparameter, Laborergebnisse, ein Gewicht, ein Symptom-Score | LOINC, UCUM-Einheiten |
| `Condition` | Eine Diagnose oder ein Gesundheitsproblem mit seinem Status über die Zeit | ICD-10 (SNOMED CT hinter einem Lizenz-Flag) |

Medikamente (`MedicationStatement`), Allergien (`AllergyIntolerance`), Impfungen und Dokumente folgen demselben Muster; die [26 unterstützten Ressourcentypen](https://developers.anpheros.com/de/guides/fhir) sind in der Capability Statement unter `/fhir/R4/metadata` aufgeführt.

## Bevor Sie beginnen

Holen Sie sich einen Sandbox-Schlüssel (`sk_test_…`) unter [platform.anpheros.com/dashboard](https://platform.anpheros.com/dashboard/) mit der Option **Get a sandbox key**. Nichts, was Sie dort erstellen, sind echte Patientendaten, und nichts ist für andere Projekte sichtbar.

```bash
export BASE=https://platform.anpheros.com/fhir/R4
export KEY=sk_test_…
```

## Schritt 1: Einen Patienten erstellen

```bash
curl -X POST "$BASE/Patient" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" -d '{
  "resourceType": "Patient",
  "identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-10442"}],
  "name": [{"family": "Marin", "given": ["Ioana"]}],
  "gender": "female",
  "birthDate": "1979-04-12"
}'
```

`201 Created`, mit der vom Server zugewiesenen ID und Version:

```json
{"resourceType": "Patient",
 "identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-10442"}],
 "name": [{"family": "Marin", "given": ["Ioana"]}], "gender": "female", "birthDate": "1979-04-12",
 "id": "d09e3942-ed86-4458-b099-fa674ab21b84",
 "meta": {"versionId": "1", "lastUpdated": "2026-10-12T20:16:51.043Z"}}
```

Behalten Sie Ihre eigenen IDs in `identifier` mit einer `system`, die Sie kontrollieren (hier eine Klinik-Aufzeichnungsnummer), damit Sie den Patienten immer mit `GET $BASE/Patient?identifier=https://clinic.example/mrn|MRN-10442` wiederfinden können. Die FHIR `id` ist die des Servers und spezifisch für Ihr Projekt: Ein anderes Projekt sieht dieselbe Person unter einer anderen ID.

```bash
export PID=d09e3942-ed86-4458-b099-fa674ab21b84
```

## Schritt 2: Eine Messung als Observation speichern

Blutdruck ist eine Observation mit zwei Komponenten, systolisch und diastolisch, jede mit eigenem LOINC-Code. Geben Sie an, wer gemessen hat: hier ein Heimgerät.

```bash
curl -X POST "$BASE/Observation" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H "X-Anpheros-Author-Type: device" -H "Idempotency-Key: bp-2026-10-10-0830" -d '{
  "resourceType": "Observation",
  "status": "final",
  "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
  "code": {"coding": [{"system": "http://loinc.org", "code": "85354-9", "display": "Blood pressure panel"}]},
  "subject": {"reference": "Patient/'$PID'"},
  "effectiveDateTime": "2026-10-10T08:30:00Z",
  "component": [
    {"code": {"coding": [{"system": "http://loinc.org", "code": "8480-6"}]},
     "valueQuantity": {"value": 138, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]"}},
    {"code": {"coding": [{"system": "http://loinc.org", "code": "8462-4"}]},
     "valueQuantity": {"value": 88, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]"}}
  ]
}'
```

Die Antwort ist die gespeicherte Ressource mit `id` und `meta.versionId: "1"`. Drei Details sind für eine nutzbare Aufzeichnung wichtig:

- **Codes statt Bezeichnungen.** `85354-9` bedeutet "Blutdruck-Panel" in jedem FHIR-System; ein Freitext "BP" nicht. Codes finden Sie mit `GET /v1/terminology/loinc?q=blood pressure` ([FHIR-Codesysteme](https://developers.anpheros.com/de/guides/fhir-code-systems)).
- **UCUM-Einheiten** (`mm[Hg]`, `kg`, `mg/dL`) in `valueQuantity.code`, damit Werte verglichen und umgerechnet werden können.
- **`Idempotency-Key`.** Ein erneuter Versuch nach einem Timeout gibt die erste Antwort zurück, anstatt die Messung doppelt zu speichern.

Laborergebnisse sind dieselbe Ressource mit `category` `laboratory` und normalerweise einem `referenceRange`. Um ganze Laborberichte zu importieren, siehe [Wie Laborergebnisse in eine FHIR-Aufzeichnung importiert werden](https://developers.anpheros.com/de/guides/import-lab-results-fhir).

## Schritt 3: Eine Diagnose als Condition aufzeichnen

```bash
curl -X POST "$BASE/Condition" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H "X-Anpheros-Author-Type: practitioner" -d '{
  "resourceType": "Condition",
  "subject": {"reference": "Patient/'$PID'"},
  "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "active"}]},
  "verificationStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", "code": "confirmed"}]},
  "code": {"coding": [{"system": "http://hl7.org/fhir/sid/icd-10", "code": "I10", "display": "Essential (primary) hypertension"}]},
  "onsetDateTime": "2026-03-02"
}'
```

`clinicalStatus` (active, resolved, in remission) und `verificationStatus` (confirmed, provisional) sind bewusst getrennt: eine vermutete Diagnose ist nicht dasselbe wie eine bestätigte, und ein behobenes Problem ist immer noch Teil der Historie.

## Schritt 4: Verwandte Ressourcen in einer Transaktion erstellen

Wenn ein Patient und seine erste Messung zusammen ankommen, zum Beispiel aus einem Kliniksystem, senden Sie diese als `transaction` Bundle. Entweder wird alles gespeichert oder nichts. Referenzen zwischen neuen Ressourcen verwenden temporäre `urn:uuid:` IDs, die der Server ersetzt:

```bash
curl -X POST "$BASE" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" -d '{
  "resourceType": "Bundle", "type": "transaction",
  "entry": [
    {"fullUrl": "urn:uuid:9f1c0d1e-0000-4000-8000-000000000001",
     "resource": {"resourceType": "Patient", "name": [{"family": "Stan", "given": ["Mihai"]}], "gender": "male", "birthDate": "1990-02-01"},
     "request": {"method": "POST", "url": "Patient"}},
    {"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": "29463-7", "display": "Body weight"}]},
       "subject": {"reference": "urn:uuid:9f1c0d1e-0000-4000-8000-000000000001"},
       "effectiveDateTime": "2026-10-10",
       "valueQuantity": {"value": 82.4, "unit": "kg", "system": "http://unitsofmeasure.org", "code": "kg"}},
     "request": {"method": "POST", "url": "Observation"}}
  ]
}'
```

Das `transaction-response` hat einen Eintrag pro Ressource, mit `"status": "201 Created"`, seiner `location` und der gespeicherten Ressource. Die `subject` der Observation verweist nun auf die echte `Patient/fad3665a-…`.

## Schritt 5: Suche

```bash
curl "$BASE/Observation?patient=$PID&code=http://loinc.org|85354-9&date=ge2026-10-01&_sort=-date" \
     -H "Authorization: Bearer $KEY"
```

Sie erhalten ein `searchset` Bundle mit `total` und den passenden Ressourcen, die neuesten zuerst. Andere Suchanfragen, die Sie oft verwenden werden: `Condition?patient=$PID&clinical-status=active`, `Observation?patient=$PID&category=laboratory` und `Patient/$PID/$everything` für den gesamten Datensatz.

## Schritt 6: Aktualisieren ohne Verlust der Historie

Die Hypertonie wird behoben. Ändern Sie den Status und fügen Sie das Enddatum hinzu. Verwenden Sie `If-Match` mit der Version, die Sie gelesen haben, um sicherzustellen, dass Sie niemals die Änderungen einer anderen Person überschreiben:

```bash
curl -X PUT "$BASE/Condition/$CID" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H 'If-Match: W/"1"' -d '{ …the same Condition…, "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "resolved"}]}, "abatementDateTime": "2026-10-11" }'
```

mit `200 OK` und `ETag: W/"2"`. Wenn ein anderer Schreibvorgang zuerst erfolgreich war, erhalten Sie `412` und lesen erneut. Die frühere Version ist immer noch vorhanden:

```bash
curl "$BASE/Condition/$CID/_history" -H "Authorization: Bearer $KEY"
```

gibt beide Versionen zurück: `versionId` 2 (`resolved`) und 1 (`active`). `GET $BASE/Condition/$CID/_history/1` liest die alte Version. Nichts in einem Datensatz wird stillschweigend überschrieben.

## Schritt 7: Sehen Sie, wer was geschrieben hat

Jeder Schreibvorgang erstellt eine `Provenance`-Ressource. Für den Blutdruckwert:

```bash
curl "$BASE/Provenance?target=Observation/$OBS" -H "Authorization: Bearer $KEY"
```

```json
{"resourceType": "Provenance",
 "target": [{"reference": "Observation/d83d9075-…/_history/1"}],
 "recorded": "2026-10-12T20:16:51.056000Z",
 "activity": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/v3-DataOperation", "code": "CREATE"}]},
 "agent": [{"type": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/provenance-participant-type", "code": "author"}]},
            "who": {"identifier": {"system": "https://anpheros.com/fhir/CodeSystem/author-type", "value": "device"}, "display": "proj_…"},
            "onBehalfOf": {"identifier": {"system": "https://anpheros.com/fhir/sid/organization", "value": "org_…"}, "display": "…"}}]}
```

Der von Ihnen gesendete Autorentyp (`device`) wird zusammen mit dem Projekt und der Organisation aufgezeichnet. Senden Sie `X-Anpheros-Author-Ref: Practitioner/<id>`, um den Kliniker hinter einem Schreibvorgang zu benennen.

## Schritt 8: Der Datensatz als Zusammenfassung

```bash
curl "$BASE/Patient/$PID/\$summary" -H "Authorization: Bearer $KEY"
```

gibt eine International Patient Summary zurück: ein `document` Bundle, das mit einem `Composition` beginnt und Abschnitte wie Probleme, Medikamente, Allergien und Vitalwerte enthält, die aus den oben genannten Ressourcen aufgebaut sind. Dies ist das Format, das an ein anderes System übergeben oder für einen Arzt ausgedruckt werden kann ([FHIR-Plattform](https://developers.anpheros.com/de/guides/fhir)).

## Bevorzugen Sie JSON ohne FHIR?

Dieselbe Daten sind über eine einfachere REST-Ansicht verfügbar, `/v1`, mit denselben IDs: `POST /v1/patients/{id}/observations` nimmt `{"code": "85354-9", "category": "vital-signs", "effective_at": "…", "components": […]}` und speichert dieselbe FHIR Observation. Verwenden Sie, was immer zu Ihrem Code passt. Siehe [Medical data API](https://developers.anpheros.com/de/guides/medical-data-api) und die [SDKs](https://developers.anpheros.com/de/guides/sdks).

## Häufig gestellte Fragen

### Was ist der beste Weg, medizinische Aufzeichnungen zu speichern?
Als kodierte, versionierte Ressourcen mit einem Protokoll, wer sie erstellt hat. HL7 FHIR R4 bietet Ihnen die Struktur (Patient, Observation, Condition und andere), Standard-Codesysteme wie LOINC und ICD-10 sowie die Historie; ein FHIR-Backend fügt Suche, Zustimmung und Provenienz hinzu.

### Benötige ich einen FHIR-Server, um FHIR zu verwenden?
Sie benötigen einen Ort, der FHIR-Ressourcen speichert und durchsucht und durchsetzt, wer sie lesen darf. Sie können einen Open-Source-FHIR-Server selbst betreiben oder einen verwalteten wie Anpheros nutzen; [Wie Anpheros im Vergleich zu anderen FHIR-Servern abschneidet](https://developers.anpheros.com/de/guides/fhir-server-comparison) wägt die Optionen ab, und [FHIR vs. eine benutzerdefinierte medizinische Datenbank](https://developers.anpheros.com/de/guides/fhir-vs-custom-database) behandelt den Aufbau Ihres eigenen Schemas.

### Wie speichere ich Blutdruck in FHIR?
Als eine `Observation` mit dem Code LOINC `85354-9` und zwei `component` Einträgen: systolisch `8480-6` und diastolisch `8462-4`, jeweils mit einer `valueQuantity` in `mm[Hg]`.

### Kann ich eine gespeicherte Ressource ändern?
Ja, mit `PUT` und `If-Match`. Jede Änderung erstellt eine neue Version; frühere Versionen bleiben über `_history` lesbar, und Provenance-Datensätze protokollieren, wer jede Änderung vorgenommen hat. Löschungen sind "soft" und behalten die Historie.

## Verwandte Themen

- [FHIR-Plattform](https://developers.anpheros.com/de/guides/fhir): Konzepte, Ressourcentypen und Operationen
- [FHIR-Codesysteme](https://developers.anpheros.com/de/guides/fhir-code-systems): LOINC, ICD-10, ATC, UCUM
- [Importieren von Laborergebnissen in einen FHIR-Datensatz](https://developers.anpheros.com/de/guides/import-lab-results-fhir)
- [Medical Data API](https://developers.anpheros.com/de/guides/medical-data-api): die einfachere REST-Ansicht derselben Daten
- [Kostenlose FHIR-Datenbank und Sandbox](https://developers.anpheros.com/de/guides/free-fhir-database)
