Skip to main content
This endpoint returns all descendant concepts (children, grandchildren, etc.) for a specific concept, allowing exploration of more specific terms and sub-classifications within the medical vocabulary hierarchy.

Path Parameters

integer
required
The unique identifier of the concept to retrieve descendants for
Example: 73211009 (Diabetes mellitus)

Query Parameters

string
Filter descendants to specific vocabularies (comma-separated)
Example: SNOMED,ICD10CM
string
Filter descendants to specific domains (comma-separated)
Example: Condition,Drug
integer
default:"10"
Maximum number of hierarchy levels to traverse downward
Range: 1-20
This endpoint always traverses the Is a / Subsumes hierarchy. It reads OMOP’s precomputed concept_ancestor closure, which stores only transitive subsumption - it has no relationship column to filter on. Every descendant is therefore returned with relationship_id: "Subsumes".A relationship_types parameter is accepted for backwards compatibility but has no effect here: passing Has part, or even a nonexistent relationship, returns the same descendants. To traverse other relationship types, use GET /v1/concepts/{concept_id}/relationships or POST /v1/concepts/relationships/traverse, which query concept_relationship directly.
boolean
default:"false"
Include hierarchy_level field for each descendant (distance from source concept)
boolean
default:"false"
Include path_length field for each descendant
boolean
default:"false"
Include deprecated/invalid concepts in descendants (by default they are excluded)
integer
default:"5000"
Maximum size of the descendant set to retrieve before pagination is applied.
Range: 1-5000
Defaults to the maximum, so paging through the response returns every descendant that matches this request - that is, those within max_levels and any domain_ids / vocabulary_ids filters you supplied. (relationship_types is not applied - see above.) It is not necessarily the concept’s entire descendant closure: max_levels defaults to 10, so deeper descendants are excluded, and truncated does not flag that (it reports the row cap only). For a full closure, pass max_levels=20 as well.Lower max_results only if you deliberately want a partial set - note that total_items then reflects the truncated set, not the true descendant count. To read the true, unfiltered count without fetching the set, use GET /v1/concepts/{concept_id}/level.
integer
default:"1"
Page number for pagination (1-based)
integer
default:"100"
Number of descendant concepts to return per page. Values above 200 are clamped to 200.
string
Specific vocabulary release version to query
Example: 2025.1

Response

integer
The concept ID for which descendants were retrieved
string
Standard name of the source concept
string
Vocabulary containing the source concept
array
Array of descendant concepts in hierarchical order
object
Summary statistics about the descendant hierarchy
object
Response metadata and pagination information

Usage Examples

Note: Examples assume a preconfigured client from new OMOPHub(). For direct usage:
TypeScript

Basic Descendant Retrieval

Get all descendants for a specific concept:
TypeScript

Limited Hierarchy Depth

Retrieve descendants up to a specific number of levels:
TypeScript

Domain-Specific Descendants

Filter descendants to specific medical domains:
TypeScript

Detailed Descendant Information

Get descendants with hierarchy levels and path information:
TypeScript

Notes

  • Descendant traversal follows “Is a” relationships by default, but can include other relationship types
  • Large hierarchies may contain thousands of descendants - use pagination and filtering appropriately
  • Standard concepts are prioritized unless explicitly disabled
  • Some medical concepts may have very deep hierarchies (6+ levels)
  • Cross-vocabulary concepts may have descendants from multiple vocabularies
  • Deprecated concepts are excluded from descendants unless specifically requested with include_invalid=true