Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
FHIR रिकॉर्ड में प्रयोगशाला परिणाम कैसे आयात करें
ट्यूटोरियल: CSV और HL7 v2 ORU^R01 के रूप में एक लैब रिपोर्ट को LOINC कोड और संदर्भ रेंज के साथ FHIR R4 अवलोकन में आयात करें, अनमैप्ड मार्कर और पुनः भेजे गए रिपोर्ट को संभालें, और प्रत्येक परिणाम को उसकी प्रयोगशाला में ट्रेस करें।
यह ट्यूटोरियल एक प्रयोगशाला रिपोर्ट को CSV फ़ाइल के रूप में और HL7 v2 ORU^R01 संदेश के रूप में लेता है, इसे एक रोगी के HL7 FHIR R4 रिकॉर्ड में प्रत्येक के लिए एक अनुरोध में आयात करता है, और दिखाता है कि आपको क्या वापस मिलता है: प्रयोगशाला Observation संसाधन LOINC कोड, संदर्भ श्रेणियों और प्रोवेनेंस के साथ। इसमें वे दो समस्याएं भी शामिल हैं जिनका सामना हर लैब एकीकरण को करना पड़ता है: ऐसे मार्कर जिन्हें स्वचालित रूप से मैप नहीं किया जा सकता है और ऐसे रिपोर्ट जिन्हें दो बार भेजा जाता है। सब कुछ एक सिंथेटिक रोगी के साथ मुफ्त सैंडबॉक्स पर चलता है।
लैब परिणाम स्टोर करना मुश्किल क्यों है
एक लैब रिपोर्ट सरल दिखती है: एक मार्कर, एक मान, एक इकाई, एक संदर्भ सीमा, एक तिथि। व्यवहार में, प्रत्येक प्रयोगशाला अपने तरीके से मार्करों का नामकरण करती है ("Hemoglobina glicozilata", "HbA1c", "Glycated haemoglobin"), दशमलव के लिए अल्पविराम या बिंदु का उपयोग करती है, श्रेणियों को 4,0-5,6, <5 या >3.5 के रूप में लिखती है, और कुछ विफल होने पर उसी रिपोर्ट को फिर से भेजती है। फ्री टेक्स्ट के रूप में संग्रहीत, उन परिणामों की समय के साथ तुलना नहीं की जा सकती, चार्ट नहीं किया जा सकता, किसी अन्य एप्लिकेशन के साथ साझा नहीं किया जा सकता या आत्मविश्वास से AI मॉडल को नहीं दिया जा सकता।
एक FHIR रिकॉर्ड प्रत्येक परिणाम को LOINC कोड, एक UCUM इकाई, एक मान, एक संदर्भ सीमा और एक तिथि के साथ एक Observation के रूप में संग्रहीत करता है, और Provenance संसाधन में रखता है कि इसे किसने भेजा है। लैब कनेक्टर वह रूपांतरण आपके लिए करता है।
lab report (CSV, HL7 v2, JSON)
│ POST /v1/patients/{id}/labs/import
▼
┌──────────────────────────────────────────────┐
│ parse rows → map marker to LOINC → parse │
│ value, unit, range → stable id per row │
└──────────────────────────────────────────────┘
│
▼
Observation (category laboratory) + Provenance (author_type import, source system, report id)
│
├─► the patient's app and every app they consented to
└─► webhooks: resource.created per Observation
शुरू करने से पहले
आपको platform.anpheros.com/dashboard से एक सैंडबॉक्स कुंजी (sk_test_…) की आवश्यकता होगी (सैंडबॉक्स कुंजी प्राप्त करें)। उदाहरण curl का उपयोग करते हैं; SDKs में समान कॉल हैं (labs.importCsv, labs.importHl7, labs.importItems)।
export BASE=https://platform.anpheros.com
export KEY=sk_test_…
# Elena Ionescu, a synthetic patient with type 2 diabetes
export PID=$(curl -s "$BASE/fhir/R4/Patient?identifier=https://anpheros.com/fhir/sid/sandbox-persona|p02" \
-H "Authorization: Bearer $KEY" | jq -r '.entry[0].resource.id')
चरण 1: एक CSV रिपोर्ट आयात करें
एक रोमानियाई प्रयोगशाला इस तरह एक रिपोर्ट निर्यात कर सकती है: अर्धविराम, दशमलव अल्पविराम, रोमानियाई कॉलम नाम और DD.MM.YYYY के रूप में तिथियां। कनेक्टर रोमानियाई और अंग्रेजी कॉलम नामों को पहचानता है।
cat > report.csv <<'EOF'
Analiza;Rezultat;UM;Interval de referinta;Data
Hemoglobina glicozilata (HbA1c);6,9;%;4,0-5,6;01.10.2026
Glicemie;131;mg/dL;70-100;01.10.2026
TSH;2,1;mUI/L;0,4-4,0;01.10.2026
Marker foarte rar;12;U/L;0-20;01.10.2026
EOF
curl -X POST "$BASE/v1/patients/$PID/labs/import" -H "Authorization: Bearer $KEY" \
-H "Content-Type: text/csv" -H "X-Anpheros-Source-System: labx" \
-H "Idempotency-Key: report-2026-10-01-elena" --data-binary @report.csv
प्रतिक्रिया (201):
{"created": 4, "skipped": 0, "unmapped": ["Marker foarte rar"], "warnings": [],
"observations": [
{"id": "ff0bbb44-…", "marker": "Hemoglobina glicozilata (HbA1c)", "code": "4548-4", "system": "http://loinc.org", "value": 6.9, "unit": "%", "date": "2026-10-01"},
{"id": "ebe5522f-…", "marker": "Glicemie", "code": "2345-7", "system": "http://loinc.org", "value": 131.0, "unit": "mg/dL", "date": "2026-10-01"},
{"id": "bace44a8-…", "marker": "TSH", "code": "3016-3", "system": "http://loinc.org", "value": 2.1, "unit": "mUI/L", "date": "2026-10-01"},
{"id": "26fd2270-…", "marker": "Marker foarte rar", "code": "marker_foarte_rar", "system": "urn:anpheros:lab-code", "value": 12.0, "unit": "U/L", "date": "2026-10-01"}]}
HbA1c, ग्लूकोज और TSH को उनके नामों से LOINC में मैप किया गया था। दशमलव अल्पविराम संख्याओं में बदल गए, और रेंज referenceRange बन गए। unmapped में एक पंक्ति वापस आई। यह अभी भी प्रयोगशाला के अपने कोड (urn:anpheros:lab-code) के तहत संग्रहीत है, जिसमें रिपोर्ट से सटीक पाठ है, इसलिए कुछ भी खोया नहीं है।
चरण 2: अनमैप्ड मार्करों को हैंडल करें
कुछ नामों के लिए निर्णय की आवश्यकता होती है। "Glicemie" (रक्त शर्करा) एक अच्छा उदाहरण है: LOINC के पास सीरम या प्लाज्मा में ग्लूकोज (2345-7, प्रयोगशाला में लिया गया एक शिरापरक नमूना) के लिए एक कोड है और पूरे रक्त में ग्लूकोज (2339-0, उदाहरण के लिए एक उंगली-प्रिक) के लिए दूसरा है। प्रयोगशाला रिपोर्ट पर, एक नग्न "Glicemie" को सीरम या प्लाज्मा में मैप किया जाता है। "capilar", "capillary" या "sânge integral" कहने वाले नाम को पूरे रक्त में मैप किया जाता है:
{"created": 1, "skipped": 0, "unmapped": [], "warnings": [],
"observations": [{"id": "00480a6d-…", "marker": "Glicemie capilara", "code": "2339-0", "system": "http://loinc.org", "value": 140.0, "unit": "mg/dL", "date": "2026-10-02"}]}
उन मार्करों के लिए जिन्हें कनेक्टर पहचानता नहीं है, कोड देखें:
curl "$BASE/v1/terminology/loinc?q=glucose" -H "Authorization: Bearer $KEY"
{"data": [
{"system": "http://loinc.org", "code": "2339-0", "display": "Glucose [Mass/volume] in Blood", "display_ro": "Glicemie (sânge)", "category": "laboratory", "unit": "mg/dL"},
{"system": "http://loinc.org", "code": "2345-7", "display": "Glucose [Mass/volume] in Serum or Plasma", "display_ro": "Glicemie (ser)", "category": "laboratory", "unit": "mg/dL"}],
"total": 2}
फिर कोड को LOINC कॉलम में भेजें। रिपोर्ट में एक कोड हमेशा नाम पर जीतता है। उस मैपिंग को प्रति प्रयोगशाला अपनी तरफ रखें और उससे हर रिपोर्ट में कॉलम जोड़ें:
Analiza;Rezultat;UM;Interval de referinta;Data;LOINC
Glicemie;99;mg/dL;70-100;04.10.2026;2339-0
जिन मार्करों को LOINC बिल्कुल कवर नहीं करता है, जैसे कि मनगढ़ंत "Marker foarte rar", वे प्रयोगशाला के कोड के तहत रह सकते हैं। वे रोगी को दिखाए जाते हैं और रिकॉर्ड में शामिल किए जाते हैं। उनकी तुलना अन्य प्रयोगशालाओं के परिणामों से नहीं की जा सकती है।
चरण 3: एक ही रिपोर्ट को दो बार भेजें
प्रयोगशालाएँ रिपोर्ट को फिर से भेजती हैं। प्रत्येक पंक्ति को रिपोर्ट आईडी, कोड, तिथि और मान से निर्मित एक स्थिर पहचानकर्ता मिलता है, इसलिए एक ही रिपोर्ट का दूसरा आयात कुछ भी नहीं बनाता है:
{"created": 0, "skipped": 4, "unmapped": ["Marker foarte rar"], "warnings": [], "observations": []}
जो पंक्तियाँ बदली हैं, उदाहरण के लिए एक सुधारा हुआ मान, उन्हें नए परिणामों के रूप में आयात किया जाता है। Idempotency-Key हेडर एक दूसरी गारंटी जोड़ता है: एक ही कुंजी के साथ एक नेटवर्क पुनः प्रयास पहले प्रतिक्रिया को अपरिवर्तित लौटाता है।
चरण 4: एक HL7 v2 ORU^R01 संदेश आयात करें
अधिकांश प्रयोगशाला सूचना प्रणाली HL7 v2 का उपयोग करती हैं। संदेश को वैसे ही भेजें (ER7 टेक्स्ट, CR या LF द्वारा अलग किए गए सेगमेंट):
MSH|^~\&|LABX|LAB1|ANPHEROS|EHR|202610010930||ORU^R01|MSG00077|P|2.5.1
PID|1||12345||Ionescu^Elena||19850903|F
OBR|1||R-77|24331-1^Lipid panel^LN|||202610010800
OBX|1|NM|2093-3^Cholesterol [Mass/volume] in Serum or Plasma^LN||212|mg/dL|<200|H|||F|||202610010800
OBX|2|NM|2085-9^HDL Cholesterol^LN||52|mg/dL|>40|N|||F|||202610010800
curl -X POST "$BASE/v1/patients/$PID/labs/import" -H "Authorization: Bearer $KEY" \
-H "Content-Type: x-application/hl7-v2+er7" --data-binary @oru.hl7
{"created": 2, "skipped": 0, "unmapped": [], "warnings": [],
"observations": [
{"id": "b562045b-…", "marker": "Cholesterol [Mass/volume] in Serum or Plasma", "code": "2093-3", "system": "http://loinc.org", "value": 212.0, "unit": "mg/dL", "date": "2026-10-01T08:00:00Z"},
{"id": "9b3274e4-…", "marker": "HDL Cholesterol", "code": "2085-9", "system": "http://loinc.org", "value": 52.0, "unit": "mg/dL", "date": "2026-10-01T08:00:00Z"}]}
OBX-3 को LN कोडिंग सिस्टम के साथ सीधे LOINC के रूप में उपयोग किया जाता है। OBX-7 संदर्भ सीमा बन जाता है और OBX-8 (H, N) व्याख्या बन जाती है। OBR-3 (R-77) को प्रोवेनेंस में रिपोर्ट आईडी के रूप में रखा जाता है। रोगी वह है जो URL में है: रोगी को खोजने के लिए PID सेगमेंट का उपयोग नहीं किया जाता है, इसलिए एक गलत PID परिणामों को किसी और से नहीं जोड़ सकता है।
पहले से ही पार्स किए गए परिणाम हैं? JSON भेजें: {"date": "2026-10-01", "origin": "report-77", "items": [{"marker": "Ferritin", "value": 38, "unit": "ng/mL", "ref_low": 15, "ref_high": 150}]}। Ferritin को LOINC 2276-4 पर मैप किया गया है।
चरण 5: परिणामों को FHIR के रूप में पढ़ें
curl "$BASE/fhir/R4/Observation?patient=$PID&code=http://loinc.org|4548-4&_sort=-date&_count=1" \
-H "Authorization: Bearer $KEY"
आयातित HbA1c, जैसा कि संग्रहीत है:
{
"resourceType": "Observation",
"id": "62b1b0c0-…",
"meta": {"versionId": "1", "lastUpdated": "2026-10-12T20:05:57.011Z"},
"identifier": [{"system": "urn:anpheros:lab-import", "value": "c52d3cd6449291d34f6bef1516d0ac05"}],
"status": "final",
"category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "laboratory"}]}],
"code": {"coding": [{"system": "http://loinc.org", "code": "4548-4", "display": "Hemoglobin A1c/Hemoglobin.total in Blood"}],
"text": "Hemoglobina glicozilata (HbA1c)"},
"subject": {"reference": "Patient/…"},
"effectiveDateTime": "2026-10-01",
"valueQuantity": {"value": 6.9, "unit": "%"},
"referenceRange": [{"low": {"value": 4.0, "unit": "%"}, "high": {"value": 5.6, "unit": "%"}}]
}
LOINC डिस्प्ले मानक अंग्रेजी नाम है। code.text प्रयोगशाला की अपनी शब्दावली रखता है, इसलिए रोगी अभी भी वही देखता है जो कागज की रिपोर्ट पर था। संसाधनों और खोज के बारे में अधिक जानने के लिए, FHIR प्लेटफ़ॉर्म गाइड और FHIR कोड सिस्टम देखें।
चरण 6: जाँचें कि किसने भेजा है
curl "$BASE/v1/patients/$PID/provenance/Observation/62b1b0c0-…" -H "Authorization: Bearer $KEY"
{"data": [{"version": 1, "activity": "CREATE", "recorded": "2026-10-12T20:05:57.011000Z",
"author_type": "import", "author": "proj_…", "source_system": "labx", "origin_id": null,
"fhir": "Provenance/f15c4fee-…"}], "total": 1}
author_type: import और source_system: labx मान के साथ बने रहते हैं। जब कोई AI एप्लिकेशन बाद में संदर्भ API के माध्यम से इस परिणाम को पढ़ता है, तो इसे [import/labx] के रूप में लेबल किया जाता है, ताकि मॉडल प्रयोगशाला परिणाम को उस मान से अलग बता सके जो रोगी ने टाइप किया है।
आगे क्या होता है
- मरीज़ अपने ऐप में परिणाम देखता है। कोई भी एप्लिकेशन जिसे उन्होंने सहमति दी है, वह अपने स्कोप के भीतर उन्हें पढ़ सकता है (सहमति और एक्सेस मॉडल)।
- प्रत्येक Observation के लिए एक
resource.createdवेबहुक फायर होता है, इसलिए क्लिनिक डैशबोर्ड या AI सारांश को पोलिंग के बिना अपडेट किया जा सकता है। POST /fhir/R4/Observation/$validate?profile=eu-labरिपोर्ट करता है कि कोई परिणाम HL7 Europe प्रयोगशाला रिपोर्ट प्रोफ़ाइल के मुकाबले कैसे मापता है।- प्रति अनुरोध 500 पंक्तियों तक; सीमाएं सीमाएं और दर सीमाएं में सूचीबद्ध हैं।
अक्सर पूछे जाने वाले प्रश्न
FHIR में कौन से लैब रिपोर्ट फॉर्मेट आयात किए जा सकते हैं?
CSV जिसमें हेडर रो हो (कॉमा, सेमीकोलन या टैब, डेसिमल कॉमा स्वीकार्य है), HL7 v2 ORU^R01 मैसेज और JSON। PDF रिपोर्ट को डॉक्यूमेंट के रूप में स्टोर किया जा सकता है; उनसे निकाले गए मान डॉक्यूमेंट को वापस इंगित करते हैं।
LOINC कोड के बिना मार्करों का क्या होता है?
उन्हें प्रयोगशाला के अपने कोड के तहत रिपोर्ट से सटीक टेक्स्ट के साथ स्टोर किया जाता है और unmapped में सूचीबद्ध किया जाता है। उस प्रयोगशाला के लिए एक LOINC कॉलम जोड़ें और उन्हें मैप किया जाएगा। रिपोर्ट में एक कोड हमेशा नाम पर प्राथमिकता लेता है।
क्या रिपोर्ट को फिर से भेजना सुरक्षित है?
हाँ। प्रत्येक रो में रिपोर्ट, कोड, तिथि और मान से बना एक स्थिर पहचानकर्ता होता है, इसलिए पहले से आयात की गई रो को छोड़ दिया जाता है; बदली हुई रो को नए परिणाम के रूप में आयात किया जाता है।
क्या कोई प्रयोगशाला किसी भी रोगी के लिए परिणाम आयात कर सकती है?
नहीं। एक प्रयोगशाला उन रोगियों में आयात करती है जिन्हें उसके प्रोजेक्ट ने बनाया है या जिनके रिकॉर्ड उस व्यक्ति ने OAuth के माध्यम से उसके साथ साझा किए हैं। अन्य रोगी उसके लिए मौजूद नहीं हैं (404)।
संबंधित
- Laboratory results API: HL7 v2 और FHIR साथ-साथ, और एक परिणाम में क्या होना चाहिए
- Lab connector: हर कॉलम का नाम, HL7 फ़ील्ड और प्रतिक्रिया फ़ील्ड
- Healthcare data interoperability: कोड और प्रोवेनेंस (provenance) एक्सचेंज किए गए डेटा को उपयोगी क्यों बनाते हैं
- Healthcare integrations: क्लीनिक, लैब, डिवाइस और थर्ड-पार्टी ऐप्स
- Medical data API: एकल अवलोकन (observations), स्थितियाँ (conditions) और दवाएँ (medications) लिखना
- How to build an AI healthcare app with a FHIR backend: इन परिणामों का उपयोग AI उत्तर में करना
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card