Open Food Facts Product Database (Hugging Face Parquet Mirror)

Datadory delivers open food facts product database data covering 4,758,598 crowd-built product rows - roughly 4.69 million foods plus 73,400 beauty items - keyed one row per barcode across 111 documented columns of brands, category trees, multilingual ingredient lists, a nested nutrient struct, Nutri-Score and NOVA grades, packaging, provenance and app-scan counts, built up since 2012 from products scanned in 150+ countries.

What is the Open Food Facts Product Database (Hugging Face Parquet Mirror)?

Open Food Facts product data is the barcode-level census of what shoppers actually pick up: 4,758,598 crowd-contributed products - roughly 4.69 million foods plus 73,400 beauty items - each one a row keyed on its EAN barcode across 111 documented columns. The record stacks seven layers on that single key: identity (barcode, localized product names, brands), classification (category, food-group, label and country tag hierarchies), composition (ingredient lists kept per language, additive counts, allergen panels), a nested nutrient struct carrying values per 100 grams, per serving and prepared, the scoring trio (Nutri-Score letter, NOVA processing group, environmental grade), packaging components, and provenance down to the contributor who entered it and when.

It sits on the Consumer Finance shelf deliberately. Regulator surveys measure households; this measures the till - brand by brand, category by category, market by market, with app-scan counts attached as a demand signal. Against a catalog average of 7.81, it scores 9/10 on our rubric, carried by verified field definitions, an ungated pipeline-ready Parquet distribution and continuous contribution flow since 2012.

Get a sample of this dataset cut to your brands, categories or markets before you commit.

What do product records look like?

Two real rows captured during verification, shaped exactly as a sample lands:

PRODUCT ROWS - one row per barcode
| code         | product_name                                   | brands  | categories_tags                          | quantity | countries_tags     | nutriscore_grade | nova_group |
| ------------ | ---------------------------------------------- | ------- | ---------------------------------------- | -------- | ------------------ | ---------------- | ---------- |
| 0000101209159| Véritable pâte à tartiner noisettes chocolat noir | Bovetti | en:breakfasts, en:spreads, en:hazelnut-spreads | 350 g    | en:france          | e                | 3          |
| 0000105000011| Chamomile Herbal Tea                           | Lagg's  | -                                        | 1 g      | en:united-states   | unknown          | 1          |

Read them as checkable claims. The first is a French-market hazelnut-chocolate spread from Bovetti in a 350 g pack, graded Nutri-Score e with NOVA group 3 - a processed formulation sitting at the strict end of both ladders. The second is a US herbal tea whose grade reads unknown because nobody has entered one yet. That second row is the honest one: completeness varies row to row in any crowd-built panel, and treating absent grades as zeros would poison every ranking downstream. Multiply the contrast across 4.76 million rows and you have assortment structure you can query, not a marketing deck.

What fields does each product record carry?

Think of the 111 columns as the same seven blocks every row shares. The identity block fixes the product: code, the EAN barcode that serves as the universal join key; product_name stored as localized text entries so a multi-market catalog reads natively; generic_name; and brands beside normalized brands_tags. The classification block slots the product into hierarchies without string-matching names - categories_tags, food_groups_tags, labels_tags for certifications such as organic or fair-trade, countries_tags for the markets where it sells, plus origins.

The composition block carries ingredients_text kept per language, normalized ingredients_tags, additives_n, allergens_tags and vitamins_tags. The nutrition block is the struct that earns its keep: nutriments holds energy, fat fractions, carbohydrates, sugars, fiber, proteins, salt and the vitamin panel, each with value and unit per 100 grams, per serving and prepared - parse it once and every nutrition claim becomes arithmetic. The scoring block summarizes it (nutriscore_grade, nutriscore_score, nova_group, environmental_score_grade). Packaging, provenance and popularity close the row: packagings, quantity, serving_size, stores, creator, created_t, last_modified_t, popularity_key, scans_n, unique_scans_n and images.

The dictionary below maps the columns that do most of the work; the remainder fold out with your sample, and any narrower slice ships as additional fields on request.

Where does coverage run, and at what grain?

  • Geography: global by construction - products have been scanned across 150+ countries, and each row names its own markets in countries_tags, so a country cut is a filter rather than a separate extraction.
  • Temporal: contributions accumulate continuously back to 2012, and every row carries created_t and last_modified_t Unix timestamps. Recency is therefore computable per record: filter to edits inside your review window and the panel dates itself. The mirror repository itself was last modified 2026-08-20, one day before our verification pass.
  • Granularity: strictly one row per product barcode - no aggregation layer to unwind, no pre-summarized rollups to reverse-engineer, and a join key stable enough to append each pull to the last.

Two splits make up the whole: a food panel running to millions of rows and a beauty panel holding tens of thousands, which is why per-category statistics need per-category denominators. Set against the wider catalog, this record scores 9/10 - high band, verified definitions, live pipeline.

How is the data delivered?

API, files, or your warehouse. Daily, weekly, or hourly.

You choose the channel and the cadence; flattening the nested nutrition struct into typed columns, keeping the 111-field schema stable across pulls and flagging additions rather than springing them are our problem. Because contributors edit records continuously, the cadence you pick builds your history - weekly suits assortment benchmarking, daily suits price-and-promotion tracking, hourly suits launch monitoring. Whichever you choose, code stays the join key to everything else you own. Tell us the cut - one brand, one category tree, one market - and the sample arrives shaped that way, rows and dictionary included.

Who uses this data, and for what?

  1. Competitive intelligence and product teams track rival assortments brand by brand and watch category entries appear as rows, not press releases - created_t timestamps make a rival launch a query result.
  2. Market researchers size categories from label and food-group tags instead of survey recall, with per-country cuts available on request - the assortment map of 150+ markets without a panel invoice.
  3. Data scientists train grading and classification models on the scoring trio, with ingredient text and the nutrition struct as raw material - millions of labeled examples no synthetic set matches.
  4. E-commerce and retail operators enrich listings with open nutrition, ingredient and grade data under attribution, normalizing supplier feeds that arrive in a dozen shapes.
  5. Investors and quants read scan-weighted popularity (unique_scans_n, popularity_key) as a demand proxy between earnings prints - shelf listings say what is stocked; scan counts say what moves.
  6. Journalists, academics and students cite a public, barcode-level record of what the world actually eats and puts on its skin, deep enough to disaggregate what headlines average away.

Get a sample of this dataset scoped to the brands and categories you argue with most.

Which personas get the most value?

Competitive intel and product teams get the assortment map rivals would rather they assembled themselves, keyed on a barcode that joins cleanly onto syndicated retail data (their use cases). Market researchers and consultants get category sizing from label and food-group taxonomies instead of recall surveys (their use cases). Data scientists and ML engineers get millions of labeled, feature-rich examples for grading, classification and embedding work (their use cases). Developers and builders wire typed product-shaped rows into catalogs and recommendation systems without rewriting ingestion between releases (their use cases). Journalists, academics and students cite the primary record behind every food-label claim (their use cases).

Which datasets pair well with this one?

Notes and adjacent reading:

The card rail below collects these alongside the rest of the vertical: browse the whole shelf on the Consumer Finance data hub, see the ranked shortlist of the best consumer finance datasets, or read the Hugging Face / Open Food Facts source profile.

Field dictionary

Every field below is documented against real records. The full dictionary ships with the sample.

Field dictionary - the working core of the 111-column product schema (one row per barcode)
fieldtypedefinitionexample
codestringProduct barcode (EAN), the primary key and universal join to retail or purchase panels.0000101209159
product_namelocalized textProduct name stored as main-language entry plus translations, so multi-market catalogs read natively.Véritable pâte à tartiner noisettes chocolat noir
generic_namestringGeneric descriptor for the product type where contributors supplied one.-
brandsstringBrand name(s) exactly as displayed on pack.Bovetti
brands_tagstagsNormalized brand tags derived from the displayed brand.["xx:Bovetti"]
categories_tagstagsNormalized category hierarchy describing the product type.["en:breakfasts","en:sweet-spreads","en:hazelnut-spreads"]
food_groups_tagstagsCoarse food-group classification above the category tree.-
labels_tagstagsCertification and label tags such as organic or fair-trade.-
countries_tagstagsMarkets where the product is sold; the per-row geography field.["en:france"]
originsstringIngredient or product origin text as entered.-
ingredients_texttextIngredient list text, kept per language.-
ingredients_tagstagsNormalized ingredient tags parsed from the list.-
additives_nintegerCount of additives in the product.-
allergens_tagstagsAllergen panel declared for the product.-
vitamins_tagstagsVitamin and mineral fortification tags.-
nutrimentsnested structPer-100g, per-serving and prepared nutrient values, each with its unit - energy, fat fractions, sugars, fiber, proteins, salt and vitamins.{"name":"saturated-fat","100g":10.0,"unit":"g"}
nutriscore_gradeenumNutri-Score letter grade a through e; reads unknown where no grade has been computed.e
nutriscore_scorenumberUnderlying numeric Nutri-Score behind the letter grade.-
nova_groupintegerNOVA processing group 1 (unprocessed/minimally processed) through 4 (ultra-processed).3
environmental_score_gradeenumEnvironmental-impact (Green-Score) letter grade.-
packagingsstructPackaging components with material and shape detail per unit.-
quantitystringNet quantity as printed on the pack.350 g
serving_sizestringServing-size text used for the per-serving nutrition column.-
storesstringStore chains where the product was observed.-
creatorstringContributor who created the entry - the provenance trail behind every row.-
created_ttimestampUnix timestamp of entry creation; the basis for launch-detection queries.-
last_modified_ttimestampUnix timestamp of last edit; filter to your review window and the panel dates itself.-
popularity_keyintegerProduct popularity ranking metric maintained by the project.-
scans_nintegerTotal app scans recorded for the barcode.-
unique_scans_nintegerUnique app scans - the demand signal attached to each barcode.-
imagestextProduct photo references, licensed separately from the tabular record.-

Questions buyers ask

How many products does the Open Food Facts Product Database (Hugging Face Parquet Mirror) hold?

4,758,598 products on one row per barcode: roughly 4.69 million foods and 73,400 beauty items, described by 111 columns. Counts come from the catalog research pass verified August 21, 2026; your sample reflects the live panel, re-counted at delivery time rather than quoted from a stale snapshot.

Which fields identify a product across systems?

Three layers: code, the EAN barcode that serves as the primary key and joins cleanly to retail or purchase panels; product_name kept as localized text entries; and brands beside normalized brands_tags for attribution. Category tags slot each product into a food-group hierarchy without string-matching names.

What nutrition detail rides on each row?

A nested nutriments structure holding per-100g, per-serving and prepared values, each with its unit - energy, fat fractions, carbohydrates, sugars, fiber, proteins, salt plus vitamins and minerals. Scoring fields summarize it: nutriscore_grade a through e, nova_group 1 through 4, and the environmental-score grade.

Is every field populated on every row?

No - contributors enter what the pack shows, so completeness varies row to row. Identity and classification fields run dense; some scoring grades are simply absent, like the chamomile tea in our sample rows whose grade reads unknown. Treat missing values as absent rather than zero, and let Datadory flag per-column fill rates with each delivery.

Why is a food product database filed under Consumer Finance?

Because barcode-level product records describe household buying behavior - brands chosen, categories crossed, stores visited, scan counts attached. Twenty-four datasets share the Consumer Finance filing, spanning official surveys and this product panel, and purchasing-behavior work draws on both.

Can Datadory scope a pull to specific brands, categories or markets?

Yes. Send the brand lists, category-tree branches or country cuts you need - one hazelnut-spread segment across French retail, one organic label across 150+ markets - and the sample comes back scoped to them with the full field dictionary attached, delivered by API, files, or your warehouse on the schedule you choose.

See the rows before you pay anything.

Name this dataset and we send real records from it — scoped to the fields you asked for.

See pricing