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"
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]}')
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))
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))
Caveats worth knowing
-
Trial dates are estimates. Sponsors register planned completion dates and update them.
isEstimatedtells you which are planned and which already happened, andprecision: "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"]andmaxTrialsPerTickerto focus.
Use it from an AI assistant
https://mcp.apify.com/?tools=smartmoney-data/biotech-catalyst-calendar
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
- FDA Recall Checker: FDA recalls, drug labels and adverse-event counts
- Insider Trading API: are insiders buying ahead of the readout?
- Trading Halts: biotech stocks are often halted for news pending on decision day
Data is for informational purposes only and is not investment advice.
Top comments (0)