Uzbekistan Digital Health Platform
0.5.0 - ci-build
Uzbekistan Digital Health Platform, published by Ministry of Health of the Republic of Uzbekistan. This guide is not an authorized publication; it is the continuous build for version 0.5.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/uzinfocom-org/digital-health-ig/ and changes regularly. See the Directory of published versions
Cross-cutting rules that apply across all UZ Core profiles. These answer the questions implementers ask most often - what metadata every resource needs, what to do when you have no value for a field, how to encode units, how to bundle resources, and how the platform reports errors.
Every resource exchanged on the platform must carry, in addition to its clinical content:
meta.profile - the canonical URL (with version) of the UZ Core profile the resource claims to conform to. This is how the server knows which rules to validate against.id - the logical id of the resource on the server. New resources will have one assigned to them by the server.{
"resourceType": "Observation",
"id": "abc-123",
"meta": {
"profile": ["https://dhp.uz/fhir/core/StructureDefinition/uz-core-observation"],
"lastUpdated": "2026-05-30T09:12:00+05:00"
}
}
Content is exchanged as JSON, UTF-8 encoded.
There is a difference between "I have no value" and "there is no value", and FHIR lets you say which:
0..) element, including Must Support optional elements.1.. element, so use the resource's defined "unknown" mechanism: a data-absent-reason extension on the element (example), or an "unknown" code where the bound value set provides one (for example a coded element bound to a value set that includes unknown).Some profiles add an explicit data-absent-reason slot - for example UZ Core Patient allows a data-absent-reason extension on the identifier's value for the rare case where even an identifier is unavailable.
See Must Support for how this interacts with the S flag.
Numeric measurements use UCUM (http://unitsofmeasure.org) for the unit code:
{
"valueQuantity": {
"value": 7.2,
"unit": "%",
"system": "http://unitsofmeasure.org",
"code": "%"
}
}
system and code with the machine-readable UCUM code, not only the human unit string.value; only omit code/system when there is genuinely no UCUM unit.Observation.referenceRange and Observation.interpretation respectively.Addresses appear on several resources (Patient, Practitioner, Organization, Location). UZ Core supports both Uzbekistan and international addresses.
Use coded values from the official registries for administrative divisions. The platform validates that region, district, and city match codes from the Digital Population Management (DPM) system:
{
"address": [{
"use": "home",
"type": "physical",
"country": "UZ",
"state": "1727", // Region code from https://terminology.dhp.uz/fhir/core/ValueSet/state-vs (e.g., 1727 for Tashkent Region)
"district": "1727220", // District code from https://terminology.dhp.uz/fhir/core/ValueSet/regions-vs (e.g., 1727220 for Bekobod district)
"city": "17150085", // Mahalla code from https://terminology.dhp.uz/fhir/core/ValueSet/mahalla-vs (citizens' assembly)
"line": ["Amir Temur ko'chasi"],
"text": "Yangi Sergeli mahallasi, Amir Temur ko'chasi, 15-uy, 42-xonadon"
}]
}
For non-Uzbekistan addresses, administrative divisions are free text without required value sets, allowing flexible representation of foreign address structures:
{
"address": [{
"use": "home",
"type": "physical",
"country": "US",
"state": "California", // Free text
"district": "Los Angeles County", // Free text
"city": "Los Angeles", // Free text
"line": ["123 Main Street", "Apt 4B"],
"postalCode": "90001"
}]
}
code is what carries meaning. See FHIR basics for how UZ CodeSystems and HL7 terminology supplements provide these multilingual designations.$validate-code operation:POST [base]/ValueSet/$validate-code
{ "resourceType": "Parameters",
"parameter": [
{ "name": "url", "valueUri": "https://dhp.uz/fhir/core/ValueSet/uz-core-diagnosis" },
{ "name": "system", "valueUri": "http://hl7.org/fhir/sid/icd-10" },
{ "name": "code", "valueCode": "E11" } ] }
See Identifier systems for identifier (not terminology) systems.
Choose the Bundle.type by what you are doing:
Bundle.type |
Use it for |
|---|---|
| transaction | Submitting several interdependent resources as one atomic unit (all succeed or all fail) - e.g. a lab result set (ServiceRequest + Specimen + Observation + DiagnosticReport). |
| batch | Submitting several independent operations together without atomicity. |
| document | A finalized, legally-significant clinical document - a Composition as the header followed by the referenced clinical resources. Used for discharge summaries, certificates, signed reports. |
| searchset | Returned by the server in response to a search. You consume these; you do not create them. |
When several resources are related, transmit them together in a Bundle rather than as separate uncoordinated calls. See the Workflows for concrete transaction and document Bundle examples.
GET (read/search), POST (create), PUT (update), PATCH (partial update), and DELETE. The exact interactions per resource are declared in the CapabilityStatement.entered-in-error, inactive, revoked or the equivalent for the resource, depending on the case. For example a withdrawn Goal becomes cancelled/completed, a withdrawn Consent is set inactive, an erroneous clinical record is set entered-in-error. The resource and its history remain queryable.ETag from your last read and send it back as If-Match on the update; if someone else changed the resource since you read it, the version no longer matches and the server responds with 412 Precondition Failed ("Version is mismatch"). Re-read and retry - see Concurrency.When a request fails - validation, authorization, conflict - the server returns an OperationOutcome with a severity, a code and a human-readable diagnostic:
{
"resourceType": "OperationOutcome",
"issue": [{
"severity": "error",
"code": "required",
"diagnostics": "Patient.identifier: minimum required = 1, but only found 0",
"expression": ["Patient.identifier"]
}]
}
Common codes you will see: required/value/invariant (the resource failed profile validation), code-invalid (a code is not in the bound value set), forbidden (authorization/consent denied the request - see access control guidance), and a 412 with code invalid (an If-Match version clash - see Concurrency). Read the diagnostics and expression to find the offending element.