NCI Clinical Trials Search API Reference¶
The National Cancer Institute's Clinical Trials Search (CTS) API provides advanced search capabilities for cancer clinical trials with enhanced filtering options beyond ClinicalTrials.gov.
Overview¶
The NCI CTS API offers:
- Advanced biomarker and mutation filtering
- Comprehensive organization database
- Intervention and drug vocabularies
- Disease terminology with NCI Thesaurus integration
- Prior therapy and eligibility criteria
Base URL: https://clinicaltrialsapi.cancer.gov/api/v2/
Authentication¶
An API key is required for all endpoints.
Obtaining an API Key¶
- Visit https://clinicaltrialsapi.cancer.gov/
- Click "Get API Key"
- Complete registration
- Key is emailed immediately
Using the API Key¶
Include in request headers:
Or as query parameter:
Core Endpoints¶
1. Trial Search¶
Search for clinical trials with advanced filtering.
Parameters¶
Basic Search:
keyword
: General text searchnct_id
: Specific NCT identifiersdiseases
: Disease/condition namesinterventions
: Treatment names
Advanced Filters:
biomarkers
: Required biomarkers/mutationsprior_therapy_required
: true/falseaccepts_brain_mets
: true/falsemin_age
: Minimum age in yearsmax_age
: Maximum age in years
Pagination:
size
: Results per page (max 50)from
: Starting index (offset)
Example Request¶
curl -X GET "https://clinicaltrialsapi.cancer.gov/api/v2/trials" \
-H "X-API-KEY: your-key" \
-d "diseases=melanoma" \
-d "biomarkers=BRAF V600E" \
-d "accepts_brain_mets=true" \
-d "size=10"
Response Format¶
{
"total": 42,
"trials": [
{
"nct_id": "NCT04280705",
"brief_title": "BRAF/MEK Inhibitor Combination",
"current_trial_status": "Active",
"phase": "Phase II",
"biomarker_eligibility": [
{
"gene": "BRAF",
"variant": "V600E",
"required": true
}
],
"sites": [...]
}
]
}
2. Trial Details¶
Get comprehensive information about a specific trial.
Example Request¶
curl -X GET "https://clinicaltrialsapi.cancer.gov/api/v2/trials/NCT04280705" \
-H "X-API-KEY: your-key"
3. Organization Search¶
Search for cancer research organizations and treatment centers.
Parameters¶
name
: Organization nameorg_city
: City locationorg_state_or_province
: State/provinceorg_country
: Countryorg_type
: Type (e.g., "NCI-designated", "academic")
Important: Always use city AND state together to avoid Elasticsearch errors.
Example Request¶
curl -X GET "https://clinicaltrialsapi.cancer.gov/api/v2/organizations" \
-H "X-API-KEY: your-key" \
-d "org_city=Houston" \
-d "org_state_or_province=TX"
4. Organization Details¶
Get details about a specific organization.
5. Intervention Search¶
Search for drugs, devices, and procedures used in trials.
Parameters¶
name
: Intervention nametype
: Drug, Device, Procedure, etc.synonyms
: Include synonym matches (default: true)
Example Request¶
curl -X GET "https://clinicaltrialsapi.cancer.gov/api/v2/interventions" \
-H "X-API-KEY: your-key" \
-d "name=pembrolizumab" \
-d "type=Drug"
6. Intervention Details¶
7. Biomarker Search¶
Search for biomarkers used in trial eligibility criteria.
Parameters¶
name
: Biomarker nametype
: mutation, expression, etc.gene
: Associated gene symbol
8. Disease Search¶
Search NCI's controlled vocabulary of cancer conditions.
Parameters¶
name
: Disease nameinclude_synonyms
: Include synonym matchescategory
: Disease category
Advanced Features¶
Biomarker-Based Trial Search¶
Find trials requiring specific mutations:
params = {
"diseases": "non-small cell lung cancer",
"biomarkers": ["EGFR L858R", "EGFR exon 19 deletion"],
"prior_therapy_required": False,
"accepts_brain_mets": True
}
response = requests.get(
"https://clinicaltrialsapi.cancer.gov/api/v2/trials",
headers={"X-API-KEY": api_key},
params=params
)
Complex Eligibility Queries¶
# Find trials with specific eligibility
params = {
"diseases": "melanoma",
"biomarkers": "BRAF V600E",
"min_age": 18,
"max_age": 75,
"prior_therapy": "vemurafenib", # Exclude if prior vemurafenib
"performance_status": "0-1" # ECOG 0 or 1
}
Organization Network Analysis¶
# Find all NCI-designated centers in a region
params = {
"org_type": "NCI-designated",
"org_state_or_province": ["CA", "OR", "WA"] # West Coast
}
orgs = requests.get(
"https://clinicaltrialsapi.cancer.gov/api/v2/organizations",
headers={"X-API-KEY": api_key},
params=params
)
# Get trials at each center
for org in orgs.json()["organizations"]:
trials = requests.get(
f"https://clinicaltrialsapi.cancer.gov/api/v2/trials",
headers={"X-API-KEY": api_key},
params={"site_org_id": org["id"]}
)
Data Models¶
Trial Object¶
{
"nct_id": "NCT04280705",
"brief_title": "Study Title",
"official_title": "Full Protocol Title",
"current_trial_status": "Active",
"phase": "Phase II",
"study_type": "Interventional",
"primary_purpose": "Treatment",
"diseases": [
{
"name": "Melanoma",
"nci_thesaurus_id": "C0025202"
}
],
"biomarker_eligibility": [
{
"gene": "BRAF",
"variant": "V600E",
"required": true,
"inclusion": true
}
],
"arms": [...],
"sites": [...]
}
Organization Object¶
{
"org_id": "NCI-2021-00123",
"name": "MD Anderson Cancer Center",
"type": "NCI-designated",
"address": {
"city": "Houston",
"state": "TX",
"country": "United States",
"postal_code": "77030"
},
"contact": {
"name": "Clinical Trials Office",
"phone": "1-800-392-1611",
"email": "[email protected]"
},
"active_trials_count": 1250
}
Error Handling¶
Common Errors¶
401 Unauthorized¶
400 Bad Request¶
{
"error": "Invalid parameter combination",
"details": "Must specify both city AND state for location search"
}
429 Rate Limited¶
Best Practices¶
- Always use city AND state together for location searches
- Handle missing totals - the API may not return total counts with size parameter
- Use specific searches - broad queries may timeout
- Implement retry logic for rate limits
Rate Limits¶
- With API Key: 1,000 requests/day
- Burst Rate: 10 requests/second
- Without Key: Not supported
Differences from ClinicalTrials.gov¶
Enhanced Features¶
- Biomarker search: Mutation-specific queries
- Prior therapy: Exclude based on previous treatments
- Brain metastases: Specific acceptance criteria
- Performance status: ECOG/Karnofsky filtering
Limitations¶
- Cancer trials only: Limited to oncology studies
- No offset pagination: Must use size parameter carefully
- Location parameters: Different naming (org_ prefix)
Integration Examples¶
Example 1: Precision Medicine Search¶
async def find_precision_trials(mutation, cancer_type, location):
"""Find trials for specific mutation in cancer type near location"""
# Search for trials
trial_params = {
"diseases": cancer_type,
"biomarkers": mutation,
"accepts_brain_mets": True,
"size": 50
}
trials = await fetch_nci_api("trials", trial_params)
# Filter by location if provided
if location:
nearby_trials = []
for trial in trials["trials"]:
for site in trial.get("sites", []):
distance = calculate_distance(location, site["coordinates"])
if distance < 100: # 100 miles
nearby_trials.append(trial)
break
return nearby_trials
return trials["trials"]
Example 2: Biomarker-Driven Pipeline¶
def biomarker_trial_pipeline(gene, variant):
"""Complete pipeline from variant to trials"""
# 1. Search biomarkers
biomarkers = requests.get(
"https://clinicaltrialsapi.cancer.gov/api/v2/biomarkers",
headers={"X-API-KEY": api_key},
params={"gene": gene, "name": variant}
).json()
# 2. Get associated trials
all_trials = []
for biomarker in biomarkers.get("biomarkers", []):
trials = requests.get(
"https://clinicaltrialsapi.cancer.gov/api/v2/trials",
headers={"X-API-KEY": api_key},
params={"biomarker_id": biomarker["id"]}
).json()
all_trials.extend(trials.get("trials", []))
# 3. Deduplicate and sort by phase
unique_trials = {t["nct_id"]: t for t in all_trials}.values()
return sorted(unique_trials, key=lambda x: x.get("phase", ""))
Support Resources¶
- API Documentation: https://clinicaltrialsapi.cancer.gov/
- Support Email: [email protected]
- Status Page: https://status.cancer.gov/
- Terms of Use: https://clinicaltrialsapi.cancer.gov/terms