{"slug":"alterlab-clinicaltrials","title":"alterlab-clinicaltrials","summary":"Query ClinicalTrials.gov via its API v2 to search trials by condition, drug, location, recruitment status, or phase and retrieve trial details by NCT ID. Use when finding interventional or observational studies, checking trial status and eligibility for patient matching, or expor","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-23T18:57:08.826874Z","repo":{"url":"https://github.com/AlterLab-IEU/AlterLab-Academic-Skills","stars":68,"forks":13,"license":"MIT","updatedAt":"2026-09-23T13:42:59Z"},"bodyHtml":"<hr>\n<h2>name: alterlab-clinicaltrials\ndescription: Query ClinicalTrials.gov via its API v2 to search trials by condition, drug, location, recruitment status, or phase and retrieve trial details by NCT ID. Use when finding interventional or observational studies, checking trial status and eligibility for patient matching, or exporting clinical trial records for research. Part of the AlterLab Academic Skills suite.\nlicense: MIT\nallowed-tools: Read WebFetch Bash(curl:<em>) Bash(python:</em>)\ncompatibility: Keyless ClinicalTrials.gov API v2 (no authentication required)\nmetadata:\nskill-author: AlterLab\nversion: \"1.0.1\"\nlast_updated: \"2026-09-23\"</h2>\n<h1>ClinicalTrials.gov Database</h1>\n<h2>Overview</h2>\n<p>ClinicalTrials.gov is a comprehensive registry of clinical studies conducted worldwide, maintained by the U.S. National Library of Medicine. Access API v2 to search for trials, retrieve detailed study information, filter by various criteria, and export data for analysis. The API is public (no authentication required) with rate limits of ~50 requests per minute, supporting JSON and CSV formats.</p>\n<h2>When to Use This Skill</h2>\n<p>This skill should be used when working with clinical trial data in scenarios such as:</p>\n<ul>\n<li><strong>Patient matching</strong> - Finding recruiting trials for specific conditions or patient populations</li>\n<li><strong>Research analysis</strong> - Analyzing clinical trial trends, outcomes, or study designs</li>\n<li><strong>Drug/intervention research</strong> - Identifying trials testing specific drugs or interventions</li>\n<li><strong>Geographic searches</strong> - Locating trials in specific locations or regions</li>\n<li><strong>Sponsor/organization tracking</strong> - Finding trials conducted by specific institutions</li>\n<li><strong>Data export</strong> - Extracting clinical trial data for further analysis or reporting</li>\n<li><strong>Trial monitoring</strong> - Tracking status updates or results for specific trials</li>\n<li><strong>Eligibility screening</strong> - Reviewing inclusion/exclusion criteria for trials</li>\n</ul>\n<h3>Does NOT Trigger</h3>\n<table>\n<thead>\n<tr>\n<th>Scenario</th>\n<th>Use Instead</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Published trial results, RCT papers, or meta-analysis literature</td>\n<td><code>alterlab-pubmed</code></td>\n</tr>\n<tr>\n<td>FDA approvals, drug labels, adverse-event (FAERS) or recall data</td>\n<td><code>alterlab-fda</code></td>\n</tr>\n<tr>\n<td>Writing a CSR, SAE narrative, or other trial report document</td>\n<td><code>alterlab-clinical-reports</code></td>\n</tr>\n<tr>\n<td>Evidence-graded treatment recommendations / decision algorithms</td>\n<td><code>alterlab-clinical-decision</code></td>\n</tr>\n</tbody>\n</table>\n<h2>Quick Start</h2>\n<h3>Basic Search Query</h3>\n<p>Run the helper script (from this skill's <code>scripts/</code> directory):</p>\n<pre><code>python3 scripts/query_clinicaltrials.py\n</code></pre>\n<p>Or use Python directly with the <code>requests</code> library. Note: the API omits\n<code>totalCount</code> unless you pass <code>countTotal=true</code>, and the pagination token is\nreturned as <code>nextPageToken</code>.</p>\n<pre><code>import requests\n\nurl = \"https://clinicaltrials.gov/api/v2/studies\"\nparams = {\n    \"query.cond\": \"breast cancer\",\n    \"filter.overallStatus\": \"RECRUITING\",\n    \"pageSize\": 10,\n    \"countTotal\": \"true\",  # required for data['totalCount'] to exist\n}\n\nresponse = requests.get(url, params=params)\ndata = response.json()\n\nprint(f\"Found {data['totalCount']} trials\")\n</code></pre>\n<h3>Retrieve Specific Trial</h3>\n<p>Get detailed information about a trial using its NCT ID:</p>\n<pre><code>import requests\n\nnct_id = \"NCT04852770\"\nurl = f\"https://clinicaltrials.gov/api/v2/studies/{nct_id}\"\n\nresponse = requests.get(url)\nstudy = response.json()\n\n# Access specific modules\ntitle = study['protocolSection']['identificationModule']['briefTitle']\nstatus = study['protocolSection']['statusModule']['overallStatus']\n</code></pre>\n<h2>Core Capabilities</h2>\n<h3>1. Search by Condition/Disease</h3>\n<p>Find trials studying specific medical conditions or diseases using the <code>query.cond</code> parameter.</p>\n<p><strong>Example: Find recruiting diabetes trials</strong></p>\n<pre><code>from scripts.query_clinicaltrials import search_studies\n\nresults = search_studies(\n    condition=\"type 2 diabetes\",\n    status=\"RECRUITING\",\n    page_size=20,\n    sort=\"LastUpdatePostDate:desc\"\n)\n\nprint(f\"Found {results['totalCount']} recruiting diabetes trials\")\nfor study in results['studies']:\n    protocol = study['protocolSection']\n    nct_id = protocol['identificationModule']['nctId']\n    title = protocol['identificationModule']['briefTitle']\n    print(f\"{nct_id}: {title}\")\n</code></pre>\n<p><strong>Common use cases:</strong></p>\n<ul>\n<li>Finding trials for rare diseases</li>\n<li>Identifying trials for comorbid conditions</li>\n<li>Tracking trial availability for specific diagnoses</li>\n</ul>\n<h3>2. Search by Intervention/Drug</h3>\n<p>Search for trials testing specific interventions, drugs, devices, or procedures using the <code>query.intr</code> parameter.</p>\n<p><strong>Example: Find Phase 3 trials testing Pembrolizumab</strong></p>\n<pre><code>from scripts.query_clinicaltrials import search_studies\n\nresults = search_studies(\n    intervention=\"Pembrolizumab\",\n    status=[\"RECRUITING\", \"ACTIVE_NOT_RECRUITING\"],\n    page_size=50\n)\n\n# Filter by phase in results\nphase3_trials = [\n    study for study in results['studies']\n    if 'PHASE3' in study['protocolSection'].get('designModule', {}).get('phases', [])\n]\n</code></pre>\n<blockquote>\n<p><strong>Phase filtering note:</strong> There is no <code>filter.phase</code> query parameter — passing\none returns HTTP 400. To filter server-side, use <code>aggFilters=phase:N</code> where N is\n0–4 (values within a facet are space-separated, e.g. <code>aggFilters=phase:2 3</code> for\nPhase 2 or 3), or <code>filter.advanced=AREA[Phase](PHASE2 OR PHASE3)</code> with Essie\nsyntax. Post-filtering on <code>designModule.phases</code> (as above) is the simplest\napproach when you already need the full records.</p>\n</blockquote>\n<p><strong>Common use cases:</strong></p>\n<ul>\n<li>Drug development tracking</li>\n<li>Competitive intelligence for pharmaceutical companies</li>\n<li>Treatment option research for clinicians</li>\n</ul>\n<h3>3. Geographic Search</h3>\n<p>Find trials in specific locations using the <code>query.locn</code> parameter.</p>\n<p><strong>Example: Find cancer trials in New York</strong></p>\n<pre><code>from scripts.query_clinicaltrials import search_studies\n\nresults = search_studies(\n    condition=\"cancer\",\n    location=\"New York\",\n    status=\"RECRUITING\",\n    page_size=100\n)\n\n# Extract location details\nfor study in results['studies']:\n    locations_module = study['protocolSection'].get('contactsLocationsModule', {})\n    locations = locations_module.get('locations', [])\n    for loc in locations:\n        if 'New York' in loc.get('city', ''):\n            print(f\"{loc['facility']}: {loc['city']}, {loc.get('state', '')}\")\n</code></pre>\n<p><strong>Common use cases:</strong></p>\n<ul>\n<li>Patient referrals to local trials</li>\n<li>Geographic trial distribution analysis</li>\n<li>Site selection for new trials</li>\n</ul>\n<h3>4. Search by Sponsor/Organization</h3>\n<p>Find trials conducted by specific organizations using the <code>query.spons</code> parameter.</p>\n<p><strong>Example: Find trials sponsored by NCI</strong></p>\n<pre><code>from scripts.query_clinicaltrials import search_studies\n\nresults = search_studies(\n    sponsor=\"National Cancer Institute\",\n    page_size=100\n)\n\n# Extract sponsor information\nfor study in results['studies']:\n    sponsor_module = study['protocolSection']['sponsorCollaboratorsModule']\n    lead_sponsor = sponsor_module['leadSponsor']['name']\n    collaborators = sponsor_module.get('collaborators', [])\n    print(f\"Lead: {lead_sponsor}\")\n    if collaborators:\n        print(f\"  Collaborators: {', '.join([c['name'] for c in collaborators])}\")\n</code></pre>\n<p><strong>Common use cases:</strong></p>\n<ul>\n<li>Tracking institutional research portfolios</li>\n<li>Analyzing funding organization priorities</li>\n<li>Identifying collaboration opportunities</li>\n</ul>\n<h3>5. Filter by Study Status</h3>\n<p>Filter trials by recruitment or completion status using the <code>filter.overallStatus</code> parameter.</p>\n<p><strong>Valid status values:</strong></p>\n<ul>\n<li><code>RECRUITING</code> - Currently recruiting participants</li>\n<li><code>NOT_YET_RECRUITING</code> - Not yet open for recruitment</li>\n<li><code>ENROLLING_BY_INVITATION</code> - Only enrolling by invitation</li>\n<li><code>ACTIVE_NOT_RECRUITING</code> - Active but no longer recruiting</li>\n<li><code>SUSPENDED</code> - Temporarily halted</li>\n<li><code>TERMINATED</code> - Stopped prematurely</li>\n<li><code>COMPLETED</code> - Study has concluded</li>\n<li><code>WITHDRAWN</code> - Withdrawn prior to enrollment</li>\n<li>Expanded-access records use <code>AVAILABLE</code>, <code>NO_LONGER_AVAILABLE</code>,\n<code>TEMPORARILY_NOT_AVAILABLE</code>, <code>APPROVED_FOR_MARKETING</code>; <code>WITHHELD</code> and <code>UNKNOWN</code>\nalso occur (full list: <code>GET /api/v2/studies/enums</code>)</li>\n</ul>\n<p><strong>Example: Find recently completed trials with results</strong></p>\n<pre><code>from scripts.query_clinicaltrials import search_studies\n\nresults = search_studies(\n    condition=\"alzheimer disease\",\n    status=\"COMPLETED\",\n    sort=\"LastUpdatePostDate:desc\",\n    page_size=50\n)\n\n# Filter for trials with results\ntrials_with_results = [\n    study for study in results['studies']\n    if study.get('hasResults', False)\n]\n\nprint(f\"Found {len(trials_with_results)} completed trials with results\")\n</code></pre>\n<h3>6. Retrieve Detailed Study Information</h3>\n<p>Get comprehensive information about specific trials including eligibility criteria, outcomes, contacts, and locations.</p>\n<p><strong>Example: Extract eligibility criteria</strong></p>\n<pre><code>from scripts.query_clinicaltrials import get_study_details\n\nstudy = get_study_details(\"NCT04852770\")\neligibility = study['protocolSection']['eligibilityModule']\n\nprint(f\"Eligible Ages: {eligibility.get('minimumAge')} - {eligibility.get('maximumAge')}\")\nprint(f\"Eligible Sex: {eligibility.get('sex')}\")\nprint(f\"\\nInclusion Criteria:\")\nprint(eligibility.get('eligibilityCriteria'))\n</code></pre>\n<p><strong>Example: Extract contact information</strong></p>\n<pre><code>from scripts.query_clinicaltrials import get_study_details\n\nstudy = get_study_details(\"NCT04852770\")\ncontacts_module = study['protocolSection']['contactsLocationsModule']\n\n# Overall contacts\nif 'centralContacts' in contacts_module:\n    for contact in contacts_module['centralContacts']:\n        print(f\"Contact: {contact.get('name')}\")\n        print(f\"Phone: {contact.get('phone')}\")\n        print(f\"Email: {contact.get('email')}\")\n\n# Study locations\nif 'locations' in contacts_module:\n    for location in contacts_module['locations']:\n        print(f\"\\nFacility: {location.get('facility')}\")\n        print(f\"City: {location.get('city')}, {location.get('state')}\")\n        if location.get('status'):\n            print(f\"Status: {location['status']}\")\n</code></pre>\n<h3>7. Pagination and Bulk Data Retrieval</h3>\n<p>Handle large result sets efficiently using pagination.</p>\n<p><strong>Example: Retrieve all matching trials</strong></p>\n<pre><code>from scripts.query_clinicaltrials import search_with_all_results\n\n# Get all trials (automatically handles pagination)\nall_trials = search_with_all_results(\n    condition=\"rare disease\",\n    status=\"RECRUITING\"\n)\n\nprint(f\"Retrieved {len(all_trials)} total trials\")\n</code></pre>\n<p><strong>Example: Manual pagination with control</strong></p>\n<pre><code>from scripts.query_clinicaltrials import search_studies\n\nall_studies = []\npage_token = None\nmax_pages = 10  # Limit to avoid excessive requests\n\nfor page in range(max_pages):\n    results = search_studies(\n        condition=\"cancer\",\n        page_size=1000,  # Max page size\n        page_token=page_token\n    )\n\n    all_studies.extend(results['studies'])\n\n    # Check for next page. The API returns the cursor as 'nextPageToken';\n    # you pass it back in as the 'pageToken' request parameter.\n    page_token = results.get('nextPageToken')\n    if not page_token:\n        break\n\nprint(f\"Retrieved {len(all_studies)} studies across {page + 1} pages\")\n</code></pre>\n<h3>8. Data Export to CSV</h3>\n<p>Export trial data to CSV format for analysis in spreadsheet software or data analysis tools.</p>\n<p><strong>Example: Export to CSV file</strong></p>\n<pre><code>from scripts.query_clinicaltrials import search_studies\n\n# Request CSV format\nresults = search_studies(\n    condition=\"heart disease\",\n    status=\"RECRUITING\",\n    format=\"csv\",\n    page_size=1000\n)\n\n# Save to file\nwith open(\"heart_disease_trials.csv\", \"w\") as f:\n    f.write(results)\n\nprint(\"Data exported to heart_disease_trials.csv\")\n</code></pre>\n<p><strong>Note:</strong> CSV format returns a string instead of JSON dictionary.</p>\n<h3>9. Extract and Summarize Study Information</h3>\n<p>Extract key information for quick overview or reporting.</p>\n<p><strong>Example: Create trial summary</strong></p>\n<pre><code>from scripts.query_clinicaltrials import get_study_details, extract_study_summary\n\n# Get details and extract summary\nstudy = get_study_details(\"NCT04852770\")\nsummary = extract_study_summary(study)\n\nprint(f\"NCT ID: {summary['nct_id']}\")\nprint(f\"Title: {summary['title']}\")\nprint(f\"Status: {summary['status']}\")\nprint(f\"Phase: {', '.join(summary['phase'])}\")\nprint(f\"Enrollment: {summary['enrollment']}\")\nprint(f\"Last Update: {summary['last_update']}\")\nprint(f\"\\nBrief Summary:\\n{summary['brief_summary']}\")\n</code></pre>\n<h3>10. Combined Query Strategies</h3>\n<p>Combine multiple filters for targeted searches.</p>\n<p><strong>Example: Multi-criteria search</strong></p>\n<pre><code>from scripts.query_clinicaltrials import search_studies\n\n# Find Phase 2/3 immunotherapy trials for lung cancer in California\nresults = search_studies(\n    condition=\"lung cancer\",\n    intervention=\"immunotherapy\",\n    location=\"California\",\n    status=[\"RECRUITING\", \"NOT_YET_RECRUITING\"],\n    page_size=100\n)\n\n# Further filter by phase\nphase2_3_trials = [\n    study for study in results['studies']\n    if any(phase in ['PHASE2', 'PHASE3']\n           for phase in study['protocolSection'].get('designModule', {}).get('phases', []))\n]\n\nprint(f\"Found {len(phase2_3_trials)} Phase 2/3 immunotherapy trials\")\n</code></pre>\n<h2>Resources</h2>\n<ul>\n<li><code>scripts/query_clinicaltrials.py</code> — helpers for the common query patterns:\n<code>search_studies()</code>, <code>get_study_details()</code>, <code>search_with_all_results()</code>\n(auto-pagination), <code>extract_study_summary()</code>. Run directly for example usage.</li>\n<li><code>references/api_reference.md</code> — full endpoint/parameter specs, response\nmodules, error handling, and data standards (ISO 8601, CommonMark). Load when\nworking with unfamiliar API features or troubleshooting.</li>\n</ul>\n<h2>Best Practices</h2>\n<h3>Rate Limit Management</h3>\n<p>The API has a rate limit of approximately 50 requests per minute. For bulk data retrieval:</p>\n<ol>\n<li>Use maximum page size (1000) to minimize requests</li>\n<li>Implement exponential backoff on rate limit errors (429 status)</li>\n<li>Add delays between requests for large-scale data collection</li>\n</ol>\n<pre><code>import time\nimport requests\n\ndef search_with_rate_limit(params):\n    try:\n        response = requests.get(\"https://clinicaltrials.gov/api/v2/studies\", params=params)\n        response.raise_for_status()\n        return response.json()\n    except requests.exceptions.HTTPError as e:\n        if e.response.status_code == 429:\n            print(\"Rate limited. Waiting 60 seconds...\")\n            time.sleep(60)\n            return search_with_rate_limit(params)  # Retry\n        raise\n</code></pre>\n<h3>Data Structure Navigation</h3>\n<p>The API response has a nested structure. Key paths to common information:</p>\n<ul>\n<li><strong>NCT ID</strong>: <code>study['protocolSection']['identificationModule']['nctId']</code></li>\n<li><strong>Title</strong>: <code>study['protocolSection']['identificationModule']['briefTitle']</code></li>\n<li><strong>Status</strong>: <code>study['protocolSection']['statusModule']['overallStatus']</code></li>\n<li><strong>Phase</strong>: <code>study['protocolSection']['designModule']['phases']</code></li>\n<li><strong>Eligibility</strong>: <code>study['protocolSection']['eligibilityModule']</code></li>\n<li><strong>Locations</strong>: <code>study['protocolSection']['contactsLocationsModule']['locations']</code></li>\n<li><strong>Interventions</strong>: <code>study['protocolSection']['armsInterventionsModule']['interventions']</code></li>\n</ul>\n<h3>Error Handling</h3>\n<p>Use a <code>timeout</code> on every request and treat HTTP 400 as a query bug, not \"no trials\":\nthe API rejects unknown parameters (e.g. <code>filter.phase</code>) and malformed Essie\nexpressions with 400.</p>\n<h3>Handling Missing Data</h3>\n<p>Not all trials have complete information. Always check for field existence:</p>\n<pre><code># Safe navigation with .get()\nphases = study['protocolSection'].get('designModule', {}).get('phases', [])\nenrollment = study['protocolSection'].get('designModule', {}).get('enrollmentInfo', {}).get('count', 'N/A')\n\n# Check before accessing\nif 'resultsSection' in study:\n    # Process results\n    pass\n</code></pre>\n<h2>Technical Specifications</h2>\n<ul>\n<li><strong>Base URL</strong>: <code>https://clinicaltrials.gov/api/v2</code></li>\n<li><strong>Authentication</strong>: Not required (public API)</li>\n<li><strong>Rate Limit</strong>: ~50 requests/minute per IP</li>\n<li><strong>Response Formats</strong>: JSON (default), CSV</li>\n<li><strong>Max Page Size</strong>: 1000 studies per request (larger values are coerced down to 1000)</li>\n<li><strong>Date Format</strong>: ISO 8601</li>\n<li><strong>Text Format</strong>: CommonMark Markdown for rich text fields</li>\n<li><strong>API Version</strong>: 2.x (v2.0 released March 2024; <code>GET /api/v2/version</code> reports the current build, 2.0.5 as of 2026-09, plus the data timestamp)</li>\n<li><strong>API Specification</strong>: OpenAPI 3.0</li>\n</ul>\n<p>For complete technical details, see <code>references/api_reference.md</code>.</p>\n","files":[{"path":"evals/evals.json","sizeBytes":4201,"isText":true},{"path":"references/api_reference.md","sizeBytes":11776,"isText":true},{"path":"scripts/query_clinicaltrials.py","sizeBytes":7573,"isText":true},{"path":"SKILL.md","sizeBytes":16136,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-23T18:59:27.523736Z","sha256":"8E0B336F3A4A627195A5C225C35B280E158FB7F1BB0A8740C956769D7B531F21","sizeBytes":14400},"review":null,"source":{"repositoryUrl":"https://github.com/AlterLab-IEU/AlterLab-Academic-Skills","path":"skills/databases/alterlab-clinicaltrials","license":"MIT","commit":"e4836c08a20da195a11f30f203a8cf23ec30aa95","subtreeSha":"F1D0B64E4363E3674814B3DEE36CB6E6D27E9C56A8F11E1CACBBA58DD1DD9B35","lastSyncedAt":"2026-09-23T18:56:52.297238Z"},"reviewedAt":"2026-09-23T19:03:50.307489Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/AlterLab-IEU/AlterLab-Academic-Skills/tree/main/skills/databases/alterlab-clinicaltrials"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install alterlab-ieu-alterlab-academic-skills@llmmart"},{"target":"git","command":"git clone https://github.com/AlterLab-IEU/AlterLab-Academic-Skills.git"}]}