Submission Service
Service that provides functionality for submitting report data
Overview
The Submission service is responsible for submitting a tenant’s generated reporting content to a configured destination. Currently, the service submits reports to a configured Azure Blob Storage destination. For local testing, the Azurite Docker image (Link Here) can be used as a local instance of Azure Blob Storage.
| File | Description | Multiple Files? |
|---|---|---|
| Aggregate | A MeasureReport resource that contains references to each patient evaluation for a specific measure | Yes, one per measure |
| Manifest | A Bundle resource that contains references to each of the submission files (Patient, Aggregate, etc). This file is extended for System State Manifest support. | No |
| Patient List | A List resource of all patients that were admitted into the facility during the reporting period | No |
| Device | A Device resource that details the version of Link Cloud that was used | No |
| Organization | An Organization resource for the submitting facility | No |
| Other Resources | A Bundle resource that contains all of the shared resources (Location, Medication, etc) that are referenced in the patient Measure Reports | No |
| Patient | A Bundle resource that contains the MeasureReports and related resources for a patient | Yes, one per evaluated patient |
Nodes
Common Configurations
- Swagger
- Azure App Configuration
- Kafka Configuration
- Kafka Consumer Retry Configuration
- Service Registry Configuration
- CORS Configuration
- Token Service Configuration
- Service Authentication
- Mongo Database
Custom Configurations
| Name | Value | Description | Secret? |
|---|---|---|---|
| SubmissionServiceConfig__SubmissionDirectory | <string> | The location of where to store submission files until they are ready to be submitted. i.e. /data/Submission | No |
| SubmissionServiceConfig__PatientBundleBatchSize | 1 | The number of patients to process during submission in parallel (as seperate threads) | No |
| SubmissionServiceConfig__MeasureNames__0__Url | <string> | URL of measure | No |
| SubmissionServiceConfig__MeasureNames__0__MeasureId | <string> | ID of measure | No |
| SubmissionServiceConfig__MeasureNames__0__ShortName | <string> | Short name of the measure (used in building submission file name) | No |
| Features__DownloadReportEnabled | <boolean> | Whether or not the download report feature is enabled. Defaults to false. | No |
Functionality
The Link Submission service is responsible for securely transmitting compiled measure reports and their associated clinical data to an external Blob Storage container. The payload consists of Newline-Delimited JSON (.ndjson) files representing FHIR resources.
Structure and Timing
The transmission process is triggered asynchronously by the SubmitPayload Kafka topic. When a payload is ready for submission:
- The Submission service’s
SubmitPayloadListenerpicks up the message. ThePayloadTypeon the value of the event will determine whether a patient report or a facility summary manifest file is being sent to the external endpoint. Patient report submissions are immediately submitted when a patient has been evaluated and validated for all measures within a reporting period. - The service streams the pre-compiled
.ndjsoncontent. It optimizes this by attempting to read directly from the internal blob storage (where the Report service initially placed it). If the internal client is unavailable or the file cannot be found, it falls back to retrieving the bundle via the Report service’s REST API. - The content is streamed directly to the external Blob Storage container.
- The service emits a
PayloadSubmittedKafka event upon successful transfer, and logs an Audit Event for traceability.
This mechanism allows the system to scale and asynchronously write large files without holding up upstream measure evaluation processes or creating excessive memory pressure.
File Hierarchy and Naming Conventions
Data submitted to the external blob storage is organized hierarchically. A “folder” (blob prefix) is created per report schedule, and the related .ndjson files are placed within it.
Folder Naming Convention
The folder path is constructed dynamically and follows this naming pattern: \{BlobRoot}/\{facilityId}_\{dqms}_\{reportingStartDate}_\{scheduleId}/
- facilityId: The submitting organization’s Facility ID (lowercase).
- dqms: A + separated list of shortened, sorted measure names (e.g., ach+hypo).
- reportingStartDate: The start date of the reporting period formatted as yyyyMMdd.
- scheduleId: A sanitized, URL-safe version of the Report Schedule GUID.
Example Folder: 98234_ach+hypo_20240101_e6a8d3..._/
File Naming Conventions
Inside the submission folder, the structured files are named as follows:
- Aggregate Data: manifest.ndjson
- Patient Data: patient-{patientId}.ndjson (One file is generated per patient)
Aggregate Level Information (manifest.ndjson)
The manifest.ndjson file contains the summary-level information for the report bundle. It uses the application/x-ndjson content type, where each line is a fully valid JSON object representing a FHIR resource.
The structure inside the aggregate manifest includes:
- MeasureReport: Represents the summary-level (population) aggregation of all individual patient measure reports. It contains population counts and scoring.
- List: A FHIR List resource that references each individual patient who met the specific dQM criteria (e.g., Initial Population, Numerator, Denominator).
- Device: A resource representing the “Submitting Device”, which includes version information and software details about the Link platform performing the submission.
- Organization: A resource representing the submitting organization.
- OperationOutcome: A resource representing the patient id’s that were submitted to the external endpoint, but failed validation. A single resource would be generated with multiple issues representing each failed patient.
Individual Patient Information (patient-{patientId}.ndjson)
Each patient whose data is being submitted has their own dedicated .ndjson file. Like the manifest, each line is a serialized, valid FHIR resource.
The structure of the individual patient file logically flows as:
- MeasureReport: Starts with the individual-level
MeasureReport. This details exactly which populations the patient fell into and points to the specific pieces of clinical data that served as evidence. - Patient: The primary FHIR
Patientresource describing the individual’s demographics. - Clinical Data: The remainder of the .ndjson lines consist of the evaluated clinical resources, such as
Observation,Condition,Encounter,MedicationRequest, etc., that were pulled from the EHR and factored into the measure calculation. - OperationOutcome: This resource would show in the patient file if they fail validation.
Submission Storage Hierarchy
Below is an example of the hierarchical structure of a facility’s Azure Blob Storage submission for a facility NSHN ACH Monthly report:
98234_achm_20260201_a1322b82-37b4-4cb2-91b0-bcad0a703086├── manifest.ndjson └── MeasureReport └── List └── Device └── OperationOutcome└── patient-jEY0jhwcYACCAMEZwhEmUytjgNiWXrPfueFL6kJzIqRUN.ndjson └── MeasureReport └── Patient └── Encounter └── Location └── Encounter └── Location └── Medication└── patient-PfN97mRomyKGqn9vgGDXpp5u97fiE9v6iXxeyNdXNtn6J.ndjson └── MeasureReport └── Patient └── Encounter └── Location └── Observation └── DiagnoticReport └── OperationOutcomeManifest.ndjson Example
Below is an example of the FHIR resources that are added to the manifest.ndjson file:
{"resourceType":"Organization","id":"af0e74a6-24ca-4d22-abe3-12c3bf96744c","meta":{"profile":["https://www.cdc.gov/nhsn/nhsn-measures/StructureDefinition/nhsn-submitting-organization"]},"identifier":[{"system":"https://www.cdc.gov/nhsn/OrgID","value":"MyFacility-1775588582125"}],"active":true,"type":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/organization-type","code":"prov","display":"Healthcare Provider"}]}],"name":"MyFacility-1775588582125","telecom":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]}],"address":[{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"unknown"}]}]}{"resourceType":"Device","id":"d5be3f1e-c031-4ebb-b202-92ba87e3f1ee","deviceName":[{"name":"NHSNLink"}],"version":[{"value":""}]}{"resourceType":"List","id":"aaa5024e-de6a-4f27-8a35-da977ca404e0","extension":[{"url":"http://www.cdc.gov/nhsn/fhirportal/dqm/ig/StructureDefinition/link-patient-list-applicable-period-extension","valuePeriod":{"start":"2025-11-01T05:00:00+00:00","end":"2025-12-01T05:59:59+00:00"}}],"status":"current","mode":"snapshot","entry":[{"item":{"reference":"Patient/PfN97mRomyKGqn9vgGDXpp5u97fiE9v6iXxeyNdXNtn6J"}},{"item":{"reference":"Patient/jEY0jhwcYACCAMEZwhEmUytjgNiWXrPfueFL6kJzIqRUN"}}]}{"resourceType":"MeasureReport","id":"0f751f54-f405-4060-94d5-a6cb7038b3e5","meta":{"profile":["http://www.cdc.gov/nhsn/fhirportal/dqm/ig/StructureDefinition/subjectlist-measurereport"]},"contained":[{"resourceType":"List","id":"initial-population-list","status":"current","mode":"snapshot","entry":[{"item":{"reference":"MeasureReport/a775db5f-f00a-4a05-aa1e-b979cad13a19"}},{"item":{"reference":"MeasureReport/f2ec24e5-2342-4eb1-9c94-1c2096d37d87"}}]}],"status":"complete","type":"subject-list","measure":"http://www.cdc.gov/nhsn/fhirportal/dqm/ig/Measure/NHSNAcuteCareHospitalMonthlyInitialPopulation|1.0.0-dev","date":"2026-04-24T14:17:18.9758292+00:00","reporter":{"reference":"Organization/af0e74a6-24ca-4d22-abe3-12c3bf96744c"},"period":{"start":"2025-11-01T05:00:00+00:00","end":"2025-12-01T05:59:59+00:00"},"group":[{"population":[{"code":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/measure-population","code":"initial-population","display":"Initial Population"}]},"count":221,"subjectResults":{"reference":"#initial-population-list"}}]}]}{"resourceType":"OperationOutcome","id":"e18b348c-2cd9-4431-b3b9-5fba3550dc0b","issue":[{"severity":"error","code":"invalid","diagnostics":"Validation failed for patient jEY0jhwcYACCAMEZwhEmUytjgNiWXrPfueFL6kJzIqRUN"},{"severity":"error","code":"invalid","diagnostics":"Validation failed for patient PfN97mRomyKGqn9vgGDXpp5u97fiE9v6iXxeyNdXNtn6J"}]}Patient.ndjson Example
Below is an example of a submitted patient.ndjson file for a patient in the manifest.ndjson file shown above:
{"resourceType":"MeasureReport","id":"a775db5f-f00a-4a05-aa1e-b979cad13a19","extension":[{"url":"http://hl7.org/fhir/5.0/StructureDefinition/extension-MeasureReport.population.description","valueString":"The Acute Care Hospital Monthly Initial Population includes all encounters for patients of any age in an ED, observation, or inpatient location or all encounters for patients of any age with an ED, observation, inpatient, or short stay status during the measurement period."},{"url":"http://hl7.org/fhir/5.0/StructureDefinition/extension-MeasureReport.supplementalDataElement.reference","valueReference":{"extension":[{"url":"http://hl7.org/fhir/us/davinci-deqm/StructureDefinition/extension-criteriaReference","valueString":"sde-minimal-patient"}],"reference":"Patient/jEY0jhwcYACCAMEZwhEmUytjgNiWXrPfueFL6kJzIqRUN"}},{"url":"http://hl7.org/fhir/5.0/StructureDefinition/extension-MeasureReport.supplementalDataElement.reference","valueReference":{"extension":[{"url":"http://hl7.org/fhir/us/davinci-deqm/StructureDefinition/extension-criteriaReference","valueString":"sde-location"}],"reference":"Location/RsRPNHzwjNuhj3mxTniehTWT9iZHMJ3jAPux90m01D6PT"}},{"url":"http://hl7.org/fhir/5.0/StructureDefinition/extension-MeasureReport.supplementalDataElement.reference","valueReference":{"extension":[{"url":"http://hl7.org/fhir/us/davinci-deqm/StructureDefinition/extension-criteriaReference","valueString":"sde-ip-encounters"}],"reference":"Encounter/A1H45ixVFdCepcwv99pl1ebIvjJVOIcErTugl8CDMNm7w"}},{"url":"http://hl7.org/fhir/5.0/StructureDefinition/extension-MeasureReport.supplementalDataElement.reference","valueReference":{"extension":[{"url":"http://hl7.org/fhir/us/davinci-deqm/StructureDefinition/extension-criteriaReference","valueString":"sde-procedure"}],"reference":"Procedure/R0O12KSwXrdfIGU9uTiX9KGgHaPoTRM2vT4XzbNbvBEik"}}],"status":"complete","type":"individual","measure":"http://www.cdc.gov/nhsn/fhirportal/dqm/ig/Measure/NHSNAcuteCareHospitalMonthlyInitialPopulation|1.0.0-dev","subject":{"reference":"Patient/jEY0jhwcYACCAMEZwhEmUytjgNiWXrPfueFL6kJzIqRUN"},"date":"2026-04-24T14:15:51+00:00","period":{"start":"2025-11-01T05:00:00+00:00","end":"2025-12-01T05:59:59+00:00"},"group":[{"population":[{"id":"initial-population","extension":[{"url":"http://hl7.org/fhir/5.0/StructureDefinition/extension-MeasureReport.population.description","valueString":"All encounters for patients of any age in an ED, observation, or inpatient location or all encounters for patients of any age with an ED, observation, inpatient, or short stay status during the measurement period."}],"code":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/measure-population","code":"initial-population","display":"Initial Population"}]},"count":1}]}],"evaluatedResource":[{"reference":"ServiceRequest/eTAnk3yEdxxBU759Ufioxn8sNcnZuHAC454Dpo7u2u88u"},{"reference":"Patient/jEY0jhwcYACCAMEZwhEmUytjgNiWXrPfueFL6kJzIqRUN"},{"reference":"Location/RsRPNHzwjNuhj3mxTniehTWT9iZHMJ3jAPux90m01D6PT"},{"reference":"Procedure/R0O12KSwXrdfIGU9uTiX9KGgHaPoTRM2vT4XzbNbvBEik"},{"reference":"Encounter/A1H45ixVFdCepcwv99pl1ebIvjJVOIcErTugl8CDMNm7w"}]}{"resourceType":"Patient","id":"jEY0jhwcYACCAMEZwhEmUytjgNiWXrPfueFL6kJzIqRUN","meta":{"extension":[{"url":"http://www.cdc.gov/nhsn/fhirportal/dqm/ig/StructureDefinition/link-received-date-extension","valueDateTime":"2026-04-24T13:54:11Z"}],"versionId":"1","lastUpdated":"2026-01-28T19:17:08.756+00:00","profile":["http://www.cdc.gov/nhsn/fhirportal/dqm/ig/StructureDefinition/cross-measure-patient"]},"extension":[{"url":"http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity","extension":[{"url":"ombCategory","valueCoding":{"system":"urn:oid:2.16.840.1.113883.6.238","code":"2135-2","display":"Hispanic or Latino"}}]},{"url":"http://hl7.org/fhir/us/core/StructureDefinition/us-core-birthsex","valueCode":"M"},{"url":"http://hl7.org/fhir/us/core/StructureDefinition/us-core-race","valueCoding":{"system":"urn:oid:2.16.840.1.113883.6.238","code":"2106-3","display":"White"}}],"identifier":[{"use":"usual","type":{"text":"CEID"},"system":"urn:oid:1.2.840.114350.1.13.93.3.7.3.688884.100","value":"XXXNHSCHACPG8YM"},{"use":"usual","type":{"text":"EPI"},"system":"urn:oid:1.2.840.114350.1.13.93.3.7.5.737384.0","value":"E38171"},{"use":"usual","type":{"text":"EXTERNAL"},"system":"urn:oid:1.2.840.114350.1.13.93.3.7.2.698084","value":"Z02445"},{"use":"usual","type":{"text":"FHIR"},"system":"http://open.epic.com/FHIR/StructureDefinition/patient-dstu2-fhir-id","value":"jEY0jhwcYACCAMEZwhEmUytjgNiWXrPfueFL6kJzIqRUN"},{"use":"usual","type":{"text":"FHIR STU3"},"system":"http://open.epic.com/FHIR/StructureDefinition/patient-fhir-id","value":"eoYMSVqleH50WfN2HlgKJh40eOryKLuH6hysGq8jUoA8C"},{"use":"usual","type":{"text":"INTERNAL"},"system":"urn:oid:1.2.840.114350.1.13.93.3.7.2.698084","value":"Z91553"},{"use":"usual","type":{"text":"MRN"},"system":"urn:oid:2.16.840.1.113883.3.16.100.1","value":"488950597"},{"use":"usual","system":"https://open.epic.com/FHIR/StructureDefinition/PayerMemberId","value":"2113399039"}],"active":false,"name":[{"text":"Eric014 Daniel084 Murillo042","family":"Murillo042","given":["Eric014","Daniel084"]}],"telecom":[{"system":"phone","value":"+1 254-555-4939"}],"gender":"female","birthDate":"2008-09-11","deceasedBoolean":false,"address":[{"use":"home","line":["15331 Mays Plains Suite 849081"],"city":"Littlechester","state":"MO","postalCode":"72321"}],"contact":[{"name":{"use":"usual","text":"White030, Samantha033"}}],"communication":[{"language":{"coding":[{"system":"urn:ietf:bcp:47","code":"en","display":"English"}],"text":"English"},"preferred":true}]}{"resourceType":"Location","id":"RsRPNHzwjNuhj3mxTniehTWT9iZHMJ3jAPux90m01D6PT","meta":{"versionId":"1","lastUpdated":"2026-01-28T19:17:08.956+00:00","profile":["http://www.cdc.gov/nhsn/fhirportal/dqm/ig/StructureDefinition/ach-monthly-location"]},"status":"active","name":"Pediatric Burn Ward","mode":"instance","type":[{"coding":[{"system":"https://www.cdc.gov/nhsn/cdaportal/terminology/codesystem/hsloc.html","code":"1078-5","display":"Pediatric Burn Ward"}]}],"telecom":[{"system":"phone","value":"+1 396-555-0921"}],"address":{"use":"work","line":["222 Nathan Lodge043"],"city":"Alexanderton","state":"PA","postalCode":"54431"},"physicalType":{"coding":[{"system":"https://terminology.hl7.org/6.1.0/CodeSystem-location-physical-type.html","code":"wa","display":"Ward"}]},"partOf":{"reference":"Location/iUe9pd2zFJfSLWLFwfEmBw5TfYjOaaN9AkN6JU7IhmpRD"}}{"resourceType":"Procedure","id":"R0O12KSwXrdfIGU9uTiX9KGgHaPoTRM2vT4XzbNbvBEik","meta":{"extension":[{"url":"http://www.cdc.gov/nhsn/fhirportal/dqm/ig/StructureDefinition/link-received-date-extension","valueDateTime":"2026-04-24T13:57:08Z"}],"versionId":"1","lastUpdated":"2026-01-28T19:17:11.072+00:00","profile":["http://www.cdc.gov/nhsn/fhirportal/dqm/ig/StructureDefinition/ach-monthly-procedure"]},"status":"completed","code":{"coding":[{"system":"http://snomed.info/sct","code":"185349003","display":"Insertion of subcutaneous infusion pump"}]},"subject":{"reference":"Patient/jEY0jhwcYACCAMEZwhEmUytjgNiWXrPfueFL6kJzIqRUN"},"encounter":{"reference":"Encounter/A1H45ixVFdCepcwv99pl1ebIvjJVOIcErTugl8CDMNm7w"},"performedPeriod":{"start":"2025-11-29T01:17:51Z","end":"2025-11-29T02:07:51Z"}}{"resourceType":"Encounter","id":"A1H45ixVFdCepcwv99pl1ebIvjJVOIcErTugl8CDMNm7w","meta":{"extension":[{"url":"http://www.cdc.gov/nhsn/fhirportal/dqm/ig/StructureDefinition/link-received-date-extension","valueDateTime":"2026-04-24T13:54:11Z"}],"versionId":"1","lastUpdated":"2026-01-28T19:17:08.97+00:00","profile":["http://www.cdc.gov/nhsn/fhirportal/dqm/ig/StructureDefinition/ach-monthly-encounter"]},"extension":[{"url":"http://open.epic.com/FHIR/StructureDefinition/extension/accidentrelated","valueBoolean":false},{"url":"https://www.lantanagroup.com/fhir/StructureDefinition/nhsn-encounter-original-status","valueCoding":{"code":"TRIAGED"}}],"status":"finished","class":{"system":"http://terminology.hl7.org/CodeSystem/v3-ActCode","code":"IMP","display":"inpatient encounter"},"type":[{"coding":[{"system":"http://snomed.info/sct","code":"183452005","display":"Emergency hospital admission (procedure)"}],"text":"Emergency hospital admission (procedure)"}],"serviceType":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/service-type","code":"319","display":"Diaphragm Fitting"}],"text":"Diaphragm Fitting"},"subject":{"reference":"Patient/jEY0jhwcYACCAMEZwhEmUytjgNiWXrPfueFL6kJzIqRUN","display":"Eric014 Daniel084 Murillo042"},"period":{"start":"2025-11-29T00:47:51Z","end":"2025-11-29T17:49:57Z"},"reasonCode":[{"coding":[{"system":"http://snomed.info/sct","code":"423590009","display":"Clostridium difficile colitis (disorder)"}],"text":"C. difficile colitis"},{"coding":[{"system":"urn:oid:1.2.840.114350.1.13.277.3.7.2.728286","code":"35","display":"Diarrhea"}],"text":"Diarrhea"}],"diagnosis":[{"condition":{"reference":"Condition/IGSvNitj"},"use":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/diagnosis-role","code":"AD","display":"Admission diagnosis"}]}}],"hospitalization":{"admitSource":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/admit-source","code":"psych","display":"From psychiatric hospital"}],"text":"From psychiatric hospital"},"dischargeDisposition":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/discharge-disposition","code":"psy","display":"Psychiatric hospital"}],"text":"Psychiatric hospital"}},"location":[{"location":{"reference":"Location/RsRPNHzwjNuhj3mxTniehTWT9iZHMJ3jAPux90m01D6PT","display":"Pediatric Burn Ward"},"period":{"start":"2025-11-29T09:52:54Z","end":"2025-11-29T17:49:57Z"}}]}{"resourceType":"OperationOutcome","id":"cd751f88-e03c-4ee6-a518-37a4f5158a02","issue":[{"severity":"error","code":"invalid","diagnostics":"Patient has failed Validation"}]}How To Associate Patient Submissions to the Manifest
Each submitted patient .ndjson file will contain a single FHIR Patient resource and at least one MeasureReport. If a user needs to cross check that a patient’s submission is in the manifest or vice versa, the following can be done:
-
To ensure a patient’s submission is in the manifest:
- The
Patient.Idreference must be included in the manifestList.entryof the manifest List resource. - The
MeasureReport.Idreference must be included in the manifestMeasureReport.contained.List.entryof the manifest MeasureReport resource.
- The
-
To ensure manifest entries have a corresponding patient submission:
- Each
MeasureReport.contained.List.entrymust correspond to a single patient submission. A potential error in the submission process may have occurred if aMeasureReport.Idon the manifest does not coincide with any patient.ndjson Measure Reports.
- Each
Comparisons Between Link MVP and Link Cloud Submissions
| MVP | Link Cloud |
|---|---|
| Patient files are in .json format | Patient files are in .ndjson format |
| Patient file is a FHIR Bundle resource that contains all resources used for evaluation. | Patient file has a new line delimited list of all resources used for evaluation |
| Patient bundles are submitted for an entire reporting period at once | Patient files are submitted immediately after evaluation and pre-qual validation is complete |
| Manual submission of patient bundles indicates end of reporting period | The existence of the manifest.ndjson file in the facility submission directory indicates end of reporting period |
| No indication that patient failed prequal validation | Patient.ndjson file and manifest.ndsjon file will contain an OperationOutcome resource indicating that there was a failed validation |
| Facility related resources (Medication, Location, etc) exist in the patient Bundle | Facility related resources (Medication, Location, etc) exist in the patient .ndjson files |
Database Schema
Persistence schema for the Submission Service (Azure Blob Storage)
Internal storage for bundles before submission
External storage for final submissions to public health agencies