curl -X POST "https://api.omophub.com/v1/search/advanced" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "diabetes mellitus type 2",
"page_size": 10
}'
results = client.search.advanced_search(
query="diabetes mellitus type 2",
page_size=10
)
for concept in results.data:
print(f"{concept.concept_id}: {concept.concept_name}")
print(f" Vocabulary: {concept.vocabulary_id}")
print(f" Score: {concept.relevance_score:.3f}")
import { OMOPHub } from '@omophub/omophub-node';
const client = new OMOPHub();
const { data: results } = await client.search.advanced({
query: 'diabetes mellitus type 2',
pageSize: 10,
});
results?.forEach(concept => {
console.log(`${concept.concept_id}: ${concept.concept_name}`);
console.log(` Vocabulary: ${concept.vocabulary_id}`);
console.log(` Score: ${concept.relevance_score?.toFixed(3)}`);
});
results <- advanced_search_concepts(client,
query = "diabetes mellitus type 2",
page_size = 10
)
for (i in 1:nrow(results$data$concepts)) {
concept <- results$data$concepts[i, ]
cat(paste(concept$concept_id, concept$concept_name, sep = ": "), "\n")
cat(paste(" Vocabulary:", concept$vocabulary_id), "\n")
cat(paste(" Score:", round(concept$relevance_score, 3)), "\n")
}
{
"success": true,
"data": {
"concepts": [
{
"concept_id": 201826,
"concept_name": "Type 2 diabetes mellitus",
"concept_code": "44054006",
"vocabulary_id": "SNOMED",
"vocabulary_name": "Systematized Nomenclature of Medicine Clinical Terms",
"domain_id": "Condition",
"concept_class_id": "Clinical Finding",
"standard_concept": "S",
"valid_start_date": "1970-01-01",
"valid_end_date": "2099-12-31",
"invalid_reason": null,
"relevance_score": 0.953
},
{
"concept_id": 435216,
"concept_name": "Diabetes mellitus type 2 in obese",
"concept_code": "E11.0",
"vocabulary_id": "ICD10CM",
"vocabulary_name": "International Classification of Diseases, Tenth Revision, Clinical Modification",
"domain_id": "Condition",
"concept_class_id": "4-char billing code",
"standard_concept": null,
"valid_start_date": "2015-10-01",
"valid_end_date": "2099-12-31",
"invalid_reason": null,
"relevance_score": 0.847
}
],
"facets": {
"vocabularies": [
{"vocabulary_id": "SNOMED", "vocabulary_name": "SNOMED CT", "count": 45},
{"vocabulary_id": "ICD10CM", "vocabulary_name": "ICD-10-CM", "count": 23},
{"vocabulary_id": "ICD9CM", "vocabulary_name": "ICD-9-CM", "count": 12}
],
"domains": [
{"domain_id": "Condition", "domain_name": "Condition", "count": 67},
{"domain_id": "Observation", "domain_name": "Observation", "count": 13}
],
"concept_classes": [
{"concept_class_id": "Clinical Finding", "count": 45},
{"concept_class_id": "4-char billing code", "count": 23}
]
},
"search_metadata": {
"query_time_ms": 127,
"total_results": 80,
"max_relevance_score": 0.953,
"search_algorithm": "full_text_with_ranking"
}
},
"meta": {
"request_id": "req_adv_search_abc123",
"timestamp": "2024-01-15T10:30:00Z",
"vocab_release": "2025.1",
"search": {
"query": "diabetes mellitus type 2",
"total_results": 80,
"filters_applied": {
"vocabulary_ids": [],
"domain_ids": [],
"standard_concepts_only": true
}
},
"pagination": {
"page": 1,
"page_size": 10,
"total_items": 80,
"total_pages": 8,
"has_next": true,
"has_previous": false
}
}
}
Advanced Search
Perform multi-criteria search across OMOP medical vocabularies with advanced filtering by domain, vocabulary, concept class, and standard status.
curl -X POST "https://api.omophub.com/v1/search/advanced" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "diabetes mellitus type 2",
"page_size": 10
}'
results = client.search.advanced_search(
query="diabetes mellitus type 2",
page_size=10
)
for concept in results.data:
print(f"{concept.concept_id}: {concept.concept_name}")
print(f" Vocabulary: {concept.vocabulary_id}")
print(f" Score: {concept.relevance_score:.3f}")
import { OMOPHub } from '@omophub/omophub-node';
const client = new OMOPHub();
const { data: results } = await client.search.advanced({
query: 'diabetes mellitus type 2',
pageSize: 10,
});
results?.forEach(concept => {
console.log(`${concept.concept_id}: ${concept.concept_name}`);
console.log(` Vocabulary: ${concept.vocabulary_id}`);
console.log(` Score: ${concept.relevance_score?.toFixed(3)}`);
});
results <- advanced_search_concepts(client,
query = "diabetes mellitus type 2",
page_size = 10
)
for (i in 1:nrow(results$data$concepts)) {
concept <- results$data$concepts[i, ]
cat(paste(concept$concept_id, concept$concept_name, sep = ": "), "\n")
cat(paste(" Vocabulary:", concept$vocabulary_id), "\n")
cat(paste(" Score:", round(concept$relevance_score, 3)), "\n")
}
{
"success": true,
"data": {
"concepts": [
{
"concept_id": 201826,
"concept_name": "Type 2 diabetes mellitus",
"concept_code": "44054006",
"vocabulary_id": "SNOMED",
"vocabulary_name": "Systematized Nomenclature of Medicine Clinical Terms",
"domain_id": "Condition",
"concept_class_id": "Clinical Finding",
"standard_concept": "S",
"valid_start_date": "1970-01-01",
"valid_end_date": "2099-12-31",
"invalid_reason": null,
"relevance_score": 0.953
},
{
"concept_id": 435216,
"concept_name": "Diabetes mellitus type 2 in obese",
"concept_code": "E11.0",
"vocabulary_id": "ICD10CM",
"vocabulary_name": "International Classification of Diseases, Tenth Revision, Clinical Modification",
"domain_id": "Condition",
"concept_class_id": "4-char billing code",
"standard_concept": null,
"valid_start_date": "2015-10-01",
"valid_end_date": "2099-12-31",
"invalid_reason": null,
"relevance_score": 0.847
}
],
"facets": {
"vocabularies": [
{"vocabulary_id": "SNOMED", "vocabulary_name": "SNOMED CT", "count": 45},
{"vocabulary_id": "ICD10CM", "vocabulary_name": "ICD-10-CM", "count": 23},
{"vocabulary_id": "ICD9CM", "vocabulary_name": "ICD-9-CM", "count": 12}
],
"domains": [
{"domain_id": "Condition", "domain_name": "Condition", "count": 67},
{"domain_id": "Observation", "domain_name": "Observation", "count": 13}
],
"concept_classes": [
{"concept_class_id": "Clinical Finding", "count": 45},
{"concept_class_id": "4-char billing code", "count": 23}
]
},
"search_metadata": {
"query_time_ms": 127,
"total_results": 80,
"max_relevance_score": 0.953,
"search_algorithm": "full_text_with_ranking"
}
},
"meta": {
"request_id": "req_adv_search_abc123",
"timestamp": "2024-01-15T10:30:00Z",
"vocab_release": "2025.1",
"search": {
"query": "diabetes mellitus type 2",
"total_results": 80,
"filters_applied": {
"vocabulary_ids": [],
"domain_ids": [],
"standard_concepts_only": true
}
},
"pagination": {
"page": 1,
"page_size": 10,
"total_items": 80,
"total_pages": 8,
"has_next": true,
"has_previous": false
}
}
}
Overview
The advanced search endpoint provides powerful multi-criteria search capabilities across healthcare vocabularies. Use complex queries, filters, and ranking to find the most relevant medical concepts.Best for: Complex search scenarios requiring multiple filters, specific vocabularies, or advanced ranking criteria.
Query Requirements: Queries must be at least 3 characters long OR include at least one filter (
vocabulary_ids, domain_ids, or concept_class_ids). This prevents overly broad searches that could timeout.Endpoint
string
/v1/search/advanced
Authentication
string
required
Bearer token with your API key
Request Body
string
required
The search query termExample:
"diabetes mellitus type 2"Validation: Query must be at least 3 characters long, OR include at least one filter (vocabulary_ids, domain_ids, or concept_class_ids). Short queries without filters are rejected to prevent performance issues.array
Array of vocabulary IDs to search withinOptions:
SNOMED, ICD10CM, ICD9CM, RxNorm, LOINC, HCPCS, etc.Default: All vocabulariesarray
Array of domain IDs to filter byOptions:
Condition, Drug, Procedure, Measurement, Observation, etc.array
Array of concept class IDs to filter byExamples:
Clinical Finding, Pharmaceutical Substance, Procedureboolean
default:true
Whether to include only standard concepts
boolean
default:true
Whether to include invalid/deprecated concepts
array
Array of relationship filter objects
[{
"relationship_id": "Maps to",
"target_vocabularies": ["SNOMED"],
"required": true
}]
object
Filter by validity date range
{
"start_date": "2020-01-01",
"end_date": "2024-12-31"
}
integer
default:1
Page number (1-based indexing)
integer
default:20
Number of results per page (max: 1000)
Response
boolean
Whether the request was successful
object
Show data
Show data
array
Array of matching concepts
Show concept object
Show concept object
integer
Unique concept identifier
string
Human-readable concept name
string
Concept code within its vocabulary
string
Source vocabulary identifier
string
Human-readable vocabulary name
string
Concept domain classification
string
Concept class within vocabulary
string
Standard concept designation (S = Standard, C = Classification)
string
Date when concept became valid
string
Date when concept becomes invalid
string
Reason for invalidity (if applicable)
number
Search relevance score (0.0 to 1.0)
object
object
Response metadata including pagination
Show meta
Show meta
string
Unique identifier for this request
string
ISO 8601 timestamp of the response
string
Vocabulary release version used
object
Examples
Basic Search
curl -X POST "https://api.omophub.com/v1/search/advanced" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "diabetes mellitus type 2",
"page_size": 10
}'
results = client.search.advanced_search(
query="diabetes mellitus type 2",
page_size=10
)
for concept in results.data:
print(f"{concept.concept_id}: {concept.concept_name}")
print(f" Vocabulary: {concept.vocabulary_id}")
print(f" Score: {concept.relevance_score:.3f}")
import { OMOPHub } from '@omophub/omophub-node';
const client = new OMOPHub();
const { data: results } = await client.search.advanced({
query: 'diabetes mellitus type 2',
pageSize: 10,
});
results?.forEach(concept => {
console.log(`${concept.concept_id}: ${concept.concept_name}`);
console.log(` Vocabulary: ${concept.vocabulary_id}`);
console.log(` Score: ${concept.relevance_score?.toFixed(3)}`);
});
results <- advanced_search_concepts(client,
query = "diabetes mellitus type 2",
page_size = 10
)
for (i in 1:nrow(results$data$concepts)) {
concept <- results$data$concepts[i, ]
cat(paste(concept$concept_id, concept$concept_name, sep = ": "), "\n")
cat(paste(" Vocabulary:", concept$vocabulary_id), "\n")
cat(paste(" Score:", round(concept$relevance_score, 3)), "\n")
}
{
"success": true,
"data": {
"concepts": [
{
"concept_id": 201826,
"concept_name": "Type 2 diabetes mellitus",
"concept_code": "44054006",
"vocabulary_id": "SNOMED",
"vocabulary_name": "Systematized Nomenclature of Medicine Clinical Terms",
"domain_id": "Condition",
"concept_class_id": "Clinical Finding",
"standard_concept": "S",
"valid_start_date": "1970-01-01",
"valid_end_date": "2099-12-31",
"invalid_reason": null,
"relevance_score": 0.953
},
{
"concept_id": 435216,
"concept_name": "Diabetes mellitus type 2 in obese",
"concept_code": "E11.0",
"vocabulary_id": "ICD10CM",
"vocabulary_name": "International Classification of Diseases, Tenth Revision, Clinical Modification",
"domain_id": "Condition",
"concept_class_id": "4-char billing code",
"standard_concept": null,
"valid_start_date": "2015-10-01",
"valid_end_date": "2099-12-31",
"invalid_reason": null,
"relevance_score": 0.847
}
],
"facets": {
"vocabularies": [
{"vocabulary_id": "SNOMED", "vocabulary_name": "SNOMED CT", "count": 45},
{"vocabulary_id": "ICD10CM", "vocabulary_name": "ICD-10-CM", "count": 23},
{"vocabulary_id": "ICD9CM", "vocabulary_name": "ICD-9-CM", "count": 12}
],
"domains": [
{"domain_id": "Condition", "domain_name": "Condition", "count": 67},
{"domain_id": "Observation", "domain_name": "Observation", "count": 13}
],
"concept_classes": [
{"concept_class_id": "Clinical Finding", "count": 45},
{"concept_class_id": "4-char billing code", "count": 23}
]
},
"search_metadata": {
"query_time_ms": 127,
"total_results": 80,
"max_relevance_score": 0.953,
"search_algorithm": "full_text_with_ranking"
}
},
"meta": {
"request_id": "req_adv_search_abc123",
"timestamp": "2024-01-15T10:30:00Z",
"vocab_release": "2025.1",
"search": {
"query": "diabetes mellitus type 2",
"total_results": 80,
"filters_applied": {
"vocabulary_ids": [],
"domain_ids": [],
"standard_concepts_only": true
}
},
"pagination": {
"page": 1,
"page_size": 10,
"total_items": 80,
"total_pages": 8,
"has_next": true,
"has_previous": false
}
}
}
Filtered Search
curl -X POST "https://api.omophub.com/v1/search/advanced" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "hypertension",
"vocabulary_ids": ["SNOMED", "ICD10CM"],
"domain_ids": ["Condition"],
"standard_concepts_only": true,
"date_range": {
"start_date": "2020-01-01",
"end_date": "2024-12-31"
},
"page_size": 20
}'
results = client.search.advanced_search(
query="hypertension",
vocabulary_ids=["SNOMED", "ICD10CM"],
domain_ids=["Condition"],
standard_concepts_only=True,
date_range={
"start_date": "2020-01-01",
"end_date": "2024-12-31"
},
page_size=20
)
print(f"Found {results.meta.pagination.total_items} concepts")
print(f"Query executed in {results.data.search_metadata.query_time_ms}ms")
import { OMOPHub } from '@omophub/omophub-node';
const client = new OMOPHub();
const { data: results, meta } = await client.search.advanced({
query: 'hypertension',
vocabularyIds: ['SNOMED', 'ICD10CM'],
domainIds: ['Condition'],
standardConceptsOnly: true,
dateRange: {
startDate: '2020-01-01',
endDate: '2024-12-31',
},
pageSize: 20,
});
console.log(`Found ${meta?.pagination?.total_items} concepts`);
results <- advanced_search_concepts(client,
query = "hypertension",
vocabulary_ids = c("SNOMED", "ICD10CM"),
domain_ids = c("Condition"),
standard_concepts_only = TRUE,
date_range = list(
start_date = "2020-01-01",
end_date = "2024-12-31"
),
page_size = 20
)
cat(paste("Found", results$meta$pagination$total_items, "concepts\n"))
cat(paste("Query executed in", results$data$search_metadata$query_time_ms, "ms\n"))
Complex Relationship Filtering
curl -X POST "https://api.omophub.com/v1/search/advanced" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "insulin",
"vocabulary_ids": ["RxNorm"],
"domain_ids": ["Drug"],
"relationship_filters": [
{
"relationship_id": "RxNorm has dose form",
"target_vocabularies": ["RxNorm"],
"required": true
}
],
"concept_class_ids": ["Clinical Drug"],
"page_size": 15
}'
results = client.search.advanced_search(
query="insulin",
vocabulary_ids=["RxNorm"],
domain_ids=["Drug"],
relationship_filters=[
{
"relationship_id": "RxNorm has dose form",
"target_vocabularies": ["RxNorm"],
"required": True
}
],
concept_class_ids=["Clinical Drug"],
page_size=15
)
for concept in results.data:
print(f"Drug: {concept.concept_name}")
print(f" Code: {concept.concept_code}")
print(f" Class: {concept.concept_class_id}")
import { OMOPHub } from '@omophub/omophub-node';
const client = new OMOPHub();
const { data: results } = await client.search.advanced({
query: 'insulin',
vocabularyIds: ['RxNorm'],
domainIds: ['Drug'],
relationshipFilters: [
{
relationship_id: 'RxNorm has dose form',
target_vocabularies: ['RxNorm'],
required: true,
},
],
conceptClassIds: ['Clinical Drug'],
pageSize: 15,
});
results.data.forEach(concept => {
console.log(`Drug: ${concept.concept_name}`);
console.log(` Code: ${concept.concept_code}`);
console.log(` Class: ${concept.concept_class_id}`);
});
results <- advanced_search_concepts(client,
query = "insulin",
vocabulary_ids = c("RxNorm"),
domain_ids = c("Drug"),
relationship_filters = list(
list(
relationship_id = "RxNorm has dose form",
target_vocabularies = c("RxNorm"),
required = TRUE
)
),
concept_class_ids = c("Clinical Drug"),
page_size = 15
)
for (i in 1:nrow(results$data$concepts)) {
concept <- results$data$concepts[i, ]
cat(paste("Drug:", concept$concept_name), "\n")
cat(paste(" Code:", concept$concept_code), "\n")
cat(paste(" Class:", concept$concept_class_id), "\n")
}
Search Features
Full-Text Search
- Multi-field search: Searches concept names, synonyms, and descriptions
- Phrase matching: Use quotes for exact phrases:
"myocardial infarction" - Wildcard support: Use
*for partial matching:diabet* - Boolean operators: Use AND, OR, NOT:
diabetes AND type 2
Relevance Scoring
Results are ranked by relevance using:- Exact matches: Exact concept name matches score highest
- Phrase matches: Complete phrase matches in names or synonyms
- Term frequency: Frequency of query terms in concept text
- Vocabulary priority: Standard concepts ranked higher
- Clinical relevance: Healthcare-specific ranking adjustments
Faceted Search
Use facets to understand result distribution:# Access facets for filtering insights
facets = results.data.facets
print("Available vocabularies:")
for vocab in facets.vocabularies:
print(f" {vocab.vocabulary_name}: {vocab.count} concepts")
print("\nAvailable domains:")
for domain in facets.domains:
print(f" {domain.domain_name}: {domain.count} concepts")
Performance Tips
- Use specific vocabulary_ids: Limit search to relevant vocabularies only
- Filter by domain_ids: Reduce result set with domain filters
- Reasonable page sizes: Use page_size of 20-100 for best performance
- Cache results: Cache frequently accessed searches
- Use standard concepts: Set
standard_concepts_only: truefor faster queries - Avoid broad queries: Short queries (< 3 characters) without filters are rejected. Use more specific terms or add filters for better results.
Related Endpoints
Basic Search
Simple concept search with minimal parameters
Search Autocomplete
Real-time search suggestions
Similar Concepts
Find semantically similar concepts
Search Facets
Get available search facets
Was this page helpful?