|
<< Klicken Sie, um das Inhaltsverzeichnis anzuzeigen >> Navigation: Schnittstellen > FHIR Server (+) > Discovery und CodeSystems |
Der Endpunkt /fhir/metadata liefert eine maschinenlesbare Beschreibung aller Ressourcen, Suchparameter und Operationen des FHIR Servers, in FHIR-Sprache ein CapabilityStatement. Wenn Sie zum ersten Mal mit einem FHIR-Server arbeiten, fangen Sie hier an:
GET https://EMIL-Server:8443/fhir/metadata
Accept: application/fhir+json
Kein Auth-Header nötig: Das CapabilityStatement ist öffentlich, damit Clients die Schnittstelle entdecken können, bevor sie sich anmelden.
Aufbau der Antwort (gekürzt, ohne die documentation-Texte):
{
"resourceType": "CapabilityStatement",
"status": "active",
"date": "2026-10-23",
"kind": "instance",
"fhirVersion": "4.0.1",
"format": ["json"],
"software": { "name": "EMIL FHIR Server", "version": "5.7.7759" },
"implementation":{ "description": "EMIL FHIR Endpoint (Build 5.7.7759)",
"url": "https://EMIL-Server:8443/fhir" },
"description": "EMIL-Plattform FHIR-Server. ...",
"rest": [{
"mode": "server",
"security": {
"cors": true,
"service": [{ "coding": [{ "system": "http://terminology.hl7.org/CodeSystem/restful-security-service",
"code": "OAuth", "display": "OAuth2 client_credentials" }] }],
"extension": [{ "url": "http://fhir-registry.smarthealthit.org/StructureDefinition/oauth-uris",
"extension": [{ "url": "token",
"valueUri": "https://EMIL-Server:8443/fhir/token" },
{ "url": "authorize",
"valueUri": "https://EMIL-Server:8443/fhir/authorize" }] }]
},
"resource": [
{ "type": "Patient",
"interaction": [{ "code": "read" }, { "code": "search-type" }],
"searchParam": [{ "name": "identifier", "type": "token" },
{ "name": "family", "type": "string" },
{ "name": "given", "type": "string" },
{ "name": "name", "type": "string" }]
},
{ "type": "Observation",
"interaction": [{ "code": "create" }, { "code": "update" }]
},
{ "type": "Questionnaire",
"interaction": [{ "code": "read" }, { "code": "search-type" }]
},
{ "type": "Task",
"interaction": [{ "code": "read" }, { "code": "update" }, { "code": "search-type" }],
"searchParam": [{ "name": "_lastUpdated", "type": "date" },
{ "name": "status", "type": "token" }],
"searchInclude": ["Task:patient"]
},
{ "type": "CodeSystem", "interaction": [{ "code": "read" }] },
{ "type": "Media",
"interaction": [{ "code": "read" }, { "code": "search-type" }],
"searchParam": [{ "name": "patient", "type": "reference" },
{ "name": "category", "type": "token" },
{ "name": "date", "type": "date" }]
},
{ "type": "Binary", "interaction": [{ "code": "read" }] }
],
"operation": [
{ "name": "bundle", "definition": "https://emil.itc-ms.de/fhir/OperationDefinition/system-bundle" },
{ "name": "pid-config", "definition": "https://emil.itc-ms.de/fhir/OperationDefinition/system-pid-config" },
{ "name": "supported-questionnaires", "definition": "https://emil.itc-ms.de/fhir/OperationDefinition/system-supported-questionnaires" },
{ "name": "register-task-system", "definition": "https://emil.itc-ms.de/fhir/OperationDefinition/system-register-task-system" }
],
"interaction": [{ "code": "transaction" }]
}]
}
Was Sie daraus lesen können:
•Token- und Authorize-URL: rest[0].security.extension[].extension[] mit url='token' bzw. url='authorize'. Siehe Anmeldung (OAuth2).
•Lese- und schreibbare Ressourcen: jeder resource[]-Eintrag mit seinen interaction[]-Codes read, search-type, create, update.
•Suchparameter einer Ressource: resource[].searchParam[].
•System-Operationen und -Interaktionen: operation[] und rest[0].interaction[].
•Server-Version: software.version ist die Programmversion des EMIL-Servers im Format 5.J.nnnn (z. B. 5.7.7759); dieselbe Angabe steht in implementation.description. Geben Sie sie bei Support-Anfragen immer an.
Jeder Eintrag trägt zudem eine documentation-Property mit ausführlicher Erklärung (Mapping-Regeln, Whitelist-Verhalten, Standardwerte). Dort steht der Inhalt dieser Hilfe in Kurzform direkt am Server.
Ressource / Operation |
Interaktionen |
Zweck |
Patient |
read, search-type |
Patient suchen und lesen (Lesen). Anlegen und Ändern ist nicht möglich (405). |
Observation |
create, update |
Einzelwerte schreiben (Schreiben). Gelesen werden Observations über $bundle. |
QuestionnaireResponse |
create, update |
Formulare schreiben (Schreiben). Der Server nimmt POST und PUT an, die Ressource ist im CapabilityStatement aber nicht aufgeführt. Gelesen werden QuestionnaireResponses über $bundle. |
Questionnaire |
read, search-type |
Schmale Formulardefinition je Form-ItemType (Lesen). |
CodeSystem |
read |
Kataloge itemtype, study, drug, stop-reason, image-category, selection (unten). |
Media |
read, search-type |
Metadaten der Patientenbilder (Lesen). |
Binary |
read |
Bilddaten (JPEG) zu einem Media-Eintrag. |
Task |
read, update, search-type |
Fragebogen-Aufträge; nur für Fragebogensysteme. Ein Fragebogensystem sieht ausschließlich die eigenen Aufträge, setzt den Status per PUT (accepted, in-progress, rejected, failed) und liefert das Ergebnis als transaction-Bundle mit genau einer QuestionnaireResponse und dem Task (completed). |
transaction |
POST /fhir |
Rücklieferung fest verdrahteter Schnittstellen (RheCORD) als transaction-Bundle (Schreiben). Bundle.type=batch wird nicht verarbeitet. |
$bundle |
GET |
Kohorten-Export mit Paging (Lesen). |
$pid-config |
GET |
Liefert als Parameters das systemweit aktive Identifier-System, über das eingelieferte Patienten aufgelöst werden: activeSubjectIdentifierSystem (emil-internal, praxissystem oder kis). Der Wert ist je Installation fest; einmal abrufen und zwischenspeichern. Pflicht-Vorabschritt für die transaction-Rücklieferung. |
$supported-questionnaires |
GET, POST |
Nur Fragebogensysteme: POST ersetzt die Liste der Bögen, die das System ausfüllen lassen kann; GET liefert die gespeicherte Liste. |
$register-task-system |
POST (ohne Token) |
Anmeldung eines Fragebogensystems mit Herstellerlizenz von ITC (Parameter vendor, system, key). Der Kanal ist danach gültig, aber inaktiv; der Administrator der Einrichtung aktiviert ihn und erzeugt das Secret. |
Kompakter für OAuth-Clients ist GET /fhir/.well-known/smart-configuration (ohne Token, standardisiert nach „SMART on FHIR“). Die Antwort nennt:
•authorization_endpoint und token_endpoint,
•grant_types_supported: client_credentials, authorization_code und, solange nicht abgeschaltet, refresh_token,
•token_endpoint_auth_methods_supported: client_secret_post und client_secret_basic,
•code_challenge_methods_supported: S256,
•scopes_supported: system/*.read, patient/*.read und, solange Refresh-Tokens aktiv sind, offline_access.
Die Ressourcen verweisen über numerische IDs auf interne Konzepte: Ein ItemType ist z. B. 10038 = Körpergewicht, ein Medikament ist 124 = Methotrexat. Die Bedeutung dieser IDs lösen die folgenden CodeSystem-Ressourcen auf:
GET /fhir/CodeSystem/itemtype # ItemType-Wörterbuch (Felder)
GET /fhir/CodeSystem/study # Studienkatalog
GET /fhir/CodeSystem/drug # Medikamentenkatalog
GET /fhir/CodeSystem/stop-reason # Absetzgründe (1..10)
GET /fhir/CodeSystem/image-category # Bild-Kategorien (IMAGE_CAT)
GET /fhir/CodeSystem/selection # Selektionen (Abfragen)
Alle CodeSystems unterstützen Paging via _count (Standard 1000, 0 = kein Limit) und _offset (Standard 0). Bei geschnittenen Antworten liefert der Server zusätzlich meta.tag mit code="partial" und einen Link-Header mit rel="next"/"prev"/"first"/"last". Die Gesamtanzahl steht immer in der Top-Level-Property count (unabhängig vom Slice).
Das wichtigste CodeSystem: Hier stehen für jeden ItemType (also jedes Feld, das in einer Patientenakte vorkommen kann) Titel, Datentyp und gegebenenfalls die Auswahlwerte. Beispielaufruf und gekürzte Antwort (der dritte Eintrag „Allergien“ mit der ID 12345 ist ein fiktives Beispiel für eine Mehrfachauswahl):
GET /fhir/CodeSystem/itemtype?_count=3
Authorization: Bearer <token>
{
"resourceType": "CodeSystem",
"id": "itemtype",
"url": "https://emil.itc-ms.de/fhir/sid/itemtype",
"name": "EMILItemType",
"status": "active",
"content": "complete",
"count": 2483,
"property": [
{ "code": "area", "type": "code", "description": "L=laboratory, F=fixed/master data, V=visits" },
{ "code": "unit", "type": "string", "description": "Display unit (UCUM-aligned where applicable)" },
{ "code": "variable", "type": "string", "description": "Internal variable name used in EMIL formulas" },
{ "code": "kind", "type": "code", "description": "Item kind. Determines value cardinality..." },
{ "code": "enabled", "type": "boolean","description": "Only set on child concepts (coded values)..." }
],
"concept": [
{ "code": "10038",
"display": "Körpergewicht",
"property": [ { "code": "area", "valueCode": "V" },
{ "code": "unit", "valueString": "kg" },
{ "code": "variable", "valueString": "GEWICHT" },
{ "code": "kind", "valueCode": "number" } ]
},
{ "code": "10048",
"display": "BMI",
"property": [ { "code": "area", "valueCode": "V" },
{ "code": "unit", "valueString": "kg/m²" },
{ "code": "kind", "valueCode": "calc" } ]
},
{ "code": "12345",
"display": "Allergien",
"property": [ { "code": "area", "valueCode": "F" },
{ "code": "kind", "valueCode": "mlist" } ],
"concept": [
{ "code": "12345/POLLEN", "display": "Pollen" },
{ "code": "12345/PEANUT", "display": "Erdnüsse" },
{ "code": "12345/PENICILLIN", "display": "Penicillin",
"property": [ { "code": "enabled", "valueBoolean": false } ] }
]
}
]
}
So lesen Sie das:
•concept[].code ist die ItemType-ID. Damit bauen Sie in Observation/QuestionnaireResponse die code.coding[].code-Felder.
•property/kind sagt, was für ein Feldtyp das ist und wie der Wert auszusehen hat: number/numberu → Observation.valueQuantity mit der Einheit aus property/unit. slist → Observation.valueCodeableConcept mit genau einem coding[]. mlist → Observation.valueCodeableConcept mit einem coding[] pro gewählter Option. text und Varianten → valueString. date/datefuz/datefuzm (+ u-Varianten) → beim Lesen valueDateTime mit der Genauigkeit des Feldes (Jahr, Monat oder Tag), beim Schreiben valueString mit dem Datum als ISO-String. form/calcform/custform/custhform → eigene QuestionnaireResponse statt Observation. calc/calctext → berechnetes Feld, nicht direkt schreibbar. Der Server berechnet es selbst aus seinen Quell-Items.
•concept[].concept[] — verschachtelte Sub-Concepts. Nur bei kind=slist/mlist: die zulässigen Auswahlwerte. Der Sub-Code hat die Form <typeid>/<rawcode> — genau diese Form erscheint später in der Observation. Historische Werte (im Datendictionary als ausgeblendet markiert) tragen property/enabled = false.
•property/area: L = Labor, F = Stammdaten (einmalig pro Patient), V = Verlauf (pro Visit). Bestimmt, in welche Art von Encounter der Wert geschrieben werden muss (Stammdaten landen automatisch in der Fixed-Visit).
•property/unit: die Stamm-Einheit des Feldes. Beim Schreiben müssen Sie den Wert in dieser Einheit liefern; eine andere Einheit führt zu einem 400er-Fehler.
GET /fhir/CodeSystem/study
Authorization: Bearer <token>
{
"resourceType": "CodeSystem",
"id": "study",
"url": "https://emil.itc-ms.de/fhir/sid/study",
"name": "EMILStudy",
"status": "active",
"count": 47,
"concept": [
{ "code": "1850", "display": "RhDV Erwachsene 2024" },
{ "code": "1851", "display": "RABBIT" },
{ "code": "1852", "display": "Kids-RhDV" }
]
}
Die code-Werte sind die internen Studien-IDs, die Sie z. B. in $bundle?study=<id> oder in der Client-Liste (Spalte Erlaubte Studie) verwenden. Clients mit Studieneinschränkung sehen nur Studien, in die ihre Patienten eingeschlossen sind.
GET /fhir/CodeSystem/drug?_count=8&_offset=0
Authorization: Bearer <token>
{
"resourceType": "CodeSystem",
"id": "drug",
"url": "https://emil.itc-ms.de/fhir/sid/drug",
"name": "EMILDrug",
"title": "EMIL drugs",
"status": "active",
"content": "complete",
"caseSensitive": "true",
"count": 214,
"meta": { "tag": [ { "system": "https://emil.itc-ms.de/fhir/CodeSystem/paging",
"code": "partial", "display": "offset=0 count=8 total=214" } ] },
"concept": [
{ "code": "-5", "display": "Intraartikuläre Injektionen (Glukokortikoide)" },
{ "code": "-4", "display": "Intravenöse Pulstherapie (Glukokortikoide)" },
{ "code": "-3", "display": "Glukokortikoide low dose" },
{ "code": "-2", "display": "Glukokortikoide high dose" },
{ "code": "-1", "display": "Glukokortikoide" },
{ "code": "1", "display": "Orencia" },
{ "code": "2", "display": "Humira" },
{ "code": "3", "display": "Amgevita (Biosimilar)" }
]
}
Wird referenziert von MedicationStatement.medicationCodeableConcept.
Die Codes -1 bis -5 sind Pseudo-Präparate der formularbasierten Glukokortikoid-Dokumentation. Sie stehen nicht in der Präparate-Tabelle, werden aber wie echte Präparate als medicationCodeableConcept ausgegeben; deshalb enthält das CodeSystem sie, wegen der aufsteigenden Sortierung am Anfang. -1 ist die Kortison-Dokumentation der Erwachsenen-Rheumatologie (Item 52012), -2 bis -5 stammen aus der Kinderrheumatologie (Item 52223), siehe MedicationStatement.
Der Wert von count ist installationsabhängig (Präparate-Tabelle + 5 Pseudo-Präparate) und dient hier nur der Illustration des Pagings.
GET /fhir/CodeSystem/stop-reason
Authorization: Bearer <token>
{
"resourceType": "CodeSystem",
"id": "stop-reason",
"url": "https://emil.itc-ms.de/fhir/sid/stop-reason",
"status": "active",
"count": 10,
"concept": [
{ "code": "1", "display": "Remission" },
{ "code": "2", "display": "Nebenwirkung" },
{ "code": "3", "display": "Unzureichende Wirkung" },
{ "code": "4", "display": "Kontraindikation" },
{ "code": "5", "display": "Patientenwunsch / Kinderwunsch / Schwangerschaft" },
{ "code": "6", "display": "Compliance" },
{ "code": "7", "display": "Kosten" },
{ "code": "8", "display": "Sonstiges" },
{ "code": "9", "display": "Wirkverlust" },
{ "code": "10", "display": "Fehlendes Ansprechen" }
]
}
Wird referenziert von MedicationStatement.statusReason[].coding[] bei abgesetzten Medikationen.
Die gepflegten Bild-Kategorien (Tabelle IMAGE_CAT), auf die Media.modality verweist.
GET /fhir/CodeSystem/image-category
Authorization: Bearer <token>
{
"resourceType": "CodeSystem",
"id": "image-category",
"url": "https://emil.itc-ms.de/fhir/sid/image-category",
"status": "active",
"count": 6,
"concept": [
{ "code": "1", "display": "Befund" },
{ "code": "3", "display": "Röntgen" }
]
}
Die im Client unter Abfragen gepflegten Selektionen. Damit lässt sich eine im Client zusammengestellte Patientengruppe direkt als Export-Kohorte verwenden, ohne die Subject-IDs einzeln zu übergeben (siehe $bundle?selection=). Archivierte Selektionen werden nicht gelistet.
GET /fhir/CodeSystem/selection
Authorization: Bearer <token>
{
"resourceType": "CodeSystem",
"id": "selection",
"url": "https://emil.itc-ms.de/fhir/sid/selection",
"status": "active",
"count": 2,
"concept": [
{ "code": "14", "display": "RA-Patienten unter Biologika",
"property": [ { "code": "subjects", "valueInteger": 218 },
{ "code": "updated", "valueDateTime": "2026-07-28T03:12:44" },
{ "code": "dynamic", "valueBoolean": true } ] },
{ "code": "21", "display": "Studienkandidaten manuell",
"property": [ { "code": "subjects", "valueInteger": 12 },
{ "code": "dynamic", "valueBoolean": false } ] }
]
}
Die code-Werte sind die internen Selektions-IDs für $bundle?selection=<id>. Je Selektion werden drei Properties geliefert:
•subjects — Anzahl der aktuell in der Selektion enthaltenen Patienten.
•updated — Zeitpunkt, zu dem die Abfrage zuletzt ausgeführt wurde. Die Property fehlt, wenn die Selektion noch nie ausgeführt wurde oder es sich um eine manuell zusammengestellte Liste handelt (im Client: „Aktualität unbekannt").
•dynamic — true bei einer Abfrage, die im Client neu berechnet werden kann, false bei einer statischen, manuell zusammengestellten Patientenliste.