# FDA Advisory Committee Catalyst Monitor (`maydit/fda-advisory-catalyst-monitor`) Actor

Track FDA advisory meeting dates, agendas, cancellations and briefing document links. Compare saved observations with source evidence. No paid API, inferred tickers or approval predictions.

- **URL**: https://apify.com/maydit/fda-advisory-catalyst-monitor.md
- **Developed by:** [Brandt May](https://apify.com/maydit) (community)
- **Categories:** Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 fda advisory meeting observations

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![Official FDA advisory meeting dates, document links and saved page changes](https://api.apify.com/v2/key-value-stores/nemaYfVcrTgloz8Wn/records/fda-advisory-catalyst-monitor-2f5072022590.png?signature=Yu8AeUAgQukjFrPgmSaz)

### Follow the meeting and its materials

Organize FDA advisory meeting research around official dates, agendas and supporting document links. Keep a focused watchlist and see how each meeting page changes across saved runs. Built for biopharma researchers and teams maintaining a regulatory research calendar.

[Open this Actor in Console](https://console.apify.com/actors/HHcnbkCKWYYqg3U3h/input) · [First run](#try-this-actor) · [Results](#result-preview) · [Saved comparisons](#build-a-repeatable-workflow) · [Full guide](#full-guide)

### Try this Actor

Inspect **one meeting** from FDA’s official calendar. Upcoming meetings are selected first, starting with the nearest date. If no upcoming meeting appears in the index, the Actor selects the most recent past meeting. No paid source API or external account is required.

**Inspect the next FDA advisory meeting** — paste this input into the Console JSON editor.

```json
{
  "discoverySource": "calendar",
  "maxMeetings": 1,
  "maxResults": 1,
  "maxRunSeconds": 90
}
```

Open the dataset to read the agenda, meeting date and document links. Follow `sourceUrl` to the official page and check **Run report** for the run’s coverage.

Calendar discovery uses two source requests, spaced by 30 seconds to follow FDA’s published crawl delay. A successful small run normally finishes in under 60 seconds, subject to FDA availability and latency. Allow roughly 30 seconds for each additional request. An exact `meetingUrls` watchlist skips index discovery.

### Result preview

One saved row is one meeting observation, including its recognized FDA attachment links.

| Research question | Output fields |
| --- | --- |
| Which meeting and when? | `title`, `meetingDate`, `meetingEndDate`, `meetingTimeText` |
| What is the published status? | `status`, `statusEvidence` |
| What is on the agenda? | `center`, `agendaText`, `productSponsorEvidence` |
| Which materials are linked? | `documents`, `documentCount` |
| What changed since the saved page? | `changedFields`, `addedDocumentLinks`, `revisedDocumentLinks`, `removedDocumentLinks` |
| Where is the official evidence? | `sourceUrl`, `observedAt` |

Document results are **link metadata**. PDF contents, approval outcomes, PDUFA dates and guessed ticker mappings are outside this Actor’s scope.

### Usage and pricing

Base result rate on the FREE tier: **$5 per 1,000 saved meeting observations**. The [Pricing tab](https://apify.com/maydit/fda-advisory-catalyst-monitor/pricing) shows your plan’s result rate and the **Actor Start** charge. Set `maxResults` and a platform spending limit before running a larger watchlist. A result cap is an upper bound, not a promise of that many results.

Saved unchanged observations are billable. `onlyChanges` skips unchanged rows after a baseline; skipped rows, source errors and summary files are not dataset-item charges.

### Build a repeatable workflow

1. **Choose a meeting page.** Use calendar discovery to find a relevant meeting, then copy its official URL into `meetingUrls` for a focused watchlist.
2. **Save a baseline.** Use the specific-meeting comparison example below, replacing its historical URL with your watchlist. Keep the same selection settings, `snapshotName` and named history store.
3. **Review page changes.** Check the meeting dates, published status, agenda and added/revised document links. Open each official source before acting on a time-sensitive change.
4. **Maintain your research calendar.** Export the dataset or connect your own destination. Use `id` as the meeting key and retain the original URL. After the baseline, `onlyChanges: true` can suppress unchanged observations.

A fully unchanged repeat can correctly save zero rows. A missing meeting does not establish a cancellation, and a missing link does not establish document withdrawal. Run each namespace sequentially and read SUMMARY for gaps.

### Full guide

#### Select the meetings you need

| Input | Behavior |
| --- | --- |
| `meetingUrls` | Up to 40 official FDA advisory calendar meeting pages. When provided, these replace discovery. |
| `discoverySource` | `calendar` by default, or `recent` for FDA’s recently updated materials index. |
| `dateFrom`, `dateTo` | Optional inclusive meeting-date bounds in `YYYY-MM-DD` form. |
| `keywords` | Match any supplied term in the title or extracted agenda, ignoring case. |
| `maxMeetings` | Maximum meeting pages selected and attempted. Default 1. |
| `maxResults` | Maximum saved meeting observations. Default 10. |
| `maxRequests` | Maximum FDA requests, including discovery. Default 8. |
| `maxRunSeconds` | Run budget including spacing, source work and history. Default 240; range 30–900. The platform deadline also applies. |

**Keyword filtering happens after pages are selected by date/order and `maxMeetings`.** A zero-match run does not establish that FDA has no matching meeting. Raise the page and time limits, narrow the date range, or use explicit meeting URLs to inspect the intended watchlist. The summary counts discovered, selected and unselected candidates.

#### Three example inputs

The first exact example is [Inspect the next FDA advisory meeting](#try-this-actor) above. The other saved examples are:

##### Inspect a recently updated FDA meeting

Inspect the latest meeting in FDA’s recently updated materials index, including its complete recognized FDA attachment link inventory.

```json
{
  "discoverySource": "recent",
  "maxMeetings": 1,
  "maxResults": 1,
  "maxRunSeconds": 90
}
```

##### Compare a specific FDA meeting page

A historical October 2026 meeting demonstrates source documents and a saved comparison. Repeats return changed or unchanged observations.

```json
{
  "meetingUrls": [
    "https://www.fda.gov/advisory-committees/advisory-committee-calendar/vaccines-and-related-biological-products-advisory-committee-october-1-2026-meeting-announcement"
  ],
  "comparePrevious": true,
  "snapshotName": "vrbpac-october-2026",
  "maxMeetings": 1,
  "maxResults": 1,
  "maxRunSeconds": 90
}
```

The specific meeting example is historical. Replace its URL with a meeting relevant to your research; the example does not claim to be an upcoming event. The recently updated materials index can also reference older meetings.

#### Field reference

| Field | Meaning |
| --- | --- |
| `id`, `eventId` | Stable identifier derived from the meeting’s official URL. |
| `title`, `sourceUrl`, `observedAt` | Source title, evidence link and collection timestamp. |
| `meetingDate`, `meetingEndDate` | Dates from the page’s event metadata, with index/title fallback where available. |
| `meetingDateText`, `meetingTimeText` | FDA’s displayed date and time wording. |
| `status`, `statusEvidence` | Cancelled, postponed or rescheduled only when that wording appears in the meeting title; otherwise `announced`. `announced` does not mean the event is still upcoming. |
| `center`, `agendaText` | FDA center when provided and the recognized agenda section. |
| `productSponsorEvidence` | Product, sponsor and NDA/BLA number only where the agenda uses supported, explicit application/submission wording. The source excerpt is included. Other meetings have an empty list. |
| `documents`, `documentCount` | Complete recognized FDA attachment links on the retrieved meeting page, with source labels and a type derived from those labels. |
| `sourceUpdatedAt`, `indexModifiedAt` | Source-provided page/index timestamps when available. These are not market announcement timestamps. |
| `recentMaterialDate` | Date from the recently updated materials index, when that discovery route is used. It can refer to an older meeting. |
| `watchlistLabel` | Your optional annotation. It is not a verified ticker or company mapping. |
| `comparisonStatus`, `changedFields`, `previous` | New, changed or unchanged observations and the preceding saved values, when comparisons are enabled. |
| `addedDocumentLinks`, `removedDocumentLinks`, `revisedDocumentLinks` | Differences between complete recognized link inventories for the same meeting URL. A revised link retains its URL but changes its label/type. |

The Actor recognizes FDA `/media/{id}/download` links and FDA file attachments with supported document extensions. It collects **link metadata**. It does not download PDF bytes, extract PDF text, inspect videos or detect content overwritten at the same attachment URL without a link-label change. It does not retrieve external sites linked from a meeting page.

#### Saved comparison behavior

Enable `comparePrevious` to save observations to the named key-value store `maydit-fda-advisory-watchlists`. The first comparison has no baseline and returns matching observations as `new`. Later runs show `changed` or `unchanged` and include previous values. Only rows confirmed saved to the dataset advance history.

Set `onlyChanges` to save new or changed meetings only. It implies `comparePrevious`; a fully unchanged repeat correctly produces an empty dataset. Keep comparisons off for independent snapshots.

Use the same `snapshotName`, discovery/watchlist settings, dates and keywords for a consistent comparison. Use a dedicated `stateStoreName` to isolate a workflow. Run one writer per comparison namespace; concurrent writers are unsupported and a detected conflict leaves the existing history intact. Limit and source failures preserve prior records for meetings that were not successfully saved. History supports up to 20,000 identities per namespace.

The Actor never infers that a meeting was cancelled because it disappeared from an index. A missing document link means only that the link is absent from the current page’s recognized inventory. It does not establish that FDA withdrew the document. URL changes create a new meeting identity.

#### Coverage for research

Advisory meetings help you organize regulatory research and notice newly posted supporting materials. Committee recommendations are advisory; the FDA makes the final regulatory decision. This Actor is not a complete PDUFA calendar, a trial-results feed, an approval prediction or a trading signal.

Meeting notices generally appear at least 15 calendar days before the meeting. FDA intends to post background materials no later than two business days beforehand, with stated exceptions; transcripts can take longer. Check the original page for time-sensitive decisions. A source refresh or link change does not establish when information first became public.

FDA indexes are bounded source listings, not complete historical archives. The calendar can contain old events, and recently updated materials can reference a meeting from an earlier year. Product/sponsor extraction intentionally supports only clear wording; ticker ownership, licensing relationships and corporate parents are not inferred. Missing metadata stays null or empty.

#### Run quality and limits

One saved dataset row is one meeting observation, including its document links. New, changed and unchanged observations are saved when `comparePrevious` is enabled without `onlyChanges`. A filtered or skipped unchanged meeting creates no dataset row. Source failures create no synthetic paid records.

The Actor checks the remaining dataset-item allowance before writing. A final affordable row is counted even when it exhausts the spending limit. Source selection limits, the time budget and spending limits can leave work unfinished.

Open **Run report** for a readable result, or **SUMMARY** for machine-readable coverage, failures, counts, limits and history status. A successful run covers its selected observations; it does not imply complete FDA coverage. An upstream outage that leaves no usable observation fails with a diagnostic. A legitimate empty filter or unchanged comparison warns and succeeds.

Responses are limited to 2 MiB and the link inventory to 300 recognized documents per meeting. An unsupported or oversized response is reported as a failure rather than saved as partial evidence. Access refusals are reported without a proxy or access-control workaround. The Actor uses public sources and does not submit comments or interact with meetings.

#### Sources

- [FDA Advisory Committee Calendar](https://www.fda.gov/advisory-committees/advisory-committee-calendar), including its public page JSON index.
- [Recently Updated Advisory Committee Materials](https://www.fda.gov/advisory-committees/recently-updated-advisory-committee-materials), including its public page JSON index.
- [FDA advisory meeting questions and answers](https://www.fda.gov/advisory-committees/about-advisory-committees/common-questions-and-answers-about-fda-advisory-committee-meetings).
- [How FDA uses advisory committees](https://www.fda.gov/drugs/information-consumers-and-patients-drugs/advisory-committees-critical-fdas-product-review-process).
- [FDA website policy](https://www.fda.gov/about-fda/about-website/website-policies). FDA content is generally public domain unless otherwise noted; linked sponsor materials can carry their own notices.

This is an independent tool and is not affiliated with or endorsed by FDA.

### Help with your run

Open **Run report** in the run’s Output tab for a readable outcome and **SUMMARY** for detailed coverage and source issues. Export CSV for flat spreadsheet columns or JSON to preserve nested evidence.

For help, open this Actor’s **Issues** tab with the run URL, relevant input and expected result. Remove credentials and private information before posting.

[Explore more Mayd-It Actors](https://apify.com/maydit)

# Actor input Schema

## `meetingUrls` (type: `array`):

Up to 40 individual HTTPS www.fda.gov advisory committee calendar meeting page URLs. Nonempty input uses only these pages. Omitted or empty discovers meetings from the selected official index.

## `discoverySource` (type: `string`):

Used only when meetingUrls is empty. Omitted uses calendar, with upcoming dates first and most recent past meetings if none are upcoming. Recent sorts meetings by the source index material date. The bounded index is not a complete historical archive.

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

Up to 20 case-insensitive terms. A meeting must match at least one in its title or extracted agenda. Pages are selected before this filter, so raise maxMeetings when a narrow filter matches no selected page.

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

Optional inclusive meeting date YYYY-MM-DD. Applies to discovery and explicit pages.

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

Optional inclusive meeting date YYYY-MM-DD.

## `watchlistLabel` (type: `string`):

Optional label copied into every row. This is your annotation, not a verified ticker, company mapping or FDA declaration.

## `maxMeetings` (type: `integer`):

Maximum pages selected and attempted per run, after discovery date filtering and before keyword filtering. At least 30 seconds separates source requests. Remaining unselected candidates are counted in SUMMARY.

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

Maximum confirmed dataset rows. Each row is one meeting observation including its document link inventory. Skipped unchanged meetings do not use this allowance.

## `comparePrevious` (type: `boolean`):

First comparison emits new observations. Later runs report changed or unchanged fields and added, removed or revised document links. Only confirmed saved rows advance the named history.

## `onlyChanges` (type: `boolean`):

Implies comparePrevious. The first run saves new observations; a fully unchanged repeat correctly saves zero rows. Does not infer missing meetings or cancellations.

## `snapshotName` (type: `string`):

1-80 letters, numbers, underscores or hyphens. History is also scoped to source selection, URL watchlist, dates and keywords. Use one writer per namespace; overlapping runs are unsupported.

## `stateStoreName` (type: `string`):

3-63 letters, numbers or hyphens. Read and written only when comparisons are enabled. A dedicated store isolates your workflow.

## `maxRequests` (type: `integer`):

Maximum source HTTP requests, including the discovery index. No retries, redirects, PDF downloads or secondary hosts are fetched. Default discovery needs two requests.

## `maxRunSeconds` (type: `integer`):

Includes request spacing, source work and history. Also constrained by the platform deadline minus 25 seconds. Default two-request discovery normally takes about 31 seconds; allow roughly 30 seconds for each additional page.

## Actor input object example

```json
{
  "meetingUrls": [],
  "discoverySource": "calendar",
  "keywords": [],
  "maxMeetings": 1,
  "maxResults": 10,
  "comparePrevious": false,
  "onlyChanges": false,
  "snapshotName": "default",
  "stateStoreName": "maydit-fda-advisory-watchlists",
  "maxRequests": 8,
  "maxRunSeconds": 240
}
```

# Actor output Schema

## `results` (type: `string`):

Successful source observations only, including document links and comparisons.

## `runReport` (type: `string`):

Readable source coverage, limits and history outcome.

## `summary` (type: `string`):

Saved counts, failed sources, unselected meetings, request/time/spending stops and history outcome.

## `csvExport` (type: `string`):

Download current meeting observations for a spreadsheet.

# 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 = {
    "meetingUrls": [],
    "discoverySource": "calendar"
};

// Run the Actor and wait for it to finish
const run = await client.actor("maydit/fda-advisory-catalyst-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 = {
    "meetingUrls": [],
    "discoverySource": "calendar",
}

# Run the Actor and wait for it to finish
run = client.actor("maydit/fda-advisory-catalyst-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 '{
  "meetingUrls": [],
  "discoverySource": "calendar"
}' |
apify call maydit/fda-advisory-catalyst-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maydit/fda-advisory-catalyst-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/HHcnbkCKWYYqg3U3h/builds/AzXDTzctnGahxIKBN/openapi.json
