FDA NDC Pharmaceutical Labeler & Product Intelligence avatar

FDA NDC Pharmaceutical Labeler & Product Intelligence

Pricing

$6.50 / 1,000 unique ndc products

Go to Apify Store
FDA NDC Pharmaceutical Labeler & Product Intelligence

FDA NDC Pharmaceutical Labeler & Product Intelligence

Extract official FDA NDC prescription and OTC product listings with labeler filters, full packaging and ingredient arrays, and JSON/CSV exports. One row per unique product.

Pricing

$6.50 / 1,000 unique ndc products

Rating

0.0

(0)

Developer

AFK Digital

AFK Digital

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Categories

Security

Limited permissions

Share

Extract structured pharmaceutical product listings from the official openFDA NDC Directory API. Filter prescription and OTC products by product-level marketing start date, product type, dosage form and labeler. Deliver one unique product per row with complete packaging and active ingredient arrays, source links and UTC retrieval timestamps.

Quick start

Run with the default input; no openFDA key is needed for the tested example:

{"maxResults":20,"maxChargeUsd":1}

Twenty products cost $0.13 in product events. The Actor stops at the earliest result or spending limit. The default example is designed to finish within five minutes; availability depends on the upstream API.

Prescription tablet example:

{
"productType":"HUMAN PRESCRIPTION DRUG",
"dosageForm":"TABLET",
"marketingStartDateFrom":"2025-01-01",
"marketingStartDateTo":"2026-10-29",
"maxResults":100,
"maxChargeUsd":0.65
}

OTC example:

{"productType":"HUMAN OTC DRUG","maxResults":50,"maxChargeUsd":0.325}

For an exact labeler query, use its full FDA spelling, for example Padagis Israel Pharmaceuticals Ltd. All text filters are exact, case-sensitive matches and combine with AND. Dates are inclusive and accept YYYY-MM-DD or YYYYMMDD. They describe the labeler's reported marketing start, not when the record was discovered or published. The unfiltered source also includes bulk ingredients and drugs for further processing; use productType to select your scope.

Output

JSON retains missing values as null and preserves every object and field in packaging and active_ingredients, including strengths, package NDCs, dates and sample flags.

FieldMeaning
product_ndcProduct identifier, retained as a string
generic_name, brand_nameNames reported in the listing, or null
labeler_nameListing labeler; no physical manufacturer inference
dosage_form, product_typeFDA source values
marketing_start_dateProduct-level source date, YYYYMMDD, or null
packagingComplete array of package objects, or null
packaging_descriptionArray of descriptions aligned with packages; missing descriptions are null
active_ingredientsComplete array of ingredient objects, or null
packaging_text, active_ingredients_textReadable joined text for CSV/workflows
packaging_json, active_ingredients_jsonJSON strings for lossless roundtrip from CSV
source_urlProduct lookup on official FDA API, without credentials
fetched_atUTC ISO 8601 retrieval timestamp
source_last_updatedFDA dataset metadata timestamp

One row represents a product, not an individual package. No package explosion or ingredient truncation occurs. If the live source repeats a product NDC during a run, the first complete source record encountered is retained; later duplicates are skipped. This is not a historical revision archive. Source changes during traversal can affect coverage.

Export JSON for nested arrays. Use the Unique NDC products Dataset view for readable CSV. Select the JSON string columns to keep nested data losslessly in CSV; parse them with JSON.parse in n8n or a Clay transformation. CSV empty cells correspond to missing values; JSON is authoritative for distinguishing null from empty strings.

Clay, n8n and API use

Run this Actor with JSON input using Apify's integration or an HTTP request. Read the returned defaultDatasetId and request:

GET https://api.apify.com/v2/datasets/DATASET_ID/items?format=json&clean=true
GET https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&clean=true&view=overview

Use an Authorization Bearer header for private datasets. Never put Apify credentials into shareable URLs. Upsert into Clay or a database using product_ndc. Each new Actor run is billed independently; deduplication is within a run, including already saved IDs recovered after a restart.

The output panel also links to RUN_SUMMARY, which records saved product counts, duplicate/invalid skips, pages, request attempts, stop reason and source update date. Source failure after partial progress leaves delivered products accessible and marks the run FAILED.

Pricing and spending limits

Pay per event: $0.0065 per successfully saved unique product ($6.50 / 1,000). The only priced event is apify-default-dataset-item. No startup, HTTP request, retry, package or ingredient event is charged. Platform usage is covered by the developer in standard runs. No subscription or rental fee is configured.

The default product budget is $1 and default result limit is 20. The Actor floors the budget to whole products, respects Apify's per-run maximum charge, and stops when another product cannot fit. Hard caps: 10,000 products, $65 product budget, 900 FDA attempts and 240 seconds collection time. Users may lower all caps. Zero product budget returns no products and makes no FDA request.

Only saved product rows are billed; error metadata and summaries are not dataset products. Restart recovery reads existing product IDs and skips them. HTTP retries do not write or bill rows.

API limits and reliability

The official endpoint is https://api.fda.gov/drug/ndc.json. Current live validation accepted limit=1000; default page size is 100. Some older endpoint documentation still says 100. The general query documentation specifies 1,000 and skip up to 25,000. This Actor follows FDA's trusted HTTPS Link: rel=next search_after cursor, rather than using skip to cross the 26,000-hit window.

Published FDA quotas: without a key, 240 requests/minute/IP and 1,000/day/IP; with a key, 240/minute/key and 120,000/day/key. Documentation contains mixed wording about key requirements; the default was verified without a key. Shared Apify IP usage can exhaust anonymous quotas. An optional secret apiKey uses HTTP Basic authentication; it is excluded from output URLs and application logs.

Requests run sequentially at 120/minute by default, capped at 180/minute. Timeouts default to 30 seconds; transient HTTP 408/429/5xx and network failures get up to four retries with exponential backoff, jitter and Retry-After handling. Quotas are never bypassed. No browser, Playwright or proxy is used. Empty searches return an empty dataset; unexpected responses and exhausted safety limits fail visibly.

Interpretation and source rights

A labeler may be a manufacturer, repackager, relabeler or entity distributing under its own label. This Actor does not identify verified physical manufacturers or contract packagers.

An NDC listing is not FDA product approval. FDA has not necessarily verified submitted listing information. Do not infer safety, effectiveness, reimbursement eligibility or commercial availability from a row. This product supports data research and workflow enrichment, not medical decisions.

openFDA data is generally public domain/CC0 unless otherwise marked, including commercial reuse subject to its terms and third-party rights. This Actor adds filtering, preservation, export and delivery; it does not claim exclusive ownership of FDA data or FDA endorsement.

Sources:

Development

Python 3.13; official Apify Python SDK; stdlib HTTP/JSON.

python -m unittest discover -s tests -v
python -m src.main

See INPUT.json for local input. Store publication and release evidence are maintained separately from the product source.