# ClinicalTrials.gov Feed: New Trials, Status Changes & Results (`moment-data/clinical-trials-new-studies-feed`) Actor

Daily feed of new clinical trials from the official ClinicalTrials.gov API (public domain), plus status changes (recruiting, completed, terminated, withdrawn) and newly posted results. Filter by condition, drug, sponsor, sponsor class, phase, country. No contact data.

- **URL**: https://apify.com/moment-data/clinical-trials-new-studies-feed.md
- **Developed by:** [Luke Miller](https://apify.com/moment-data) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 study records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## ClinicalTrials.gov Feed: New Trials, Status Changes & Results (official API, no key)

Get **every new clinical trial the day it is posted on ClinicalTrials.gov**, plus **status changes** (newly recruiting, completed, terminated, withdrawn, suspended) and **newly posted results**, from the **official ClinicalTrials.gov API v2** run by the U.S. National Library of Medicine (public domain). About **150-270 new studies are registered every weekday** worldwide. Filter by **condition, drug / intervention, sponsor name, sponsor class (industry, NIH, academic), phase, study type, site country and status**, and run it on a schedule to get only what is new since the last run.

### Who it's for

- **Pharma and biotech business development / licensing:** spot new Phase 1-3 programs from other sponsors in your therapeutic areas the day they are registered, and see which trials just completed or were terminated (with the sponsor's stated reason).
- **CROs, site networks, SMOs, central labs, eCOA / eClinical vendors and patient-recruitment firms:** new industry trials that are **not yet recruiting** are your sales pipeline. Filter `sponsorClasses: ["INDUSTRY"]`, `overallStatuses: ["NOT_YET_RECRUITING"]` and your countries.
- **Competitive intelligence and investors:** watch competitors (`sponsorNames`) and mechanisms (`interventions`) for new studies, terminations and results postings.
- **Medical affairs, market access, consultants and analysts:** a clean daily list of trial starts, completions and results by indication.
- **Data teams, CRMs and AI agents:** flat JSON with NCT ID, sponsor, collaborators, phase, status, conditions (plus MeSH terms), interventions, enrollment, dates, site facility / city / country and a link.

### Why this Actor

- **A change feed, not a search box.** Existing ClinicalTrials.gov scrapers return search results. This Actor returns **events**: `newStudies` (first posted), `statusChanges` and `resultsPosted`, with a stateless lookback window by default or **new since last run** for schedules (you only pay for events you have not received yet).
- **Status changes that mean something.** Hundreds of records are edited every day; most edits are routine. By default the feed keeps only updates whose status looks freshly changed (e.g. COMPLETED with an actual completion date in the last 180 days, RECRUITING with an actual start in the last 120 days, TERMINATED / WITHDRAWN / SUSPENDED with the stated reason). On scheduled `sinceLastRun` runs it also **confirms changes against the status it saw last time** and gives you `previousStatus`.
- **Filters done server-side** with ClinicalTrials.gov's own search (condition synonyms, intervention search, sponsor/collaborator search), so filtered runs are fast and cheap.
- **Friendly inputs:** phases as `2`, `Phase 3`, `1/2` or `III`; countries as ISO codes (`US`, `DE`, `KR`) or names; sponsor classes as `industry`, `NIH`, `university`.
- **Sponsor-level data only.** No investigator names, no contact names, emails or phone numbers. Individual (person) sponsors are shown as "Individual sponsor (name withheld)".
- **Official, public-domain source**, keyless, no proxies, no browser.

### Quick start

Run with the default input `{}`: you get the **30 newest studies first posted on ClinicalTrials.gov** (latest posting day, widened to earlier days when needed, e.g. on weekends) in a few seconds.

Example inputs:

```json
{ "sponsorClasses": ["INDUSTRY"], "phases": ["2", "3"], "conditions": ["obesity", "type 2 diabetes"], "daysBack": 7, "maxItems": 200 }
```

```json
{ "eventTypes": ["statusChanges"], "overallStatuses": ["TERMINATED", "WITHDRAWN", "SUSPENDED"], "sponsorClasses": ["INDUSTRY"], "daysBack": 7, "maxItems": 200 }
```

```json
{ "eventTypes": ["newStudies", "statusChanges", "resultsPosted"], "sponsorNames": ["Pfizer", "Novartis", "AstraZeneca"], "daysBack": 30, "maxItems": 300 }
```

```json
{ "interventions": ["CAR-T", "cell therapy"], "countries": ["US", "CN"], "overallStatuses": ["NOT_YET_RECRUITING", "RECRUITING"], "daysBack": 14 }
```

#### Schedule tip (daily feed)

Create a schedule (e.g. every weekday at 08:00 ET, after the daily ClinicalTrials.gov refresh) with `"mode": "sinceLastRun"`, your filters, a large `maxItems` (e.g. 1000) and one `stateKey` per schedule. Each run delivers only events not delivered before; the first run covers `daysBack` days. Connect the dataset to Slack, email, Google Sheets, HubSpot or a webhook with Apify integrations.

### Input

| Field | What it does |
|---|---|
| `eventTypes` | `newStudies` (default), `statusChanges`, `resultsPosted`. `maxItems` is split evenly across them. |
| `mode` | `window` (default, stateless) or `sinceLastRun` (only events not delivered before for this `stateKey`). |
| `daysBack` | Posting days to cover, ending today (default 2). Window mode widens up to 7 extra days when short (`autoExtend`). |
| `conditions` | Disease / condition terms (ClinicalTrials.gov condition search incl. synonyms). Any of them. |
| `interventions` | Drug, biologic, device or procedure terms. Any of them. |
| `keywords` | Free text anywhere in the record. Any of them. |
| `sponsorNames` | Lead sponsor or collaborator names. Any of them. |
| `sponsorClasses` | Lead sponsor class: `INDUSTRY`, `NIH`, `FED`, `OTHER_GOV`, `NETWORK`, `OTHER` (academic, hospitals, nonprofits). |
| `phases` | `EARLY_PHASE1`, `PHASE1` ... `PHASE4`, `NA` (shortcuts `1`, `2`, `1/2`, `III`). |
| `studyTypes` | `INTERVENTIONAL`, `OBSERVATIONAL`, `EXPANDED_ACCESS`. |
| `countries` | Site countries as ISO codes or names. Many brand-new studies list no sites yet, so this filter drops them. |
| `overallStatuses` | Current status filter for all event types. For `statusChanges`, empty = watch RECRUITING, ACTIVE_NOT_RECRUITING, COMPLETED, TERMINATED, WITHDRAWN, SUSPENDED. |
| `onlyLikelyStatusChanges` | Default `true`: drop routine edits (see "How status changes work"). |
| `maxItems` | Hard cap on delivered records and spend (default 30). |
| `autoExtend` | Window mode: widen the window when it holds fewer than `maxItems` (default `true`). |
| `stateKey` | Saved-history name for `sinceLastRun`. |

### Output

One dataset item per event. Example (`newStudies`; see `sample-output.json` for a status change and a results posting; locations are trimmed to 3 there, the Actor returns up to 50 per study plus `locationCount`):

```json
{
  "eventType": "newStudies",
  "eventDate": "2026-10-30",
  "nctId": "NCT07906717",
  "title": "A Study of JNJ-101556143 With Best Supportive Care in Participants With Metastatic Prostate Cancer",
  "officialTitle": "A Phase 3 Randomized, Double-blind, Placebo-controlled Study of JNJ-101556143, a Regulated Induced Proximity Targeting Chimera (RIPTAC™) Therapeutic Plus Best Supportive Care Versus Best Supportive Care in Participants With Metastatic Androgen Pathway Modulation-Resistant Prostate Cancer",
  "acronym": null,
  "overallStatus": "NOT_YET_RECRUITING",
  "lastKnownStatus": null,
  "whyStopped": null,
  "studyType": "INTERVENTIONAL",
  "phases": [
    "PHASE3"
  ],
  "phase": "PHASE3",
  "leadSponsor": "Janssen Research & Development, LLC",
  "leadSponsorClass": "INDUSTRY",
  "collaborators": [],
  "collaboratorNames": null,
  "conditions": [
    "Prostatic Neoplasms"
  ],
  "conditionMeshTerms": [
    "Prostatic Neoplasms"
  ],
  "keywords": [],
  "interventions": [
    {
      "type": "DRUG",
      "name": "JNJ-101556143"
    },
    {
      "type": "DRUG",
      "name": "Placebo"
    },
    {
      "type": "DRUG",
      "name": "Best Supportive Care"
    }
  ],
  "interventionNames": "DRUG: JNJ-101556143; DRUG: Placebo; DRUG: Best Supportive Care",
  "interventionMeshTerms": [],
  "enrollment": 400,
  "enrollmentType": "ESTIMATED",
  "allocation": "RANDOMIZED",
  "primaryPurpose": "TREATMENT",
  "fdaRegulatedDrug": true,
  "fdaRegulatedDevice": false,
  "startDate": "2026-11-06",
  "startDateType": "ESTIMATED",
  "primaryCompletionDate": "2028-02-14",
  "primaryCompletionDateType": "ESTIMATED",
  "completionDate": "2028-08-18",
  "completionDateType": "ESTIMATED",
  "firstPostedDate": "2026-10-30",
  "lastUpdatePostedDate": "2026-10-30",
  "resultsFirstPostedDate": null,
  "hasResults": false,
  "statusVerifiedDate": "2026-10",
  "locationCount": 0,
  "countries": [],
  "locations": [],
  "briefSummary": "The purpose of this study is to evaluate how well JNJ-101556143 plus Best Supportive Care (BSC) improves overall survival (the length of time a participant remains alive) compared with placebo plus BSC in participants with metastatic androgen pathway modulation-resistant prostate cancer (mAPMR). mAPMR is an advanced form of prostate cancer that has spread to other parts of the body and no longer responds to hormone treatments designed to block male hormones (androgens).",
  "url": "https://clinicaltrials.gov/study/NCT07906717",
  "firstSeenAt": "2026-10-31T07:08:34.907Z"
}
```

Main fields: `eventType`, `eventDate` (first posted / last update posted / results first posted, depending on event), `nctId`, `title`, `officialTitle`, `acronym`, `overallStatus`, `whyStopped`, `studyType`, `phase` / `phases`, `leadSponsor`, `leadSponsorClass`, `collaborators` / `collaboratorNames`, `conditions`, `conditionMeshTerms`, `keywords`, `interventions` / `interventionNames`, `interventionMeshTerms`, `enrollment` (+ type), `allocation`, `primaryPurpose`, `fdaRegulatedDrug` / `fdaRegulatedDevice`, `startDate`, `primaryCompletionDate`, `completionDate` (+ ACTUAL / ESTIMATED types), `firstPostedDate`, `lastUpdatePostedDate`, `resultsFirstPostedDate`, `hasResults`, `countries`, `locationCount`, `locations` (facility, city, state, country, site recruitment status), `briefSummary` (first 600 characters), `url`, `firstSeenAt`. Status-change items add `statusSignal` (`likely-new`, `confirmed-change`, or `routine-update` when the filter is off), `statusSignalReason` and `previousStatus` (on confirmed changes).

A run summary (windows, resolved filters, counts, skipped routine updates, why the run stopped) is saved as the `OUTPUT` record in the default key-value store.

### How status changes work

The public API returns each study's **current** status; record history is not available through it. So `statusChanges` looks at studies whose record was updated (`LastUpdatePostDate`) in the window and have a watched status, and by default keeps only the ones whose status looks freshly changed:

- **TERMINATED / WITHDRAWN / SUSPENDED** unless the study stopped long ago (actual completion more than 180 days earlier, or results already posted before the window). The sponsor's `whyStopped` reason is included.
- **COMPLETED** with an ACTUAL completion date in the last 180 days.
- **RECRUITING / ENROLLING_BY_INVITATION** with an ACTUAL start date in the last 120 days.
- **ACTIVE_NOT_RECRUITING** with an ACTUAL primary completion date in the last 120 days (enrollment closed).
  In `sinceLastRun` mode the Actor also remembers the status of every study it delivered, so a later run reports a real change with `previousStatus` (`statusSignal: "confirmed-change"`) and skips studies whose status did not change. Set `onlyLikelyStatusChanges: false` to receive every updated record with a watched status.

### Pricing

Pay per event: a small fee per run start plus a fee per delivered study record. `maxItems` and your run's maximum charge cap the spend; the Actor never delivers records your limit cannot cover. See the Pricing tab for current prices.

### Data source and notes

- Source: [ClinicalTrials.gov API v2](https://clinicaltrials.gov/data-api/api), U.S. National Library of Medicine. ClinicalTrials.gov data is in the public domain (see its Terms and Conditions); please credit ClinicalTrials.gov as the source.
- The database is refreshed once a day (Monday to Friday postings). Dates are ClinicalTrials.gov's posting dates (US Eastern calendar days).
- Requests are paced to stay well under ClinicalTrials.gov's rate limits (about 50 requests per minute per IP). A default run makes 1 request.
- Sponsor-level data only. The Actor never requests central contacts, overall officials or site contacts, drops the organization's internal study ID and the responsible investigator, and withholds sponsor, collaborator or facility names that are individuals.
- This Actor is not affiliated with or endorsed by the NLM, NIH or ClinicalTrials.gov.

### FAQ

**Why did a weekend run return Friday's studies?** Nothing is posted on weekends, so window mode widens to the latest posting days (up to 7 extra days). Set `autoExtend: false` to get exactly `daysBack`.

**Why does a country filter return fewer new studies?** Many studies are registered before sites are listed. Leave `countries` empty for complete coverage, or combine with `sponsorNames`.

**Can I get investigator or site contact details?** No. This feed is sponsor-level by design. Use the `url` to view the public record on ClinicalTrials.gov.

**How do I get a full historical extract?** Set `daysBack` up to 365 and a large `maxItems`. For daily monitoring use `sinceLastRun` on a schedule.

# Actor input Schema

## `eventTypes` (type: `array`):

newStudies = studies first posted in the window (default). statusChanges = studies whose record was updated in the window and whose current status is a watched status (see Overall status), e.g. newly RECRUITING, COMPLETED, TERMINATED, WITHDRAWN. resultsPosted = studies whose results were first posted in the window. Empty = newStudies only.

## `mode` (type: `string`):

window (default): studies in the last N days, no saved state. sinceLastRun: only events not delivered before for this State key (and, for statusChanges, confirmed against the status saved last time). Use sinceLastRun for daily schedules.

## `daysBack` (type: `integer`):

Window of posting days ending today. ClinicalTrials.gov posts new records once a day, Monday to Friday (about 150-270 new studies per weekday). In window mode the window is widened (up to 7 extra days) when it holds fewer than Max records, so weekend runs still return the latest postings. Also the first-run window in sinceLastRun mode.

## `conditions` (type: `array`):

Disease or condition terms, matched by ClinicalTrials.gov's condition search (synonyms included), e.g. obesity, non-small cell lung cancer, Alzheimer. Several terms = any of them. Empty = all.

## `interventions` (type: `array`):

Intervention / treatment terms, e.g. semaglutide, CAR-T, monoclonal antibody, pembrolizumab, gene therapy, device. Several terms = any of them.

## `keywords` (type: `array`):

Free-text terms searched across the whole record (titles, summary, keywords, outcomes). Several terms = any of them.

## `sponsorNames` (type: `array`):

Lead sponsor or collaborator names, e.g. Pfizer, Novartis, Mayo Clinic, National Cancer Institute. Several names = any of them.

## `sponsorClasses` (type: `array`):

INDUSTRY (pharma, biotech, medtech), NIH, FED (other US federal), OTHER_GOV (non-US government), NETWORK, OTHER (universities, hospitals, nonprofits). Empty = all.

## `phases` (type: `array`):

EARLY_PHASE1, PHASE1, PHASE2, PHASE3, PHASE4, NA (not applicable, e.g. device or behavioral studies). Shortcuts: 1, 2, 3, 4, 1/2, II. Empty = all.

## `studyTypes` (type: `array`):

INTERVENTIONAL, OBSERVATIONAL, EXPANDED_ACCESS. Empty = all.

## `countries` (type: `array`):

Countries with at least one study site: ISO codes (US, GB, DE, CN, JP) or names (United States, Germany). Note: many new studies list no sites yet, so a country filter drops them. Empty = worldwide.

## `overallStatuses` (type: `array`):

Current overall status: NOT_YET_RECRUITING, RECRUITING, ENROLLING_BY_INVITATION, ACTIVE_NOT_RECRUITING, SUSPENDED, TERMINATED, COMPLETED, WITHDRAWN, UNKNOWN. Applies to all event types. For statusChanges, empty = watch RECRUITING, ACTIVE_NOT_RECRUITING, COMPLETED, TERMINATED, WITHDRAWN, SUSPENDED.

## `onlyLikelyStatusChanges` (type: `boolean`):

Most daily record updates are routine edits. When on, a study seen for the first time is delivered only if its status looks freshly changed: TERMINATED / WITHDRAWN / SUSPENDED not stopped long ago, COMPLETED with an actual completion date in the last 180 days, RECRUITING with an actual start in the last 120 days, ACTIVE_NOT_RECRUITING with an actual primary completion in the last 120 days. In sinceLastRun mode, studies already seen are delivered only when their status differs from the saved one (statusSignal = confirmed-change). Turn off to get every updated record with a watched status.

## `maxItems` (type: `integer`):

Hard cap on delivered records (also caps your spend), split evenly across event types. Default is small so a first run is quick and cheap; raise it for production.

## `autoExtend` (type: `boolean`):

In window mode, look up to 7 extra days back when the window holds fewer than Max records (newest first). Turn off to get exactly the Days back window.

## `stateKey` (type: `string`):

Name of the saved search for sinceLastRun mode. Each key keeps its own history, so use one key per schedule / filter set.

## Actor input object example

```json
{
  "eventTypes": [
    "newStudies"
  ],
  "mode": "window",
  "daysBack": 2,
  "onlyLikelyStatusChanges": true,
  "maxItems": 30,
  "autoExtend": true,
  "stateKey": "default"
}
```

# Actor output Schema

## `studies` (type: `string`):

One record per study event (new study, status change or results posted).

## `summary` (type: `string`):

Windows covered, resolved filters, counts, why the run stopped.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "eventTypes": [
        "newStudies"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("moment-data/clinical-trials-new-studies-feed").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "eventTypes": ["newStudies"] }

# Run the Actor and wait for it to finish
run = client.actor("moment-data/clinical-trials-new-studies-feed").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "eventTypes": [
    "newStudies"
  ]
}' |
apify call moment-data/clinical-trials-new-studies-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,moment-data/clinical-trials-new-studies-feed"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Phiaob4njWLcK2WMX/builds/6JqEFWg10Xfddmemg/openapi.json
