Skip to main content

A flexible client for FHIR servers supporting the SMART on FHIR protocol

Project description


This is _fhirclient_, a flexible Python client for [FHIR][] servers supporting the [SMART on FHIR][smart] protocol.
The client is compatible with Python 2.7.10 and Python 3.

Client versioning is not identical to FHIR versioning.
The `master` branch is usually on the latest version of the client as shown below, possibly on bugfix releases thereof.
The `develop` branch should be on recent freezes, and the `feature/latest-ci` branch is periodically updated to the latest FHIR continuous integration builds.

Version | FHIR |  
**3.0.0** | `3.0.0` | (STU-3)
**x.x** | `1.8.0` | (STU-3 Ballot, Jan 2017)
**x.x** | `1.6.0` | (STU-3 Ballot, Sep 2016)
**1.0.3** | `1.0.2` | (DSTU 2)
**1.0** | `1.0.1` | (DSTU 2)
**0.5** | `` | (DSTU 2 Ballot, May 2015)
**0.0.4** | `` | (DSTU 1)
**0.0.3** | `` | (DSTU 1)
**0.0.2** | `` | (DSTU 1)


pip install fhirclient


Technical documentation is available at [][docs].

### Client Use

To connect to a SMART on FHIR server (or any open FHIR server), you can use the `FHIRClient` class.
It will initialize and handle a `FHIRServer` instance, your actual handle to the FHIR server you'd like to access.

##### Read Data from Server

To read a given patient from an open FHIR server, you can use:

from fhirclient import client
settings = {
'app_id': 'my_web_app',
'api_base': ''
smart = client.FHIRClient(settings=settings)

import fhirclient.models.patient as p
patient ='hca-pat-1', smart.server)
# '1963-06-12'
# 'Christy Ebert'

If this is a protected server, you will first have to send your user to the authorize endpoint to log in.
Just call `smart.authorize_url` to obtain the correct URL.
You can use `smart.prepare()`, which will return `False` if the server is protected and you need to authorize.
The `smart.ready` property has the same purpose, it will however not retrieve the server's _CapabilityStatement_ resource and hence is only useful as a quick check whether the server instance is ready.

smart = client.FHIRClient(settings=settings)
# prints `False`
# prints `True` after fetching CapabilityStatement
# prints `True`
# prints `True` immediately
# is `None`

You can work with the `FHIRServer` class directly, without using `FHIRClient`, but this is not recommended:

smart = server.FHIRServer(None, '')
import fhirclient.models.patient as p
patient ='hca-pat-1', smart)[0].given
# ['Christy']

##### Search Records on Server

You can also search for resources matching a particular set of criteria:

smart = client.FHIRClient(settings=settings)
import fhirclient.models.procedure as p
search = p.Procedure.where(struct={'subject': 'hca-pat-1', 'status': 'completed'})
procedures = search.perform_resources(smart.server)
for procedure in procedures:
# {'status': u'completed', 'code': {'text': u'Lumpectomy w/ SN', ...

# to get the raw Bundle instead of resources only, you can use:
bundle = search.perform(smart.server)

### Data Model Use

The client contains data model classes, built using [fhir-parser][], that handle (de)serialization and allow to work with FHIR data in a Pythonic way.
Starting with version 1.0.5, data model validity are enforced to a certain degree.

#### Initialize Data Model

import fhirclient.models.patient as p
import fhirclient.models.humanname as hn
patient = p.Patient({'id': 'patient-1'})
# prints `patient-1`

name = hn.HumanName()
name.given = ['Peter'] = 'Parker' = [name]
# prints patient's JSON representation, now with id and name

name.given = 'Peter'
# throws FHIRValidationError:
# {root}:
# name:
# given:
# Expecting property "given" on <class 'fhirclient.models.humanname.HumanName'> to be list, but is <class 'str'>

#### Initialize from JSON file

import json
import fhirclient.models.patient as p
with open('path/to/patient.json', 'r') as h:
pjs = json.load(h)
patient = p.Patient(pjs)[0].given
# prints patient's given name array in the first `name` property

### Flask App

Take a look at [``][flask_app] to see how you can use the client in a simple (Flask) app.
This app starts a webserver, listening on [_localhost:8000_](http://localhost:8000), and prompts you to login to our sandbox server and select a patient.
It then goes on to retrieve the selected patient's demographics and med prescriptions and lists them in a simple HTML page.

The Flask demo app has separate requirements.
Clone the _client-py_ repository, then best create a virtual environment and install the needed packages like so:

git clone
cd client-py
virtualenv -p python3 env
. env/bin/activate
pip install -r requirements_flask_app.txt

Building Distribution

pip install -r requirements.txt
python sdist
python bdist_wheel

### Incrementing the lib version

bumpversion patch
bumpversion minor
bumpversion major

Docs Generation

Docs are generated with [Doxygen][] and [doxypypy][].
You can install doxypypy via pip: `pip install doxypypy`.
Then you can just run Doxygen, configuration is stored in the `Doxyfile`.

Running Doxygen will put the generated documentation into `docs`, the HTML files into `docs/html`.
Those files make up the content of the `gh-pages` branch.
I usually perform a second checkout of the _gh-pages_ branch and copy the html files over, with:

rsync -a docs/html/ ../client-py-web/

PyPi Publishing (notes for SMART team)

Using setuptools (*Note*: Alternatively, you can use twine

### Make sure that you have the PyPi account credentials in your account

copy to ~/.pypirc

### Test the build

python sdist
python bdist_wheel

### Upload the packages to PyPi

python sdist upload -r pypi
python bdist_wheel upload -r pypi



“fhirclient” is written and maintained by the SMART Platforms Team / Boston Children's Hospital.


The following wonderful people contributed directly or indirectly to this project:

- Erik Wiffin <>
- Josh Mandel <>
- Nikolai Schwertner <>
- Pascal Pfiffner <>
- Trinadh Baranika <>

Please add yourself here alphabetically when you submit your first pull request.

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for fhirclient, version 3.2.0
Filename, size File type Python version Upload date Hashes
Filename, size fhirclient-3.2.0.tar.gz (351.9 kB) File type Source Python version None Upload date Hashes View
Filename, size fhirclient-3.2.0-py2.py3-none-any.whl (550.4 kB) File type Wheel Python version py2.py3 Upload date Hashes View

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Huawei Huawei PSF Sponsor Microsoft Microsoft PSF Sponsor NVIDIA NVIDIA PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page