ClinicalTrials.gov Scraper & API - Trials by Condition & Phase avatar

ClinicalTrials.gov Scraper & API - Trials by Condition & Phase

Pricing

from $5.84 / 1,000 study returneds

Go to Apify Store
ClinicalTrials.gov Scraper & API - Trials by Condition & Phase

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

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

5 hours ago

Last modified

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:

startDatestartDatePrecision
2011-12-16day
2011-12month
(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 sentstudies matched
phase:239,750
phase:310,989
phase:2,phase:3 (the comma form)10,989 - phase 2 gone
phase:2,phase:3,phase:42,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

FieldWhat it does
conditionCondition or disease, e.g. diabetes, breast cancer.
interventionDrug, device or procedure, e.g. semaglutide, CAR-T.
termFree text across the whole record, e.g. CRISPR.
locationCountry, state or city with a study site, e.g. Japan.
sponsorOrganisation running the study, e.g. Pfizer, NIH.
statusesRecruitment status. An invalid value is rejected by the registry with its reason, not ignored.
phasesTrial phase. Observational studies have none and are excluded by this filter.
studyTypeInterventional or observational.
maxStudiesHow many to return. cancer alone matched 123,154 studies, so this is what keeps a run affordable.
maxRetriesAttempts 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.