This document describes the structure and syntax of the electronic health information (EHI) exports produced by Accumedic EMR and Accumedic PM. It is the export format documentation for ONC Health IT Certification criterion 45 CFR 170.315(b)(10) Electronic Health Information export: the single-patient export (§170.315(b)(10)(i)) and the patient population export (§170.315(b)(10)(ii)). Every export package includes a link to this page.
Every table and column that can appear in an export (1054 tables) is described in the data dictionary, with the code lists the application defines. The same information is available as JSON and CSV.
01The two exports
Accumedic EMR (clinical records) and Accumedic PM (scheduling, billing and practice management) share one database for each practice. An export contains the EHI that the two products store: demographics, clinical documentation, problems, medications, allergies, immunizations, orders and results, treatment plans, assessments, opioid treatment program dispensing, messages, scheduling, insurance, claims, payments and statements. It also contains stored documents and images.
| Single-patient export | Patient population export | |
|---|---|---|
| Criterion | §170.315(b)(10)(i) | §170.315(b)(10)(ii) |
| Contents | All EHI for one patient, plus the reference data needed to interpret it | All EHI for every patient in the practice database, plus all reference data |
exportType in manifest.json |
single-patient |
population |
Both exports use the same package structure, file formats and conventions. Records that were deleted in the application but are still stored (for example, encounters marked as deleted) are included in both exports.
02How an export is produced
Single-patient export.
- An authorized user creates it from within Accumedic EMR. It can be run at any time, with no Accumedic involvement (§170.315(b)(10)(i)(B)).
- Steps:
- Open the patient's Demographics and select EHI Export.
- Select Create EHI export.
- The export runs in the background and the user receives a message when it is ready.
- Download the ZIP file from the same page.
- Completed exports remain available for download for a period set by the practice (7 days by default).
- Who can create one (§170.315(b)(10)(i)(C)(1)): only users who have been given the Export Patient EHI privilege. Practice administrators assign it to specific users or roles. No user has it until it is assigned, and it is not available in emergency-access sessions.
- Creating and downloading exports are recorded in the application's access audit log.
Patient population export. The practice requests it from Accumedic support. Accumedic produces the export with its export tool and delivers the ZIP file to the practice securely.
03Package structure
An export is a single ZIP file. ZIP64 is used for packages larger than 4 GB.
The C-CDA summary is included for convenience and human readability. Everything it contains is also in data/.
04CSV conventions
- One file per table, named
data/<TABLE>.csv. Table and column names are upper case, and columns appear in the source table's order. - RFC 4180, comma-delimited, UTF-8 without a byte-order mark, CRLF line endings, with a header row.
- Missing values: an unquoted empty field means no value (
NULL). A quoted empty field ("") means an empty text value. - A field that contains a comma, a double quote, a line break, or leading or trailing spaces is enclosed in double quotes. Embedded double quotes are doubled.
- A table with no rows for the patient is still present, as a header-only file.
Every column has a logical type, given in the data dictionary and in manifest.json:
| Type | Representation | Example |
|---|---|---|
string |
Text as entered. May contain line breaks. Some clinical note fields contain HTML markup. | Follows up in 2 weeks |
integer |
Optional minus sign and digits | -42 |
decimal |
. as the decimal separator, no thousands separator |
125.5000 |
float |
Decimal or scientific notation | 98.6 |
boolean |
1 = true, 0 = false |
1 |
date |
yyyy-MM-dd |
2024-03-01 |
datetime |
yyyy-MM-ddTHH:mm:ss.fff, in the practice's local time (the source system does not record a time zone) |
2024-03-01T14:30:00.000 |
datetimeoffset |
ISO 8601 with UTC offset | 2024-03-01T14:30:00.000-05:00 |
time |
HH:mm:ss.fff |
08:15:00.000 |
guid |
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
|
binary |
Base64. Row-version values are hexadecimal with a 0x prefix. |
|
file |
Path of a file in the package, relative to the package root (section 7) | documents/PAT_IMAGES/000123_4/referral.pdf |
Text flag columns use the values stored by the application, typically Y/N.
05manifest.json
manifest.json is generated from the database at the moment the export is created. It is the authoritative data
dictionary for that export: it describes every file in the package, so it stays accurate even for a table added to
the product after this documentation was published.
{
"formatName": "Accumedic EHI Export",
"formatVersion": "1.0",
"formatSpecification": "https://patient-export-docs.accumedic.com",
"exportType": "single-patient",
"generatedAtUtc": "2026-10-06T14:03:22Z",
"generator": { "name": "Accumedic EMR", "version": "1.0.0.0", "linkageManifestVersion": "2026-10-06" },
"source": { "practice": "Example Practice" },
"consistency": "Tables are read one after another from the database; ...",
"patientKey": { "table": "PATIENTS", "column": "ACCOUNT" },
"patients": [ { "account": "000123", "lastName": "Doe", "firstName": "Jane", "dateOfBirth": "1980-01-31" } ],
"tables": [
{
"name": "AR_LINE_ITEMS",
"category": "patient",
"domain": "Billing: encounters, A/R, claims, remittance",
"description": "Charge lines on an invoice: procedure, diagnosis pointers, dates and units.",
"patientLink": "(INVOICE) -> ACCOUNTS_RECEIVABLE(INVOICE)",
"patientLinks": [ { "type": "via", "table": "ACCOUNTS_RECEIVABLE", "join": [ { "column": "INVOICE", "references": "INVOICE" } ] } ],
"primaryKey": ["INVOICE", "LINE_NO"],
"file": { "path": "data/AR_LINE_ITEMS.csv", "rows": 42, "bytes": 5120, "sha256": "…" },
"columns": [
{ "name": "INVOICE", "type": "integer", "sqlType": "int", "nullable": false },
{ "name": "DATE_OF_SERVICE", "type": "datetime", "sqlType": "datetime", "nullable": true }
]
}
],
"codeLists": { "AR_TRANSACTION_KIND": { "description": "…", "values": [ { "code": "0", "meaning": "Charge" } ] } },
"documents": { "count": 17, "totalBytes": 48211122, "files": [ { "path": "documents/PAT_IMAGES/000123_4/referral.pdf",
"table": "PAT_IMAGES", "column": "IMAGE_BODY", "rowKey": "000123_4", "mimeType": "application/pdf",
"originalFileName": "referral.pdf", "bytes": 182044, "sha256": "…" } ] },
"tablesNotIncluded": [ { "name": "…", "category": "audit", "reason": "…" } ],
"warnings": []
}
| Field | Meaning |
|---|---|
exportType |
single-patient or population |
patients |
Single-patient exports: the patient the export was created for |
consistency |
How the data was read (see section 10) |
tables[] |
One entry per CSV file |
tables[].category |
patient (records belonging to a patient), shared (a record shared by several patients, such as a claim batch or an electronic remittance file), reference (code tables and directories used to interpret patient records), audit (population exports, on request only), unresolved (a table not yet classified; see section 10) |
tables[].patientLinks |
How each row relates to a patient (section 6); absent for reference tables |
tables[].relatedPersonColumns |
Single-patient exports: for rows that belong to a related person rather than the patient, only these columns are populated (section 6) |
tables[].autoLinked |
true when the table was not in the published data dictionary at the time of the export and was linked to the patient automatically |
tables[].columns[] |
Each column in file order: name, logical type (section 4), source sqlType, nullable, and where available description and codeList |
codeLists |
Code lists used by columns in this export (section 8) |
documents.files[] |
Every document file, the table, column and row it belongs to, its MIME type, the original file name when recorded, size and SHA-256. storedCompressed: true means the application stored the file inside a ZIP wrapper and the export contains the unwrapped original. |
tablesNotIncluded |
Tables with patient-related data that are not in this export, and why (section 9) |
warnings |
Anything the export could not do completely, for example a document file that could not be found |
sha256 |
Lowercase hexadecimal SHA-256 of the file, for integrity checking |
06Linkage and attribution
Patient identifier. ACCOUNT (text, up to 12 characters) identifies a patient in both products.
PATIENTSlists the accounts that are patients.PEOPLEholds names, addresses and other demographic details. It holds them for patients and also for related persons, such as an insurance subscriber or guarantor.
How a row relates to a patient. Each patient table's patientLinks gives one or more ways a row can relate to a
patient. A row relates to a patient if any of them applies:
{"type": "column", "column": "X"}: the row's columnXholds the patient'sACCOUNT.{"type": "via", "table": "T", "join": [{"column": "A", "references": "B"}]}: the row's columnAequals columnBof a row in tableT, and that row relates to the patient. ApplyT's ownpatientLinksthe same way.
The data dictionary shows the same information in words. Common keys that link records:
| Key | Identifies | Table that relates it to the patient |
|---|---|---|
ENCOUNTER_ID |
a clinical encounter and its documentation | EMR_ENCOUNTERS |
ENCOUNTER |
a billing encounter (superbill) | ENCOUNTERS |
EPISODE_CARE_ID |
a program admission (episode of care) | PAT_PROGRAMS |
APPT_ID |
an appointment | APPOINTMENTS |
INVOICE |
an invoice and its charges, claims and payments | ACCOUNTS_RECEIVABLE (through PATIENT_ACCOUNT) |
LAB_ORDER_NUMBER + LAB_ID |
a laboratory order and its results | EMR_ORDERS |
Related persons. In a few tables ACCOUNT identifies someone other than the patient:
- In
ACCOUNTS_RECEIVABLEandELIG_REQUESTS,ACCOUNTis the responsible party or insured;PATIENT_ACCOUNTis the patient. - In
INSURANCE_POLICIES,ACCOUNTis the policy holder. A patient covered as a dependent is linked to the policy throughPAT_INSURANCES. - In
PAT_STATEMENT_DATES,ACCOUNTis the statement recipient.
A single-patient export includes the PEOPLE rows of the patient's guarantor, legal representative and insurance
policy holders, because the patient's records refer to them. These rows contain only the person's ACCOUNT and name;
their other columns are empty. manifest.json lists the populated columns under relatedPersonColumns. The
patient's own row is complete, and population exports contain every row in full.
Shared records. Some records belong to more than one patient: a claim batch, an electronic remittance (835) file, a group-therapy group, or a contact person linked to several patients. A single-patient export includes such a record when the patient's records refer to it, but never the other patients' rows. In a population export a shared record appears once, and it relates to every patient whose records refer to it.
Attribution in a population export. To find all rows for one patient, start from PATIENTS.ACCOUNT and apply
each table's patientLinks as described above. Reference tables are not attributed to patients.
07Documents and images
Scanned and uploaded documents, photographs, signatures, rendered encounter notes, laboratory result documents and
message attachments are written to documents/ in their original file format:
documents/<TABLE>/<row key>/<file name>
<row key>is the row's primary-key values joined with_.<file name>is the original file name when the application recorded one. Otherwise it is the column name plus an extension matching the file's content, for exampleIMAGE_BODY.pdf.- When a row has more than one file column, files from the additional columns are prefixed with the column name,
for example
IMAGE_THUMB_intake.pdf. - The row's column in the CSV holds the same relative path.
manifest.jsonlists every file with its MIME type, size and SHA-256. - Where the application stored a file inside a ZIP wrapper, the export contains the original file. ZIP files and Office documents that were uploaded as such are exported unchanged.
08Codes and clinical forms
Code values.
- Many columns hold codes from standard code systems: ICD-10-CM, CPT/HCPCS, SNOMED CT, RxNorm, LOINC, CVX and NDC.
- Practice-defined codes are decoded by reference tables included in the export, for example the lookup tables whose
names begin with
V_, and directories such asPROVIDERS,PAYORSandLOCATIONS. - A few code lists are defined by the application itself. They are listed on the
code lists page and in
manifest.json(codeLists), and are referenced by the columns that use them.
Clinical forms. Clinical documentation is entered on configurable forms.
- Each encounter is a row of
EMR_ENCOUNTERS. ItsMASTER_TEMPLATE_IDidentifies the form used, and the form is described inEMR_MASTER_TEMPLATES. - The values entered on a form are stored in tables whose names begin with
EMR_ENCOUNTERS_(for exampleEMR_ENCOUNTERS_PROGRESS_NOTESandEMR_ENCOUNTERS_SOAP). These rows are keyed byENCOUNTER_ID, plusSEQUENCE_NOfor repeating entries. EMR_DATA_ELEMENT_MASTERdescribes each form field: its name, description and units, and theTABLE_NAMEandCOLUMN_NAMEwhere its value is stored.- The signed note is also included as a PDF (
EMR_ENCOUNTERS.IMAGE_BODY).
09What is not included
Exports contain the EHI the products store. The following are not included:
| Not included | Why |
|---|---|
| Application configuration that is not needed to interpret the data: user and security settings, screen layouts, report definitions, system integration settings and internal number sequences | Not health information. Code tables and directories needed to interpret the data (for example providers, payers, locations, programs, fee schedules and form definitions) are included. |
| Staff and provider personal details | Not patient information. Directory information (names, credentials, identifiers such as NPI, and practice contact details) is included so that the people named in patient records can be identified. |
| Audit trails and interface logs | Not part of the designated record set. The clinical content of interface messages (for example, laboratory results) is stored, and exported, in the clinical tables. Population exports include them when the practice requests it. |
| Data that has been permanently deleted | No longer stored |
| Psychotherapy notes, as defined in 45 CFR 164.501 | Excluded from EHI by definition (45 CFR 171.102). Accumedic EMR and Accumedic PM do not maintain psychotherapy notes separately from the medical record. All clinical documentation the products store, including session and process notes recorded in encounters, is part of the medical record and is included. |
Audit trails and interface logs are not part of the designated record set. They are excluded from single-patient exports, and are included in a population export only when the practice requests them:
AUDIT_ACTIVITY, AUDIT_FIELD_CHANGES, AUDIT_FORM_ACCESS, AUDIT_HL7_MESSAGES, AUDIT_REPORT_ACCESS, EMR_DRFIRST_ERROR_LOG, EMR_ENCOUNTERS_AUDIT_LOG, EXCHANGE_SYNC_LOG, HL7_RECEIVER_LOG, INTERFACE_LOG_PAT, RCM_INTERFACE_LOG, RCM_PAYMENT_LOG, STOCKAMP_SERVER_LOG
Records that contain other patients' data, such as complete claim transmission files, are included in population exports only:
CLAIM_BATCH_MESSAGES, CLAIM_BATCH_REPORTS, CLAIM_BATCH_TRANSMISSION
Each export's manifest.json lists, under tablesNotIncluded, the tables with patient-related data that are not in
that export, and why.
10Stated limits
The export declares the following limits about itself.
Tables are read one after another, not inside a single database transaction. A record changed while the export runs can appear in one table and not in a related one. Population exports are normally produced from a copy of the practice database, which avoids this.
When two patient records were merged, the data was moved to the surviving account. The previous demographic record is kept in PAT_OLD_PEOPLE, and OLD_ACCOUNT holds the former account number.
If a stored document file cannot be found when the export is created, its column is empty and the export's warnings say so.
An export may contain a table that is not yet in the published data dictionary. It is fully described in that export's manifest.json, marked "autoLinked": true or "category": "unresolved", and noted in warnings.
The row counts in manifest.json are authoritative for the export.
11Reading an export
- Unzip the package, using a tool that supports ZIP64 for large population exports.
- Read
README.txt, thenmanifest.json. CheckexportType, and for a single-patient export,patients. - For each entry in
tables, loadfile.pathwith an RFC 4180 CSV parser, as UTF-8. Treat unquoted empty fields as missing values, and convert values using the column types (section 4). - Optionally, verify each file against its
sha256. - Relate rows to the patient with
patientLinks(section 6), and join tables on the keys described in the data dictionary. - Decode codes using the reference tables and
codeLists(section 8). - Open documents from the paths in the CSV columns or in
documents.files.
12Versioning and currency
- The format version is in
manifest.json(formatVersion). Adding tables or columns does not change the major version, so consumers should ignore columns they do not recognise. A change to the meaning or representation of existing data increments the major version, and the documentation for earlier versions remains available. - This documentation and the data dictionary are generated from the product's database schema. They are republished whenever a product release changes the export format (§170.315(b)(10)(iii)).
manifest.jsonin each export is generated at the time of export, so it always describes that export exactly.
| Version | Date | Change |
|---|---|---|
| 1.0 | 6 October 2026 | Initial release |
13Contact
Questions about an export can be sent to Accumedic support through the practice's usual support channel.