Application Programming Interface (API)

Terms of API Use

Introduction

With WebChart , you can enhance and configure the system to support a wide range of workflows and processes. This includes migrating valuable data from legacy applications, seamlessly integrating with HR systems, email platforms, laboratories, and medical devices, and facilitating secure data sharing across the solution. WebChart also provides robust capabilities for aggregating data from multiple sources without encountering barriers.

This document outlines the framework that underpins these capabilities.

The core API utilizes a REST architecture, supporting both GET and POST methods to retrieve or modify records. Access to the API requires an authenticated session, which can be established either through a cookie-based mechanism using a username and password or via an OAuth 2.0 bearer token generated with an API key.

Explore the WebChart API, below.

Interactive, dynamic documentation of the WebChart API can be found inside the product. Navigate to the API tab of the Control Panel for full visibility of the various objects and their APIs.

Then you can explore each object type and then clock on the Object to experiment with the javascript api. There is a button at the lower right that allows you to experiment in real time.

Every object has a URL. For example: patients:

JavaScript API

Node: https://github.com/mieweb/mieapi-js

Meteor: https://github.com/mieweb/mieapi-meteor

Python API

example in python: wcjson.py

Example programs

Other examples can be found here: https://github.com/mieweb/webchart-interface-examples

Session Establishment

Command-line


curl WEBCHARTURL?login_user=USERNAME&login_passwd=PASSWORD  

Python example


out = urllib2.urlopen(URL, urllib.urlencode({
  'login_user': USERNAME,
  'login_passwd': PASSWORD
}))
COOKIE = out.headers.get('Set-Cookie').split('=')[1].split(';')[0]
Info
COOKIE represents the session and is sent in the response.

ONC Certification API 2015 Edition

Overall, this document is intended to comply with the established criteria laid out for 2015 Edition ONC Certification–Patient Selection 170.315(g)(7), Data Category Request 170.315(g)(8), and All Data Request 170.315(g)(9). The following table provides access to the ONC specifications regarding these standards and requirements:

§ 170.315(g)(7)Application Access – Patient Selection(g)(7) GuideTest Procedure (PDF - 172 KB)
§ 170.315(g)(8)Application Access – Data Category Request(g)(8) Guide
CCDS Guide
Test Procedure (PDF - 181 KB)
CCDS Reference (PDF - 360 KB)
§ 170.315(g)(9)Application Access – All Data Request(g)(9) Guide
CCDS Guide
Test Procedure (PDF - 236 KB)
§ 170.315(g)(10)Application Access – All Data Request(g)(9) Guide
CCDS Guide
Test Procedure (PDF - 236 KB)

§ 170.315(g)(7) Application access – Patient Selection

http://system/?f=layout&module=JS&name=API_DOC&tabmodule=admin&tabselect=API


requests = {  
  'Last Name LIKE "Hart"': 'GET/db/patients/LIKE_last_name=Hart',  
  'Last Name LIKE "Pregnant"': 'GET/db/patients/LIKE_last_name=Pregnan',  
}  
for title, url in requests.iteritems():  
  print('\\nQuerying for patients: {0}'.format(title))  
js = json.load(  
  urllib2.urlopen(URL, urllib.urlencode({  
    'f': 'json',  
    'session_id': COOKIE,  
    'apistring': base64.b64encode(url)  
  })))  
print(json.dumps(js))  

Requests are URLs. urllib2.urlopen does the work of calling each request and outputting the response on the screen.

§ 170.315(g)(8) Application access – Data Category Request

URL-specific sections are returned in XML CCDA format.

Patient Name?f=layout&module=StructDocAPI&name=Patient%20Name&XML&pat_id=XX
Sex?f=layout&module=StructDocAPI&name=Gender%20Code&XML&pat_id=XX
Date of Birth?f=layout&module=StructDocAPI&name=Birth%20Date&XML&pat_id=XX
Race?f=layout&module=StructDocAPI&name=Patient%20Race&XML&pat_id=XX
Ethnicity?f=layout&module=StructDocAPI&name=Patient%20Ethnicity&XML&pat_id=XX
Preferred Language?f=layout&module=StructDocAPI&name=Patient%20Language&XML&pat_id=XX
Smoking Status?f=layout&module=StructDocAPI&name=Smoking%20Status&XML&pat_id=XX
Problems?f=layout&module=StructDocAPI&name=Problems&XML&pat_id=XX
Medications?f=layout&module=StructDocAPI&name=Medications&XML&pat_id=XX
Medication Allergies?f=layout&module=StructDocAPI&name=Allergies&XML&pat_id=XX
Laboratory Tests (Orders?)
Laboratory Values(s)/Result(s)?f=layout&module=StructDocAPI&name=Results&XML&pat_id=XX
Vital Signs?f=layout&module=StructDocAPI&name=Vital Signs&XML&pat_id=XX
Procedures?f=layout&module=StructDocAPI&name=Procedures&XML&pat_id=XX
Care Team Member(s)?f=layout&module=StructDocAPI&name=Care Team Members&XML&encounter_id=XX
Immunizations?f=layout&module=StructDocAPI&name=Immunizations&XML&pat_id=XX
Unique Device Identifier(s) for a Patient's Implantable Device(s)?f=layout&module=StructDocAPI&name=Medical_Equipment&XML&pat_id=XX
Assessment and Plan of Treatment?f=layout&module=StructDocAPI&name=Assessments&XML&encounter_id=XX
Goals?f=layout&module=StructDocAPI&name=Goals&XML&encounter_id=XX
Health Concerns?f=layout&module=StructDocAPI&name=Health Concerns&XML&encounter_id=XX
&sdate=YYYY-MM-DD
&edate=YYYY-MM-DD

#!/usr/bin/env python
import sys
import os
import urllib2
import urllib
import base64
import json
import re

USERNAME = 'dave'
PASSWORD = 'dave'
COOKIE = None

DTREG = '\\d{4}-\\d{2}-\\d{2}'
OUTPUT = 'output'
APIS = {
       'Patient Name': 'Patient Name',
       'Sex': 'Gender Code',
       'Date of Birth': 'Birth Date',
       'Race': 'Patient Race',
       'Ethnicity': 'Patient Ethnicity',
       'Preferred Language': 'Patient Language',
       'Smoking Status': 'Smoking Status',
       'Problems': 'Problems',
       'Medications': 'Medications',
       'Medication Allergies': 'Allergies',
       'Lab Values_Result': 'Results',
       'Vital Signs': 'Vital Signs',
       'Procedures': 'Procedures',
       'Immunizations': 'Immunizations',
}

def usage():
       print('Usage: {0} URL [startDate [endDate]] PatientLastName1 PatientLastName2 ...'.format(__file__))
       exit()

if __name__ == '__main__':
       if len(sys.argv) < 3:
               usage()
       URL = sys.argv[1]
       sdate = ''
       edate = ''
       names = sys.argv[2:]
       dtmatches = [x for x in names if re.match(DTREG, x)]
       if dtmatches:
               if len(dtmatches) == 1:
                       sdate = dtmatches[0]
               else:
                       sdate = dtmatches[0]
                       edate = dtmatches[1]
       charts = {}
       print('Initializing session at {0}'.format(URL))
       try:
               out = urllib2.urlopen(URL, urllib.urlencode({
                       'login_user': USERNAME,
                       'login_passwd': PASSWORD
               }))
               COOKIE = out.headers.get('Set-Cookie').split('=')[1].split(';')[0]
       except Exception as e:
               print('Session failed to initialize {0}'.format(e))

       if COOKIE:
               for name in names:
                       js = json.load(urllib2.urlopen(URL, urllib.urlencode({
                               'f': 'json',
                               'session_id': COOKIE,
                               'apistring': base64.b64encode('GET/db/patients/LIKE_last_name={0}'.format(name))
                       })))
                       if js and js['db']:
                               for rec in js['db']:
                                       charts[rec['pat_id']] = rec
               for cid, chart in charts.iteritems():
                       patname = '{0},{1},{2}_{3}'.format(chart['last_name'], chart['first_name'],
                               chart['middle_name'], cid)
                       if not os.path.exists(os.path.join(OUTPUT, patname)):
                               os.makedirs(os.path.join(OUTPUT, patname))
                       print('Retrieving data for {0} {1} {2}'.format(patname,
                               'after' if not edate and sdate else 'between' if edate and sdate else '',
                               sdate if not edate else '{0} and {1}'.format(sdate, edate)))
                       for k, v in APIS.iteritems():
                               res = urllib2.urlopen(URL, urllib.urlencode({
                                       'session_id': COOKIE,
                                       'f': 'layout',
                                       'module': 'StructDocAPI',
                                       'XML': '1',
                                       'name': v,
                                       'pat_id': cid,
                                       'sdate': sdate,
                                       'edate': edate,
                               }))
                               with open (os.path.join(OUTPUT, patname, '{0}.xml'.format(k)), 'w') as fp:
                                       fp.write(res.read())

§ 170.315(g)(9) Application access – All Data Request

Receive documents stored in charts:


#!/usr/bin/env python  
import urllib2  
import urllib  
import base64  
import json  
import os

URL = 'https://server/webchart.cgi'  
USERNAME = 'dave'  
PASSWORD = 'dave'  
COOKIE = None

# Download a document  
def downloadDocument(doc_id, filename):  
    if not os.path.exists(filename):  
        out = urllib2.urlopen(URL, urllib.urlencode({  
            'f': 'stream',  
            'doc_id': doc_id,  
            'session_id': COOKIE,  
            'rawdata': '1'  
        }))  
        with open(filename, 'wb') as fp:  
            fp.write(out.read())

def downloadDocumentMeta(pat_id):  
        try:  
                api = "GET/db/documents/storage_type=19&LIKE_service_date=2017-05-02%25&pat_id=" + pat_id  
                print('\\nQuerying for patients: {0}'.format(pat_id))  
                docs = json.load(  
                        urllib2.urlopen(URL, urllib.urlencode({  
                                'f': 'json',  
                                'session_id': COOKIE,  
                                'apistring': base64.b64encode(api)  
                        })))  
                return docs["db"][0]["doc_id"];  
        except:  
                return ""

if __name__ == '__main__':  
        print('Initializing session')  
        try:  
                out = urllib2.urlopen(URL, urllib.urlencode({  
                        'login_user': USERNAME,  
                        'login_passwd': PASSWORD  
                }))  
                COOKIE = out.headers.get('Set-Cookie').split('=')[1].split(';')[0]  
        except Exception as e:  
                print('Session failed to initialize {0}'.format(e))

        print('Getting Patients')  
        if COOKIE:  
                requests = {  
                        'Last Name LIKE "Newman"': 'GET/db/patients/LIKE_last_name=Newman',  
                        'Last Name LIKE "Larson"': 'GET/db/patients/LIKE_last_name=Larson',  
                        'Last Name LIKE "Bates"': 'GET/db/patients/LIKE_last_name=Bates',  
                        'Last Name LIKE "Wright"': 'GET/db/patients/LIKE_last_name=Wright',  
                }  
                for title, url in requests.iteritems():  
                        print('\\nQuerying for patients: {0}'.format(title))  
                        js = json.load(  
                                urllib2.urlopen(URL, urllib.urlencode({  
                                        'f': 'json',  
                                        'session_id': COOKIE,  
                                        'apistring': base64.b64encode(url)  
                                })))  
                        pat_id = js["db"][0]["pat_id"]  
                        name = js["db"][0]["last_name"]

                        print("Getting Documents for Patient:" + pat_id)  
                        doc_id = downloadDocumentMeta(pat_id);

                        if doc_id != "":  
                                print("Downloading Document:" + doc_id)  
                                downloadDocument(doc_id, name + "_" + doc_id + ".xml")  
                        else:  
                                print("No documents exist for that patient that meet the criteria.")  
                        # print(json.dumps(js))

Document Export Tool

WebChart  has functional tools for importing and exporting documents to the system. The Export Tool is written in Python and can be run on Windows, Mac, or Linux. Conversely, importing documents is done with the MIE File Import utility.

Requirements

  • Windows: compiled exe are provided so Windows 7+ is sufficient.
  • Mac 10.8+: Python 2.7 is shipped with Mountain Lion and greater.
  • Linux: Python 2.7 or Python 3.1 is required and python-tk. The user interface requires a GUI / window manager.

Installing

  • Download the project from GitHub at https://github.com/mieweb/wcexport
  • Windows-compiled EXE files are provided so python does not have to be installed.
  • Instructions for use are in the README.md file within the git project.

WebChart Documentation

Last Updated:

Last Build: Thu, 03 Oct 2024 14:16:30 UTC
WikiGDrive Version: dd69069d725fca5f553df7ded62e130a49d49ca6