1. Where each part stands
| Part | Status |
|---|---|
| Ordering from the chart | Working on OpenEMR's public demo (2026-09-29). QDX was launched from a patient's summary page, the patient's demographics were filled in, and a test order was placed. |
| Results into the OpenEMR chart | Through OpenEMR's own lab results import (HL7). Tested 2026-09-29 on a self-hosted OpenEMR 7.0.3: QDX's result message was matched to the patient and stored with each value, its units, range and flag, as a final report. OpenEMR's FHIR API offers outside apps no write access, so this is the route. |
| Other ways | QDX can also send every result the other ways your practice chooses: the QDX portal, fax, email, a phone call, FHIR, a webhook, or PDF. |
2. Register QDX in OpenEMR
Register QDX as a confidential SMART app, either under Administration > System > API Clients, or through OpenEMR's registration endpoint (<your OpenEMR>/oauth2/default/registration):
| Field | Value |
|---|---|
| Application type | Confidential (private). QDX signs in with its own key, so no secret is exchanged: token endpoint auth method private_key_jwt, JWKS URI https://qdx.systems/portal/api/emr/jwks/nonprod.json for testing. QDX provides the production key set when you go live. |
| Redirect URI | https://qdx.systems/app/launch.html |
| Launch URI | https://qdx.systems/app/launch.html?org=<your QDX organization ID>. Through the registration endpoint, this is the initiate_login_uri field. |
| Scopes | openid fhirUser launch api:fhir user/Patient.read user/Practitioner.read user/Encounter.read user/Condition.read user/Person.read. OpenEMR refuses FHIR reads without api:fhir, and names a user who is not set up as a provider as a Person. |
Then enable the client (Administration > System > API Clients > Edit > Enable Client). "QDX Lab Ordering" appears under SMART Enabled Apps on each patient's summary page.
What the clinician sees:
- An OpenEMR sign-in and permission screen inside the app the first time (OpenEMR asks the user to authorize the app).
- The patient's demographics filled in, and the chart's ICD-10 conditions offered, when the conditions carry ICD-10 codes.
- The first time each OpenEMR user opens QDX, they choose which of your verified clinicians they are. QDX remembers the choice.
3. Results into the chart (HL7)
| Setting | Value |
|---|---|
| Procedure provider | Add a procedure provider (Procedures > Providers): name "QDX", direction results only, protocol local filesystem, results path a folder on your server (for example /var/qdx-results), and QDX as the sending facility. |
| Delivery | In QDX, Settings > Results delivery: HL7 over SFTP to your server, into that folder. QDX sends its HL7 v2.3 result message (ORU^R01), each value with its LOINC code where known and the performing lab's code. |
| Import | Procedures > Electronic Reports processes new results. OpenEMR matches each result to the patient by name and date of birth, and asks when a match is unclear. |
4. In QDX
Your QDX administrator adds the connection under Settings > EMR connections: OpenEMR, the FHIR base URL (<your OpenEMR>/apis/default/fhir), the client ID OpenEMR issued, your OpenEMR address as a frame site, and test or live mode.
5. Results by fax, for any practice
Until results are filed into your chart (or alongside it), QDX can fax each result report to your EMR's fax inbox. See Results into any EMR by fax.
6. Questions
Write to ops@qdx.systems.