DEV Community

SmartMoneyData
SmartMoneyData

Posted on

Build a Biotech Catalyst Calendar: PDUFA Dates, Trial Readouts and FDA Approvals in Python

Biotech stocks move on a handful of dates: the day a pivotal trial reads out, the day the FDA decides on an application (the PDUFA date), and the day an advisory committee votes. Paid catalyst calendars charge hundreds of dollars a month for this. The underlying data is public; it is just spread across three government sources that do not talk to each other.

This tutorial builds that calendar for any list of tickers.

The three sources

Source What it gives you
ClinicalTrials.gov Every trial a company sponsors, with its phase and primary completion date, the point after which topline data usually follows
SEC 8-K filings PDUFA target action dates and advisory committee dates the company announced in its press releases
openFDA (Drugs@FDA) FDA approvals of the company's applications, including label expansions

Joining them by hand means matching sponsor names ("Vertex Pharmaceuticals Incorporated" on ClinicalTrials.gov, "VERTEX PHARMS INC" at the FDA, "VERTEX PHARMACEUTICALS INC / MA" at the SEC) and reading press releases for dates written like "PDUFA date November 30th". The Biotech Catalyst Calendar does that matching for you, without needing an API key, and returns one row per dated event.

Step 1: Setup

pip install apify-client pandas
export APIFY_TOKEN="your-token-here"
Enter fullscreen mode Exit fullscreen mode

Step 2: Build the calendar

import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])

run = client.actor("smartmoney-data/biotech-catalyst-calendar").call(
    run_input={
        "tickers": ["VRTX", "SRPT", "MRNA"],
        "daysAhead": 365,
        "daysBack": 0,          # upcoming events only
    }
)
events = list(client.dataset(run["defaultDatasetId"]).iterate_items())

for e in events:
    print(f'{e["date"]}  {e["ticker"]:<5} {e["eventType"]:<26} {e["title"][:70]}')
Enter fullscreen mode Exit fullscreen mode

Each row has date, daysUntil, eventType (pdufa-date, fda-advisory-committee, trial-primary-completion, fda-approval, fda-supplement-approval), a title, a detail (for PDUFA dates, the exact sentence from the press release), and a link to the source.

A real example

Running it for Vertex (VRTX) in October 2026 found 247 trials where Vertex is the lead sponsor and picked up this line from its second-quarter 2026 results release:

povetacicept PDUFA date November 30th

The release didn't state a year, so the actor dated the PDUFA event from the filing date (August 3, 2026), giving 2026-11-30. The row is marked yearInferred: true, and the original sentence is in detail, so you can check the inference yourself.

Step 3: Only the binary events

Trial completions are useful for planning, but PDUFA dates and advisory committees are the classic binary events:

import pandas as pd

df = pd.DataFrame(events)
binary = df[df.eventType.isin(["pdufa-date", "fda-advisory-committee"])]
print(binary[["date", "ticker", "eventType", "detail"]].to_string(index=False))
Enter fullscreen mode Exit fullscreen mode

Or skip trials entirely with "sources": ["filings"], which is faster and cheaper.

Step 4: Next 90 days, sorted

upcoming = df[df.daysUntil.between(0, 90)].sort_values("date")
print(upcoming[["date", "daysUntil", "ticker", "eventType", "title"]].to_string(index=False))
Enter fullscreen mode Exit fullscreen mode

Caveats worth knowing

  • Trial dates are estimates. Sponsors register planned completion dates and update them. isEstimated tells you which are planned and which already happened, and precision: "month" means the sponsor gave only a month.
  • Not every PDUFA date is public. Companies are not required to disclose them, and some only mention them on earnings calls. The actor finds the ones written in 8-K filings and their press-release exhibits.
  • Big pharma runs hundreds of trials. Use "phases": ["PHASE3"] and maxTrialsPerTicker to focus.

Use it from an AI assistant

https://mcp.apify.com/?tools=smartmoney-data/biotech-catalyst-calendar
Enter fullscreen mode Exit fullscreen mode

Add it as a remote MCP server in Claude, ChatGPT or Cursor and ask: "What binary events do VRTX, SRPT and MRNA have in the next 90 days?"

Related tools


Data is for informational purposes only and is not investment advice.

Top comments (0)