OpenMD APIopenmd.com ↗
Access OpenMD's medical dictionary, abbreviations, word parts, health site directory, and research guides via 11 structured API endpoints.
What is the OpenMD API?
The OpenMD API exposes 11 endpoints covering medical term definitions, abbreviations, word parts, a curated health site directory, and structured research guides. Use get_dictionary_term to retrieve definitions from multiple medical sources, phonetic pronunciation, images, and related videos for a given term. The API also surfaces specialized content like dangerous prescription abbreviations and organized health resource directories by category.
curl -X GET 'https://api.parse.bot/scraper/e3dde5ae-7ae1-4454-a7e5-127c2fd5e843/get_dictionary_term?term=heart' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace openmd-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: OpenMD Medical Reference API — bounded, re-runnable."""
from parse_apis.openmd_medical_reference_api import OpenMD, Letter, TermNotFound
client = OpenMD()
# Look up a specific medical term and inspect its definitions.
term = client.terms.get(term="heart")
print(f"Term: {term.name}, Category: {term.category}, Pronunciation: {term.pronunciation}")
for defn in term.definitions[:3]:
print(f" [{defn.source}] {defn.text[:80]}")
# Search the dictionary — returns matching terms with optional details.
for result in client.terms.search(query="lung", limit=3):
print(f"Search result: {result.term} — {result.url}")
# Browse terms by letter using the Letter enum.
for link in client.terms.browse(letter=Letter.B, limit=5):
print(f" {link.term}: {link.url}")
# List abbreviations filtered by letter.
for abbr in client.abbreviations.list(letter=Letter.A, limit=5):
print(f" {abbr.abbreviation} = {abbr.meaning}")
# Navigate directory: list categories, then drill into one for sites.
category = client.directorycategories.list(limit=1).first()
if category:
for site in category.sites(limit=3):
print(f" {site.name} ({site.domain}): {site.description}")
# Get a research guide's structured content via the constructible accessor.
guide_content = client.guide("medical-terminology").content()
print(f"Guide: {guide_content.title}, blocks: {len(guide_content.content)}")
# Typed error handling for a term that may not exist.
try:
client.terms.get(term="xyznonexistent12345")
except TermNotFound as exc:
print(f"Term not found: {exc.term}")
print("Exercised: terms.get / terms.search / terms.browse / abbreviations.list / directorycategories.list / category.sites / guide.content")
Retrieve full definitions and metadata for a specific medical term. Returns definitions from multiple medical sources, pronunciation, category, etymology, images, and related videos when available. Coverage is strongest for anatomy terms; some disease terms may return fewer definitions.
| Param | Type | Description |
|---|---|---|
| termrequired | string | Medical term to look up (e.g. 'heart', 'lung', 'diabetes'). |
{
"type": "object",
"fields": {
"name": "string, canonical name of the term",
"term": "string, the queried term",
"images": "array of image objects with src, alt, and title",
"videos": "array of video objects with title, url, source, and duration",
"category": "string, medical category (e.g. Anatomy)",
"definitions": "array of definition objects with source, text, and source_detail",
"pronunciation": "string, phonetic pronunciation"
},
"sample": {
"data": {
"name": "heart",
"term": "heart",
"images": [
{
"alt": "Wikimedia",
"src": "https://openmd.com/data/images/103/1004680_01.jpg",
"title": "Wikimedia"
}
],
"videos": [
{
"url": "https://www.merckmanuals.com/home/multimedia/video/v49313600",
"title": "The Heart",
"source": "Merck Manuals",
"duration": "0:33"
}
],
"category": "Anatomy",
"definitions": [
{
"text": "The hollow, muscular organ that maintains the circulation of the blood.",
"source": "NLM Medical Subject Headings",
"source_detail": "U.S. National Library of Medicine, 2025"
}
],
"pronunciation": "heart [ hahrt ]"
},
"status": "success"
}
}About the OpenMD API
Medical Dictionary Endpoints
The get_dictionary_term endpoint accepts a term parameter (e.g. heart, diabetes) and returns a definitions array where each object includes source, text, and source_detail — so you can see which medical reference each definition comes from. Additional fields include pronunciation, category (e.g. Anatomy), images (with src, alt, and title), and videos (with title, url, source, and duration). Coverage is strongest for anatomy terms; some disease or syndrome entries may return fewer definition sources. search_dictionary handles cases where you don't know the exact canonical term: it returns either a direct match with full details or a list of candidate term links.
Abbreviations and Word Parts
get_abbreviations_by_letter and get_word_parts_by_letter both accept an optional letter parameter (A–Z) and return arrays of abbreviation-meaning or word_part-meaning pairs respectively. These are useful for building medical terminology tools, EHR helpers, or educational flashcard systems. browse_dictionary_by_letter similarly lists all dictionary terms starting with a given letter, with each result including the term string and its url.
Health Site Directory and Research Guides
The directory side of the API starts with get_directory_categories, which returns all available category slug values (e.g. cardiology, neurology). Pass a slug to get_directory_category to get the sites listed under that category, each with name, url, description, and domain. Research guides follow the same two-step pattern: list_research_guides returns guide slug values, and get_research_guide returns the full structured content as typed blocks (text, heading, list, table).
Prescription and Safety Content
Two dedicated endpoints handle prescription-related content. get_prescription_abbreviations returns a structured guide to shorthand used in prescriptions — useful for patient-facing apps or clinical education tools. get_dangerous_abbreviations returns the guide to abbreviations flagged as error-prone, including tables identifying which abbreviations to avoid and why. Both return the same content block format as get_research_guide.
The OpenMD API is a managed, monitored endpoint for openmd.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when openmd.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official openmd.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a medical terminology lookup tool using
get_dictionary_termto display multi-source definitions and pronunciation. - Generate alphabetical term lists for a medical education app with
browse_dictionary_by_letter. - Populate an abbreviation decoder feature in an EHR or clinical notes tool using
get_abbreviations_by_letter. - Create a word-parts reference for medical students using
get_word_parts_by_letter(roots, prefixes, suffixes). - Build a curated health resource directory organized by specialty using
get_directory_categoriesandget_directory_category. - Surface prescription error warnings in a clinical decision support tool using
get_dangerous_abbreviations. - Integrate structured research guide content into a patient education platform using
get_research_guide.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does OpenMD have an official developer API?+
What does `get_dictionary_term` return, and are definitions always from multiple sources?+
definitions array where each item includes source, text, and source_detail, so you can see which reference each definition comes from. Coverage varies: anatomy terms typically have more definition sources than disease or pharmacology entries, which may return only one or two definitions.Can I retrieve full article-level content for every term, including all linked diseases and drug interactions?+
Does the API support full-text search across the entire dictionary, or only exact-term lookups?+
search_dictionary accepts a query string and returns either a direct match with full details or a list of candidate term links. It does not currently support wildcard patterns, relevance-ranked full-text search, or filtering by category. You can fork the API on Parse and revise it to add more advanced search filtering.Are the research guide content blocks structured enough to render programmatically?+
get_research_guide and the prescription/dangerous abbreviation endpoints return a content array where each block has an explicit type field — text, heading, list, or table — along with the corresponding data. This lets you render or parse each section type independently without custom HTML parsing.