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_tandlast_modified_tUnix 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,
codestays 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?
- Competitive intelligence and product teams track rival assortments brand by brand and watch category entries appear as rows, not press releases -
created_ttimestamps make a rival launch a query result. - 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.
- 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.
- 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.
- 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. - 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:
- Fed SHED Survey Data - the surveyed side of household well-being beside the purchased side; our head-to-head sets them against each other in the SHED vs Open Food Facts comparison.
- Survey of Consumer Finances (SCF) - family balance sheets to weight the purchasing power behind the baskets.
- FDIC Unbanked and Underbanked Households - who pays how, next to what they carry out of the store.
- USDA Food Environment Atlas - county-level store availability to place product supply in its retail geography.
- World Bank Global Findex Database 2025 - account ownership worldwide when the spending question leaves the checkout line.
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 | type | definition | example |
|---|---|---|---|
code | string | Product barcode (EAN), the primary key and universal join to retail or purchase panels. | 0000101209159 |
product_name | localized text | Product name stored as main-language entry plus translations, so multi-market catalogs read natively. | Véritable pâte à tartiner noisettes chocolat noir |
generic_name | string | Generic descriptor for the product type where contributors supplied one. | - |
brands | string | Brand name(s) exactly as displayed on pack. | Bovetti |
brands_tags | tags | Normalized brand tags derived from the displayed brand. | ["xx:Bovetti"] |
categories_tags | tags | Normalized category hierarchy describing the product type. | ["en:breakfasts","en:sweet-spreads","en:hazelnut-spreads"] |
food_groups_tags | tags | Coarse food-group classification above the category tree. | - |
labels_tags | tags | Certification and label tags such as organic or fair-trade. | - |
countries_tags | tags | Markets where the product is sold; the per-row geography field. | ["en:france"] |
origins | string | Ingredient or product origin text as entered. | - |
ingredients_text | text | Ingredient list text, kept per language. | - |
ingredients_tags | tags | Normalized ingredient tags parsed from the list. | - |
additives_n | integer | Count of additives in the product. | - |
allergens_tags | tags | Allergen panel declared for the product. | - |
vitamins_tags | tags | Vitamin and mineral fortification tags. | - |
nutriments | nested struct | Per-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_grade | enum | Nutri-Score letter grade a through e; reads unknown where no grade has been computed. | e |
nutriscore_score | number | Underlying numeric Nutri-Score behind the letter grade. | - |
nova_group | integer | NOVA processing group 1 (unprocessed/minimally processed) through 4 (ultra-processed). | 3 |
environmental_score_grade | enum | Environmental-impact (Green-Score) letter grade. | - |
packagings | struct | Packaging components with material and shape detail per unit. | - |
quantity | string | Net quantity as printed on the pack. | 350 g |
serving_size | string | Serving-size text used for the per-serving nutrition column. | - |
stores | string | Store chains where the product was observed. | - |
creator | string | Contributor who created the entry - the provenance trail behind every row. | - |
created_t | timestamp | Unix timestamp of entry creation; the basis for launch-detection queries. | - |
last_modified_t | timestamp | Unix timestamp of last edit; filter to your review window and the panel dates itself. | - |
popularity_key | integer | Product popularity ranking metric maintained by the project. | - |
scans_n | integer | Total app scans recorded for the barcode. | - |
unique_scans_n | integer | Unique app scans - the demand signal attached to each barcode. | - |
images | text | Product 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.