Submission Service

Service that provides functionality for submitting report data

Service .NET MSSQL 8073:8080 CPU: 50m-500m RAM: 256Mi-1Gi OpenAPI

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.

FileDescriptionMultiple Files?
AggregateA MeasureReport resource that contains references to each patient evaluation for a specific measureYes, one per measure
ManifestA 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 ListA List resource of all patients that were admitted into the facility during the reporting periodNo
DeviceA Device resource that details the version of Link Cloud that was usedNo
OrganizationAn Organization resource for the submitting facilityNo
Other ResourcesA Bundle resource that contains all of the shared resources (Location, Medication, etc) that are referenced in the patient Measure ReportsNo
PatientA Bundle resource that contains the MeasureReports and related resources for a patientYes, one per evaluated patient

Nodes

Common Configurations

Custom Configurations

NameValueDescriptionSecret?
SubmissionServiceConfig__SubmissionDirectory<string>The location of where to store submission files until they are ready to be submitted. i.e. /data/SubmissionNo
SubmissionServiceConfig__PatientBundleBatchSize1The number of patients to process during submission in parallel (as seperate threads)No
SubmissionServiceConfig__MeasureNames__0__Url<string>URL of measureNo
SubmissionServiceConfig__MeasureNames__0__MeasureId<string>ID of measureNo
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:

  1. The Submission service’s SubmitPayloadListener picks up the message. The PayloadType on 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.
  2. The service streams the pre-compiled .ndjson content. 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.
  3. The content is streamed directly to the external Blob Storage container.
  4. The service emits a PayloadSubmitted Kafka 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:

  1. MeasureReport: Represents the summary-level (population) aggregation of all individual patient measure reports. It contains population counts and scoring.
  2. List: A FHIR List resource that references each individual patient who met the specific dQM criteria (e.g., Initial Population, Numerator, Denominator).
  3. Device: A resource representing the “Submitting Device”, which includes version information and software details about the Link platform performing the submission.
  4. Organization: A resource representing the submitting organization.
  5. 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:

  1. 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.
  2. Patient: The primary FHIR Patient resource describing the individual’s demographics.
  3. 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.
  4. 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
└── OperationOutcome

Manifest.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.Id reference must be included in the manifest List.entry of the manifest List resource.
    • The MeasureReport.Id reference must be included in the manifest MeasureReport.contained.List.entry of the manifest MeasureReport resource.
  • To ensure manifest entries have a corresponding patient submission:

    • Each MeasureReport.contained.List.entry must correspond to a single patient submission. A potential error in the submission process may have occurred if a MeasureReport.Id on the manifest does not coincide with any patient.ndjson Measure Reports.
MVPLink Cloud
Patient files are in .json formatPatient 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 oncePatient files are submitted immediately after evaluation and pre-qual validation is complete
Manual submission of patient bundles indicates end of reporting periodThe existence of the manifest.ndjson file in the facility submission directory indicates end of reporting period
No indication that patient failed prequal validationPatient.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 BundleFacility related resources (Medication, Location, etc) exist in the patient .ndjson files

Database Schema

8 properties

Persistence schema for the Submission Service (Azure Blob Storage)

InternalBlobStoragearray[object]

Internal storage for bundles before submission

ExternalBlobStoragearray[object]

External storage for final submissions to public health agencies