# ClinicalTrials.gov Watch — New Trials by Condition & Sponsor (`oneshotventure/trials-watch`) Actor

Scheduled change feed of newly posted ClinicalTrials.gov studies.

- **URL**: https://apify.com/oneshotventure/trials-watch.md
- **Developed by:** [Nick](https://apify.com/oneshotventure) (community)
- **Categories:** Developer tools, Agents, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.50 / 1,000 results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## ClinicalTrials.gov Monitor — New Trials by Condition & Sponsor

Track **newly posted ClinicalTrials.gov studies** by condition, keyword, sponsor and recruitment
status. NCT ID, titles, phase, status, sponsor and dates as clean JSON from the official
ClinicalTrials.gov API — with NCT-ID memory so a scheduled run flags exactly what is new.

### What does this Actor do?

You give it conditions, keywords, a sponsor and a set of recruitment statuses. It queries the official
ClinicalTrials.gov API once per condition and once per keyword, merges the results by NCT ID, keeps
only studies whose **first-posted date** falls in the window, sorts them newest-first, and emits them.

Two details make it a monitor rather than a search. First, the window is anchored on
`studyFirstPostDateStruct` — the date the study first appeared on the registry — not on the study's
start date or last-update date, which is what you actually want when the question is "what is new?".
Second, it keeps a **list of NCT IDs it has already seen** across runs, so `newSinceLastRun` tells
you truthfully whether a study is genuinely new to you or was in a previous run's window.

### Who is it for?

- **Competitive intelligence teams at pharma and biotech** watching what rivals put into the clinic.
- **CRO business development** looking for newly posted studies that need sites or services.
- **Patient-recruitment agencies** tracking recruiting studies by condition and geography.
- **Biotech investors and analysts** monitoring a sponsor's pipeline as it becomes public.
- **Medical journalists and researchers** following trial activity in a therapeutic area.
- **AI agent builders** who want a clinical-trials tool with a stable output schema.

### Use cases

- Watch one condition — `melanoma`, `ALS`, `type 2 diabetes` — for every newly posted study.
- Monitor a named sponsor's registrations as an early read on their pipeline.
- Track only `RECRUITING` studies in your therapeutic area for site-selection outreach.
- Feed new Phase 3 registrations into a competitive-intelligence digest.
- Give an agent a tool that answers "what trials were just posted for this condition?"

### What you get

One row per study. Any value the source does not publish is `null` — the field is always present, and
the untouched protocol section stays in `raw`.

| Field | Type | Description |
|---|---|---|
| `nctId` | string | ClinicalTrials.gov identifier, e.g. `NCT06712345` — the unique key the seen-list tracks |
| `briefTitle` | string | Short study title |
| `officialTitle` | string | Full official study title |
| `overallStatus` | string | Recruitment status, e.g. `RECRUITING`, `NOT_YET_RECRUITING`, `COMPLETED` |
| `conditions` | array | Conditions the study addresses |
| `phases` | array | Trial phases, e.g. `["PHASE2", "PHASE3"]` |
| `locations` | array | Up to 25 convenient location extracts (`facility`, `city`, `state`, `country`, `status`); complete source locations remain in `raw` |
| `centralContacts` | array | Up to 5 central-contact extracts, with published `name`, `role`, `phone` and `email` fields |
| `leadSponsor` | string | Lead sponsor name |
| `organization` | string | Sponsoring organization's full name |
| `firstPostedDate` | string | Date the study first appeared on ClinicalTrials.gov |
| `startDate` | string | Study start date, where published |
| `briefSummary` | string | Study summary, truncated to 500 characters |
| `url` | string | Direct link to the study on clinicaltrials.gov |
| `raw` | object | The complete original protocol section, unmodified |
| `newSinceLastRun` | boolean | `true` if this NCT ID had not been seen on an earlier successful run |
| `retrievedAt` | string | ISO 8601 timestamp of when this row was fetched |

#### Sample output record

```json
{
  "nctId": "NCT06712345",
  "briefTitle": "Study of Compound X in Advanced Melanoma",
  "officialTitle": "A Phase 2, Open-Label Study of Compound X in Participants With Unresectable or Metastatic Melanoma",
  "overallStatus": "RECRUITING",
  "conditions": ["Melanoma", "Skin Neoplasms"],
  "phases": ["PHASE2"],
  "leadSponsor": "Example Therapeutics, Inc.",
  "organization": "Example Therapeutics, Inc.",
  "firstPostedDate": "2026-08-19",
  "startDate": "2026-09-01",
  "briefSummary": "This study evaluates the safety and efficacy of Compound X in participants with…",
  "url": "https://clinicaltrials.gov/study/NCT06712345",
  "raw": { "identificationModule": { "…": "…" } },
  "newSinceLastRun": true,
  "retrievedAt": "2026-08-23T09:52:18.663Z"
}
```

### How to use it

#### Watch a condition for recruiting studies

```json
{
  "conditions": ["melanoma"],
  "statuses": ["RECRUITING"],
  "maxResults": 25
}
```

#### Follow a sponsor's pipeline

`sponsor` is applied to every query rather than being a query of its own.

```json
{
  "conditions": ["oncology"],
  "sponsor": "Example Therapeutics",
  "maxResults": 100
}
```

#### Everything newly posted

Leave `conditions` and `keywords` empty to track all newly posted studies.

```json
{
  "postedSince": "2026-08-01",
  "maxResults": 500
}
```

### Input parameters

| Input | Type | Description |
|---|---|---|
| `conditions` | array | Conditions, each queried separately. Empty with no keywords searches all newly posted studies |
| `keywords` | array | Full-text terms, each queried separately |
| `sponsor` | string | Optional sponsor name, applied to every query |
| `locationCountry` | string | Optional exact country filter; any one study location must match it together with any supplied state filter |
| `locationState` | string | Optional exact state filter; any one study location must match it together with any supplied country filter |
| `statuses` | array | ClinicalTrials.gov overall-status values such as `RECRUITING` or `COMPLETED`. Validated by the Actor |
| `postedSince` | string | `YYYY-MM-DD` start date. Overrides the previous successful run's watermark |
| `maxResults` | integer | Maximum records per run (1–1000). Default: `100` |

An unsupported status value fails the run with a clear error rather than silently returning nothing.

### How monitoring works (first run and scheduling)

The first run searches the **last 14 days** by first-posted date unless `postedSince` is supplied. To
keep the watermark and the seen-NCT-ID list across runs, **schedule this Actor as a saved Task** so
runs share the same storage — both live in the task's key-value store. A fresh unsaved run starts a
fresh baseline.

**The dataset contains the window, not a strict delta.** Studies first posted on the boundary date can
appear in two consecutive runs; `newSinceLastRun` is `false` on the second. Filter on that flag
downstream if you only want to alert on studies you have never seen.

### Honest limitations

- **Each run emits the window, not a strict delta**, as above — use `newSinceLastRun` to separate
  genuinely new studies from repeats.
- **Conditions and keywords are queried separately, then merged.** Two conditions means two queries
  and a union, not an AND across both.
- **The window keys on first-posted date.** A study registered years ago that was updated yesterday is
  not "new" by this definition and will not appear.
- **`briefSummary` is truncated to 500 characters.** The full text is available on
  ClinicalTrials.gov via `url`, and the untruncated protocol section is in `raw`.
- **Locations and central contacts are capped at 25 and 5 respectively.** The complete source modules,
  including site contacts and any further locations, remain inside `raw`.
- **Registry data is sponsor-submitted.** Accuracy, completeness and timeliness are the sponsor's,
  not this Actor's.

### Reliability

Diagnostics are written to the `RUN_SUMMARY` key-value record — never into the dataset. A failed
upstream request leaves the watermark and the seen-ID list unchanged, so a transient outage cannot
silently skip a window.

Every record carries `retrievedAt` and a `url` back to the official registry entry, so you can check
any row against the source yourself.

Maintained against the upstream API. If ClinicalTrials.gov changes its schema or an endpoint moves,
report it through the Issues tab and it gets fixed.

### Integrations

Connect this Actor to Make, Zapier, n8n, Slack, Google Sheets, Airtable or any HTTP endpoint through
Apify integrations. A daily Task can post newly registered trials into a research channel, or fire a
webhook so a competitive-intelligence digest is assembled the moment a study posts. Datasets export as
JSON, CSV, Excel, XML, RSS or HTML.

### API usage

```bash
curl -X POST "https://api.apify.com/v2/acts/oneshotventure~trials-watch/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"conditions": ["melanoma"], "statuses": ["RECRUITING"], "maxResults": 25}'
```

Python, JavaScript, PHP and CLI clients are documented under
[Apify API clients](https://docs.apify.com/api/client).

### Use with AI agents (MCP)

This Actor is callable from any MCP-compatible client — Claude, Cursor, VS Code or your own agent —
through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). The input schema is
fully described and every record uses one stable, flat JSON shape, so an agent can call it and read
the result without a parsing step. Because it reads the official ClinicalTrials.gov API rather than a
rendered page, the answer an agent gets is the same one the source publishes.

*Factual registry data. Not medical advice, and not a substitute for reading the study record.*

### Frequently asked questions

#### Is there a free ClinicalTrials.gov API?

Yes — the National Library of Medicine publishes an open API for the registry, with no key required.
This Actor is the scheduling, multi-query and change-feed layer over it.

#### How do I track new clinical trials for a condition?

Put the condition in `conditions`, save the Actor as a Task, and schedule it. Each run returns studies
first posted in the new window, with `newSinceLastRun` marking the ones you have not seen.

#### How do I monitor a competitor's trial pipeline?

Set `sponsor` to their name. It is applied to every query, so you can combine it with conditions or
keywords to narrow to a therapeutic area.

#### Can I filter by trial phase or recruitment status?

Recruitment status yes, via `statuses`. Phase is returned on every record in the `phases` array but is
not an input filter — filter on it downstream.

#### How often is ClinicalTrials.gov updated?

Continuously, as sponsors submit and update records. This Actor reads the API live at run time, so
results are as current as the registry itself.

#### Does it return site locations or eligibility criteria?

It returns up to 25 normalized site locations and up to 5 central contacts. Eligibility criteria remain
inside `raw`, and the full record is always one click away via `url`.

#### Why did a study appear in two runs?

Because the window is inclusive of its start date. The second appearance carries
`newSinceLastRun: false` — filter on that flag to alert only once.

### Related actors

- [US Product Recalls Monitor](https://apify.com/oneshotventure/recalls-monitor) — CPSC and FDA food,
  drug and device enforcement actions.
- [NPI Registry Lookup](https://apify.com/oneshotventure/npi-lookup) — US healthcare provider search
  and verification.
- [Grants.gov Monitor](https://apify.com/oneshotventure/grants-feed) — new federal research funding
  opportunities.
- [Federal Register Monitor](https://apify.com/oneshotventure/fedreg-watch) — new FDA and HHS rules
  and notices.

### Disclaimer

This independent tool uses public ClinicalTrials.gov data and is not affiliated with NIH or NLM.

# Actor input Schema

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

Conditions to search separately. Empty with no keywords searches all newly posted studies.

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

Full-text terms to search separately.

## `sponsor` (type: `string`):

Optional sponsor name applied to every query.

## `locationCountry` (type: `string`):

Optional exact country filter. A study matches when any location matches all provided geographic filters.

## `locationState` (type: `string`):

Optional exact state filter. A study matches when any location matches all provided geographic filters.

## `statuses` (type: `array`):

ClinicalTrials.gov overall-status values, such as RECRUITING or COMPLETED. Values are validated by the actor.

## `postedSince` (type: `string`):

YYYY-MM-DD start date. Overrides the previous successful-run watermark.

## `maxResults` (type: `integer`):

Maximum records per run (1-1000).

## Actor input object example

```json
{
  "conditions": [
    "melanoma"
  ],
  "keywords": [],
  "statuses": [],
  "maxResults": 25
}
```

# Actor output Schema

## `records` (type: `string`):

New clinical trial records in the default dataset.

## `runSummary` (type: `string`):

Run diagnostics stored as RUN\_SUMMARY in the key-value store.

# 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 = {
    "conditions": [
        "melanoma"
    ],
    "maxResults": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("oneshotventure/trials-watch").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 = {
    "conditions": ["melanoma"],
    "maxResults": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("oneshotventure/trials-watch").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 '{
  "conditions": [
    "melanoma"
  ],
  "maxResults": 25
}' |
apify call oneshotventure/trials-watch --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,oneshotventure/trials-watch"
        }
    }
}

```

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/qBmxutTglQExvAZOA/builds/Aygf8s7I9voHx9utc/openapi.json
