ClinicalTrials.gov Scraper & API - Trials by Condition & Phase
Pricing
from $5.84 / 1,000 study returneds
ClinicalTrials.gov Scraper & API - Trials by Condition & Phase
For pharma intelligence, site feasibility and RAG pipelines: trials from the official ClinicalTrials.gov v2 API, flattened from 12 nested modules, each start date labelled day, month or year. The registry holds 602,104 studies; a phase 2, 3 and 4 search returns 51,862 here, 2,597 naively
Pricing
from $5.84 / 1,000 study returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
5 hours ago
Last modified
Categories
Share
ClinicalTrials.gov Scraper & API
For pharma and biotech competitive intelligence, CRO site selection, patient recruitment and healthcare investors: clinical trials from the US National Library of Medicine's own registry as flat rows — condition, phase, status, sponsor, locations and dates.
The registry is far bigger than a search page can show you. Measured against the live API on 2026-09-10 it held 602,104 studies; cancer alone matched 123,154 of them. Narrowing that one term: RECRUITING 18,755, a Japan location 3,105, phase 3 10,989.
The registry's own phase filter silently throws your filters away. This Actor does not. Asking for phase:2,phase:3 returns 10,989 — phase 2 gone. phase:2,phase:3,phase:4 returns 2,597 — only phase 4. The form this Actor sends returns 51,862, which is all three. Dates are just as treacherous: of 200 cancer trials, 117 had a full date, 81 had only 2011-12, and 2 had none, so every date here carries the precision it actually has (day, month) instead of a 2011-12-01 nobody ever published.
No API key, no scraping, no proxy. A typo is reported as a typo, never as an empty result that looks like an answer. Export as JSON, CSV or Excel.
{"condition": "breast cancer","statuses": ["RECRUITING"],"phases": ["3"],"maxStudies": 200}
What this fixes about the raw API
Everything below was measured against the live API on 2026-09-10, not read from documentation.
1. Four in ten start dates hold only a year and a month
Of 200 cancer trials, 117 had a full date, 81 had only 2011-12, and 2 had none. A scraper that parses
these into a date either drops them or invents a day the registry never published.
Here the date is passed through exactly as the registry wrote it, and a second column says how precise it is:
startDate | startDatePrecision |
|---|---|
2011-12-16 | day |
2011-12 | month |
| (absent) | unknown |
So you can sort by it, and you can also tell which rows you are allowed to sort to the day.
2. An empty search returns the entire registry
Leave every filter blank and the API happily returns all 602,104 studies. A blank field or a variable that
did not get set becomes a bill. This Actor never sends an unnarrowed search: if you supply nothing at all it
falls back to the condition diabetes, says so in the log, and writes the search it actually ran into the
matchedQuery column of every row. If you supply anything - a drug, a sponsor, a location, a status, a phase -
that is used on its own and nothing is added to it.
3. Picking two phases means OR, not "the last one you picked"
The API takes several values for one facet separated by a space; a comma between them silently keeps only the
last. Measured on cancer:
| what is sent | studies matched |
|---|---|
phase:2 | 39,750 |
phase:3 | 10,989 |
phase:2,phase:3 (the comma form) | 10,989 - phase 2 gone |
phase:2,phase:3,phase:4 | 2,597 - only phase 4 |
phase:2 3 4 (what this Actor sends) | 51,862 |
Ticking Phase 2, 3 and 4 with the comma form returns 5 per cent of the matching trials and says nothing. Here the values for one facet are joined with a space and different facets with a comma, so both AND and OR behave the way the input schema says they do.
4. A term the registry does not know returns zero, not an error
query.cond=zzznotadisease answers HTTP 200 with totalCount: 0. A typo therefore looks exactly like a
disease nobody studies. That empty result comes back as its own row saying the search worked and matched
nothing - which is not the same row you get when a filter value was rejected (HTTP 400, with the registry's
reason) or when the request simply failed. None of those three rows is charged.
5. pageSize is silently capped at 1,000
Ask for 2,000 and you get 1,000, with no error and no warning. Paging here is done against what actually came back rather than what was requested, so a run never reports more studies than it received.
6. Twelve nested modules become one row
The API returns each study as twelve nested objects. This flattens them into one row per study, with lists
kept as lists: conditions, phases, interventionNames, countries, collaborators, keywords. A study
with no phase - every observational study - gets an empty list rather than an invented N/A.
What you get
nctId, url, briefTitle, officialTitle, overallStatus, whyStopped, studyType, phases,
enrollmentCount, enrollmentType, conditions, keywords, interventionTypes, interventionNames,
leadSponsor, leadSponsorClass, collaborators, startDate, startDatePrecision, completionDate,
completionDatePrecision, firstPostedDate, lastUpdatePostedDate, sex, minimumAge, maximumAge,
healthyVolunteers, standardAges, locationCount, countries, firstLocationFacility,
firstLocationCity, briefSummary.
Input
| Field | What it does |
|---|---|
condition | Condition or disease, e.g. diabetes, breast cancer. |
intervention | Drug, device or procedure, e.g. semaglutide, CAR-T. |
term | Free text across the whole record, e.g. CRISPR. |
location | Country, state or city with a study site, e.g. Japan. |
sponsor | Organisation running the study, e.g. Pfizer, NIH. |
statuses | Recruitment status. An invalid value is rejected by the registry with its reason, not ignored. |
phases | Trial phase. Observational studies have none and are excluded by this filter. |
studyType | Interventional or observational. |
maxStudies | How many to return. cancer alone matched 123,154 studies, so this is what keeps a run affordable. |
maxRetries | Attempts per request. HTTP 400 is permanent and is never retried. |
Scale
Measured on 2026-09-10: the registry held 602,104 studies. cancer matched 123,154 of them. Each filter
applied on its own to cancer gave: RECRUITING 18,755, a Japan location 3,105, phase 3 10,989 - so the
filters do narrow the search rather than being accepted and ignored. (These are separate figures, not a
sequence.)
Source and licence
ClinicalTrials.gov API v2 (clinicaltrials.gov/api/v2). Works of the US federal government are in the public
domain. This Actor makes plain HTTPS requests to the documented JSON endpoints; it does not scrape any web page
and needs no API key or proxy.