# Drug Label Change Records — NLM DailyMed SPL (`nexgensignal/drug-label-change-records`) Actor

Per-record U.S. FDA drug labels (SPL) from the official NLM DailyMed service. Set id, product, labeler organization, version, published date, optional NDC. Keyless, public domain, no personal data.

- **URL**: https://apify.com/nexgensignal/drug-label-change-records.md
- **Developed by:** [NexGen Signal](https://apify.com/nexgensignal) (community)
- **Categories:** Business, News, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $33.50 / 1,000 label change records

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/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

## Drug Label Change Records — NLM DailyMed (SPL)

**Official source. No API key. Pay per record.**

This actor turns the U.S. **National Library of Medicine's DailyMed** — the official distribution point for FDA Structured Product Labeling (SPL) — into clean, per-label records. Each run reads the keyless DailyMed v2 web service and delivers one row per drug label: the SPL set id, the product/drug name, the labeler organization, the SPL version, and the published date — the facts you track to know **when a drug label changed and who changed it**. Product and organization grain, public-domain metadata, no person fields.

### What this is, in one paragraph

Every prescription and OTC drug marketed in the U.S. has a Structured Product Label, and NLM redistributes all of them through DailyMed. A label is versioned: each time the labeler updates it, the SPL version increments and a new published date is stamped. This actor reads DailyMed's SPL list newest-first, parses each into a single analysis-ready record — set id, product, labeler organization, version, date — and optionally attaches the NDC package codes. Values are verbatim. You are billed only for records actually delivered.

### Who buys this and for what job

- **Pharma regulatory and competitive-intelligence teams** watching label versions across their own and competitors' products to catch label changes as they publish.
- **Pharmacovigilance and safety teams** tracking when labels are revised (a version bump is the signal).
- **Health-tech and formulary products** ingesting a structured, keyless drug-label index keyed by set id and NDC.
- **Data engineers** who want a one-call, no-key feed of the U.S. drug-label universe reduced to product/org fields.

### Public domain — metadata only

DailyMed is distributed by NLM, and NLM's works are U.S. Government works. Per NLM: *"Works produced by the U.S. government are not subject to copyright protection in the United States"* and *"may be freely used or reproduced without permission in the U.S."* — with attribution: *"Source: National Library of Medicine."* One honest boundary travels on every record: an individual product label's **content** is submitted by the labeler and can include third-party material, so this actor carries label **metadata only** (set id, product, labeler, version, date, NDC) — never the label body text. These are metadata records for change-tracking, not medical or regulatory advice.

### Product / organization grain — no person data

This actor works at product and organization grain: the drug product and its labeler company. SPL label metadata carries no natural-person fields, and this actor emits none — a person-key guard runs on every record as a backstop.

### Pricing

| Event | Free plan | Bronze | Silver | Gold / Platinum / Diamond |
|-------|-----------|--------|--------|---------------------------|
| `label_change_record` | $0.05 | $0.045 | $0.04 | $0.0335 |

Delivered before charged. Blocked runs and empty results cost nothing.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `drugName` | string | — | Optional. Keep only SPLs whose drug name matches (e.g. `metformin`). |
| `includeNdc` | boolean | false | If enabled, fetch each SPL's NDC package codes (one extra request per record, slower). |
| `maxRecords` | integer | 500 | Ceiling on records delivered and billed. |

The actor reads SPLs newest-first and follows the service's `next_page_url` pagination.

### Output

One JSON object per label. Real example (values verbatim):

```json
{
  "record_id": "0e043431-9d87-478d-87f5-5aa8b0a932eb",
  "setid": "0e043431-9d87-478d-87f5-5aa8b0a932eb",
  "product_name": "AUTOBRUSH MINT (SODIUM FLUORIDE) LIQUID",
  "labeler_organization": "LANDER ENTERPRISES, LLC",
  "spl_version": 1,
  "published_date": "Aug 19, 2026",
  "title": "AUTOBRUSH MINT (SODIUM FLUORIDE) LIQUID [LANDER ENTERPRISES, LLC]",
  "ndcs": [],
  "source": "U.S. NLM DailyMed (SPL v2 web service)",
  "source_url": "https://dailymed.nlm.nih.gov/dailymed/drugInfo.cfm?setid=0e043431-9d87-478d-87f5-5aa8b0a932eb",
  "licence": "U.S. NLM DailyMed ... may be freely used or reproduced ... label METADATA only ...",
  "attribution": "Source: National Library of Medicine (DailyMed).",
  "observed_at": "2026-08-19T00:00:00Z"
}
```

An unbilled `RUN_RECEIPT` records the robots check, the filters, SPLs seen and delivered, and whether charged equals delivered.

### Field reference

Each record is a flat set of label-tracking fields. Identity: `record_id` / `setid` (the stable SPL set id that keys a product's label across versions). What and who: `product_name` and `labeler_organization`, both parsed from the SPL title (which is also carried verbatim as `title`). The change signal: `spl_version` (increments on each label revision) and `published_date`. Optional: `ndcs`, the NDC package codes, populated only when `includeNdc` is enabled. Provenance: `source`, `source_url` (a direct DailyMed label link), `licence`, `attribution`, `disclaimer`, and `observed_at`.

### How a run works

A run first re-reads the source's robots posture from your runtime. DailyMed serves no robots file — `/robots.txt` redirects to the site homepage, which carries no directives — a no-policy posture; the run stops at the door only if that ever changes to a real disallow. It then reads the SPL list newest-first and flattens each label to one record, parsing the product and labeler out of the title. If you enabled NDC codes, it fetches each label's package codes with one extra paced request. Each record is delivered **before** it is charged, so a blocked or empty run costs you nothing; the actor follows the service's own `next_page_url` cursor, pauses briefly between pages, and stops at your `maxRecords` ceiling. The `charge_equals_delivered` flag in the receipt confirms you were billed for exactly what you received.

### Cost guidance

One `label_change_record` per delivered label: cost = labels delivered × your plan's per-record price. DailyMed carries about **158,681** SPLs. Scope with `drugName` to a single molecule (typically a few hundred to a couple thousand labels) to keep runs bounded. 1,000 labels is **$50** (Free) / **$33.50** (Gold). Enabling `includeNdc` adds one request per record — leave it off for the fastest, cheapest runs.

### Freshness

DailyMed publishes new and revised labels continuously, and this actor reads the list **newest-first**, so a small run returns the most recently published or updated labels across the entire drug universe — the freshest edge of the label stream. Because the SPL version and published date are carried on every record, you can diff two runs of the same `drugName` over time to detect exactly which products had a label version bump between them, which is the core change-tracking workflow this feed is built for. The `db_published_date` the service reports is also surfaced in the run receipt so you know how current the underlying database snapshot is.

### Honest limitations

- **Metadata only.** The label body text is not included — this is the SPL index (set id, product, labeler, version, date) plus optional NDC codes.
- **Product/labeler are parsed from the SPL title**, which follows DailyMed's `PRODUCT [LABELER]` convention; the full title is always carried verbatim so you can re-parse if needed.
- **A version bump is the change signal** — this actor surfaces the current version and date, not a field-level diff of what changed inside the label.
- **NDC codes are opt-in** (one extra request per record).
- **No person data** is emitted.

### Differentiation

Distinct from **fda-recall-risk-records** in this fleet: a recall is a product being pulled from the market, not a label revision. It is also distinct from **fleet-1's fda-drug-approvals**: an approval is a market-entry decision, not the ongoing label content/version that DailyMed distributes. Both are named so buyers pick the right one.

### The NexGen Signal family

Part of the NexGen Signal family of official-source, pay-per-record products:

- [FDA Device Clearance Records — 510(k)](https://apify.com/nexgensignal/fda-device-clearance-records)
- [FDA Recall Risk Records — openFDA](https://apify.com/nexgensignal/fda-recall-risk-records)
- [Federal Rulemaking Records — US Federal Register](https://apify.com/nexgensignal/federal-rulemaking-records)
- [Grant Opportunity Records — US Grants.gov](https://apify.com/nexgensignal/grant-opportunity-records)
- [EU Regulatory Change Records — EUR-Lex](https://apify.com/nexgensignal/eu-regulatory-change-records)

*Source: U.S. National Library of Medicine (DailyMed) SPL v2 web service. NLM works are U.S. Government works, free to use with attribution; individual label content may include third-party material, so this actor carries label metadata only. Reformatted to product/org records; values verbatim; no person data emitted.*

# Actor input Schema

## `drugName` (type: `string`):

Optional. Keep only SPLs whose drug name matches (e.g. metformin).

## `includeNdc` (type: `boolean`):

If enabled, fetch each SPL's NDC package codes (one extra request per record, slower).

## `maxRecords` (type: `integer`):

Maximum records delivered and billed. You are billed only for records delivered.

## Actor input object example

```json
{
  "includeNdc": false,
  "maxRecords": 500
}
```

# Actor output Schema

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

The delivered DailyMed SPL label records.

# 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 = {
    "maxRecords": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgensignal/drug-label-change-records").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 = { "maxRecords": 500 }

# Run the Actor and wait for it to finish
run = client.actor("nexgensignal/drug-label-change-records").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 '{
  "maxRecords": 500
}' |
apify call nexgensignal/drug-label-change-records --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexgensignal/drug-label-change-records"
        }
    }
}

```

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/b6A1MvPoIiqaE93ur/builds/Xx9Jgm3WKJO89iRUM/openapi.json
