A complete technical reference covering NDC structure, GTIN architecture, the GS1 Healthcare NDC-to-GTIN embedding mechanism, DSCSA serialization requirements, the FDA NDC12 final rule (March 2026), and the GS1 AI 715 decoupling strategy.
The National Drug Code (NDC) is the FDA's standard unique identifier for drugs marketed in the United States. Established under Section 510 of the Federal Food, Drug, and Cosmetic Act (21 U.S.C. 360), the NDC is required for every drug product intended for commercial distribution.
The NDC is a three-segment numeric code, where each segment carries distinct meaning:
| Segment | Name | Assigned By | Identifies |
|---|---|---|---|
| 1st | Labeler Code | FDA | The entity responsible for the drug: manufacturer, repacker, relabeler, or private label distributor |
| 2nd | Product Code | Labeler (accepted by FDA) | A specific formulation: active ingredient(s), strength, dosage form |
| 3rd | Package Code | Labeler (accepted by FDA) | The specific package size and type (e.g., bottle of 100, blister pack of 30) |
The NDC covers: human prescription drugs, over-the-counter (OTC) drugs, approved and unapproved drugs, repackaged and relabeled drugs, and compounded drugs from 503B outsourcing facilities.
Excluded: animal drugs (separate directory), blood products, drugs not intended for commercial distribution.
The current FDA-assigned NDC is a 10-digit, 3-segment number. The total digit count across all three segments is always 10, but the number of digits in each segment varies. Per 21 CFR 207.33(b), three valid configurations exist:
| Configuration | Labeler | Product | Package | Total | Example |
|---|---|---|---|---|---|
| 4-4-2 | 4 digits | 4 digits | 2 digits | 10 | 0591-0369-01 |
| 5-3-2 | 5 digits | 3 digits | 2 digits | 10 | 79903-376-10 |
| 5-4-1 | 5 digits | 4 digits | 1 digit | 10 | 80425-0302-1 |
The 11-digit NDC was not created by FDA. It originated from the HIPAA Administrative Simplification final rule (August 17, 2000 — 65 FR 50312). When HHS adopted the NDC as the standard medical data code set for drugs in electronic transactions, it established a uniform 11-digit format to conform with customary practice used in computer systems.
The HIPAA 11-digit NDC is always 5-4-2: Labeler (5) + Product (4) + Package (2) = 11 digits total.
| 10-digit Config | Short Segment | Padding Applied | 10-digit Example | 11-digit Result |
|---|---|---|---|---|
| 4-4-2 | Labeler (4→5) | 0 prepended to labeler | 0591-0369-01 | 00591-0369-01 |
| 5-3-2 | Product (3→4) | 0 prepended to product | 79903-376-10 | 79903-0376-10 |
| 5-4-1 | Package (1→2) | 0 prepended to package | 80425-0302-1 | 80425-0302-01 |
Key properties: exactly one leading zero is added in every case; each 10-digit NDC maps to exactly one 11-digit NDC (bijective); the conversion is deterministic only when you know the segment configuration.
HIPAA electronic claims (EDI 837), CMS/Medicare/Medicaid billing systems, pharmacy benefit managers (PBMs), electronic health records (EHR), RxNorm (NLM's normalized drug naming system), and the NSDE (FDA's Comprehensive NDC SPL Data Elements File).
When hyphens are removed from a 10-digit NDC, the resulting 10-character digit string is ambiguous. Without knowing the original segment configuration, you cannot determine where the segment boundaries fall.
The string 0591036901 (10 digits, no hyphens) can be parsed three ways:
| Parse | Config | Labeler | Product | Package | 11-digit Result |
|---|---|---|---|---|---|
| A | 4-4-2 | 0591 | 0369 | 01 | 00591036901 |
| B | 5-3-2 | 05910 | 369 | 01 | 05910036901 |
| C | 5-4-1 | 05910 | 3690 | 1 | 05910369001 |
The problem escalates once FDA begins assigning 6-digit labeler codes. A native 11-digit NDC in configuration 6-3-2 would produce the same digit count as the HIPAA 11-digit standard (5-4-2). Without hyphens, these become indistinguishable — identical strings pointing to different drugs. This collision is the primary technical driver for the NDC12 rule.
Per 21 CFR 201.25, the NDC must appear on drug labels as a 10-digit number in one of the three valid configurations, displayed with hyphens between segments. A barcode encoding the NDC must also be present.
| Field | Format | Example |
|---|---|---|
| ProductNDC | 2-segment, hyphenated (labeler-product) | 0591-0369 |
| NDCPackageCode | 3-segment, hyphenated (labeler-product-package) | 0591-0369-01 |
11-digit, no hyphens, no spaces: 00591036901
| Field | Format | Chars | Purpose |
|---|---|---|---|
| NDC_RAW | As received from FDA (hyphenated) | varchar(13) | Preserves segment boundaries |
| NDC_DIGITS | Digits only, no hyphens | varchar(10) | Ambiguous — avoid for matching |
| NDC11 | 5-4-2 zero-padded, no hyphens | char(11) | HIPAA canonical form — best for matching |
| NDC11_DISPLAY | 5-4-2 zero-padded, with hyphens | char(13) | Human-readable 11-digit |
| NDC12 | 6-4-2 zero-padded, no hyphens | char(12) | Future-proof (post-2033) |
| NDC12_DISPLAY | 6-4-2 zero-padded, with hyphens | char(14) | Future human-readable |
The NDC Directory is updated daily. Products are excluded from the main download if flagged:
E — non-complianceU — expired certificationI — FDA-inactivatedD — discontinuedThe Global Trade Item Number (GTIN) is the GS1 standard identifier for trade items worldwide. All GTIN formats share the same logical structure — they differ only in total digit length. Every GTIN ends with a check digit.
| Format | Digits | Barcode Symbology | Primary Use |
|---|---|---|---|
| GTIN-8 | 8 | EAN-8 | Very small consumer items |
| GTIN-12 | 12 | UPC-A | U.S./Canada retail point-of-sale |
| GTIN-13 | 13 | EAN-13 | International retail POS |
| GTIN-14 | 14 | ITF-14, GS1-128, GS1 DataMatrix | Cases, pallets, inner packs, serialized pharma |
All GTIN formats are stored in databases as 14-digit strings by left-padding with zeros:
000000 + 8 digits00 + 12 digits0 + 13 digitsThis normalization ensures a single field type can hold any GTIN format and enables uniform lookup.
A GTIN-14 is exactly 14 digits, composed of four logical fields:
[Indicator Digit] [GS1 Company Prefix + Item Reference] [Check Digit]
1 digit 12 digits 1 digit
Critical constraint: GS1 Company Prefix + Item Reference always totals
exactly 12 digits. The split between prefix and reference is variable
(6-10 digit prefix, corresponding 6-2 digit reference), but the total is fixed.| Value | Meaning |
|---|---|
| 0 | Individual saleable unit (single item, bottle, vial) |
| 1-8 | Grouping levels — inner pack, case, pallet (exact meaning is company-defined) |
| 9 | Variable measure trade item (sold by weight, volume, etc.) |
Position: 1 2 3 4 5 6 7 8 9 10 11 12 13 14
[IND] [----GS1 Company Prefix----] [--Ref--] [CD]
|<--------- 12 digits --------->|The GS1 standard uses a Modulo-10 algorithm with alternating weights of 3 and 1. This applies to GTIN-8, GTIN-12, GTIN-13, GTIN-14, SSCC, and all other GS1 key identifiers.
(10 - (sum mod 10)) mod 10GTIN-14 first 13 digits: 0 3 6 1 4 1 4 9 9 9 9 5 1
Sum = 0+3+18+1+12+1+12+9+27+9+27+5+3 = 127
Check digit = (10 − (127 mod 10)) mod 10 = (10 − 7) mod 10 = 3
Full GTIN-14: 03614149999513
def gs1_check_digit(digits: str) -> int:
"""Calculate GS1 Mod-10 check digit for any GS1 key identifier."""
total = 0
for i, d in enumerate(digits):
weight = 3 if (i % 2 == 0) else 1 # position 1 = index 0 = weight 3
total += int(d) * weight
return (10 - (total % 10)) % 10GS1 US reserved the GS1 Prefix "03" specifically for U.S. FDA NDC Labeler Code holders. This is the bridge between the FDA's NDC system and GS1's global GTIN system.
| FDA Labeler Code | GS1 Company Prefix | Length |
|---|---|---|
| 4-digit (e.g., 0591) | 03 + 0591 = 030591 | 6-digit GCP |
| 5-digit (e.g., 12345) | 03 + 12345 = 0312345 | 7-digit GCP |
This is the critical mechanism by which the pharmaceutical supply chain identifies drugs using GS1 barcodes while maintaining traceability back to the FDA NDC.
GTIN-14 = [Indicator] + "03" + [10-digit NDC] + [Check Digit]
= [1 digit] + [2] + [10 digits] + [1 digit]
= 14 digits
Where:
Indicator = 0 for unit-of-use, 1-8 for groupings (case, pallet)
"03" = GS1 prefix for FDA labelers
NDC10 = all 10 digits without hyphens, in original segment order
Check Digit = GS1 Mod-10 calculated over positions 1-13Drug: NDC10 0409-4921-34 (4-4-2), indicator digit = 1 (case level)
Positions 1-13: 1 0 3 0 4 0 9 4 9 2 1 3 4 Check digit: 8 GTIN-14: 10304094921348
Position: 1 2 3 4 5 6 7 8 9 10 11 12 13 14
[IND] [0] [3] [L] [L] [L] [L] [L] [P] [P] [P] [K] [K] [CD]
(0) "03" prefix 5-digit 3-digit 2-digit
labeler product packagePosition: 1 2 3 4 5 6 7 8 9 10 11 12 13 14
[IND] [0] [3] [L] [L] [L] [L] [P] [P] [P] [P] [K] [K] [CD]
(0) "03" prefix 4-digit 4-digit 2-digit
labeler product packageGTIN-14: 0 0 3 L L L L L P P P K K CD
^ ^ ^ ^
| | | |
| +--+-- strip "03" prefix +-- strip check digit
+-- strip indicator
NDC10 = positions 4-13 (10 digits, no hyphens)GTIN-12: 0 3 L L L L L P P P K CD
^ ^ ^
+--+-- strip "03" +-- strip check digit
NDC = positions 3-11 (9-10 digits depending on config)The Drug Supply Chain Security Act (Title II of FDASIA, signed November 2013, codified at 21 U.S.C. 360eee et seq.) established a phased U.S. electronic track-and-trace system for prescription drugs.
| Element | Description | Format |
|---|---|---|
| NDC | National Drug Code | 3-segment, hyphenated (human-readable) |
| Serial Number | Unique per unit within a lot | Up to 20 alphanumeric characters |
| Lot/Batch Number | Manufacturing lot | Up to 20 alphanumeric characters |
| Expiration Date | Product expiry | YYMMDD |
| GS1 AI | Field | Format | Example |
|---|---|---|---|
| (01) | GTIN | Fixed 14-digit numeric | (01)10303300074376 |
| (21) | Serial Number | Variable, up to 20 alphanum | (21)A1B2C3D4 |
| (10) | Lot Number | Variable, up to 20 alphanum | (10)LOT123 |
| (17) | Expiration Date | 6-digit YYMMDD | (17)280531 |
| Phase | Date | Requirement |
|---|---|---|
| Manufacturer serialization | November 2017 | Affix PI to saleable units |
| Repackager serialization | November 2018 | Affix PI to repackaged units |
| Trading partner verification | November 2019 | Wholesalers must verify PI |
| Dispenser verification | November 2020 | Pharmacies must handle serialized product |
| Full electronic interoperability | November 2024 | Full EPCIS-based item-level trace |
| Attribute | Value |
|---|---|
| Title | Revising the National Drug Code Format and Drug Label Barcode Requirements |
| Published | March 5, 2026 |
| FR Docket | 2026-04368 |
| CFR Amended | 21 CFR 207.33 |
| Effective Date | March 7, 2033 |
| Transition Period | March 7, 2033 – March 6, 2036 |
| Hard Deadline | After March 7, 2036, enforcement for noncompliant labeling |
| Segment | Length | Purpose |
|---|---|---|
| Labeler Code | 6 digits | FDA-assigned |
| Product Code | 4 digits | Formulation, strength, dosage form |
| Package Code | 2 digits | Package size and type |
| Total | 12 digits | Single, uniform configuration |
Display format with hyphens: LLLLLL-PPPP-KK (e.g., 000591-0369-01)
| Current Config | Labeler Padding | Product Padding | Package Padding | Example (10-digit) | Example (12-digit) |
|---|---|---|---|---|---|
| 4-4-2 | +2 zeros | none | none | 0591-0369-01 | 000591-0369-01 |
| 5-3-2 | +1 zero | +1 zero | none | 79903-376-10 | 079903-0376-10 |
| 5-4-1 | +1 zero | none | +1 zero | 80425-0302-1 | 080425-0302-01 |
FDA's authority does not extend to HIPAA transaction standards. CMS will need to separately update the 11-digit HIPAA NDC billing standard to accept 12 digits. This requires separate HHS/CMS rulemaking.
| Date | Event |
|---|---|
| August 2018 | FDA public hearing and RFC on future NDC format |
| July 25, 2022 | Proposed rule published (FR docket 2022-15414) |
| November 22, 2022 | Comment period closed |
| February 2026 | Industry groups publicly pressure FDA to finalize |
| March 5, 2026 | Final rule published |
| March 7, 2033 | Effective date |
| March 7, 2036 | End of transition period |
This is the most technically disruptive aspect of the NDC12 transition.
Under the current system: GTIN-14 = [1 indicator] + "03" + [10-digit NDC] + [1 check digit] = 14 digits ✓ With NDC12: GTIN-14 = [1 indicator] + "03" + [12-digit NDC] + [1 check digit] = 16 digits ✗ OVERFLOW
| Class | GTIN Source | NDC Encoding | Barcode Model |
|---|---|---|---|
| Legacy | NDC-derived GTIN (embedded via '03' + NDC10) | NDC extractable from GTIN | Current AI (01) model |
| New (NDC12s from 2033+) | Separately assigned GTIN (decoupled) | NDC carried via AI 715 | New AI (01) + AI (715) model |
For legacy products (existing NDC10s converted to NDC12 via leading zeros), the original GTIN remains valid because the embedded 10-digit NDC hasn't changed — only the FDA's representation of it has gained leading zeros.
GS1 US developed a new Application Identifier (AI) 715 specifically for carrying a 12-digit NDC as a separate data element alongside the GTIN in GS1 barcodes.
Old model (current): (01) GTIN-14 <-- NDC is embedded inside the GTIN (21) Serial (10) Lot (17) Expiry New model (post-2033, new NDC12 products): (01) GTIN-14 <-- GTIN assigned independently, no NDC embedded (715) NDC12 <-- NDC carried as separate data element (21) Serial (10) Lot (17) Expiry
| Carrier | AI 715 Support | Post-2033 Viability |
|---|---|---|
| UPC-A (linear) | No — can only carry 12 digits total | Dead end for pharma. Cannot carry AI 715. |
| GS1-128 (linear) | Yes — supports multiple AIs | Viable but bulky |
| GS1 DataBar | Yes — supports multiple AIs | Viable for small packages |
| GS1 DataMatrix (2D) | Yes — preferred format | Recommended going forward |
When existing NDCs are converted to NDC12 via leading zeros, the 10-digit NDC embedded in the GTIN does not change. The GTIN itself remains valid. Existing serialized product in the supply chain is not affected by the format change alone.
New products assigned 12-digit NDCs from 2033 cannot have their NDC embedded in the GTIN. Their barcodes will use the AI 715 model.
Post-2033, a single 2D DataMatrix encoding AI (01) + AI (715) + AI (21) + AI (10) + AI (17) can satisfy both 21 CFR 201.25 labeling requirements and DSCSA requirements simultaneously, eliminating the need for dual barcodes on pharmaceutical labels.
| Date | Milestone |
|---|---|
| March 5, 2026 | Final rule published |
| 2026–2033 | 7-year preparation window (no format change yet) |
| March 7, 2033 | NDC12 effective: FDA begins issuing 12-digit NDCs, auto-converts all existing |
| 2033–2036 | 3-year transition: 10-digit labels tolerated in commerce |
| After March 7, 2036 | Enforcement begins for noncompliant labeling |
| Concern | Current State | Future-Proof Action |
|---|---|---|
| NDC field sizing | 10-11 chars typical | Expand to 12 chars (digits) / 14 chars (with hyphens) |
| NDC format field | Optional (segment config) | Add NDC_FORMAT enum: 10-DIGIT, 11-DIGIT, 12-DIGIT |
| GTIN field sizing | 14 chars (already correct) | No change needed |
| GTIN-NDC derivation | Algorithmic (extract from GTIN) | Must support both extraction and AI 715 lookup |
| NDC12 column | Does not exist | Add NDC12 / NDC12_DISPLAY fields (can be populated now via conversion) |
-- From NDC11 (5-4-2) to NDC12 (6-4-2): add 1 leading zero to labeler
-- NDC11: LLLLL-PPPP-KK (11 digits)
-- NDC12: 0LLLLL-PPPP-KK (12 digits)
SELECT '0' || NDC11_PACKAGE AS NDC12_PACKAGE,
'0' || SUBSTR(NDC11_PACKAGE_DISP, 1, 5) || SUBSTR(NDC11_PACKAGE_DISP, 6) AS NDC12_PACKAGE_DISP
FROM NDC_PACKAGE;
-- Note: This simple prepend works because the NDC11 5-4-2 format already has
-- the product and package segments at their target 4-2 lengths.
-- Only the labeler segment needs one more leading zero (5 -> 6).Input: Barcode scan data
IF AI (715) present:
NDC12 = AI (715) value
GTIN = AI (01) value
# NDC is NOT derived from GTIN
ELSE:
GTIN = AI (01) value
NDC10 = extract from GTIN (positions 4-13, strip "03")
NDC11 = zero-pad to 5-4-2
NDC12 = zero-pad to 6-4-2| Urgency | Action |
|---|---|
| Now (2026) | Add NDC12 columns, populate via conversion. No external dependencies. |
| By 2030 | Update GTIN processing logic to handle AI 715. Update barcode scanning. |
| By 2033 | Full dual-format support operational. FDA begins issuing native NDC12s. |
| By 2036 | All active products in 12-digit format. Legacy extraction still needed for historical data. |
| Format | Config | Total Digits | Who Uses It | Example (hyphenated) | Example (digits only) |
|---|---|---|---|---|---|
| FDA 10-digit | 4-4-2 | 10 | Drug labels, FDA directory | 0591-0369-01 | 0591036901 |
| FDA 10-digit | 5-3-2 | 10 | Drug labels, FDA directory | 79903-376-10 | 7990337610 |
| FDA 10-digit | 5-4-1 | 10 | Drug labels, FDA directory | 80425-0302-1 | 8042503021 |
| HIPAA 11-digit | 5-4-2 | 11 | Claims, billing, EHR, RxNorm | 00591-0369-01 | 00591036901 |
| FDA 12-digit (2033+) | 6-4-2 | 12 | All uses (future) | 000591-0369-01 | 000591036901 |
| Input | Output | Method |
|---|---|---|
| NDC10 → GTIN-14 | [0] + "03" + [NDC10] + [check] | Prefix '03', add indicator + check |
| GTIN-14 → NDC10 | Strip pos 1, 2-3, 14 | Remove indicator, '03', check digit |
| NDC12 → GTIN-14 | Not possible via embedding | Use AI 715 (separate field) |
| GTIN-14 + AI 715 → NDC12 | Read AI 715 value directly | No extraction from GTIN needed |
| AI | Field | Length | Format |
|---|---|---|---|
| (01) | GTIN | 14 fixed | Numeric |
| (10) | Lot/Batch | Up to 20 | Alphanumeric |
| (17) | Expiration | 6 fixed | YYMMDD |
| (21) | Serial Number | Up to 20 | Alphanumeric |
| (715) | NDC12 | 12 fixed | Numeric (new — post-2033) |
| Carrier | GTIN | Serial | NDC12 (AI 715) | Scanner Type |
|---|---|---|---|---|
| UPC-A (linear) | GTIN-12 only | No | No | Laser or camera |
| GS1-128 (linear) | GTIN-14 | Yes | Yes | Laser or camera |
| GS1 DataBar | GTIN-14 | Yes | Yes | Camera preferred |
| GS1 DataMatrix (2D) | GTIN-14 | Yes | Yes | Camera only |