# Longevity Trial Readouts (ClinicalTrials.gov) → Stock Tickers (`northlab/bio-finance-trial-monitor`) Actor

Clinical trial catalyst calendar for longevity biotech: which ClinicalTrials.gov studies read out, and when. 9 topics with sponsor type, stock ticker and primary completion date. Structured JSON + HTML viewer, callable as an MCP tool by AI agents.

- **URL**: https://apify.com/northlab/bio-finance-trial-monitor.md
- **Developed by:** [Carlos Schwiening](https://apify.com/northlab) (community)
- **Categories:** AI, MCP servers, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 trial 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/platform/actors/running/actors-in-store#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

## Longevity Clinical Trial Monitor (Catalyst Calendar)

**A catalyst calendar for longevity biotech: which trials produce data, and
when.** 638 trials across 9 longevity topics · 108 industry-sponsored · 29
sponsored by a listed company you can trade · 65 with a primary completion
date in the next 180 days, 33 within 90 days.

The core question this answers: **which longevity studies read out in the next
90 days — and who owns the upside?** Every trial carries its
`primaryCompletionDate` (the date the primary endpoint is measured, i.e. when
data exists), its sponsor type (industry / academic / government), and — where
the sponsor is a listed company — its stock ticker.

Built on the official [ClinicalTrials.gov API v2](https://clinicaltrials.gov/data-api/api)
— no scraping, no AI-generated summaries, no scoring or "hype vs. real
science" judgment calls. Every field comes straight from the registered trial
record; what this Actor adds is structure: sponsor-name normalization (so
"Acme Inc.", "Acme, Inc" and "ACME" roll up as one company), sponsor
classification, ticker mapping, and change detection across runs.

Works as a **tool for AI agents** as well as for humans: the Actor is exposed
over Apify's MCP server, so an agent can call it with structured filters and
get typed JSON back. See [Use as an MCP tool](#use-as-an-mcp-tool).

### Live demo

**[Open the viewer →](https://api.apify.com/v2/key-value-stores/ckCy0XGyUXmFLd3Aw/records/viewer?signature=1HCbnrprmY0ELhS8JW5kG)**

This viewer is the free preview of the full unfiltered feed. Paying runs go
further — see [Query filters](#query-filters-actor-input) below for the
topic/status/phase/sponsor/change filters available on every run.

![Viewer overview](https://api.apify.com/v2/key-value-stores/ckCy0XGyUXmFLd3Aw/records/overview_v1?signature=IIwC8Llm9nqjzzQWyxkT)

Prefer raw data over a UI? These two URLs always point at the latest run's
full, unfiltered output — no need to look up a run ID:

- **[Full feed (JSON)](https://api.apify.com/v2/key-value-stores/ckCy0XGyUXmFLd3Aw/records/raw_feed?signature=1KHlUpw37TCXor7tmy8mj)** — every trial in the dataset, incl. its full change history
- **[Digest (JSON)](https://api.apify.com/v2/key-value-stores/ckCy0XGyUXmFLd3Aw/records/weekly_digest?signature=1mmZXprFx44A838I1fxbf)** — per-topic stats + trials that changed in the last 30 days

### What you get

Each dataset item is one clinical trial matching one of the tracked
longevity topics:

| Field | Description |
|---|---|
| `nctId`, `nctUrl` | Trial identity + link to the source record on ClinicalTrials.gov |
| `title`, `conditions` | What the trial is studying and which conditions it targets |
| `sponsor`, `sponsorKey` | Normalized sponsor/company name (legal-suffix and casing variants collapsed into one group) |
| `sponsorType`, `sponsorClass` | `industry` / `academic` / `government` / `other`, plus ClinicalTrials.gov's own raw class it was derived from |
| `ticker`, `tickerCompany`, `listingStatus` | Stock ticker if the sponsor is publicly listed (`ticker`), or why not (`privat`, `non-commercial`, `unmapped`) |
| `status`, `phases` | Current recruitment status and trial phase(s) |
| `topics`, `topicKeys` | Which tracked longevity topic(s) this trial matches |
| `startDate`, **`primaryCompletionDate`**, `lastUpdateDate` | Trial timeline as registered. `primaryCompletionDate` is the catalyst date — when the primary endpoint is measured |
| `firstSeenAt` | When this Actor first recorded the trial |
| `changes` | Detected status/phase/date changes since first seen — each entry has `field`, `fromValue`, `toValue`, `detectedAt`. This accumulates the longer the Actor runs; it is a bonus, not the headline |

### Tracked topics

Nine longevity themes, each a curated ClinicalTrials.gov query. Anything whose
bare term is also a mainstream indication (metformin → diabetes, GLP-1 →
obesity, plasma exchange → neurology) carries an explicit aging qualifier, so
the feed stays a longevity feed rather than a general-medicine dump.

| Topic key | Covers | Trials |
|---|---|---:|
| `nad_nmn` | NMN, nicotinamide mononucleotide/riboside | 166 |
| `klotho` | Klotho | 127 |
| `glp1_aging` | Semaglutide/tirzepatide/GLP-1 × aging, frailty, sarcopenia | 93 |
| `metformin` | Metformin × aging/longevity/frailty (incl. TAME) | 73 |
| `senolytics` | Senolytics, senescent cells | 68 |
| `gene_therapy` | Gene therapy × aging, klotho, follistatin | 58 |
| `rapamycin` | Rapamycin/sirolimus × aging, longevity, frailty | 56 |
| `plasma_exchange` | Plasmapheresis / therapeutic plasma exchange × aging | 14 |
| `reprogramming` | Partial/cellular reprogramming, Yamanaka factors, OSKM | 9 |

### Sponsor coverage

| | Trials |
|---|---:|
| **Industry-sponsored** | **108** |
| — mapped to a stock ticker (`ticker`) | 29 |
| — confirmed privately held (`privat`) | 50 |
| — not yet researched (`unmapped`) | 29 |
| Academic — university, hospital, individual investigator | 494 |
| Government — NIH, federal, other government agency | 34 |
| Other | 2 |

Tickers currently mapped: `ABBV`, `ADVM`, `FDMT`, `RGNX`, `OXB.L`, `CDXC`,
`JNJ`, `PFE`, `NVS`, `SNY`, `NESN.SW`, `4536.T`.

The mapping is deliberately narrow — only sponsors that actually appear in
this feed, each verified against a primary source. A `listingStatus` of
`unmapped` means "a company we haven't researched yet", not "no ticker
exists"; `privat` means we checked and there is no tradeable security.

### Query filters (Actor input)

The dataset is filterable per run — you don't have to take the full feed.
Every field below shows up as a real form in the Apify Console (Actor → Input
tab) when you configure a run:

- **`completionWithinDays`** — **the catalyst calendar.** Only trials whose
  primary completion date falls between today and N days from now. Prefilled
  with `180`; set it to `90` for the near-term readout list, or clear it for
  everything
- **`topics`** — restrict to one or more of the nine topic keys above
- **`sponsorTypes`** — `industry`, `academic`, `government`, `other`
- **`listingStatus`** — `ticker`, `privat`, `non-commercial`, `unmapped`
- **`tickerSymbols`** — restrict to specific listed sponsors, e.g. `ABBV`, `OXB.L`
- **`status`** — restrict to specific trial statuses, e.g. `RECRUITING`, `COMPLETED`, `TERMINATED` (ClinicalTrials.gov's own vocabulary)
- **`phases`** — restrict to specific trial phases, e.g. `PHASE1`, `PHASE2`, `PHASE3`
- **`dateFrom` / `dateTo`** — restrict to a trial start-date range
- **`sponsorKeyword`** — substring match on the sponsor/company name
- **`conditionKeyword`** — substring match on the trial's listed medical conditions
- **`keyword`** — substring match on title + conditions
- **`onlyWithChanges`** — only return trials with at least one recorded change since first seen
- **`changesWithinDays`** — only return trials with a change detected within the last N days — the fastest way to see "what moved recently" across all tracked trials

Leave any filter empty/unset to not restrict on it.

### What it costs

$0.003 per trial returned, plus a $0.01 Actor start. Measured on actual runs:

| Run | Trials | Cost |
|---|---:|---:|
| Prefilled input (primary completion within 180 days) | 65 | **$0.24** |
| Readouts in the next 90 days | 33 | **$0.14** |
| Full feed, no filters | 638 | **$1.95** |

### Why not just query ClinicalTrials.gov yourself?

The API is free and public. What sits between it and this dataset:

1. **Curated longevity queries.** A bare `metformin` search returns thousands
   of diabetes trials; a bare `gene therapy` search returns oncology. The nine
   topic queries above are tuned so the feed stays a longevity feed — that
   tuning is the product, and it's maintained here.
2. **Sponsor identity.** ClinicalTrials.gov gives you a free-text sponsor
   string. It does not roll up spelling variants, does not reliably tell you
   whether a sponsor is a company or a hospital (its `OTHER` class lumps both
   together), and never gives you a stock ticker. All three are added here.
3. **A catalyst date you can filter on.** `primaryCompletionDate` is
   registered as `YYYY-MM` or `YYYY-MM-DD` depending on the trial, which makes
   naive date filtering silently drop rows. `completionWithinDays` handles
   both shapes.

### Use as an MCP tool

Callable from any MCP client (Claude, Cursor, an agent framework) via Apify's
MCP server:

```json
{
  "mcpServers": {
    "apify": {
      "command": "npx",
      "args": ["-y", "@apify/actors-mcp-server", "--actors", "northlab/bio-finance-trial-monitor"],
      "env": { "APIFY_TOKEN": "<your token>" }
    }
  }
}
```

The input schema is the tool signature. *"Which listed companies have
longevity trials reading out this quarter?"* becomes one call with
`completionWithinDays: 90`, `listingStatus: ["ticker"]`.

### Who this is for

Longevity/biotech investors, analysts and researchers who want to know what
data is coming and from whom — without manually re-checking
ClinicalTrials.gov. And AI agents doing that job on their behalf.

### Data source & update frequency

[ClinicalTrials.gov](https://clinicaltrials.gov/), the official U.S.
National Library of Medicine registry of clinical trials worldwide — freely
accessible, no scraping involved. The Actor runs on a schedule and
accumulates trial history over time; a change is only recorded once this
Actor has observed a trial at least twice, so change data becomes richer the
longer the Actor has been running.

# Actor input Schema

## `topics` (type: `array`):

Only return trials matching one of these longevity topics. Leave empty for all topics.

## `status` (type: `array`):

Only return trials with one of these overall statuses, e.g. "RECRUITING", "COMPLETED", "TERMINATED" (ClinicalTrials.gov's own status vocabulary). Leave empty for all statuses.

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

Only return trials that include one of these phases, e.g. "PHASE1", "PHASE2", "PHASE3". Leave empty for all phases.

## `dateFrom` (type: `string`):

Only return trials with a start date on or after this date (YYYY-MM-DD). Leave empty for no lower bound.

## `dateTo` (type: `string`):

Only return trials with a start date on or before this date (YYYY-MM-DD). Leave empty for no upper bound.

## `sponsorKeyword` (type: `string`):

Case-insensitive substring match against the sponsor/company name, e.g. "Unity Biotechnology".

## `conditionKeyword` (type: `string`):

Case-insensitive substring match against the trial's listed medical conditions/indications, e.g. "osteoarthritis" or "frailty".

## `keyword` (type: `string`):

Case-insensitive substring match against the trial title and conditions.

## `onlyWithChanges` (type: `boolean`):

Only return trials that have at least one recorded change (status/phase/date change detected between two runs) since this Actor first saw them.

## `changesWithinDays` (type: `integer`):

Only return trials with at least one change detected within the last N days. Combine with "Only trials with recorded changes" or use standalone.

## `completionWithinDays` (type: `integer`):

Only return trials whose primary completion date — the point at which the primary endpoint is measured, i.e. when data exists — falls between today and N days from now. This is the catalyst calendar: prefilled with 180 to answer "which longevity trials read out in the next six months?". Clear it to get all trials regardless of completion date.

## `sponsorTypes` (type: `array`):

Only return trials funded by one of these sponsor types: "industry" (a company), "academic" (university/hospital/institute), "government" (NIH, federal or other government agency), "other". Derived from ClinicalTrials.gov's own lead-sponsor class, with a name heuristic for the entries it leaves ambiguous. Leave empty for all.

## `listingStatus` (type: `array`):

Only return trials whose sponsor matches one of these: "ticker" (mapped to a public stock), "privat" (a company confirmed to be privately held), "non-commercial" (university/hospital/government — no ticker by definition), "unmapped" (a company we haven't researched yet). Leave empty for all.

## `tickerSymbols` (type: `array`):

Only return trials sponsored by one of these listed companies, e.g. "ABBV" (AbbVie), "OXB.L" (Oxford Biomedica), "4536.T" (Santen). Leave empty for all sponsors.

## Actor input object example

```json
{
  "topics": [],
  "status": [],
  "phases": [],
  "onlyWithChanges": false,
  "completionWithinDays": 180,
  "sponsorTypes": [],
  "listingStatus": [],
  "tickerSymbols": []
}
```

# 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 = {
    "completionWithinDays": 180
};

// Run the Actor and wait for it to finish
const run = await client.actor("northlab/bio-finance-trial-monitor").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 = { "completionWithinDays": 180 }

# Run the Actor and wait for it to finish
run = client.actor("northlab/bio-finance-trial-monitor").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 '{
  "completionWithinDays": 180
}' |
apify call northlab/bio-finance-trial-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,northlab/bio-finance-trial-monitor"
        }
    }
}

```

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/yNeSZg95qgAzD19KF/builds/qnerg8VtCIRaeXxu6/openapi.json
