Modern Python client for the QGenda REST API
Project description
qgendapy
Modern Python client for the QGenda REST API.
Documentation: GitHub Pages Docs
Thank you to JP Jorissen for laying the foundation for this library.
Features
- Full API coverage -- 160+ methods across 24 resource groups
- Sync + Async --
QGendaClientandAsyncQGendaClientwith identical APIs - Resource-namespaced --
client.schedule.list(),client.staff.get(key),client.credentialing.workflows() - Typed models -- Dataclass responses with automatic PascalCase-to-snake_case mapping
- OData builder --
OData().select("Name").filter("IsActive eq true") - 3-tier config -- Explicit args > environment variables > INI file
- Drop-in compat -- Migration module for legacy
python-qgendausers
Installation
pip install qgendapy
Quick Start
from qgendapy import QGendaClient, OData
client = QGendaClient(
email="you@hospital.org",
password="your-password",
company_key="your-company-key",
)
# Get this week's schedule
schedule = client.schedule.list(start_date="2024-01-15", end_date="2024-01-21")
for entry in schedule:
print(f"{entry.staff_f_name} {entry.staff_l_name}: {entry.task_name}")
# OData filtering
odata = OData().select("FirstName", "LastName").filter("IsActive eq true")
staff = client.staff.list(odata=odata)
Configuration
# Environment variables
export QGENDA_EMAIL="you@hospital.org"
export QGENDA_PASSWORD="your-password"
export QGENDA_COMPANY_KEY="your-company-key"
# Then just:
client = QGendaClient()
Legacy QGENDA_CONF_FILE INI format is also supported.
Related-entity loading: includes= vs OData $expand
QGenda offers two ways to ask for related entities, and they aren't interchangeable:
- OData
$expand(client.staff.list(expand="Tags")orodata=OData().expand("Tags")) targets nav properties on the OData DTO. On QGenda's production endpoints these often returnnullfor non-admin service accounts, even when the data exists. - QGenda's own
includes=query parameter is a separate, non-OData selector that returns rich nested categories. It works under non-admin scope on schedule-style endpoints — this is the preferred way to read tag/specialty data attached to schedule entries.
# Pull every Call 1 shift on a given day, with Primary Specialty,
# Sub Specialty, Staff Type, and Skill Set tags inline:
resp = client.schedule.list(
start_date="2026-05-22",
end_date="2026-05-22",
includes="StaffTags",
odata=OData().filter("TaskName eq 'Call 1'"),
)
for entry in resp:
if entry.staff_tags:
for cat in entry.staff_tags:
print(cat.category_name, [t["Name"] for t in (cat.tags or [])])
Allowed values, observed in the wild (cross-check against your QGenda deployment):
| Endpoint | Valid includes= values |
|---|---|
/schedule |
StaffTags, TaskTags, LocationTags |
/openshifts |
TaskTags, LocationTags |
/task |
Profiles, Tags, TaskShifts |
/staffmember |
Skillset, Tags, Profiles (verify per deployment) |
/dailycase |
Task, Supervisors, DirectProviders |
/patientencounter |
StandardFields, PatientInformation |
Async
from qgendapy import AsyncQGendaClient
async with AsyncQGendaClient() as client:
schedule = await client.schedule.list(start_date="2024-01-15")
Migrating from python-qgenda
# Change one import:
# from qgenda.api.client import QGendaClient
from qgendapy.compat import QGendaClient
# Everything else works the same
client = QGendaClient(username="...", password="...", company_key="...")
client.authenticate()
resp = client.get_schedule(start_date="2024-01-15")
data = resp.json()
See docs/migration.md for the full migration guide.
Resources
| Resource | Attribute | Methods |
|---|---|---|
| Schedule | client.schedule |
list, audit_log, open_shifts, rotations |
| Staff | client.staff |
list, get, create, update, tags, skillsets, profiles, pay_modifiers, ... |
| Staff Type | client.staff_type |
list |
| Task | client.task |
list, create, update, locations, tags, shifts |
| Facility | client.facility |
list, get, create, update, delete, staff, tags, tasks, ... |
| Time Event | client.time_event |
list, create, update, delete |
| Daily Case | client.daily_case |
list, create, update, delete |
| Request | client.request |
list, approved |
| Request Limit | client.request_limit |
CRUD + staff_quotas, task_shifts |
| Daily Ops | client.daily |
configurations, rooms, patient_encounters, capacity |
| Credentialing | client.credentialing |
contacts, locations, providers, privileges, records, workflows, ... |
| Notification | client.notification |
CRUD + contacts |
| User | client.user |
list, get, non_scheduled |
| + 11 more | pay, tags, profiles, company, organization, ... |
Acknowledgments
Inspired by python-qgenda by JP Jorissen.
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file qgendapy-0.3.0.tar.gz.
File metadata
- Download URL: qgendapy-0.3.0.tar.gz
- Upload date:
- Size: 81.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
75c70284a0159af1be76059a273621dd671d56205dd9e53efb7656c772ba68ce
|
|
| MD5 |
5111711222a113d0cbc47a5744db8364
|
|
| BLAKE2b-256 |
a3d38d11d6b5ba4d0fe5407712040ec2ca929e5a01ad5afef587b5547b6e12dc
|
Provenance
The following attestation bundles were made for qgendapy-0.3.0.tar.gz:
Publisher:
publish.yml on lancereinsmith/qgendapy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qgendapy-0.3.0.tar.gz -
Subject digest:
75c70284a0159af1be76059a273621dd671d56205dd9e53efb7656c772ba68ce - Sigstore transparency entry: 1606797701
- Sigstore integration time:
-
Permalink:
lancereinsmith/qgendapy@c358268ec04c3587b5619ab3b95e7f7e9edb1bab -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/lancereinsmith
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c358268ec04c3587b5619ab3b95e7f7e9edb1bab -
Trigger Event:
release
-
Statement type:
File details
Details for the file qgendapy-0.3.0-py3-none-any.whl.
File metadata
- Download URL: qgendapy-0.3.0-py3-none-any.whl
- Upload date:
- Size: 42.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d13c7f8e1b053781a7099fd45dffd3e51a057d0cc1051abd0c736b7c0486e6d9
|
|
| MD5 |
e541b70826380bf839de857b8f17d3e2
|
|
| BLAKE2b-256 |
4f2e4265fab043b316dfd9af376e3aaf08294e9c7d5a659967fb0d39fce6c637
|
Provenance
The following attestation bundles were made for qgendapy-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on lancereinsmith/qgendapy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qgendapy-0.3.0-py3-none-any.whl -
Subject digest:
d13c7f8e1b053781a7099fd45dffd3e51a057d0cc1051abd0c736b7c0486e6d9 - Sigstore transparency entry: 1606797838
- Sigstore integration time:
-
Permalink:
lancereinsmith/qgendapy@c358268ec04c3587b5619ab3b95e7f7e9edb1bab -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/lancereinsmith
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c358268ec04c3587b5619ab3b95e7f7e9edb1bab -
Trigger Event:
release
-
Statement type: