Biotech Catalyst Sentinel

FDA PDUFA dates a company put in an SEC filing — accuracy-tested, and served to your agent per call over x402.

What it is

A PDUFA date is the day the FDA is scheduled to decide on a drug — a binary, market-moving event. Biotech Catalyst Sentinel watches both US 8-K filings and foreign-issuer 6-K filings the moment they're published, uses an LLM to extract the decision date, and keeps only dates whose exact wording is quoted verbatim from the filing. The result is a clean, machine-readable feed of upcoming catalysts and their change history — two paid endpoints, plus a free, independently auditable accuracy track record.

And what it doesn't cover. A PDUFA date is public only because a company chose to announce it — the FDA doesn't publish goal dates in advance. Reading SEC filings means we see the issuers who disclose, which skews to small- and mid-caps where one decision is material, and misses large-cap sponsors who never file an 8-K about a single drug. Our measured coverage is published, unflattered, right next to the accuracy numbers on the track record page — we'd rather you read it there than discover it later.

Primary sources only

Straight from the filing

Every record links to the exact SEC filing it came from. No press-release telephone game, no aggregated guesses.

US + foreign

US and foreign issuers

Tracks both US 8-K filers and foreign issuers that disclose PDUFA dates via 6-K — two filing types, one feed, straight from EDGAR.

Approvals + rejections

We score the “no,” too

Most trackers only note approvals. We capture FDA Complete Response Letters — rejections, the outcome a short position lives or dies on — from the company's own filing and the FDA's records, and put them on the public scorecard next to the approvals.

CBER biologics

Gene & cell therapies openFDA misses

openFDA's main drug dataset omits many CBER-regulated biologics (gene and cell therapies, blood factors). We recover approvals from the FDA Purple Book — which narrows, but does not close, the gap on the newest, highest-stakes modalities.

Grounding gate

No hallucinated dates

A date is published only if its source quote appears word-for-word in the filing text. Anything uncertain is held back and never shipped — it waits in a review queue instead of reaching the feed.

History-aware

Set → extended → resolved

Each catalyst is one entity with an event timeline. When the FDA pushes a date back or a decision lands, the record updates and keeps the change on file — so your agent acts on the current date, not a superseded one.

Machine-first

Built for agents

JSON only, no account, no signup, no subscription. Discoverable and payable autonomously via the x402 standard.

Don't trust us — verify

Being right is the entire product. One wrong date on a binary event and an agent operator silently churns forever — so accuracy is measured, published, and free to check before you ever pay.

—
median date error
(vs. actual FDA decisions)
live figure at /v1/accuracy
~90%
of decisions within
±30 days
live figure at /v1/accuracy
~half
of FDA approvals by sponsors
we could see (SEC filers)
live figure at /v1/accuracy
~16%
of ALL original NDA/BLA
decisions — most sponsors
never file with the SEC
live figure at /v1/accuracy
$0
to verify — the accuracy
track record is free & public
The dates we serve (company-disclosed PDUFA dates) are reconciled against the FDA's own records — approvals via openFDA, biologics via the FDA Purple Book, and rejections (CRLs) from the issuer's own filing — and the scorecard is served openly at GET /v1/accuracy. Every row lists the FDA application number so you can confirm it yourself. Check the track record first; pay only if it earns it. Dates the feed publishes are signed and anchored on Base each day. A purchased row carries attestation_uid when a mainnet claim exists for that date. The field is null when no claim was signed. The recipe, with one real mainnet example, is how you check a uid you already hold.

A 2023–2025 historical backtest plus every live decision since, including captured rejections — self-updating as new decisions resolve.

The API

Two paid routes. The scoreboard, one company's coverage, the service description, and the attestation checks are free. Base URL https://api.biotechcatalystsentinel.com

GET /v1/catalysts/upcoming
Upcoming PDUFA catalysts (default: next 365 days). Pay per call in USDC on Base or Solana — no account, no subscription. Optional query params: within_days (1–365), limit (1–500) and ticker (one position server-side — the membership the free /v1/coverage?ticker= counts; also on /v1/events).
# Without payment you get the x402 challenge:
curl https://api.biotechcatalystsentinel.com/v1/catalysts/upcoming
# → HTTP 402 Payment Required  (accepts: Base or Solana USDC, $0.02)

# Response after payment. The row is the free fictional sample
# (GET /v1/catalysts/upcoming/sample) — not a live date:
{
  "data": [{
    "drug_name":   "SAMPLIMAB",
    "company":     "Sample Therapeutics, Inc.",
    "ticker":      "XSMPL",
    "indication":  "sample indication (moderate-to-severe examplitis)",
    "pdufa_date":  "2026-11-15",
    "stage":       "set",
    "confidence":  "high",
    "source_url":  "https://www.sec.gov/Archives/edgar/..."
  }],
  "meta": { "total": 1 }
}
GET /v1/events
The full history of every catalyst we track — set → extended → resolved (date extensions, CRLs/rejections, approvals), oldest-first from a since cursor (newest first without one), each with its SEC source filing. A superset of /v1/catalysts/upcoming: every event carries its date — including still-upcoming forward dates — plus the resolved outcome and provenance. The full monitoring feed. Optional query params: since (event cursor) and limit (1–500).
# One fictional event from GET /v1/events/sample. A decision may carry new_date:
{
  "data": [{
    "event_type":  "decision_outcome",
    "drug_name":   "SAMPLIMAB",
    "ticker":      "XSMPL",
    "new_date":    "2026-06-12",
    "outcome":     "crl",
    "source_url":  "https://www.sec.gov/Archives/edgar/..."
  }],
  "meta": { "total": 1 }
}
GET /v1/accuracy free
The public accuracy track record — the receipts behind the feed. Always free, no payment required.
GET /v1/coverage?ticker=XYZ free
What we hold for one company: how many of its SEC filings matched our discovery query, whether any disclosed a PDUFA date, when, and how many rows the paid feed would return right now — a count, never a date. So an empty result can be read honestly: "not observable here" is not "nothing pending".
GET /v1/meta free
What the service is: version, when the scan last ran (feed.last_polled), rate guidance, and links to the scoreboard, the changelog, and the verify recipe.
GET /attest/verify?uid=… free
One signed claim and its anchor proof. A paid row carries the uid when a mainnet claim exists; the recipe includes one real mainnet example.
GET /attest/accuracy/biotech-catalyst free
Ledger counts: claims, resolutions, the attester address, and the chain the anchor used.

Agents can auto-discover pricing and schema at /.well-known/x402.

How to call it

Built on x402, the open HTTP micropayment standard. Any x402-aware client handles the 402 → pay → retry handshake for you — your agent just makes a GET and gets data back.

# Python — an x402 client signs & settles automatically
from x402 import x402ClientSync
from x402.http.clients.requests import x402_requests
# ...register your Base or Solana signer, then:
resp = session.get("https://api.biotechcatalystsentinel.com/v1/catalysts/upcoming")
print(resp.json()["data"])   # settled in USDC; ~$0.02

Payer pays only the stablecoin — gas is handled by the facilitator. Works with any x402 client (Python, JS x402-fetch, etc.).