FDA Drug Labels Monitor (openFDA SPL JSON)
Pricing
from $0.80 / 1,000 fda record delivereds
FDA Drug Labels Monitor (openFDA SPL JSON)
Return official US FDA data from openFDA as clean JSON in one Actor: drug labels (SPL), food enforcement recalls and drug shortages. Choose dataset=labels|recalls|shortages; filter by keyword, date, classification or status. Public CC0 data, keyless API, pay per event.
Pricing
from $0.80 / 1,000 fda record delivereds
Rating
0.0
(0)
Developer
Steadfetch
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Features
Share
openFDA Data Extractor
This Actor returns normalized US FDA data from the official openFDA APIs in clean JSON: drug labels, food recalls, and drug shortages. Choose which dataset to extract via the dataset parameter.
Tested daily. Last verified: 2026-10-30
What it does
- Queries the keyless public endpoints at
api.fda.govwith plain HTTP: no login, no CAPTCHA, no browser, no API key required. - Labels (
dataset: "labels"): Drug label (SPL) records with label id, set id, version, effective date, brand and generic names, manufacturers, indications and warnings text. - Recalls (
dataset: "recalls"): FDA food enforcement recalls with recall number, event id, report date, classification, product description, recalling firm, and location. - Shortages (
dataset: "shortages"): FDA drug shortage reports with generic/brand name, company, status, availability, therapeutic category, and dates. - Paginates 1,000 records per request (labels/recalls up to 5,000; shortages up to 20,000).
- Validates every item against the output schema before pushing; nothing unvalidated is delivered.
- Retries 429 rate limits with exponential backoff; stops gracefully if the limit persists.
- Deduplicates for billing safety (by label version, recall number, or shortage record key).
- The data is CC0 public domain and contains no personally identifiable information; only product-level fields are collected.
How to use
1. Extract drug labels
$apify call steadfetch/openfda-drug-labels-extractor --input='{"dataset":"labels","labels":{"search":"openfda.generic_name:\"SILICEA\""},"maxResults":10}'
2. Monitor Class I food recalls
$apify call steadfetch/openfda-drug-labels-extractor --input='{"dataset":"recalls","recalls":{"classification":"Class I","monitorMode":false},"maxResults":50}'
3. Extract current drug shortages
$apify call steadfetch/openfda-drug-labels-extractor --input='{"dataset":"shortages","shortages":{"status":["Current"],"monitorMode":false},"maxResults":50}'
Input
Required
| Field | Type | Description |
|---|---|---|
dataset | string (enum) | One of: labels, recalls, shortages. |
Dataset-specific parameters
Labels (dataset: "labels")
Pass as the labels property:
| Field | Type | Default | Description |
|---|---|---|---|
search | string | n/a | OpenFDA search syntax. Example: openfda.brand_name:"*aspirin*" |
effective_since | date (YYYY-MM-DD) | n/a | Keep labels effective on or after this date. |
Recalls (dataset: "recalls")
Pass as the recalls property:
| Field | Type | Default | Description |
|---|---|---|---|
since | date (YYYY-MM-DD) | 30 days before today | Inclusive lower bound for report date. |
until | date (YYYY-MM-DD) | Today (UTC) | Inclusive upper bound for report date. |
classification | string (select) | n/a | One of: Class I, Class II, Class III. |
state | string | n/a | Two-letter US state code. |
keyword | string | n/a | Case-insensitive substring in product/reason/firm. |
monitorMode | boolean | true | Only deliver new recalls (cross-run dedupe). |
Shortages (dataset: "shortages")
Pass as the shortages property:
| Field | Type | Default | Description |
|---|---|---|---|
status | array of strings | [] (all) | Filter by: Current, Resolved, To Be Discontinued. |
therapeuticCategory | array of strings | [] (all) | Filter by therapeutic category (case-insensitive). |
monitorMode | boolean | false | Only deliver new/changed records. Each checked record bills one monitor-check event. |
Common
| Field | Type | Default | Description |
|---|---|---|---|
maxResults | integer | 100 | Maximum records per dataset. Labels: 5,000 max. Recalls: 5,000 max. Shortages: 20,000 max. |
Example output
Labels example
{"dataset": "labels","url": "https://api.fda.gov/drug/label.json?search=id:%22ca7bbcc8-...%22","title": "SILICEA","scrapedAt": "2026-10-20T13:00:00.000Z","label_id": "ca7bbcc8-2354-375c-e053-2995a90a72a0","set_id": "0000025c-6dbf-4af7-a741-5cbacaed519a","version": "2","effective_time": "2021-09-02","brand_names": ["SILICEA"],"generic_names": ["SILICEA"],"manufacturers": ["Rxhomeo Private Limited d.b.a. Rxhomeo, Inc"],"indications": "INDICATIONS Condition listed above or as directed by the physician","warnings": "WARNINGS This product is to be used for self-limiting conditions."}
Recalls example
{"dataset": "recalls","url": "https://api.fda.gov/food/enforcement.json?search=recall_number:%22H-1407-2026%22","recall_number": "H-1407-2026","report_date": "2026-10-07","classification": "Class I","product_description": "Todd's Seeds Salad Sprouting Mixture","recalling_firm": "TODD'S SEEDS LLC","scrapedAt": "2026-10-20T08:00:00.000Z"}
Shortages example
{"dataset": "shortages","url": "https://api.fda.gov/drug/shortages.json","genericName": "Lisdexamfetamine Dimesylate Capsule","brandName": "VYVANSE","companyName": "Takeda Pharmaceuticals USA Inc.","status": "Current","updateDate": "2026-10-15","scrapedAt": "2026-10-20T04:00:00.000Z"}
Pricing
| Event | Charged when | Price |
|---|---|---|
apify-actor-start | a run starts | 0.00005 USD per run |
apify-default-dataset-item | a validated record is saved | 3.00 USD per 1,000 records |
monitor-check | shortages monitor mode only | 0.05 USD per 1,000 checks |
Works on the Apify free plan - hundreds of records for the $5 monthly credit.
FAQ
Do I need an API key? No. openFDA is keyless; the data is public domain (CC0).
Does it return personal data? No. Only product-level fields are mapped; no patient, prescriber or contact data is collected.
What is monitor mode? Monitor mode remembers records already delivered (by filter stream for recalls, by record snapshot for shortages) and only pushes new or changed ones. This prevents duplicate charges across runs.
What happens when openFDA rate-limits? 429 responses are retried with exponential backoff; if the limit persists the Actor stops pagination gracefully and returns the records already collected.
Maintenance
This Actor is tested daily against the live openFDA APIs with minimal input (labels, openfda.generic_name:"SILICEA", 10 results). A green daily test confirms the extraction pipeline -- query, pagination, and schema validation -- is working. Any break is triaged by the regulatory vertical owner and fixed before the next scheduled run.
Changelog
| Date | Change |
|---|---|
| 2026-10-29 | Unified three actors (labels, recalls, shortages) into one Actor with dataset parameter (STE-557). |