# DailyMed Label Change Watch Report (`taroyamada/dailymed-label-change-watch-report`) Actor

Monitor official DailyMed SPL metadata and version history for selected drugs, labelers, NDCs, applications, or Set IDs. Receive source-linked change alerts, report summaries, and compact exports. Baselines and unchanged checks emit no rows and no charges. Full label content is excluded by default.

- **URL**: https://apify.com/taroyamada/dailymed-label-change-watch-report.md
- **Developed by:** [naoki anzai](https://apify.com/taroyamada) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 dailymed label rows

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

## DailyMed Label Change Watch Report

Pharma label-operations and regulatory-research teams provide bounded DailyMed filters such as drug names, labelers, NDCs, application numbers, or Set IDs.\
The Actor compares public SPL metadata and version history across recurring runs.\
The result is a source-linked change alert, impact report, or compact export; full label XML/PDF/media is excluded by default.

### Run the next report

- [Medicare Coverage Change Impact Report](https://apify.com/taroyamada/medicare-coverage-change-impact-report) for public national coverage document changes.
- [CMS Provider Ownership & Quality Change Report](https://apify.com/taroyamada/cms-provider-ownership-quality-change-report) for source-linked provider ownership and quality changes.
- [FDA 510(k) Device Clearance Landscape Report](https://apify.com/taroyamada/fda-510k-device-clearance-landscape-report) for public device clearance record changes.

### Store Quickstart

1. Start with `initialRunMode: "baseline_only"` and a stable `monitorKey`.
2. Use a stable `watches[].id`, set `generateReport: true`, and leave `emitUnchanged: false`.
3. After the free baseline, run the same watch again. Only new or changed metadata/version observations produce billable output.

The first recurring run stores a baseline and emits **0 rows / 0 charge**. An unchanged recurring run emits zero rows and zero charge. The default value path is report-first and does not download full labels.

#### Example 1: Drug-name portfolio watch

```json
{
  "watches": [{
    "id": "acetaminophen-labels",
    "drugNames": ["acetaminophen"],
    "publishedDateFrom": "2024-01-01",
    "publishedDateComparison": "gte"
  }],
  "monitorKey": "acetaminophen-label-portfolio",
  "initialRunMode": "baseline_only",
  "generateReport": true,
  "emitRawRows": false,
  "emitExport": false,
  "emitUnchanged": false,
  "maxRecordsPerWatch": 10,
  "maxHistoryEntries": 5,
  "maxChargeUsd": 25
}
```

#### Example 2: Exact Set ID watch

```json
{
  "watches": [{
    "id": "known-spl",
    "setIds": ["1efe378e-fee1-4ae9-8ea5-0fe2265fe2d8"]
  }],
  "monitorKey": "known-spl-version-watch",
  "initialRunMode": "baseline_only",
  "includeHistory": true,
  "generateReport": true,
  "emitUnchanged": false,
  "maxChargeUsd": 25
}
```

#### Example 3: Labeler and application watch

```json
{
  "watches": [{
    "id": "labeler-nda-portfolio",
    "labelers": ["Example Labeler"],
    "applicationNumbers": ["NDA012345"],
    "publishedDateFrom": "2025-01-01",
    "publishedDateComparison": "gte"
  }],
  "monitorKey": "labeler-nda-portfolio",
  "initialRunMode": "emit_backfill",
  "generateReport": true,
  "emitExport": true,
  "emitUnchanged": false,
  "maxRecordsPerWatch": 25,
  "maxHistoryEntries": 10,
  "maxChargeUsd": 25
}
```

### What you receive

The report-first output can contain:

- `dailymed-label-impact-report`: grouped counts and source-linked evidence for new or changed records.
- `dailymed-label-change-alert`: one alert per new label or metadata/version change.
- `dailymed-label-export`: compact JSON-ready metadata and version history without full label content.
- `dailymed-label-row`: optional low-priced metadata row when `emitRawRows` is enabled.

Each label includes `setId`, title, SPL version, published date, labeler when present, bounded history, DailyMed metadata URL, and official history URL. The actor never treats a missing history entry as proof that no change exists.

### Pricing

| Event | Price | When it is emitted |
| --- | ---: | --- |
| `dailymed-label-row` | $0.005 | Optional compact row for a new or changed observation |
| `dailymed-label-change-alert` | $0.20 | New or changed metadata/version observation |
| `dailymed-label-impact-report` | $10.00 | One grouped report for the selected changes |
| `dailymed-label-export` | $6.00 | Optional compact source-linked export |

`maxChargeUsd` is enforced before delivery. Unknown event names, delivery failures, missing charge receipts, and state-store failures fail closed. State is committed only after all billable rows have been delivered successfully.

### Compliance and data boundary

- Uses official DailyMed Web Services v2 GET endpoints only. No API key, login, cookie, or paid service is required.
- Retrieves the `/spls` metadata list and bounded `/spls/{SETID}/history` metadata. It does not fetch or redistribute full label XML, ZIP, PDF, or media by default.
- This is descriptive public-record monitoring, not medical, clinical, legal, regulatory, pharmacovigilance, investment, procurement, or market-access advice.
- A metadata/version change is not a causality finding, safety conclusion, efficacy conclusion, treatment recommendation, approval prediction, or guarantee.
- The product is not endorsed by, approved by, or affiliated with FDA, NLM, NIH, or HHS. Verify the official record before acting.

### Support files

- [Source compliance](docs/source-compliance.md)
- [Competitive snapshot](docs/store-competitive-snapshot.md)
- [Integration guide](docs/integration-guide.md)
- [Sample output](docs/sample-output.json)

# Actor input Schema

## `watches` (type: `array`):

Bounded recurring watches. Use a stable id and at least one filter per watch.

## `monitorKey` (type: `string`):

Stable isolated state namespace for a recurring DailyMed portfolio.

## `initialRunMode` (type: `string`):

baseline\_only stores the first observation with zero rows; emit\_backfill emits current matches for an explicit first report.

## `nameType` (type: `string`):

How DailyMed interprets drugNames.

## `includeHistory` (type: `boolean`):

Fetch bounded DailyMed /history metadata for source-linked version evidence. Full label content is never fetched.

## `generateReport` (type: `boolean`):

Generate one report-first aggregate when new or changed observations are emitted.

## `emitRawRows` (type: `boolean`):

Emit the low-priced compact metadata row for each new or changed record.

## `emitExport` (type: `boolean`):

Generate a compact JSON export of metadata/version evidence without full labels.

## `emitUnchanged` (type: `boolean`):

Accepted for compatibility, but unchanged observations remain zero rows and zero charge.

## `maxRecordsPerWatch` (type: `integer`):

Maximum DailyMed list records retained per bounded query. DailyMed pagesize maximum is 100.

## `maxHistoryEntries` (type: `integer`):

Maximum version-history entries retained per label.

## `maxChargeUsd` (type: `number`):

Fail closed before delivery if planned PPE charges exceed this cap.

## `dryRun` (type: `boolean`):

Return representative rows for every configured event without DailyMed requests, state save, or PPE charges.

## Actor input object example

```json
{
  "watches": [
    {
      "id": "acetaminophen-labels",
      "drugNames": [
        "acetaminophen"
      ],
      "publishedDateFrom": "2024-01-01",
      "publishedDateComparison": "gte"
    },
    {
      "id": "example-setid",
      "setIds": [
        "1efe378e-fee1-4ae9-8ea5-0fe2265fe2d8"
      ]
    },
    {
      "id": "example-labeler",
      "labelers": [
        "Example Labeler"
      ],
      "publishedDateFrom": "2025-01-01",
      "publishedDateComparison": "gte"
    }
  ],
  "monitorKey": "dailymed-label-watch",
  "initialRunMode": "baseline_only",
  "nameType": "both",
  "includeHistory": true,
  "generateReport": true,
  "emitRawRows": false,
  "emitExport": false,
  "emitUnchanged": false,
  "maxRecordsPerWatch": 25,
  "maxHistoryEntries": 10,
  "maxChargeUsd": 25,
  "dryRun": false
}
```

# Actor output Schema

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

Source-linked DailyMed label metadata/version alerts, reports, and optional exports written to the run default dataset.

# 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 = {
    "watches": [
        {
            "id": "acetaminophen-labels",
            "drugNames": [
                "acetaminophen"
            ],
            "publishedDateFrom": "2024-01-01",
            "publishedDateComparison": "gte"
        },
        {
            "id": "example-setid",
            "setIds": [
                "1efe378e-fee1-4ae9-8ea5-0fe2265fe2d8"
            ]
        },
        {
            "id": "example-labeler",
            "labelers": [
                "Example Labeler"
            ],
            "publishedDateFrom": "2025-01-01",
            "publishedDateComparison": "gte"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("taroyamada/dailymed-label-change-watch-report").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 = { "watches": [
        {
            "id": "acetaminophen-labels",
            "drugNames": ["acetaminophen"],
            "publishedDateFrom": "2024-01-01",
            "publishedDateComparison": "gte",
        },
        {
            "id": "example-setid",
            "setIds": ["1efe378e-fee1-4ae9-8ea5-0fe2265fe2d8"],
        },
        {
            "id": "example-labeler",
            "labelers": ["Example Labeler"],
            "publishedDateFrom": "2025-01-01",
            "publishedDateComparison": "gte",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("taroyamada/dailymed-label-change-watch-report").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 '{
  "watches": [
    {
      "id": "acetaminophen-labels",
      "drugNames": [
        "acetaminophen"
      ],
      "publishedDateFrom": "2024-01-01",
      "publishedDateComparison": "gte"
    },
    {
      "id": "example-setid",
      "setIds": [
        "1efe378e-fee1-4ae9-8ea5-0fe2265fe2d8"
      ]
    },
    {
      "id": "example-labeler",
      "labelers": [
        "Example Labeler"
      ],
      "publishedDateFrom": "2025-01-01",
      "publishedDateComparison": "gte"
    }
  ]
}' |
apify call taroyamada/dailymed-label-change-watch-report --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,taroyamada/dailymed-label-change-watch-report"
        }
    }
}

```

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/xJXctvUDIZCToKKQe/builds/VqLkBRk9euREJqhU5/openapi.json
