Drug reference / DOCUMENTED CSV
FDA NDC Product & Package Reference
Enrich package NDCs with product attributes and ingredient records, with a checked join that preserves your input rows and quantities.
FDA source edition 2026-10-09 · first paid ACD release
01 / KNOW THE FIT
A useful join starts
with a clear meaning.
What you can do with it
Add product names, labelers, dosage forms and other FDA source attributes to an NDC-coded inventory or research table. The included Python script preserves every input row and flags unresolved codes; no data upload is needed.
What one row means
The main packages.csv has one original FDA packaging-list entry per product_id and package_index. products.csv has one source product record per product_id. ingredients.csv has one source ingredient-list entry per product_id and ingredient_index. List positions and record IDs are snapshot keys, not guaranteed stable across editions.
Unique keyproduct_id + package_index
How to join it
Keep input NDCs as text. join.py accepts supported hyphenated package codes or 11 ASCII digits, counts source candidates, and adds attributes only for a unique product. It keeps missing, unsupported, absent and ambiguous codes in the output. Multiple package entries for one product are flagged for review; no package date is selected. Ingredients are counted rather than expanded.
Coverage, with the edges visible
138,339 source product records, 256,752 package entries and 222,261 ingredient entries. The package table contains 256,748 distinct source codes, of which 256,746 have supported normalized keys. Two unsupported entries remain in the source table. These are snapshot counts, not a buyer match-rate estimate.
Keep in mind
- FDA listing does not establish approval, payer eligibility, current stock or availability. This is a data preparation product, not a clinical decision tool.
- The source is a dated snapshot. No historical transaction matching, RxNorm, ATC, Orange Book or standardized ingredient linkage is included.
- Four package codes have repeated entries with differing marketing dates; 1,909 product NDCs occur in multiple source records. Neither code should be assumed unique without checking the documented grain.
- Dates stay as source text: 37,798 package start dates are not YYYYMMDD. Blank end dates do not prove a product is active. Routes remain JSON arrays and strengths remain unconverted text.
- Unsegmented 10-digit input codes are not guessed. No ingredient records means the source supplied none, not that the product is ingredient-free.
Source bytes, staging tables and processing code are retained separately. We validate table keys and relationships, preserve source labels and missing values, audit repeated codes and date formats, and normalize only explicit supported identifiers. The worked example preserves eight rows and 124 units where an unchecked expansion produces 12 rows and 174 units.
02 / TRY THE SHAPE
Real rows. Before you buy.
These are the first three rows from the delivered CSV, showing 4 of 8 fields. The free download contains the first five rows and all 8 fields; it is a format sample, not a coverage test.
| package_ndc | product_id | package_index | description |
|---|---|---|---|
| 0002-0013-03 | 0002-0013_15810e26-b479-41b8-9d13-9dc503a71a2a | 1 | 3 mL in 1 VIAL, MULTI-DOSE (0002-0013-03) |
| 0002-0013-10 | 0002-0013_15810e26-b479-41b8-9d13-9dc503a71a2a | 2 | 10 mL in 1 VIAL, MULTI-DOSE (0002-0013-10) |
| 0002-0095-00 | 0002-0095_15810e26-b479-41b8-9d13-9dc503a71a2a | 1 | 3 mL in 1 SYRINGE (0002-0095-00) |
03 / NO GUESSING
Main table fields, explained.
The main table’s field dictionary from the current download. CSV has no built-in types; these are the intended import types.
Full dictionary: products, packages, ingredients, code index and enriched output →
| Field | Type | Meaning |
|---|---|---|
product_id | text | FDA source record ID; primary/foreign key within this snapshot, not guaranteed stable across editions. |
package_index | text | One-based source packaging-list position within product_id; not a durable package ID. |
package_ndc | text | FDA package ndc; source text preserved, blank means not supplied. No independent verification. |
package_ndc_record_count | text | Source entries with this package code within this product, including the current entry. |
description | text | FDA description; source text preserved, blank means not supplied. No independent verification. |
marketing_start_date | text | Unmodified source date text. Formats vary; blank means not supplied. See quality_report.json before parsing or filtering. |
marketing_end_date | text | Unmodified source date text. Formats vary; blank means not supplied. See quality_report.json before parsing or filtering. |
sample | text | FDA sample; source text preserved, blank means not supplied. No independent verification. |
04 / INSIDE THE DOWNLOAD
Data, with its context.
One ZIP · 18.3 MB · 18 files. No account or subscription required.
README.mdImport guidance, method, attribution, and limitationsall_tables_dictionary.jsonFields for all reference tables and enriched outputdata_dictionary.jsonTypes and definitions for every fielddemo_summary.jsonVerified arithmetic for the synthetic inventory exampleexample/expected.csvExpected enriched output, preserving every line and quantityexample/ingredients.csvSelected real ingredient entries for the exampleexample/input.csvEight synthetic inventory lines for the worked exampleexample/packages.csvSelected real package entries for the exampleexample/products.csvSelected real product records for the exampleingredients.csvPreserved ingredient entries for each source productjoin.pyLocal enrichment script; preserves input rows and reports unresolved codesmetadata.jsonSource provenance, production time, counts, and CSV checksumndc11_index.csvNormalized package-code keys with all candidate product IDs and countspackages.csvMain prepared table · UTF-8 CSVproducts.csvFDA source product records, keyed by product_idprovenance.jsonRetained source identifiers, URLs and file checksumsquality_report.jsonMissingness, repeated codes, unsupported identifiers and source-date auditrevision.jsonChanges and free-upgrade eligibility for this ACD revision
05 / DATES THAT MEAN SOMETHING
Sources, versions & changes.
Source versions identify the inputs. Our processing revision describes how we prepare them. Either kind of change creates a new ACD release; the package date records when it was built.
Current source versions
- FDA source edition
- 2026-10-09
- ACD processing
- Reviewed enrichment recipe 1; first paid package
- Package prepared (UTC)
Data provided by the U.S. Food and Drug Administration; submitted by labelers and independently prepared by Actually Clean Data. No agency endorsement.
RELEASE HISTORY
Oct 13, 2026 · current package (UTC)
First paid FDA reference release. The tables and checked enrichment logic match the reviewed October pilot. This launch uses the retained October 9 source; it does not claim a new FDA edition. Processing improvements for this source edition are included free.
The public pilot provided a small worked example. Its synthetic inventory quantities demonstrate join behavior, not a representative customer match rate.
Try the inventory join and inspect the full field dictionaryProcessing corrections and improvements for your purchased source edition are free. Genuinely new source editions may be sold separately. See the update policy and access instructions.
Check the downloaded CSV’s integrity
The metadata file inside the ZIP records this SHA-256 checksum for packages.csv. A matching checksum confirms identical CSV bytes.
f8e5dda26834756f4a386269f59d38ce82e7f74a5d888a2f0cf3b910951a681aREADY TO PUT IT TO WORK?
FDA NDC Product & Package Reference
$29 USD · one time · 256,752 package entries