Guide · Checked against the live API on September 23, 2026

How to download supplement label data from the NIH DSLD API.

The Dietary Supplement Label Database, run by the NIH Office of Dietary Supplements, holds declared label panels for U.S. supplements and serves them from a free JSON API with no key. It is public domain (CC0 1.0). This guide shows the calls that work, the fields worth reading, and the one assumption that quietly breaks most integrations built on it.

The base URL is https://api.ods.od.nih.gov/dsld/v9/. search-filter takes a query term in q (quote it for an exact phrase, or pass * for no term) and optional filters. The default page size is 1,000, so set size yourself.

EVERY C4 ORIGINAL LABEL CELLUCOR FILED, NEWEST FIRST

curl -s "https://api.ods.od.nih.gov/dsld/v9/search-filter?\
q=%22C4%20Original%22&brand=Cellucor&status=2&\
sort_by=entryDate&sort_order=desc&size=5" \
  | jq '.hits[]._source | {fullName, entryDate, offMarket}'

The filters worth knowing, as the API documents them:

  • status: market status, 2 all, 1 on market, 0 off market.
  • brand, product_name, ingredient_name: comma-separated; each must contain the term.
  • apply_synonyms: whether an ingredient filter also matches synonyms and alternate names (on by default).
  • ingredient_category and product_type: controlled codes, for example amino_acid or a1305 (Amino Acid/Protein).
  • date_start, date_end: four-digit years, filtered on the entry date. Read section 4 before relying on them.
  • from, size: pagination.

A product is usually several labels. DSLD indexes one label per flavor and filing, so the query above returns separate records for Watermelon, Cherry, Frozen Bombsicle and the rest. Group by what you actually mean before you count anything.

2. Read one label

label/{id} returns the full declared panel for one DSLD id.

ONE LABEL

curl -s https://api.ods.od.nih.gov/dsld/v9/label/82628 \
  | jq '{fullName, brandName, entryDate, offMarket, servingsPerContainer,
         events, ingredients: [.ingredientRows[] | {name, quantity: .quantity[0]}]}'

Fields you will use most:

  • ingredientRows: each declared line with its quantity array (amount and unit as printed, for example 1.6 and Gram(s)).
  • otheringredients, statements, claims: the rest of the label text.
  • servingSizes, servingsPerContainer, netContents, upcSku.
  • offMarket and events: the repository's own lifecycle notes.

3. Browse brands and products

  • brand-products?q=<brand>: every product label for one brand, paginated.
  • browse-brands and browse-products: listings by keyword or letter (method is required).
  • ingredient-groups?term=<term>&method=<method>: ingredient groups, optionally matched against fact-sheet synonyms.
  • search-filter-histogram: the same filters as search-filter, returned as counts over time.

NIH asks testers to keep size small (it suggests 10 when exploring). The full API reference is at api.ods.od.nih.gov/dsld/v9 and the NIH guide at dsld.od.nih.gov/api-guide.

4. The date trap

entryDate is when a label was entered into DSLD. It is not when the product launched, and it is not a date on which the product carried that label. The label with id 82628, C4 Original Watermelon, was entered on February 23, 2018 and carries an Off Market event dated March 22, 2022. Neither date says when that formula was on a shelf, and neither says when Cellucor changed it.

FormulaSignal treats every DSLD panel as exactly that: an exact declared formula with no timing. The Record stores the entry date as metadata about the filing and never as an observation of the product, and a DSLD panel alone never lets a product claim a dated state. If your integration sorts “versions” by entry date, it will eventually tell a user the wrong formula is current.

5. When you need something else

DSLD answers “what does this filed label declare”. It does not answer “what does the product on sale declare today”, “when did it change”, or “what does it cost per serving”. Those need dated first-party observations, which is what the FormulaSignal Record holds for the products it covers: the current label with the date it was read, earlier states where they were recovered, reviewed formula changes with both sources, and observed prices.

THE SAME QUESTION, WITH DATES

curl -s https://formulasignal.com/api/v1/products/resolve \
  -H "Authorization: Bearer $FORMULASIGNAL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"identifier":"C4 Original"}'

Use DSLD for breadth and FormulaSignal for dated depth; they answer different questions. The quickstart gets a free key in a few minutes, the evidence model explains which date means what, and the MCP server gives an agent the same Record.