NRCeS FHIR Profiles for ABDM: Why Your Bundles Show NA in the PHR App and 13 Fixes (2026)
CTO & Co-Founder
CTO & Co-Founder at Nirmitee.io. Architects healthcare integrations across FHIR, SMART on FHIR, ABDM and NHCX, writing from production experience taking hospital software from sandbox to go-live.

When the ABDM PHR app shows NA for the patient, doctor or hospital, the record reached the app but its FHIR bundle does not follow the NRCeS FHIR profiles closely enough for the app to read those fields. Almost every case comes down to the Composition: it must be the first entry, and its subject, author and custodian must point, by urn:uuid, to a Patient, Practitioner and Organization inside the same bundle, each with the fields the app displays.
This guide explains how the NRCeS FHIR profiles for ABDM fit together, gives a diagnostic flowchart for NA fields, walks through 13 fixes with the exact JSON, and lists the Composition type for each health information type. It is based on the NRCeS FHIR Implementation Guide for ABDM, version 6.5.0, and on our own work getting every value of real records to display in ABDM apps. Updated September 2026.
What the NRCeS FHIR profiles are and why ABDM depends on them
NRCeS (the National Resource Centre for EHR Standards) publishes the FHIR R4 Implementation Guide that ABDM uses for health records. The official ABDM FHIR profiles live at nrces.in/ndhm/fhir/r4; the current package is ndhm.in version 6.5.0. Every record your hospital system shares through ABDM Milestone 2 is a FHIR document bundle built to these profiles, and every app that displays the record reads it the way the profiles describe.
That is why a bundle can be valid FHIR and still show NA: generic FHIR allows references and structures that the ABDM apps do not follow. The fix is to build to the NRCeS profiles exactly, not to FHIR in general. If you need the integration built end to end, our ABDM integration services team builds and validates these bundles for hospital software.
| Official ABDM FHIR format | What it defines |
|---|---|
DocumentBundle | The outer bundle for every health record: type document, identifier, timestamp, meta |
| Composition profiles (one per record type) | OPConsultRecord, PrescriptionRecord, DiagnosticReportRecord, DischargeSummaryRecord, ImmunizationRecord, WellnessRecord, HealthDocumentRecord, InvoiceRecord |
| Resource profiles | Patient, Practitioner, Organization, Encounter, Condition, Observation, MedicationRequest, DiagnosticReport, DocumentReference and others, each with meta.profile set to its NRCeS URL |
The bundle structure the PHR app reads
An ABDM health record is a FHIR document: a Bundle whose first entry is a Composition, and whose other entries are the resources the Composition points to.
- Composition, always the first entry. FHIR's own rule for documents (bdl-11) is that "a document must have a Composition as the first resource".
- Patient, referenced by
Composition.subject, with the ABHA number as identifier. - Practitioner, referenced by
Composition.author. - Organization, referenced by
Composition.custodian, carrying your HFR facility ID. - Encounter, referenced by
Composition.encounter. - Clinical resources: Condition, Observation, MedicationRequest, DiagnosticReport, DocumentReference and others, each listed in a
Composition.section.
Why the PHR app shows NA: a diagnostic flowchart
Work through these checks in order. Each "No" is a specific change to your bundle, and the first failing check is usually the one that causes every NA you see.
| PHR shows NA for | Usual cause | Fix |
|---|---|---|
| Patient name | No Patient resource, or Composition.subject points somewhere else | Add the Patient with name; reference it by urn:uuid |
| Gender, date of birth | Patient resource lacks the fields | Fill gender and birthDate |
| Doctor | No Practitioner, or Composition.author not set | Add the Practitioner with a name; set author |
| Hospital or clinic | No Organization, or Composition.custodian not set | Add the Organization with your HFR facility ID; set custodian |
| Everything | References use Patient/123 style, or Composition is not first | Use urn:uuid fullUrls; move Composition to entry 0 |
13 fixes for NRCeS-compliant ABDM FHIR bundles
1. References must use urn:uuid
Every fullUrl is urn:uuid:<id>, and every reference points to one of them. Relative references such as Patient/abc-123 are the single most common cause of NA fields.
// Wrong
"subject": { "reference": "Patient/abc-123" }
// Right
"subject": { "reference": "urn:uuid:4f1c9a2e-7b3d-4e61-9c2f-1a2b3c4d5e6f", "display": "Test Patient" } 2. Bundle.identifier is required
FHIR's rule for documents (bdl-9) is that "a document must have an identifier with a system and a value".
"identifier": { "system": "https://your-hospital.example/bundle", "value": "7d9e1c2a-5b4f-4a3e-8c1d-2e3f4a5b6c7d" } 3. Bundle.timestamp is required
Rule bdl-10: "a document must have a date".
"timestamp": "2026-09-28T10:30:00.000+05:30" 4. Organization carries your HFR facility ID
{
"resourceType": "Organization",
"meta": { "profile": ["https://nrces.in/ndhm/fhir/r4/StructureDefinition/Organization"] },
"identifier": [{
"type": { "coding": [{ "system": "http://terminology.hl7.org/CodeSystem/v2-0203", "code": "PRN" }] },
"system": "https://facility.ndhm.gov.in",
"value": "IN0000000000"
}],
"name": "Your Hospital Name"
} 5. Composition.custodian points to that Organization
"custodian": { "reference": "urn:uuid:<organization-id>", "display": "Your Hospital Name" } 6. Composition.type uses the SNOMED code for the record type
"type": { "coding": [{ "system": "http://snomed.info/sct", "code": "371530004", "display": "Clinical consultation report" }], "text": "Clinical consultation report" } 7. Every resource carries its NRCeS meta.profile
"meta": { "profile": ["https://nrces.in/ndhm/fhir/r4/StructureDefinition/Patient"] } The bundle itself carries DocumentBundle; the record-type profile (for example OPConsultRecord) goes on the Composition, not on the bundle.
8. Patient identifier with the MR type and ABHA number
"identifier": [{
"type": { "coding": [{ "system": "http://terminology.hl7.org/CodeSystem/v2-0203", "code": "MR" }] },
"system": "https://healthid.ndhm.gov.in",
"value": "91-1111-2222-3333"
}] 9. Every reference carries display text
Add display to subject, author and custodian references. It costs nothing and gives the app a readable fallback.
10. Bundle meta.versionId and meta.profile
"meta": {
"versionId": "1",
"lastUpdated": "2026-09-28T10:30:00.000+05:30",
"profile": ["https://nrces.in/ndhm/fhir/r4/StructureDefinition/DocumentBundle"],
"security": [{ "system": "http://terminology.hl7.org/CodeSystem/v3-Confidentiality", "code": "V", "display": "very restricted" }]
} 11. The DocumentBundle profile on the bundle
Set Bundle.type to document and Bundle.meta.profile to DocumentBundle, as above. A bundle of type collection will not be read as a health record.
12. Composition identifier
"identifier": { "system": "https://ndhm.in/phr", "value": "645bb0c3-ff7e-4123-bef5-3852a4784813" } 13. Composition.encounter and sections
Reference the Encounter from Composition.encounter, and list every clinical resource in a Composition.section entry. A resource that is in the bundle but in no section is often not displayed at all.
ABDM health information types, profiles and SNOMED codes
Each record type has its own Composition profile. In IG 6.5.0 most of them fix the Composition type code; the diagnostic report profile uses a value set of report types instead.
| Health information type | Composition profile | Composition.type (SNOMED) |
|---|---|---|
| OP consultation | OPConsultRecord | 371530004 Clinical consultation report |
| Prescription | PrescriptionRecord | 440545006 Prescription record |
| Diagnostic report | DiagnosticReportRecord | From the diagnostic report type value set, for example 721981007 Diagnostic studies report |
| Discharge summary | DischargeSummaryRecord | 373942005 Discharge summary |
| Immunization record | ImmunizationRecord | 41000179103 Immunization record |
| Health document record | HealthDocumentRecord | 419891008 Record artifact |
| Wellness record | WellnessRecord | No fixed code in IG 6.5.0; use the profile's document type binding |
| Invoice | InvoiceRecord | No fixed code in IG 6.5.0; use the profile's document type binding |
The full walkthrough of each record type, with complete examples, is in our ABDM FHIR bundles guide, and working samples are in our public ABDM FHIR bundle examples on GitHub. To see how the bundles map to a real hospital visit, read ABDM FHIR bundles through a patient's hospital visit.
Validate against the NRCeS IG before you push
Do not wait for the PHR app to tell you something is wrong. Validate every bundle type against the IG package with the HL7 FHIR validator as part of your build:
# HL7 FHIR validator against the NRCeS package for ABDM
java -jar validator_cli.jar opconsult-bundle.json -version 4.0.1 -ig ndhm.in#6.5.0 Validation catches missing identifiers, wrong profiles and broken references. It does not catch every display problem, because a reference can be valid and still point to a Patient without a name. After validation, open each record type in the sandbox PHR app once, and check each field against the table above.
Remember that the bundle is encrypted before it leaves your system. If the app shows nothing at all rather than NA, the problem is usually encryption, not the bundle: see our ABDM Fidelius encryption guide.
What we check before any record goes live
In a live test of our ABDM integration against the sandbox in September 2026, every value in every test record arrived and displayed on the requesting side: 526 of 526 values and 30 of 30 attachments. The checks that got us there are the ones in this guide, run as automated tests on every record type:
- Composition first, every reference a
urn:uuidthat resolves inside the bundle. - Subject, author and custodian always present, with the fields the app shows.
- Every clinical resource listed in a section.
- Validation against
ndhm.in#6.5.0in the build, not by hand.
For the rest of the M2 flow that carries these bundles, see building an ABDM HIP from scratch, and for the whole integration, our ABDM integration step-by-step guide. If your records show NA and you need them fixed before NHA testing, talk to our ABDM team.
Ready to scale?
Talk to our healthcare engineering team about building, integrating, and shipping faster.
Frequently Asked Questions
Why does the ABDM PHR app show NA for the patient name?
What are the NRCeS FHIR profiles for ABDM?
Which FHIR profile does an ABDM bundle use?
Must the Composition be the first entry in an ABDM bundle?
What Organization identifier does ABDM expect?
What are the official ABDM FHIR formats?
How do I validate an ABDM FHIR bundle?


