Competitive intelligence
A competitor just registered a phase-2 in your indication — that's a new_trial record in tomorrow's run, not a surprise at a conference six months later.
Life sciences
The ClinicalTrials.gov Change Monitor is an API over the official ClinicalTrials.gov v2 registry (~600,000 studies) that returns only what changed since the last run: newly registered trials matching your filters, status flips with previous and new status, enrollment changes with the delta, and newly added trial sites with facility, location and principal-investigator name as published.
Capabilities
A study whose status flips out of your filter (Recruiting → Terminated) simply vanishes from a snapshot. This actor persists a fingerprint of every tracked study and re-checks tracked studies by NCT ID with no status filter — so the flip itself arrives as a record, with previous_status, new_status and why_stopped.
CT.gov's own email alerts tell you something changed and leave the clicking to you. Here every record states exactly what changed: the specific status transition, the enrollment delta, the named new sites.
sites_added records carry facility name, city, state, country, site status and PI name exactly as published — site-selection intelligence and KOL mapping straight from the registry.
Each schedule gets its own tracked universe via a stateKey — an oncology phase-3 watch, a single-sponsor watch (e.g. lead sponsor AstraZeneca), and a country-level watch can run side by side.
{
"change": "status_change",
"nct_id": "NCT03606967",
"brief_title": "Testing the Addition of an Individualized
Vaccine to Durvalumab and Tremelimumab...",
"lead_sponsor": "National Cancer Institute (NCI)",
"previous_status": "RECRUITING",
"new_status": "ACTIVE_NOT_RECRUITING",
"why_stopped": null,
"phases": ["PHASE2"],
"conditions": ["Metastatic Triple-Negative Breast Carcinoma"],
"enrollment_count": 86,
"num_sites": 30,
"url": "https://clinicaltrials.gov/study/NCT03606967",
"observed_at": "2026-08-06T22:34:59+00:00"
}{
"condition": "non-small cell lung cancer",
"sponsor": "AstraZeneca",
"phases": ["PHASE2", "PHASE3"],
"statuses": ["RECRUITING"],
"countries": ["United States", "Germany"],
"mode": "delta"
}Everything is optional — empty input runs a sensible oncology phase-2/3 delta watch. Snapshot mode works too, for one-off pulls.
Playbook
A competitor just registered a phase-2 in your indication — that's a new_trial record in tomorrow's run, not a surprise at a conference six months later.
Status flips are BD triggers: enrollment closing means rescue-study and next-phase conversations; a termination means white space. Field-level flips with why_stopped arrive as structured rows your CRM can route.
sites_added records show who is expanding where, with PI names as published — a live map of investigator activity in your therapeutic area.
Enrollment cuts signal trouble; raises signal confidence. enrollment_change records carry the exact delta, per study, per day.
Integration
Synchronous REST, official clients, schedules with webhooks — or expose it directly to an AI agent through the Apify MCP server. More patterns on the integrations page.
curl -X POST \
"https://api.apify.com/v2/acts/splendorous_astrolabe_xs9~clinicaltrials-change-monitor/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"condition": "non-small cell lung cancer",
"sponsor": "AstraZeneca",
"phases": ["PHASE2", "PHASE3"],
"statuses": ["RECRUITING"],
"countries": ["United States", "Germany"],
"mode": "delta"
}'from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("splendorous_astrolabe_xs9/clinicaltrials-change-monitor").call(
run_input={
"condition": "non-small cell lung cancer",
"sponsor": "AstraZeneca",
"phases": ["PHASE2", "PHASE3"],
"statuses": ["RECRUITING"],
"countries": ["United States", "Germany"],
"mode": "delta"
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item){
"mcpServers": {
"public-signal": {
"url": "https://mcp.apify.com/?actors=splendorous_astrolabe_xs9/clinicaltrials-change-monitor",
"headers": {
"Authorization": "Bearer <APIFY_TOKEN>"
}
}
}
}Pricing
Billed through your Apify account's usage credit. The free plan includes $5 of usage every month — no card needed to try it.
| Billable event | Price | Charged |
|---|---|---|
| Change record | $0.01 | per record: new_trial, status_change, enrollment_change, sites_added, baseline or snapshot row |
A single-sponsor daily watch usually costs under $0.10/day; a broad oncology phase-2/3 watch runs $0.30–$1.50/day after a one-time ~$4–5 baseline.
Questions
The free alerts say “this study was updated” in HTML email, one study per blob. This actor delivers field-level diffs as structured JSON — the exact status flip, the enrollment delta, the named new sites — schedulable, webhook-able, and usable by CRMs and AI agents.
Those platforms cost five figures a year and do far more. If what you need is reliable change detection on the public registry, a daily watch here costs pennies.
Five change types: new_trial (a study entered your funnel), status_change (with previous/new status and why_stopped), enrollment_change (with the delta), sites_added (with facility and PI detail), plus one-time baseline records that seed the tracked universe.
Yes — the sponsor filter matches the lead sponsor (e.g. "Merck Sharp & Dohme"), and a dedicated stateKey keeps that watchlist's tracked universe separate from your other schedules.
Related
SAM.gov opportunities, fresh awards, and the money mode: expiring federal contracts 6–12 months before the recompete RFP drops.
Fresh LLC and corporation registrations from official state portals, normalized and cleaned of formation-mill noise. Day-one B2B leads.
A single-sponsor daily watch usually costs under $0.10/day; a broad oncology phase-2/3 watch runs $0.30–$1.50/day after a one-time ~$4–5 baseline.