Awesome-Agent-Skills-for-Empirical-Research clinicaltrials-api-v2

Search and analyze clinical trials via the ClinicalTrials.gov v2 API

install
source · Clone the upstream repo
git clone https://github.com/brycewang-stanford/Awesome-Agent-Skills-for-Empirical-Research
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/brycewang-stanford/Awesome-Agent-Skills-for-Empirical-Research "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/43-wentorai-research-plugins/skills/domains/biomedical/clinicaltrials-api-v2" ~/.claude/skills/brycewang-stanford-awesome-agent-skills-for-empirical-research-clinicaltrials-ap && rm -rf "$T"
manifest: skills/43-wentorai-research-plugins/skills/domains/biomedical/clinicaltrials-api-v2/SKILL.md
source content

ClinicalTrials.gov v2 API Guide

Overview

ClinicalTrials.gov is the world's largest clinical trial registry, maintained by the U.S. National Library of Medicine (NLM) at NIH. It contains over 576,000 study records from 220+ countries covering interventional trials, observational studies, and expanded access programs. The v2 API provides structured JSON access with field-level filtering, cursor-based pagination, and statistics endpoints.

Key v2 improvements over the legacy API: JSON-native responses, sparse field selection via the

fields
parameter,
nextPageToken
pagination, and dedicated statistics endpoints. Study data is organized into
protocolSection
(sponsor-submitted) and
derivedSection
(NLM-computed).

Authentication

No authentication required. All endpoints are publicly accessible without API keys or registration. Users should comply with NCBI usage policies and maintain reasonable request rates.

Core Endpoints

Search Studies

  • URL:
    GET https://clinicaltrials.gov/api/v2/studies
  • Parameters:
ParameterTypeRequiredDescription
query.termstringNoFree-text search across all fields
query.condstringNoCondition or disease filter
query.intrstringNoIntervention or treatment filter
query.sponsstringNoSponsor or collaborator filter
filter.overallStatusstringNo
RECRUITING
,
COMPLETED
,
ACTIVE_NOT_RECRUITING
, etc.
filter.phasestringNo
EARLY_PHASE1
,
PHASE1
,
PHASE2
,
PHASE3
,
PHASE4
,
NA
filter.geostringNoGeographic filter (
distance(lat,lng,dist)
)
fieldsstringNoComma-separated fields for sparse response
sortstringNoSort field and direction (e.g.,
LastUpdatePostDate:desc
)
pageSizeintNoResults per page (default 10, max 1000)
pageTokenstringNoCursor token for next page
formatstringNo
json
(default) or
csv
  • Example:
curl "https://clinicaltrials.gov/api/v2/studies?query.cond=diabetes&query.intr=metformin&pageSize=1&fields=NCTId,BriefTitle,OverallStatus"
  • Response:
{
  "studies": [{
    "protocolSection": {
      "identificationModule": {
        "nctId": "NCT06649773",
        "briefTitle": "The Experiment of Noiiglutide Injection in Type 2 Diabetes Patients"
      },
      "statusModule": { "overallStatus": "ACTIVE_NOT_RECRUITING" }
    }
  }],
  "nextPageToken": "ZVNj7o2Elu8o3lpo..."
}

Full responses include

protocolSection
with:
identificationModule
(NCT ID, titles, organization),
statusModule
(status, dates),
descriptionModule
(summary),
conditionsModule
,
designModule
(type, phases, enrollment),
armsInterventionsModule
,
eligibilityModule
(criteria, sex, age),
outcomesModule
, and
contactsLocationsModule
.

Get Single Study

  • URL:
    GET https://clinicaltrials.gov/api/v2/studies/{nctId}
curl "https://clinicaltrials.gov/api/v2/studies/NCT04280705?fields=NCTId,BriefTitle,OverallStatus,Phase,LeadSponsorName,EnrollmentCount,Condition,InterventionName"
{
  "protocolSection": {
    "identificationModule": {
      "nctId": "NCT04280705",
      "briefTitle": "Adaptive COVID-19 Treatment Trial (ACTT)"
    },
    "statusModule": {
      "overallStatus": "COMPLETED",
      "startDateStruct": { "date": "2020-02-21" },
      "completionDateStruct": { "date": "2020-05-21" }
    },
    "sponsorCollaboratorsModule": {
      "leadSponsor": { "name": "National Institute of Allergy and Infectious Diseases (NIAID)" }
    },
    "conditionsModule": { "conditions": ["COVID-19"] },
    "designModule": { "phases": ["PHASE3"], "enrollmentInfo": { "count": 1062 } },
    "armsInterventionsModule": {
      "interventions": [{ "name": "Placebo" }, { "name": "Remdesivir" }]
    }
  }
}

Database Statistics

  • URL:
    GET https://clinicaltrials.gov/api/v2/stats/size
curl "https://clinicaltrials.gov/api/v2/stats/size"
{
  "totalStudies": 576554,
  "averageSizeBytes": 17186,
  "largestStudies": [
    { "id": "NCT02723955", "sizeBytes": 3596689 },
    { "id": "NCT03688620", "sizeBytes": 2865033 }
  ]
}

Field Value Statistics

  • URL:
    GET https://clinicaltrials.gov/api/v2/stats/fieldValues/{fieldName}
curl "https://clinicaltrials.gov/api/v2/stats/fieldValues/Phase"
{
  "type": "ENUM",
  "piece": "Phase",
  "field": "protocolSection.designModule.phases",
  "missingStudiesCount": 136632,
  "topValues": [
    { "value": "NA", "studiesCount": 222829 },
    { "value": "PHASE2", "studiesCount": 87478 },
    { "value": "PHASE1", "studiesCount": 63716 },
    { "value": "PHASE3", "studiesCount": 48700 },
    { "value": "PHASE4", "studiesCount": 34911 },
    { "value": "EARLY_PHASE1", "studiesCount": 6179 }
  ]
}

Rate Limits

No formal rate limits are published for the v2 API. Follow NCBI usage guidelines: stay under 3 requests/second without an API key, up to 10/second with one. For bulk data access, use the AACT relational database (https://aact.ctti-clinicaltrials.org/) or downloadable flat files rather than paginating through the full API.

Academic Use Cases

  • Systematic reviews: Use
    query.cond
    +
    query.intr
    +
    filter.overallStatus=COMPLETED
    to build PRISMA-compliant trial inventories. Paginate with
    nextPageToken
    to collect all records, then extract outcomes and enrollment for quantitative synthesis.
  • Landscape mapping: Combine search with
    stats/fieldValues
    to map phase distributions, sponsor concentration, and geographic spread for a therapeutic area -- useful for identifying evidence gaps in grant proposals.
  • Recruitment tracking: Filter by
    RECRUITING
    status and
    filter.geo
    to find active enrollment opportunities. Automate periodic queries for new trials in your domain.

Code Examples

Paginated Collection for Systematic Review

import requests, time

def collect_trials(condition, intervention, status="COMPLETED"):
    base = "https://clinicaltrials.gov/api/v2/studies"
    studies, token = [], None
    while True:
        params = {
            "query.cond": condition, "query.intr": intervention,
            "filter.overallStatus": status, "pageSize": 100,
            "fields": "NCTId,BriefTitle,Phase,EnrollmentCount,CompletionDate",
        }
        if token:
            params["pageToken"] = token
        data = requests.get(base, params=params).json()
        studies.extend(data.get("studies", []))
        token = data.get("nextPageToken")
        if not token:
            break
        time.sleep(0.34)
    return studies

trials = collect_trials("type 2 diabetes", "metformin")
print(f"Collected {len(trials)} completed metformin T2D trials")

Sponsor and Phase Analysis

import requests
from collections import Counter

params = {"query.cond": "Alzheimer's Disease", "pageSize": 100,
          "fields": "NCTId,Phase,LeadSponsorName"}
data = requests.get("https://clinicaltrials.gov/api/v2/studies", params=params).json()

phases, sponsors = Counter(), Counter()
for s in data["studies"]:
    p = s["protocolSection"]
    for ph in p.get("designModule", {}).get("phases", []):
        phases[ph] += 1
    sponsors[p.get("sponsorCollaboratorsModule", {})
              .get("leadSponsor", {}).get("name", "Unknown")] += 1

for ph, n in phases.most_common():
    print(f"{ph}: {n}")

References