Python SDK for OMOPHub - Medical Vocabulary API
Project description
OMOPHub Python SDK
Query millions standardized medical concepts via simple Python API
Access SNOMED CT, ICD-10, RxNorm, LOINC, and 90+ OHDSI ATHENA vocabularies without downloading, installing, or maintaining local databases.
Documentation · API Reference · Examples
Why OMOPHub?
Working with OHDSI ATHENA vocabularies traditionally requires downloading multi-gigabyte files, setting up a database instance, and writing complex SQL queries. OMOPHub eliminates this friction.
| Traditional Approach | With OMOPHub |
|---|---|
| Download 5GB+ ATHENA vocabulary files | pip install omophub |
| Set up and maintain database | One API call |
| Write complex SQL with multiple JOINs | Simple Python methods |
| Manually update vocabularies quarterly | Always current data |
| Local infrastructure required | Works anywhere Python runs |
Installation
pip install omophub
Quick Start
from omophub import OMOPHub
# Initialize client (uses OMOPHUB_API_KEY env variable, or pass api_key="...")
client = OMOPHub()
# Get a concept by ID
concept = client.concepts.get(201826)
print(concept["concept_name"]) # "Type 2 diabetes mellitus"
# Search for concepts across vocabularies
results = client.search.basic("metformin", vocabulary_ids=["RxNorm"], domain_ids=["Drug"])
for c in results["concepts"]:
print(f"{c['concept_id']}: {c['concept_name']}")
# Map ICD-10 code to SNOMED
mappings = client.mappings.get_by_code("ICD10CM", "E11.9", target_vocabulary="SNOMED")
# Navigate concept hierarchy
ancestors = client.hierarchy.ancestors(201826, max_levels=3)
Async Support
import asyncio
from omophub import AsyncOMOPHub
async def main():
async with AsyncOMOPHub() as client:
concept = await client.concepts.get(201826)
print(concept["concept_name"])
asyncio.run(main())
Use Cases
ETL & Data Pipelines
Validate and map clinical codes during OMOP CDM transformations:
# Validate that a source code exists and find its standard equivalent
def validate_and_map(source_vocab, source_code):
concept = client.concepts.get_by_code(source_vocab, source_code)
if concept["standard_concept"] != "S":
mappings = client.mappings.get(concept["concept_id"],
target_vocabulary="SNOMED")
return mappings["mappings"][0]["target_concept_id"]
return concept["concept_id"]
Data Quality Checks
Verify codes exist and are valid standard concepts:
# Check if all your condition codes are valid
condition_codes = ["E11.9", "I10", "J44.9"] # ICD-10 codes
for code in condition_codes:
try:
concept = client.concepts.get_by_code("ICD10CM", code)
print(f"OK {code}: {concept['concept_name']}")
except omophub.NotFoundError:
print(f"ERROR {code}: Invalid code!")
Phenotype Development
Explore hierarchies to build comprehensive concept sets:
# Get all descendants of "Type 2 diabetes mellitus" for phenotype
descendants = client.hierarchy.descendants(201826, max_levels=5)
concept_set = [d["concept_id"] for d in descendants["concepts"]]
print(f"Found {len(concept_set)} concepts for T2DM phenotype")
Clinical Applications
Build terminology lookups into healthcare applications:
# Autocomplete for clinical coding interface
suggestions = client.concepts.suggest("diab", vocabulary_ids=["SNOMED"], page_size=10)
# Returns: ["Diabetes mellitus", "Diabetic nephropathy", "Diabetic retinopathy", ...]
API Resources
| Resource | Description | Key Methods |
|---|---|---|
concepts |
Concept lookup and batch operations | get(), get_by_code(), batch(), suggest() |
search |
Full-text and semantic search | basic(), advanced(), semantic(), fuzzy() |
hierarchy |
Navigate concept relationships | ancestors(), descendants() |
mappings |
Cross-vocabulary mappings | get(), map() |
vocabularies |
Vocabulary metadata | list(), get(), stats() |
domains |
Domain information | list(), get(), concepts() |
Configuration
client = OMOPHub(
api_key="oh_xxx", # Or set OMOPHUB_API_KEY env var
base_url="https://api.omophub.com/v1", # API endpoint
timeout=30.0, # Request timeout (seconds)
max_retries=3, # Retry attempts
vocab_version="2025.2", # Specific vocabulary version
)
Error Handling
import omophub
try:
concept = client.concepts.get(999999999)
except omophub.NotFoundError as e:
print(f"Concept not found: {e.message}")
except omophub.AuthenticationError as e:
print(f"Check your API key: {e.message}")
except omophub.RateLimitError as e:
print(f"Rate limited. Retry after {e.retry_after} seconds")
except omophub.APIError as e:
print(f"API error {e.status_code}: {e.message}")
Type Safety
The SDK is fully typed with TypedDict definitions for IDE autocomplete:
from omophub import OMOPHub, Concept
client = OMOPHub()
concept: Concept = client.concepts.get(201826)
# IDE autocomplete works for all fields
concept["concept_id"] # int
concept["concept_name"] # str
concept["vocabulary_id"] # str
concept["domain_id"] # str
concept["concept_class_id"] # str
Integration Examples
With Pandas
import pandas as pd
# Search and load into DataFrame
results = client.search.basic("hypertension", page_size=100)
df = pd.DataFrame(results["concepts"])
print(df[["concept_id", "concept_name", "vocabulary_id"]].head())
In Jupyter Notebooks
# Iterate through all results with auto-pagination
for concept in client.search.basic_iter("diabetes", page_size=100):
process_concept(concept)
Compared to Alternatives
| Feature | OMOPHub SDK | ATHENA Download | OHDSI WebAPI |
|---|---|---|---|
| Setup time | 1 minute | Hours | Hours |
| Infrastructure | None | Database required | Full OHDSI stack |
| Updates | Automatic | Manual download | Manual |
| Programmatic access | Native Python | SQL queries | REST API |
Best for: Teams who need quick, programmatic access to OMOP vocabularies without infrastructure overhead.
Documentation
Contributing
We welcome contributions! Please see our Contributing Guide for details.
# Clone and install for development
git clone https://github.com/omopHub/omophub-python.git
cd omophub-python
pip install -e ".[dev]"
# Run tests
pytest
Support
- GitHub Issues
- GitHub Discussions
- Email: support@omophub.com
- Website: omophub.com
License
MIT License - see LICENSE for details.
Built for the OHDSI community
Project details
Release history Release notifications | RSS feed
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 omophub-1.3.1.tar.gz.
File metadata
- Download URL: omophub-1.3.1.tar.gz
- Upload date:
- Size: 27.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c79d6a5b1500443689d263cc9d3bfe308b5b4929e5d794e88f1452cf5d38bcde
|
|
| MD5 |
ef5c9a06a1f3ff736a758c174308982c
|
|
| BLAKE2b-256 |
a3d900aaf43eaa2587f663a30c77478b5854539bdf14422c2b5efd1cccfd5dae
|
Provenance
The following attestation bundles were made for omophub-1.3.1.tar.gz:
Publisher:
publish.yml on OMOPHub/omophub-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
omophub-1.3.1.tar.gz -
Subject digest:
c79d6a5b1500443689d263cc9d3bfe308b5b4929e5d794e88f1452cf5d38bcde - Sigstore transparency entry: 850172516
- Sigstore integration time:
-
Permalink:
OMOPHub/omophub-python@0a64db988ee667db1e22bc161b1970982924c0d6 -
Branch / Tag:
refs/tags/v1.3.1 - Owner: https://github.com/OMOPHub
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0a64db988ee667db1e22bc161b1970982924c0d6 -
Trigger Event:
release
-
Statement type:
File details
Details for the file omophub-1.3.1-py3-none-any.whl.
File metadata
- Download URL: omophub-1.3.1-py3-none-any.whl
- Upload date:
- Size: 31.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d2e034d40b08a7106cbfc003f5f8c10886a32c40a376af7eccb4c1c67cdd167c
|
|
| MD5 |
b6d1a018c9f1700a43166cbdc06fe78a
|
|
| BLAKE2b-256 |
256d512d78dc3b097df076bf497a59636e12fe52f2237f7d6e53905b97cdfb31
|
Provenance
The following attestation bundles were made for omophub-1.3.1-py3-none-any.whl:
Publisher:
publish.yml on OMOPHub/omophub-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
omophub-1.3.1-py3-none-any.whl -
Subject digest:
d2e034d40b08a7106cbfc003f5f8c10886a32c40a376af7eccb4c1c67cdd167c - Sigstore transparency entry: 850172517
- Sigstore integration time:
-
Permalink:
OMOPHub/omophub-python@0a64db988ee667db1e22bc161b1970982924c0d6 -
Branch / Tag:
refs/tags/v1.3.1 - Owner: https://github.com/OMOPHub
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0a64db988ee667db1e22bc161b1970982924c0d6 -
Trigger Event:
release
-
Statement type: