AnpherosAnpheros PlatformDevelopers

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

Cum se stochează dosare medicale folosind FHIR R4

Tutorial: creați un Pacient, o observație a tensiunii arteriale și o Afecțiune, folosiți o tranzacție, căutați, actualizați cu istoric și citiți proveniența — fiecare cerere cu curl și răspunsul real, pe sandbox-ul gratuit.

**Acest tutorial stochează un mic dosar medical ca resurse HL7 FHIR R4: un Patient, o Observation a tensiunii arteriale și un diagnostic sub forma unui Condition, apoi un pacient și o măsurătoare împreună într-o singură tranzacție. Le caută, actualizează diagnosticul fără a pierde versiunea anterioară și citește cine a scris ce. Fiecare cerere este curl simplu împotriva sandbox-ului gratuit Anpheros, iar fiecare răspuns afișat este ceea ce returnează API-ul.

Dacă sunteți nou în FHIR, citiți mai întâi Platforma FHIR pentru concepte. Această pagină este partea practică.

Cele trei resurse cu care încep majoritatea înregistrărilor

Resursă Ce conține Codificat cu
Patient despre cine este înregistrarea: nume, data nașterii, gen, identificatori din alte sisteme sistemele dvs. de identificare
Observation orice este măsurat sau raportat: semne vitale, rezultate de laborator, o greutate, un scor de simptome LOINC, unități UCUM
Condition un diagnostic sau o problemă de sănătate, cu stadiul său în timp ICD-10 (SNOMED CT în spatele unui indicator de licență)

Medicamentele (MedicationStatement), alergiile (AllergyIntolerance), imunizările și documentele urmează același model; cele 26 de tipuri de resurse suportate sunt listate în declarația de capabilități la /fhir/R4/metadata.

Înainte de a începe

Obțineți o cheie de sandbox (sk_test_…) la platform.anpheros.com/dashboard cu opțiunea Get a sandbox key. Nimic din ceea ce creați acolo nu reprezintă date reale ale pacienților și nimic nu este vizibil pentru alte proiecte.

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

Pasul 1: Crearea unui pacient

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, cu id-ul și versiunea alocate de server:

{"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"}}

Păstrați propriile id-uri în identifier cu un system pe care îl controlați (aici un număr de înregistrare al clinicii), astfel încât să puteți găsi întotdeauna pacientul din nou cu GET $BASE/Patient?identifier=https://clinic.example/mrn|MRN-10442. id FHIR este al platformei și este specific proiectului dumneavoastră: un alt proiect vede aceeași persoană sub un id diferit.

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

Pasul 2: stocarea unei măsurători ca Observație

Tensiunea arterială este o observație cu două componente, sistolică și diastolică, fiecare cu propriul cod LOINC. Specificați cine a efectuat măsurătoarea: aici un dispozitiv de acasă.

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

Răspunsul este resursa stocată cu id și meta.versionId: "1". Trei detalii sunt importante pentru un record utilizabil:

Rezultatele de laborator sunt aceeași resursă cu category laboratory și, de obicei, un referenceRange. Pentru a importa rapoarte de laborator complete, consultați Cum se importă rezultatele de laborator într-un record FHIR.

Pasul 3: înregistrați un diagnostic ca o Condiție

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 (activă, rezolvată, în remisie) și verificationStatus (confirmată, provizorie) sunt separate intenționat: un diagnostic suspectat nu este același lucru cu unul confirmat, iar o problemă rezolvată face în continuare parte din istoric.

Pasul 4: crearea resurselor asociate într-o singură tranzacție

Când un pacient și prima sa măsurătoare sosesc împreună, de exemplu dintr-un sistem de clinică, trimiteți-le ca un transaction Bundle. Fie totul este stocat, fie nimic nu este. Referințele între resursele noi folosesc urn:uuid: id-uri temporare pe care serverul le înlocuiește:

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

transaction-response are o intrare per resursă, cu "status": "201 Created", location și resursa stocată. subject-ul Observation indică acum Patient/fad3665a-…-ul real.

Pasul 5: căutare

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

Veți primi un searchset Bundle cu total și resursele corespondente, cele mai noi primele. Alte căutări pe care le veți folosi frecvent: Condition?patient=$PID&clinical-status=active, Observation?patient=$PID&category=laboratory și Patient/$PID/$everything pentru întregul dosar.

Pasul 6: actualizare fără pierderea istoricului

Hipertensiunea arterială se rezolvă. Modificați starea și adăugați data de încheiere, și folosiți If-Match cu versiunea pe care ați citit-o pentru a nu suprascrie niciodată modificarea altcuiva:

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" }'

200 OK cu ETag: W/"2". Dacă o altă scriere a ajuns acolo prima, veți primi 412 și veți citi din nou. Versiunea anterioară este încă acolo:

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

returnează ambele versiuni: versionId 2 (resolved) și 1 (active). GET $BASE/Condition/$CID/_history/1 citește versiunea veche. Nimic dintr-o înregistrare nu este suprascris silențios.

Pasul 7: vedeți cine a scris ce

Fiecare scriere creează o resursă Provenance. Pentru înregistrarea tensiunii arteriale:

curl "$BASE/Provenance?target=Observation/$OBS" -H "Authorization: Bearer $KEY"
{"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": "…"}}]}

Tipul autorului pe care l-ați trimis (device) este înregistrat împreună cu proiectul și organizația. Trimiteți X-Anpheros-Author-Ref: Practitioner/<id> pentru a numi clinicianul din spatele unei scrieri.

Pasul 8: înregistrarea ca rezumat

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

returnează un Rezumat Internațional al Pacientului (International Patient Summary): un document Bundle care începe cu un Composition și are secțiuni precum Probleme, Medicație, Alergii și Semne vitale, construit din resursele de mai sus. Acesta este formatul de transmis către un alt sistem sau de tipărit pentru un medic (platforma FHIR).

Preferi JSON fără FHIR?

Aceleași date sunt disponibile printr-o vizualizare REST mai simplă, /v1, cu aceleași ID-uri: POST /v1/patients/{id}/observations preia {"code": "85354-9", "category": "vital-signs", "effective_at": "…", "components": […]} și stochează același FHIR Observation. Folosește ce se potrivește codului tău. Vezi Medical data API și SDKs.

Întrebări frecvente

Care este cea mai bună modalitate de a stoca dosare medicale?

Ca resurse codificate, versionate, cu o înregistrare a cine a scris fiecare. HL7 FHIR R4 vă oferă structura (Patient, Observation, Condition și altele), sisteme de codificare standard precum LOINC și ICD-10, și istoric; un backend FHIR adaugă căutare, consimțământ și proveniență deasupra.

Am nevoie de un server FHIR pentru a utiliza FHIR?

Aveți nevoie de un loc care stochează și caută resurse FHIR și impune cine le poate citi. Puteți rula singur un server FHIR open-source sau puteți utiliza unul gestionat precum Anpheros; Cum se compară Anpheros cu alte servere FHIR analizează opțiunile, iar FHIR vs. o bază de date medicală personalizată acoperă crearea propriului schemă în schimb.

Cum stochez tensiunea arterială în FHIR?

Ca o singură Observation cu codul LOINC 85354-9 și două component intrări: sistolică 8480-6 și diastolică 8462-4, fiecare cu o valueQuantity în mm[Hg].

Pot modifica o resursă stocată?

Da, cu PUT și If-Match. Fiecare modificare creează o nouă versiune; versiunile anterioare rămân lizibile prin _history, iar Provenance înregistrează cine a făcut fiecare modificare. Ștergerile sunt soft și păstrează istoricul.

Conexe

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