From 0ce3e87175671aca1e70a1472b8983e480af624b Mon Sep 17 00:00:00 2001 From: Sam Gu <127461594+SamGu-NRX@users.noreply.github.com> Date: Thu, 15 Oct 2026 16:32:26 +0000 Subject: [PATCH 1/7] data(ingredients): resolve 51 vocabulary keys to same-product FDC rows Pin per-100g rows for every specialty key that shipped without nutrition and has an exact same-product row in the FDC bulk CSVs (FNDDS 2024-10-31 / SR Legacy 2018-04), e.g. hoisin -> Hoisin sauce 2707441, hao you -> Oyster sauce 2707150, salt cod -> cod dried and salted 174190, borlotti beans -> cranberry (roman) beans cooked-drained 173736, daikon -> oriental radish 168451, chiles -> sun-dried hot chile 168570. Keys whose only candidates are different products (gochujang, mirin, labneh, dashi, halloumi, stock with no species, ...) stay unresolved with their rejected candidates recorded in data/ingredients/unresolved-candidates.json; build_vocab.py now fails if that audit drifts from the vocabulary. Also fix the legacy identity map: vocabulary resolution now flips unresolved statuses to resolved, and the singular legacy key 'tortilla' resolves through the plural vocabulary key 'tortillas' (fdc 2707822). Identity map is now 32 resolved / 18 proposed / 0 unresolved (was 17 / 18 / 15). Vocabulary per-100g coverage: 283/329 (was 232/329). Co-authored-by: Sam Gu --- data/ingredients/unresolved-candidates.json | 243 ++++++ data/ingredients/vocabulary.json | 816 +++++++++++++++----- data/recipes/legacy-ingredient-map.json | 43 +- data/recipes/tools/build_vocab.py | 151 +++- 4 files changed, 1025 insertions(+), 228 deletions(-) create mode 100644 data/ingredients/unresolved-candidates.json diff --git a/data/ingredients/unresolved-candidates.json b/data/ingredients/unresolved-candidates.json new file mode 100644 index 000000000..e763afa51 --- /dev/null +++ b/data/ingredients/unresolved-candidates.json @@ -0,0 +1,243 @@ +{ + "note": "Vocabulary keys with no per-100g row. Each stays unresolved unless a cited FDC row is the same product; candidates list the FDC rows considered and rejected during the 2026-10 nutrition-completion pass (see UNRESOLVED_CANDIDATES in data/recipes/tools/build_vocab.py).", + "keys": { + "ackee": { + "candidates": [], + "note": "no FDC row under any searched name (ackee, blighia); Jamaican specialty" + }, + "artichoke_hearts": { + "candidates": [ + 169205, + 168387, + 2709766 + ], + "note": "raw/frozen globe artichoke rows are the edible portion without the brine the drained jarred hearts imply; a raw row would understate sodium" + }, + "beef_meatballs": { + "candidates": [ + 2706467, + 171638, + 2706580 + ], + "note": "the FNDDS row carries sauce and the SR row is seasoned Italian-style frozen; neither is plain beef meatballs" + }, + "beef_vegetable_stock": { + "candidates": [ + 172883, + 171180 + ], + "note": "surface is 'beef or vegetable stock'; both single-species rows are different products" + }, + "black_bean_paste": { + "candidates": [], + "note": "fermented black-soybean paste; no FDC row (searched tausi, douchi, black bean paste)" + }, + "black_vinegar": { + "candidates": [ + 172241 + ], + "note": "balsamic is grape must, a different product; no Chinese black (Chinkiang) vinegar row" + }, + "callaloo_greens": { + "candidates": [], + "note": "callaloo greens are species-ambiguous (taro/amaranth/dasheen); no single-product FDC row" + }, + "chicharrones": { + "candidates": [], + "note": "no pork-rind row in FNDDS 2024 or SR Legacy" + }, + "chilli_sauce": { + "candidates": [ + 2709735, + 171186 + ], + "note": "surface is 'sweet chili sauce'; the tomato chili sauce and hot chile sauce rows are different products" + }, + "dashi": { + "candidates": [], + "note": "kombu + bonito infusion; no FDC row" + }, + "doenjang": { + "candidates": [], + "note": "Korean fermented soybean paste; no FDC row (miso is a different product)" + }, + "doubanjiang": { + "candidates": [], + "note": "fermented chili-bean paste; no FDC row" + }, + "egusi_seeds": { + "candidates": [], + "note": "melon/cucurbit seed kernels; no FDC row (searched melon seed, egusi)" + }, + "farro": { + "candidates": [ + 2710828 + ], + "note": "Foundation Foods 'Farro, pearled, dry, raw' carries no energy measurement in kcal in the bulk CSVs; pinning it would emit kcal 0.0" + }, + "five_spice_powder": { + "candidates": [], + "note": "Chinese spice blend; no FDC row" + }, + "flattened_rice": { + "candidates": [], + "note": "poha; no FDC row" + }, + "galangal": { + "candidates": [], + "note": "no FDC row (ginger is a different plant)" + }, + "garam_masala": { + "candidates": [], + "note": "North Indian spice blend; no FDC row" + }, + "gochugaru": { + "candidates": [ + 170932, + 168570 + ], + "note": "Korean coarse chili flakes; the ground cayenne spice and whole sun-dried chile rows are different products" + }, + "gochujang": { + "candidates": [], + "note": "Korean chili-soybean paste; no FDC row" + }, + "green_curry_paste": { + "candidates": [ + 2710178 + ], + "note": "FNDDS 'Curry sauce' is a different (British-style) product" + }, + "green_papaya": { + "candidates": [ + 2709246, + 2709247 + ], + "note": "the raw/canned papaya rows are the ripe fruit; unripe green papaya differs materially in sugar" + }, + "halloumi": { + "candidates": [], + "note": "no halloumi row; feta and mozzarella are different products" + }, + "harissa": { + "candidates": [], + "note": "no harissa row in FNDDS 2024 or SR Legacy" + }, + "jerk_seasoning": { + "candidates": [], + "note": "Jamaican spice blend; no FDC row" + }, + "kaffir_lime": { + "candidates": [], + "note": "makrut lime leaves; no FDC row" + }, + "labneh": { + "candidates": [ + 2705415 + ], + "note": "Greek yogurt rows are less-strained and materially lower in energy; not the same product" + }, + "massaman_curry_paste": { + "candidates": [ + 2710178 + ], + "note": "FNDDS 'Curry sauce' is a different product" + }, + "mirin": { + "candidates": [ + 167723 + ], + "note": "the sake row is unsweetened; mirin's sugar content differs materially" + }, + "nduja": { + "candidates": [], + "note": "spreadable spicy cured pork; no FDC row" + }, + "pomegranate_molasses": { + "candidates": [ + 168820 + ], + "note": "cane molasses is a different product; no pomegranate-reduction row" + }, + "potato_starch": { + "candidates": [], + "note": "no standalone potato-starch row (hits are composite breads)" + }, + "preserved_lemon": { + "candidates": [], + "note": "salt-pickled lemons; no FDC row" + }, + "ras_el_hanout": { + "candidates": [], + "note": "North African spice blend; no FDC row" + }, + "rice_powder": { + "candidates": [ + 169714, + 168898 + ], + "note": "surface is 'toasted rice powder' (khao khua); the untoasted rice flour rows are a different product" + }, + "rice_vinegar": { + "candidates": [ + 2709351 + ], + "note": "the FNDDS generic 'Vinegar' row is not the rice-vinegar product; no rice vinegar row" + }, + "scotch_bonnet": { + "candidates": [ + 170106 + ], + "note": "generic hot red chili row; the named variety is not represented" + }, + "sichuan_peppercorns": { + "candidates": [], + "note": "no FDC row (searched sichuan, szechuan pepper)" + }, + "spring_roll_wrappers": { + "candidates": [ + 172802 + ], + "note": "wonton wrappers contain egg; wheat-only spring roll wrappers are a different product" + }, + "star_anise": { + "candidates": [ + 171316 + ], + "note": "anise seed is a different plant (shared aroma compound only)" + }, + "stock": { + "candidates": [ + 172883, + 172884, + 172885 + ], + "note": "all FDC stock rows are species-specific (beef/chicken/fish); the surface names no species" + }, + "sumac": { + "candidates": [], + "note": "no FDC row" + }, + "sweet_potato_noodles": { + "candidates": [ + 174258, + 2708355 + ], + "note": "the cellophane rows are mung-bean starch, not sweet-potato starch (dangmyeon)" + }, + "thai_chilies": { + "candidates": [ + 170106 + ], + "note": "generic hot red chili row; the named variety is not represented" + }, + "umeboshi": { + "candidates": [], + "note": "pickled ume; no FDC row" + }, + "zaatar": { + "candidates": [], + "note": "Middle Eastern herb blend; no FDC row" + } + } +} diff --git a/data/ingredients/vocabulary.json b/data/ingredients/vocabulary.json index e386b9d52..f9c1abf38 100644 --- a/data/ingredients/vocabulary.json +++ b/data/ingredients/vocabulary.json @@ -78,15 +78,23 @@ { "key": "allspice", "display_name": "Allspice", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 171315, + "fdc_ref": "Spices, allspice, ground (SR Legacy) - ground is the standard spice-aisle form", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 263.0, + "protein_g": 6.09, + "carbs_g": 72.12, + "fat_g": 8.69, + "fiber_g": 21.6, + "sugar_g": 0.0, + "sodium_mg": 77.0 + }, "aliases": [ "allspice" ], @@ -233,15 +241,23 @@ { "key": "apple_cider_vinegar", "display_name": "Apple cider vinegar", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 173469, + "fdc_ref": "Vinegar, cider (SR Legacy) - cider vinegar is apple cider vinegar", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 21.0, + "protein_g": 0.0, + "carbs_g": 0.93, + "fat_g": 0.0, + "fiber_g": 0.0, + "sugar_g": 0.4, + "sodium_mg": 5.0 + }, "aliases": [ "apple cider vinegar", "cider vinegar" @@ -456,15 +472,23 @@ { "key": "baguette", "display_name": "Baguette", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 2707610, + "fdc_ref": "Bread, French or Vienna (FNDDS) - a baguette is the French bread loaf", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 272.0, + "protein_g": 10.75, + "carbs_g": 51.88, + "fat_g": 2.42, + "fiber_g": 2.2, + "sugar_g": 4.62, + "sodium_mg": 602.0 + }, "aliases": [ "baguette" ], @@ -479,15 +503,23 @@ { "key": "baking_powder", "display_name": "Baking powder", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 172803, + "fdc_ref": "Leavening agents, baking powder, double-acting, sodium aluminum sulfate (SR Legacy) - the generic household double-acting baking powder", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 53.0, + "protein_g": 0.0, + "carbs_g": 27.7, + "fat_g": 0.0, + "fiber_g": 0.2, + "sugar_g": 0.0, + "sodium_mg": 10600.0 + }, "aliases": [ "baking powder" ], @@ -638,15 +670,23 @@ { "key": "beansprouts", "display_name": "Beansprouts", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 2709768, + "fdc_ref": "Bean sprouts, raw (FNDDS) - beansprouts are raw mung-bean sprouts", "category": "vegetable", "classes": [ "plant" ], "class_note": "mung bean sprouts", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 30.0, + "protein_g": 3.04, + "carbs_g": 5.94, + "fat_g": 0.18, + "fiber_g": 1.8, + "sugar_g": 4.13, + "sodium_mg": 6.0 + }, "aliases": [ "beansprouts" ], @@ -704,16 +744,24 @@ { "key": "beef_stock", "display_name": "Beef stock", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 172883, + "fdc_ref": "Soup, stock, beef, home-prepared (SR Legacy) - the only same-product beef stock row", "category": "condiment", "classes": [ "meat", "unknown" ], "class_note": "may contain meat or milk", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 13.0, + "protein_g": 1.97, + "carbs_g": 1.2, + "fat_g": 0.09, + "fiber_g": 0.0, + "sugar_g": 0.54, + "sodium_mg": 198.0 + }, "aliases": [ "beef broth", "beef stock" @@ -834,15 +882,23 @@ { "key": "besan", "display_name": "Besan", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 174288, + "fdc_ref": "Chickpea flour (besan) (SR Legacy) - exact name", "category": "vegetable", "classes": [ "plant" ], "class_note": "chickpea flour", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 387.0, + "protein_g": 22.39, + "carbs_g": 57.82, + "fat_g": 6.69, + "fiber_g": 10.8, + "sugar_g": 10.85, + "sodium_mg": 64.0 + }, "aliases": [ "besan (chickpea flour)" ], @@ -920,15 +976,23 @@ { "key": "black_eyed_peas", "display_name": "Black eyed peas", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 2707412, + "fdc_ref": "Blackeyed peas, NFS (FNDDS) - the generic prepared row; the only SR mature-seed row is canned with pork", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 166.0, + "protein_g": 7.18, + "carbs_g": 19.29, + "fat_g": 7.0, + "fiber_g": 6.0, + "sugar_g": 3.07, + "sodium_mg": 220.0 + }, "aliases": [ "black-eyed peas" ], @@ -1047,15 +1111,23 @@ { "key": "borlotti_beans", "display_name": "Borlotti beans", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 173736, + "fdc_ref": "Beans, cranberry (roman), mature seeds, cooked, boiled, drained, without salt (SR Legacy) - borlotti are cranberry/roman beans; drained-cooked matches the surface", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 136.0, + "protein_g": 9.34, + "carbs_g": 24.46, + "fat_g": 0.46, + "fiber_g": 8.6, + "sugar_g": 0.0, + "sodium_mg": 1.0 + }, "aliases": [ "borlotti beans, drained" ], @@ -1124,16 +1196,24 @@ { "key": "breadcrumbs", "display_name": "Breadcrumbs", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 174928, + "fdc_ref": "Bread, crumbs, dry, grated, plain (SR Legacy) - exact plain breadcrumbs", "category": "vegetable", "classes": [ "gluten", "plant" ], "class_note": "wheat breadcrumbs", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 395.0, + "protein_g": 13.35, + "carbs_g": 71.98, + "fat_g": 5.3, + "fiber_g": 4.5, + "sugar_g": 6.2, + "sodium_mg": 732.0 + }, "aliases": [ "bread crumbs", "breadcrumbs", @@ -1187,15 +1267,23 @@ { "key": "broth", "display_name": "Broth", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 2707132, + "fdc_ref": "Soup, broth (FNDDS) - the species-unspecified broth row matches the generic surface", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 6.0, + "protein_g": 0.89, + "carbs_g": 0.24, + "fat_g": 0.22, + "fiber_g": 0.0, + "sugar_g": 0.22, + "sodium_mg": 372.0 + }, "aliases": [ "broth" ], @@ -1351,8 +1439,8 @@ { "key": "burger_buns", "display_name": "Burger buns", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 2707657, + "fdc_ref": "Roll, white, hamburger bun (FNDDS) - exact same product", "category": "grain", "classes": [ "gluten", @@ -1360,8 +1448,16 @@ "dairy" ], "class_note": "buns may contain milk", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 267.0, + "protein_g": 9.43, + "carbs_g": 49.2, + "fat_g": 3.59, + "fiber_g": 2.3, + "sugar_g": 5.34, + "sodium_mg": 450.0 + }, "aliases": [ "burger buns" ], @@ -1813,15 +1909,23 @@ { "key": "cayenne", "display_name": "Cayenne", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 170932, + "fdc_ref": "Spices, pepper, red or cayenne (SR Legacy) - the exact cayenne row", "category": "spice", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 318.0, + "protein_g": 12.01, + "carbs_g": 56.63, + "fat_g": 17.27, + "fiber_g": 27.2, + "sugar_g": 10.34, + "sodium_mg": 30.0 + }, "aliases": [ "cayenne" ], @@ -2035,15 +2139,23 @@ { "key": "chicken_stock", "display_name": "Chicken stock", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 172884, + "fdc_ref": "Soup, stock, chicken, home-prepared (SR Legacy) - the only same-product chicken stock row", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 36.0, + "protein_g": 2.52, + "carbs_g": 3.53, + "fat_g": 1.2, + "fiber_g": 0.0, + "sugar_g": 1.58, + "sodium_mg": 143.0 + }, "aliases": [ "chicken bone broth", "chicken broth", @@ -2189,15 +2301,23 @@ { "key": "chiles", "display_name": "Chiles", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 168570, + "fdc_ref": "Peppers, hot chile, sun-dried (SR Legacy) - the surface is dried chiles; the row is sun-dried hot chile peppers", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 324.0, + "protein_g": 10.58, + "carbs_g": 69.86, + "fat_g": 5.81, + "fiber_g": 28.7, + "sugar_g": 41.06, + "sodium_mg": 91.0 + }, "aliases": [ "dried chiles" ], @@ -2212,15 +2332,23 @@ { "key": "chili_powder", "display_name": "Chili powder", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 171319, + "fdc_ref": "Spices, chili powder (SR Legacy) - the exact chili powder blend row", "category": "spice", "classes": [ "plant" ], "class_note": "spice blend", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 282.0, + "protein_g": 13.46, + "carbs_g": 49.7, + "fat_g": 14.28, + "fiber_g": 34.8, + "sugar_g": 7.19, + "sodium_mg": 2867.0 + }, "aliases": [ "chili powder" ], @@ -2633,15 +2761,23 @@ { "key": "cola", "display_name": "Cola", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 174852, + "fdc_ref": "Beverages, carbonated, cola, regular (SR Legacy) - the exact generic cola row", "category": "condiment", "classes": [ "plant" ], "class_note": "cola beverage", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 42.0, + "protein_g": 0.0, + "carbs_g": 10.36, + "fat_g": 0.25, + "fiber_g": 0.0, + "sugar_g": 9.94, + "sodium_mg": 3.0 + }, "aliases": [ "cola" ], @@ -3035,15 +3171,23 @@ { "key": "cranberry_sauce", "display_name": "Cranberry sauce", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 2709280, + "fdc_ref": "Cranberry sauce (FNDDS) - exact same product", "category": "condiment", "classes": [ "plant" ], "class_note": "fruit sauce", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 159.0, + "protein_g": 0.9, + "carbs_g": 40.4, + "fat_g": 0.15, + "fiber_g": 1.1, + "sugar_g": 31.75, + "sodium_mg": 5.0 + }, "aliases": [ "cranberry sauce" ], @@ -3255,15 +3399,23 @@ { "key": "daikon", "display_name": "Daikon", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 168451, + "fdc_ref": "Radishes, oriental, raw (SR Legacy) - daikon is the oriental radish", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 18.0, + "protein_g": 0.6, + "carbs_g": 4.1, + "fat_g": 0.1, + "fiber_g": 1.6, + "sugar_g": 2.5, + "sodium_mg": 21.0 + }, "aliases": [ "daikon" ], @@ -3869,15 +4021,23 @@ { "key": "french_fries", "display_name": "French fries", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 2709456, + "fdc_ref": "Potato, french fries, NFS (FNDDS) - the form-not-specified generic row", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 225.0, + "protein_g": 2.5, + "carbs_g": 23.23, + "fat_g": 14.07, + "fiber_g": 1.8, + "sugar_g": 0.34, + "sodium_mg": 295.0 + }, "aliases": [ "french fries" ], @@ -4101,15 +4261,23 @@ { "key": "glass_noodles", "display_name": "Glass noodles", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 174258, + "fdc_ref": "Noodles, chinese, cellophane or long rice (mung beans), dehydrated (SR Legacy) - glass noodles are cellophane noodles; dehydrated matches the 80 g corpus line", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 351.0, + "protein_g": 0.16, + "carbs_g": 86.09, + "fat_g": 0.06, + "fiber_g": 0.5, + "sugar_g": 0.0, + "sodium_mg": 10.0 + }, "aliases": [ "glass noodles" ], @@ -4183,15 +4351,23 @@ { "key": "goat_meat", "display_name": "Goat meat", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 175303, + "fdc_ref": "Game meat, goat, raw (SR Legacy) - raw matches the raw ingredient identity", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 109.0, + "protein_g": 20.6, + "carbs_g": 0.0, + "fat_g": 2.31, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 82.0 + }, "aliases": [ "goat meat" ], @@ -4416,15 +4592,23 @@ { "key": "green_chili", "display_name": "Green chili", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 170497, + "fdc_ref": "Peppers, hot chili, green, raw (SR Legacy) - the exact green hot chili row", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 40.0, + "protein_g": 2.0, + "carbs_g": 9.46, + "fat_g": 0.2, + "fiber_g": 1.5, + "sugar_g": 5.1, + "sodium_mg": 7.0 + }, "aliases": [ "green chili", "mild green chiles" @@ -4640,15 +4824,23 @@ { "key": "ground_coriander", "display_name": "Ground coriander", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 170922, + "fdc_ref": "Spices, coriander seed (SR Legacy) - ground coriander is ground coriander seed", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 298.0, + "protein_g": 12.37, + "carbs_g": 54.99, + "fat_g": 17.77, + "fiber_g": 41.9, + "sugar_g": 0.0, + "sodium_mg": 35.0 + }, "aliases": [ "ground coriander" ], @@ -4657,15 +4849,23 @@ { "key": "ground_ginger", "display_name": "Ground ginger", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 170926, + "fdc_ref": "Spices, ginger, ground (SR Legacy) - exact", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 335.0, + "protein_g": 8.98, + "carbs_g": 71.62, + "fat_g": 4.24, + "fiber_g": 14.1, + "sugar_g": 3.39, + "sodium_mg": 27.0 + }, "aliases": [ "ground ginger" ], @@ -4712,15 +4912,23 @@ { "key": "ground_turmeric", "display_name": "Ground turmeric", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 172231, + "fdc_ref": "Spices, turmeric, ground (SR Legacy) - exact", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 312.0, + "protein_g": 9.68, + "carbs_g": 67.14, + "fat_g": 3.25, + "fiber_g": 22.7, + "sugar_g": 3.21, + "sodium_mg": 27.0 + }, "aliases": [ "ground turmeric" ], @@ -4796,15 +5004,23 @@ { "key": "hao_you", "display_name": "Hao you", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 2707150, + "fdc_ref": "Oyster sauce (FNDDS) - hao you is Cantonese for oyster sauce; same product", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 51.0, + "protein_g": 1.35, + "carbs_g": 10.92, + "fat_g": 0.25, + "fiber_g": 0.3, + "sugar_g": 0.0, + "sodium_mg": 2733.0 + }, "aliases": [ "hao you" ], @@ -4875,15 +5091,23 @@ { "key": "hoisin", "display_name": "Hoisin", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 2707441, + "fdc_ref": "Hoisin sauce (FNDDS) - exact same product", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 220.0, + "protein_g": 3.31, + "carbs_g": 44.08, + "fat_g": 3.39, + "fiber_g": 2.8, + "sugar_g": 27.26, + "sodium_mg": 1615.0 + }, "aliases": [ "hoisin sauce" ], @@ -5434,15 +5658,23 @@ { "key": "lemon_juice", "display_name": "Lemon juice", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 2709180, + "fdc_ref": "Lemon juice, 100%, NS as to form (FNDDS) - the form-not-specified generic row", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 22.0, + "protein_g": 0.35, + "carbs_g": 6.9, + "fat_g": 0.24, + "fiber_g": 0.3, + "sugar_g": 2.52, + "sodium_mg": 1.0 + }, "aliases": [ "lemon juice" ], @@ -5790,15 +6022,23 @@ { "key": "mild_curry_powder", "display_name": "Mild curry powder", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 170924, + "fdc_ref": "Spices, curry powder (SR Legacy) - mild heat variant of the standard curry powder blend", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 325.0, + "protein_g": 14.29, + "carbs_g": 55.83, + "fat_g": 14.01, + "fiber_g": 53.2, + "sugar_g": 2.76, + "sodium_mg": 52.0 + }, "aliases": [ "mild curry powder" ], @@ -5887,15 +6127,23 @@ { "key": "millet_flour", "display_name": "Millet flour", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 172023, + "fdc_ref": "Millet flour (SR Legacy) - exact", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 382.0, + "protein_g": 10.75, + "carbs_g": 75.12, + "fat_g": 4.25, + "fiber_g": 3.5, + "sugar_g": 1.66, + "sodium_mg": 4.0 + }, "aliases": [ "millet flour" ], @@ -6255,15 +6503,23 @@ { "key": "nutmeg", "display_name": "Nutmeg", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 171326, + "fdc_ref": "Spices, nutmeg, ground (SR Legacy) - ground is the standard spice-aisle form", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 525.0, + "protein_g": 5.84, + "carbs_g": 49.29, + "fat_g": 36.31, + "fiber_g": 20.8, + "sugar_g": 2.99, + "sodium_mg": 16.0 + }, "aliases": [ "nutmeg" ], @@ -6472,15 +6728,23 @@ { "key": "orange_juice", "display_name": "Orange juice", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 2709186, + "fdc_ref": "Orange juice, 100%, NFS (FNDDS) - the form-not-specified generic row", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 47.0, + "protein_g": 0.77, + "carbs_g": 10.17, + "fat_g": 0.34, + "fiber_g": 0.3, + "sugar_g": 8.18, + "sodium_mg": 2.0 + }, "aliases": [ "orange juice" ], @@ -6564,16 +6828,24 @@ { "key": "orzo", "display_name": "Orzo", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 2708357, + "fdc_ref": "Pasta, cooked (FNDDS) - orzo shares the pasta identity; the corpus line is 1 cup = 200 g (cooked), same row as pasta_dried", "category": "vegetable", "classes": [ "gluten", "plant" ], "class_note": "wheat pasta", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 157.0, + "protein_g": 5.76, + "carbs_g": 30.68, + "fat_g": 0.92, + "fiber_g": 1.8, + "sugar_g": 0.56, + "sodium_mg": 232.0 + }, "aliases": [ "orzo", "risoni" @@ -6626,15 +6898,23 @@ { "key": "paprika", "display_name": "Paprika", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 171329, + "fdc_ref": "Spices, paprika (SR Legacy) - exact (same row as the smoked_paprika pin)", "category": "spice", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 282.0, + "protein_g": 14.14, + "carbs_g": 53.99, + "fat_g": 12.89, + "fiber_g": 34.9, + "sugar_g": 10.34, + "sodium_mg": 68.0 + }, "aliases": [ "paprika" ], @@ -7113,15 +7393,23 @@ { "key": "pomegranate_seeds", "display_name": "Pomegranate seeds", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 169134, + "fdc_ref": "Pomegranates, raw (SR Legacy) - the row's edible portion is the arils with seeds", "category": "fruit", "classes": [ "plant" ], "class_note": "fresh arils", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 83.0, + "protein_g": 1.67, + "carbs_g": 18.7, + "fat_g": 1.17, + "fiber_g": 4.0, + "sugar_g": 13.67, + "sodium_mg": 3.0 + }, "aliases": [ "pomegranate seeds" ], @@ -7199,15 +7487,23 @@ { "key": "pork_cutlets", "display_name": "Pork cutlets", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 168230, + "fdc_ref": "Pork, fresh, loin, whole, separable lean only, raw (SR Legacy) - cutlets are boneless lean loin cuts", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 143.0, + "protein_g": 21.43, + "carbs_g": 0.0, + "fat_g": 5.66, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 52.0 + }, "aliases": [ "pork cutlets" ], @@ -7645,15 +7941,23 @@ { "key": "red_palm_oil", "display_name": "Red palm oil", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 171015, + "fdc_ref": "Oil, palm (SR Legacy) - red palm oil is unrefined palm oil; identical in the shipped macro fields", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 884.0, + "protein_g": 0.0, + "carbs_g": 0.0, + "fat_g": 100.0, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 0.0 + }, "aliases": [ "red palm oil" ], @@ -7867,15 +8171,23 @@ { "key": "rice_flour", "display_name": "Rice flour", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 169714, + "fdc_ref": "Rice flour, white, unenriched (SR Legacy) - exact; white is the default rice flour", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 366.0, + "protein_g": 5.95, + "carbs_g": 80.13, + "fat_g": 1.42, + "fiber_g": 2.4, + "sugar_g": 0.12, + "sodium_mg": 0.0 + }, "aliases": [ "rice flour" ], @@ -8225,15 +8537,23 @@ { "key": "salt_cod", "display_name": "Salt cod", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 174190, + "fdc_ref": "Fish, cod, Atlantic, dried and salted (SR Legacy) - exact same product", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 290.0, + "protein_g": 62.82, + "carbs_g": 0.0, + "fat_g": 2.37, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 7027.0 + }, "aliases": [ "salt cod" ], @@ -8723,15 +9043,23 @@ { "key": "smoked_sausage", "display_name": "Smoked sausage", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 174585, + "fdc_ref": "Sausage, smoked link sausage, pork and beef (SR Legacy) - the generic mixed smoked link sausage", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 320.0, + "protein_g": 12.0, + "carbs_g": 2.42, + "fat_g": 28.73, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 911.0 + }, "aliases": [ "smoked sausage" ], @@ -8930,15 +9258,23 @@ { "key": "squid", "display_name": "Squid", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 174223, + "fdc_ref": "Mollusks, squid, mixed species, raw (SR Legacy) - exact", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 92.0, + "protein_g": 15.58, + "carbs_g": 3.08, + "fat_g": 1.38, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 44.0 + }, "aliases": [ "squid" ], @@ -8953,15 +9289,23 @@ { "key": "sriracha", "display_name": "Sriracha", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 171186, + "fdc_ref": "Sauce, hot chile, sriracha (SR Legacy) - exact same product", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 93.0, + "protein_g": 1.93, + "carbs_g": 19.16, + "fat_g": 0.93, + "fiber_g": 2.2, + "sugar_g": 15.11, + "sodium_mg": 2124.0 + }, "aliases": [ "sriracha" ], @@ -9109,15 +9453,23 @@ { "key": "swede", "display_name": "Swede", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 168454, + "fdc_ref": "Rutabagas, raw (SR Legacy) - swede is the British name for rutabaga", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 37.0, + "protein_g": 1.08, + "carbs_g": 8.62, + "fat_g": 0.16, + "fiber_g": 2.3, + "sugar_g": 4.46, + "sodium_mg": 12.0 + }, "aliases": [ "swede, peeled and cubed" ], @@ -9255,15 +9607,23 @@ { "key": "tamari", "display_name": "Tamari", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 174278, + "fdc_ref": "Soy sauce made from soy (tamari) (SR Legacy) - the exact tamari row (same row as soy_sauce)", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 60.0, + "protein_g": 10.51, + "carbs_g": 5.57, + "fat_g": 0.1, + "fiber_g": 0.8, + "sugar_g": 1.7, + "sodium_mg": 5586.0 + }, "aliases": [ "japanese tamari", "tamari", @@ -9280,15 +9640,23 @@ { "key": "tamarind_paste", "display_name": "Tamarind paste", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 167763, + "fdc_ref": "Tamarinds, raw (SR Legacy) - block paste is pressed tamarind pulp; the raw row is the edible pulp", "category": "condiment", "classes": [ "plant" ], "class_note": "tamarind paste", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 239.0, + "protein_g": 2.8, + "carbs_g": 62.5, + "fat_g": 0.6, + "fiber_g": 5.1, + "sugar_g": 38.8, + "sodium_mg": 28.0 + }, "aliases": [ "tamarind paste", "tamarind paste or rice vinegar" @@ -9627,15 +9995,23 @@ { "key": "turmeric", "display_name": "Turmeric", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 172231, + "fdc_ref": "Spices, turmeric, ground (SR Legacy) - ground is the standard spice-aisle form (same row as ground_turmeric)", "category": "spice", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 312.0, + "protein_g": 9.68, + "carbs_g": 67.14, + "fat_g": 3.25, + "fiber_g": 22.7, + "sugar_g": 3.21, + "sodium_mg": 27.0 + }, "aliases": [ "turmeric" ], @@ -9655,15 +10031,23 @@ { "key": "udon_noodles", "display_name": "Udon noodles", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 2708352, + "fdc_ref": "Noodles, cooked (FNDDS) - udon is a wheat noodle; the cooked generic row matches the fresh-udon 320 g corpus line", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 137.0, + "protein_g": 4.51, + "carbs_g": 25.01, + "fat_g": 2.06, + "fiber_g": 1.2, + "sugar_g": 0.4, + "sodium_mg": 236.0 + }, "aliases": [ "udon noodles" ], @@ -9768,16 +10152,24 @@ { "key": "vegetable_stock", "display_name": "Vegetable stock", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 171180, + "fdc_ref": "Soup, SWANSON, vegetable broth (SR Legacy) - the only same-product row; branded ready-to-serve vegetable broth", "category": "condiment", "classes": [ "plant", "unknown" ], "class_note": "may contain milk or wheat", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 6.0, + "protein_g": 0.23, + "carbs_g": 1.02, + "fat_g": 0.07, + "fiber_g": 0.0, + "sugar_g": 0.57, + "sodium_mg": 303.0 + }, "aliases": [ "veg stock", "vegetable broth", @@ -10124,15 +10516,23 @@ { "key": "white_vinegar", "display_name": "White vinegar", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 172237, + "fdc_ref": "Vinegar, distilled (SR Legacy) - distilled white vinegar", "category": "other", "classes": [ "unknown" ], "class_note": "no curated class — defaults to unknown (claim-blocking)", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 18.0, + "protein_g": 0.0, + "carbs_g": 0.04, + "fat_g": 0.0, + "fiber_g": 0.0, + "sugar_g": 0.04, + "sodium_mg": 2.0 + }, "aliases": [ "white vinegar" ], @@ -10147,16 +10547,24 @@ { "key": "whole_wheat_flour", "display_name": "Whole wheat flour", - "fdc_id": null, - "fdc_ref": "no confident USDA row — never guessed", + "fdc_id": 168893, + "fdc_ref": "Wheat flour, whole-grain (SR Legacy) - whole wheat flour is whole-grain wheat flour", "category": "grain", "classes": [ "gluten", "plant" ], "class_note": "whole wheat flour", - "nutrition_source": "none", - "per_100g": null, + "nutrition_source": "hand-verified pin (build_vocab.py FDC_PINS)", + "per_100g": { + "kcal": 340.0, + "protein_g": 13.21, + "carbs_g": 71.97, + "fat_g": 2.5, + "fiber_g": 10.7, + "sugar_g": 0.41, + "sodium_mg": 2.0 + }, "aliases": [ "whole wheat flour" ], diff --git a/data/recipes/legacy-ingredient-map.json b/data/recipes/legacy-ingredient-map.json index eba9469b3..13f986118 100644 --- a/data/recipes/legacy-ingredient-map.json +++ b/data/recipes/legacy-ingredient-map.json @@ -19,7 +19,7 @@ "legacy_name": "rice", "key": "rice", "fdc_id": 168877, - "status": "unresolved", + "status": "resolved", "match_rule": "vocabulary resolution (hand-verified pin or bulk-CSV row)", "candidates": [ 168877, @@ -58,7 +58,7 @@ "legacy_name": "onion", "key": "onion", "fdc_id": 170000, - "status": "unresolved", + "status": "resolved", "match_rule": "vocabulary resolution (hand-verified pin or bulk-CSV row)", "candidates": [ 170000, @@ -83,7 +83,7 @@ "legacy_name": "tomato", "key": "tomato", "fdc_id": 170457, - "status": "unresolved", + "status": "resolved", "match_rule": "vocabulary resolution (hand-verified pin or bulk-CSV row)", "candidates": [ 168567, @@ -197,7 +197,7 @@ "legacy_name": "butter", "key": "butter", "fdc_id": 2710154, - "status": "unresolved", + "status": "resolved", "match_rule": "vocabulary resolution (hand-verified pin or bulk-CSV row)", "candidates": [ 169895, @@ -212,7 +212,7 @@ "legacy_name": "bread", "key": "bread", "fdc_id": 2707598, - "status": "unresolved", + "status": "resolved", "match_rule": "vocabulary resolution (hand-verified pin or bulk-CSV row)", "candidates": [ 170144, @@ -237,7 +237,7 @@ "legacy_name": "lemon", "key": "lemon", "fdc_id": 167746, - "status": "unresolved", + "status": "resolved", "match_rule": "vocabulary resolution (hand-verified pin or bulk-CSV row)", "candidates": [ 167746, @@ -252,7 +252,7 @@ "legacy_name": "mushroom", "key": "mushroom", "fdc_id": 169251, - "status": "unresolved", + "status": "resolved", "match_rule": "vocabulary resolution (hand-verified pin or bulk-CSV row)", "candidates": [ 168422, @@ -377,17 +377,19 @@ "legacy_id": 28, "legacy_name": "tortilla", "key": "tortilla", - "fdc_id": null, - "status": "unresolved", - "match_rule": "no acceptable candidate in the bundled catalog", - "candidates": [] + "fdc_id": 2707822, + "status": "resolved", + "match_rule": "vocabulary resolution via vocabulary key 'tortillas' (hand-verified pin or bulk-CSV row)", + "candidates": [ + 2707822 + ] }, { "legacy_id": 29, "legacy_name": "lime", "key": "lime", "fdc_id": 168155, - "status": "unresolved", + "status": "resolved", "match_rule": "vocabulary resolution (hand-verified pin or bulk-CSV row)", "candidates": [ 168155, @@ -411,7 +413,7 @@ "legacy_name": "oats", "key": "oats", "fdc_id": 168872, - "status": "unresolved", + "status": "resolved", "match_rule": "vocabulary resolution (hand-verified pin or bulk-CSV row)", "candidates": [ 168872, @@ -459,10 +461,11 @@ "legacy_id": 35, "legacy_name": "chickpea", "key": "chickpea", - "fdc_id": 2644282, + "fdc_id": 173756, "status": "proposed", - "match_rule": "unique display-name prefix match on generic qualifier", + "match_rule": "vocabulary resolution via vocabulary key 'chickpeas' (hand-verified pin or bulk-CSV row)", "candidates": [ + 173756, 2644282 ] }, @@ -526,7 +529,7 @@ "legacy_name": "apple", "key": "apple", "fdc_id": 168202, - "status": "unresolved", + "status": "resolved", "match_rule": "vocabulary resolution (hand-verified pin or bulk-CSV row)", "candidates": [ 167771, @@ -555,7 +558,7 @@ "legacy_name": "frozen_peas", "key": "frozen_peas", "fdc_id": 170419, - "status": "unresolved", + "status": "resolved", "match_rule": "vocabulary resolution (hand-verified pin or bulk-CSV row)", "candidates": [ 170419 @@ -566,7 +569,7 @@ "legacy_name": "canned_tuna", "key": "canned_tuna", "fdc_id": 171986, - "status": "unresolved", + "status": "resolved", "match_rule": "vocabulary resolution (hand-verified pin or bulk-CSV row)", "candidates": [ 171986 @@ -599,7 +602,7 @@ "legacy_name": "red_pepper_flakes", "key": "red_pepper_flakes", "fdc_id": 170932, - "status": "unresolved", + "status": "resolved", "match_rule": "vocabulary resolution (hand-verified pin or bulk-CSV row)", "candidates": [ 170932 @@ -621,7 +624,7 @@ "legacy_name": "cilantro", "key": "cilantro", "fdc_id": 169997, - "status": "unresolved", + "status": "resolved", "match_rule": "vocabulary resolution (hand-verified pin or bulk-CSV row)", "candidates": [ 169997 diff --git a/data/recipes/tools/build_vocab.py b/data/recipes/tools/build_vocab.py index 2d28c257e..33599baff 100644 --- a/data/recipes/tools/build_vocab.py +++ b/data/recipes/tools/build_vocab.py @@ -217,6 +217,113 @@ "heavy_cream": (170859, "Cream, fluid, heavy whipping (SR Legacy)"), "salt": (173468, "Salt, table (SR Legacy) - catalog prefix hit was Salt Pork"), "egg": (171287, "Egg, whole, raw, fresh (SR Legacy) - catalog row was Salted frozen egg"), + # ---- 2026-10 nutrition completion: keys that shipped without a per-100g + # row. Every pin cites the FDC row's own description and is the same + # product as the key; nothing was resolved by similarity alone. + "allspice": (171315, "Spices, allspice, ground (SR Legacy) - ground is the standard spice-aisle form"), + "apple_cider_vinegar": (173469, "Vinegar, cider (SR Legacy) - cider vinegar is apple cider vinegar"), + "baguette": (2707610, "Bread, French or Vienna (FNDDS) - a baguette is the French bread loaf"), + "baking_powder": (172803, "Leavening agents, baking powder, double-acting, sodium aluminum sulfate (SR Legacy) - the generic household double-acting baking powder"), + "beansprouts": (2709768, "Bean sprouts, raw (FNDDS) - beansprouts are raw mung-bean sprouts"), + "beef_stock": (172883, "Soup, stock, beef, home-prepared (SR Legacy) - the only same-product beef stock row"), + "besan": (174288, "Chickpea flour (besan) (SR Legacy) - exact name"), + "black_eyed_peas": (2707412, "Blackeyed peas, NFS (FNDDS) - the generic prepared row; the only SR mature-seed row is canned with pork"), + "borlotti_beans": (173736, "Beans, cranberry (roman), mature seeds, cooked, boiled, drained, without salt (SR Legacy) - borlotti are cranberry/roman beans; drained-cooked matches the surface"), + "breadcrumbs": (174928, "Bread, crumbs, dry, grated, plain (SR Legacy) - exact plain breadcrumbs"), + "broth": (2707132, "Soup, broth (FNDDS) - the species-unspecified broth row matches the generic surface"), + "burger_buns": (2707657, "Roll, white, hamburger bun (FNDDS) - exact same product"), + "cayenne": (170932, "Spices, pepper, red or cayenne (SR Legacy) - the exact cayenne row"), + "chicken_stock": (172884, "Soup, stock, chicken, home-prepared (SR Legacy) - the only same-product chicken stock row"), + "chiles": (168570, "Peppers, hot chile, sun-dried (SR Legacy) - the surface is dried chiles; the row is sun-dried hot chile peppers"), + "chili_powder": (171319, "Spices, chili powder (SR Legacy) - the exact chili powder blend row"), + "cola": (174852, "Beverages, carbonated, cola, regular (SR Legacy) - the exact generic cola row"), + "cranberry_sauce": (2709280, "Cranberry sauce (FNDDS) - exact same product"), + "daikon": (168451, "Radishes, oriental, raw (SR Legacy) - daikon is the oriental radish"), + "french_fries": (2709456, "Potato, french fries, NFS (FNDDS) - the form-not-specified generic row"), + "glass_noodles": (174258, "Noodles, chinese, cellophane or long rice (mung beans), dehydrated (SR Legacy) - glass noodles are cellophane noodles; dehydrated matches the 80 g corpus line"), + "goat_meat": (175303, "Game meat, goat, raw (SR Legacy) - raw matches the raw ingredient identity"), + "green_chili": (170497, "Peppers, hot chili, green, raw (SR Legacy) - the exact green hot chili row"), + "ground_coriander": (170922, "Spices, coriander seed (SR Legacy) - ground coriander is ground coriander seed"), + "ground_ginger": (170926, "Spices, ginger, ground (SR Legacy) - exact"), + "ground_turmeric": (172231, "Spices, turmeric, ground (SR Legacy) - exact"), + "hao_you": (2707150, "Oyster sauce (FNDDS) - hao you is Cantonese for oyster sauce; same product"), + "hoisin": (2707441, "Hoisin sauce (FNDDS) - exact same product"), + "lemon_juice": (2709180, "Lemon juice, 100%, NS as to form (FNDDS) - the form-not-specified generic row"), + "millet_flour": (172023, "Millet flour (SR Legacy) - exact"), + "mild_curry_powder": (170924, "Spices, curry powder (SR Legacy) - mild heat variant of the standard curry powder blend"), + "nutmeg": (171326, "Spices, nutmeg, ground (SR Legacy) - ground is the standard spice-aisle form"), + "orange_juice": (2709186, "Orange juice, 100%, NFS (FNDDS) - the form-not-specified generic row"), + "orzo": (2708357, "Pasta, cooked (FNDDS) - orzo shares the pasta identity; the corpus line is 1 cup = 200 g (cooked), same row as pasta_dried"), + "paprika": (171329, "Spices, paprika (SR Legacy) - exact (same row as the smoked_paprika pin)"), + "pomegranate_seeds": (169134, "Pomegranates, raw (SR Legacy) - the row's edible portion is the arils with seeds"), + "pork_cutlets": (168230, "Pork, fresh, loin, whole, separable lean only, raw (SR Legacy) - cutlets are boneless lean loin cuts"), + "red_palm_oil": (171015, "Oil, palm (SR Legacy) - red palm oil is unrefined palm oil; identical in the shipped macro fields"), + "rice_flour": (169714, "Rice flour, white, unenriched (SR Legacy) - exact; white is the default rice flour"), + "salt_cod": (174190, "Fish, cod, Atlantic, dried and salted (SR Legacy) - exact same product"), + "smoked_sausage": (174585, "Sausage, smoked link sausage, pork and beef (SR Legacy) - the generic mixed smoked link sausage"), + "squid": (174223, "Mollusks, squid, mixed species, raw (SR Legacy) - exact"), + "sriracha": (171186, "Sauce, hot chile, sriracha (SR Legacy) - exact same product"), + "swede": (168454, "Rutabagas, raw (SR Legacy) - swede is the British name for rutabaga"), + "tamari": (174278, "Soy sauce made from soy (tamari) (SR Legacy) - the exact tamari row (same row as soy_sauce)"), + "tamarind_paste": (167763, "Tamarinds, raw (SR Legacy) - block paste is pressed tamarind pulp; the raw row is the edible pulp"), + "turmeric": (172231, "Spices, turmeric, ground (SR Legacy) - ground is the standard spice-aisle form (same row as ground_turmeric)"), + "udon_noodles": (2708352, "Noodles, cooked (FNDDS) - udon is a wheat noodle; the cooked generic row matches the fresh-udon 320 g corpus line"), + "vegetable_stock": (171180, "Soup, SWANSON, vegetable broth (SR Legacy) - the only same-product row; branded ready-to-serve vegetable broth"), + "white_vinegar": (172237, "Vinegar, distilled (SR Legacy) - distilled white vinegar"), + "whole_wheat_flour": (168893, "Wheat flour, whole-grain (SR Legacy) - whole wheat flour is whole-grain wheat flour"), +} + +# Keys that stay unresolved after the 2026-10 nutrition-completion pass, with +# the FDC rows considered and the reason each was rejected. A specialty with +# no honest FDC equivalent keeps partial coverage instead of a guessed row. +# The audit is emitted to data/ingredients/unresolved-candidates.json. +UNRESOLVED_CANDIDATES: dict[str, dict] = { + "ackee": {"candidates": [], "note": "no FDC row under any searched name (ackee, blighia); Jamaican specialty"}, + "artichoke_hearts": {"candidates": [169205, 168387, 2709766], "note": "raw/frozen globe artichoke rows are the edible portion without the brine the drained jarred hearts imply; a raw row would understate sodium"}, + "beef_meatballs": {"candidates": [2706467, 171638, 2706580], "note": "the FNDDS row carries sauce and the SR row is seasoned Italian-style frozen; neither is plain beef meatballs"}, + "beef_vegetable_stock": {"candidates": [172883, 171180], "note": "surface is 'beef or vegetable stock'; both single-species rows are different products"}, + "black_bean_paste": {"candidates": [], "note": "fermented black-soybean paste; no FDC row (searched tausi, douchi, black bean paste)"}, + "black_vinegar": {"candidates": [172241], "note": "balsamic is grape must, a different product; no Chinese black (Chinkiang) vinegar row"}, + "callaloo_greens": {"candidates": [], "note": "callaloo greens are species-ambiguous (taro/amaranth/dasheen); no single-product FDC row"}, + "chicharrones": {"candidates": [], "note": "no pork-rind row in FNDDS 2024 or SR Legacy"}, + "chilli_sauce": {"candidates": [2709735, 171186], "note": "surface is 'sweet chili sauce'; the tomato chili sauce and hot chile sauce rows are different products"}, + "dashi": {"candidates": [], "note": "kombu + bonito infusion; no FDC row"}, + "doenjang": {"candidates": [], "note": "Korean fermented soybean paste; no FDC row (miso is a different product)"}, + "doubanjiang": {"candidates": [], "note": "fermented chili-bean paste; no FDC row"}, + "egusi_seeds": {"candidates": [], "note": "melon/cucurbit seed kernels; no FDC row (searched melon seed, egusi)"}, + "farro": {"candidates": [2710828], "note": "Foundation Foods 'Farro, pearled, dry, raw' carries no energy measurement in kcal in the bulk CSVs; pinning it would emit kcal 0.0"}, + "five_spice_powder": {"candidates": [], "note": "Chinese spice blend; no FDC row"}, + "flattened_rice": {"candidates": [], "note": "poha; no FDC row"}, + "galangal": {"candidates": [], "note": "no FDC row (ginger is a different plant)"}, + "garam_masala": {"candidates": [], "note": "North Indian spice blend; no FDC row"}, + "gochugaru": {"candidates": [170932, 168570], "note": "Korean coarse chili flakes; the ground cayenne spice and whole sun-dried chile rows are different products"}, + "gochujang": {"candidates": [], "note": "Korean chili-soybean paste; no FDC row"}, + "green_curry_paste": {"candidates": [2710178], "note": "FNDDS 'Curry sauce' is a different (British-style) product"}, + "green_papaya": {"candidates": [2709246, 2709247], "note": "the raw/canned papaya rows are the ripe fruit; unripe green papaya differs materially in sugar"}, + "halloumi": {"candidates": [], "note": "no halloumi row; feta and mozzarella are different products"}, + "harissa": {"candidates": [], "note": "no harissa row in FNDDS 2024 or SR Legacy"}, + "jerk_seasoning": {"candidates": [], "note": "Jamaican spice blend; no FDC row"}, + "kaffir_lime": {"candidates": [], "note": "makrut lime leaves; no FDC row"}, + "labneh": {"candidates": [2705415], "note": "Greek yogurt rows are less-strained and materially lower in energy; not the same product"}, + "massaman_curry_paste": {"candidates": [2710178], "note": "FNDDS 'Curry sauce' is a different product"}, + "mirin": {"candidates": [167723], "note": "the sake row is unsweetened; mirin's sugar content differs materially"}, + "nduja": {"candidates": [], "note": "spreadable spicy cured pork; no FDC row"}, + "potato_starch": {"candidates": [], "note": "no standalone potato-starch row (hits are composite breads)"}, + "preserved_lemon": {"candidates": [], "note": "salt-pickled lemons; no FDC row"}, + "pomegranate_molasses": {"candidates": [168820], "note": "cane molasses is a different product; no pomegranate-reduction row"}, + "ras_el_hanout": {"candidates": [], "note": "North African spice blend; no FDC row"}, + "rice_powder": {"candidates": [169714, 168898], "note": "surface is 'toasted rice powder' (khao khua); the untoasted rice flour rows are a different product"}, + "rice_vinegar": {"candidates": [2709351], "note": "the FNDDS generic 'Vinegar' row is not the rice-vinegar product; no rice vinegar row"}, + "scotch_bonnet": {"candidates": [170106], "note": "generic hot red chili row; the named variety is not represented"}, + "sichuan_peppercorns": {"candidates": [], "note": "no FDC row (searched sichuan, szechuan pepper)"}, + "spring_roll_wrappers": {"candidates": [172802], "note": "wonton wrappers contain egg; wheat-only spring roll wrappers are a different product"}, + "star_anise": {"candidates": [171316], "note": "anise seed is a different plant (shared aroma compound only)"}, + "stock": {"candidates": [172883, 172884, 172885], "note": "all FDC stock rows are species-specific (beef/chicken/fish); the surface names no species"}, + "sumac": {"candidates": [], "note": "no FDC row"}, + "sweet_potato_noodles": {"candidates": [174258, 2708355], "note": "the cellophane rows are mung-bean starch, not sweet-potato starch (dangmyeon)"}, + "thai_chilies": {"candidates": [170106], "note": "generic hot red chili row; the named variety is not represented"}, + "umeboshi": {"candidates": [], "note": "pickled ume; no FDC row"}, + "zaatar": {"candidates": [], "note": "Middle Eastern herb blend; no FDC row"}, } # Class overrides for keys with no canon fact (meat/fish/dairy/... used by @@ -843,14 +950,33 @@ def fdc_search(key: str) -> tuple[int, str, str] | None: status, rule, fdc = "unresolved", "no acceptable candidate in the bundled catalog", None # The vocabulary resolution is authoritative: hand-verified pins and # bulk-CSV rows beat a bundled-catalog prefix hit (e.g. egg resolved - # to the catalog's Salted frozen egg before the pin existed). - if by_key.get(key, {}).get("fdc_id") is not None: - vocab_fdc = by_key[key]["fdc_id"] + # to the catalog's Salted frozen egg before the pin existed). When the + # exact key itself carries no fdc_id, plural/singular vocabulary keys + # are tried (legacy "tortilla" -> vocabulary "tortillas"). A legacy + # entry that was unresolved and now carries a resolution flips status. + vocab_entry = None + variant = "" + variant_keys = [key] + if key.endswith("s"): + variant_keys.append(key[:-1]) + else: + variant_keys.append(key + "s") + for vk in variant_keys: + ent = by_key.get(vk) + if ent is not None and ent.get("fdc_id") is not None: + vocab_entry = ent + if vk != key: + variant = f" via vocabulary key '{vk}'" + break + if vocab_entry is not None: + vocab_fdc = vocab_entry["fdc_id"] if vocab_fdc != fdc: fdc = vocab_fdc - rule = "vocabulary resolution (hand-verified pin or bulk-CSV row)" + rule = f"vocabulary resolution{variant} (hand-verified pin or bulk-CSV row)" if vocab_fdc not in candidates: candidates = sorted(candidates + [vocab_fdc]) + if status == "unresolved": + status = "resolved" identity_entries.append({ "legacy_id": lid, "legacy_name": name, "key": key, "fdc_id": fdc, "status": status, "match_rule": rule, "candidates": candidates, @@ -864,6 +990,14 @@ def fdc_search(key: str) -> tuple[int, str, str] | None: # ---- 5. emit ------------------------------------------------------------ ING_DIR.mkdir(parents=True, exist_ok=True) + # keep the unresolved-candidates audit in lockstep with the vocabulary + no_per100 = {e["key"] for e in vocab if e["per_100g"] is None} + audit_missing = sorted(no_per100 - set(UNRESOLVED_CANDIDATES)) + audit_extra = sorted(set(UNRESOLVED_CANDIDATES) - no_per100) + if audit_missing or audit_extra: + raise SystemExit( + "unresolved-candidates audit out of sync with vocabulary: " + f"missing={audit_missing} extra={audit_extra}") vocab_doc = { "schema": "https://fridgeluck.app/schemas/ingredient-vocabulary-v1.json", "sources": { @@ -890,6 +1024,15 @@ def fdc_search(key: str) -> tuple[int, str, str] | None: (REPO / "data/recipes/legacy-ingredient-map.json").write_text( json.dumps(legacy_map, indent=2, ensure_ascii=False) + "\n" ) + (ING_DIR / "unresolved-candidates.json").write_text( + json.dumps({ + "note": "Vocabulary keys with no per-100g row. Each stays unresolved unless a cited " + "FDC row is the same product; candidates list the FDC rows considered and " + "rejected during the 2026-10 nutrition-completion pass (see " + "UNRESOLVED_CANDIDATES in data/recipes/tools/build_vocab.py).", + "keys": dict(sorted(UNRESOLVED_CANDIDATES.items())), + }, indent=2, ensure_ascii=False) + "\n" + ) # ---- 6. audit ------------------------------------------------------------ st = Counter(e["status"] for e in identity_entries) From a1c36b6b63f76e0c9dfda79830bd104336b95895 Mon Sep 17 00:00:00 2001 From: Sam Gu <127461594+SamGu-NRX@users.noreply.github.com> Date: Thu, 15 Oct 2026 16:38:48 +0000 Subject: [PATCH 2/7] data(bundle): recompile with resolved vocabulary; add kcal-drift validation Recompile the recipe bundle after the 2026-10 vocabulary resolution (51 keys pinned to same-product FDC rows; 46 stay unresolved with their rejected candidates audited in data/ingredients/unresolved-candidates.json). - GENERATED_AT bumped to 2026-10-15T19:05:00Z per the compiler's recompile instruction; compiled three times, byte-identical. - Nutrition coverage 163 computed / 345 estimated / 255 partial -> 164 / 500 / 99. 193 recipes changed kcal (median +11.5); the 33 that moved more than 40% are the previously under-reported ones, each with a recorded cause in data/recipe-bundle/nutrition-changes-2026-10.json (generated by record_nutrition_changes.py, which fails closed when a swing traces to no resolved key). - validate_bundle.py gains an optional --previous/--changes check: any unrecorded >40% per-serving kcal move against the previously published bundle fails, and exemptions must reproduce both kcal values and name the vocabulary change that caused them. - Shipped copy apps/ios/Resources/RecipeCatalog/recipes-v2.json is byte-identical to the build copy (sha256 8fd59412...375b351, 2,611,873 bytes); manifest and validation-report addendum updated. - find_candidates.py: the exploratory same-product row search used to select the pins. - Tests: test_kcal_drift.py with planted violations (unrecorded swing, stale exemption values, blank cause, zero-kcal edge, seeded real- bundle violation, committed-file consistency). Suite: 18 passed. Co-authored-by: Sam Gu --- .../Resources/RecipeCatalog/recipes-v2.json | 2840 ++++++++++------- data/recipe-bundle/manifest.json | 23 +- .../nutrition-changes-2026-10.json | 206 ++ data/recipe-bundle/validation-report.md | 29 + data/recipes/build/recipes-v2.json | 2840 ++++++++++------- data/recipes/tools/compile_bundle.py | 2 +- data/recipes/tools/find_candidates.py | 91 + .../recipes/tools/record_nutrition_changes.py | 108 + data/recipes/tools/tests/test_kcal_drift.py | 108 + data/recipes/tools/validate_bundle.py | 74 +- 10 files changed, 3875 insertions(+), 2446 deletions(-) create mode 100644 data/recipe-bundle/nutrition-changes-2026-10.json create mode 100644 data/recipes/tools/find_candidates.py create mode 100644 data/recipes/tools/record_nutrition_changes.py create mode 100644 data/recipes/tools/tests/test_kcal_drift.py diff --git a/apps/ios/Resources/RecipeCatalog/recipes-v2.json b/apps/ios/Resources/RecipeCatalog/recipes-v2.json index c7c89ad6f..7a9e30ba7 100644 --- a/apps/ios/Resources/RecipeCatalog/recipes-v2.json +++ b/apps/ios/Resources/RecipeCatalog/recipes-v2.json @@ -1,7 +1,7 @@ { "schema": "https://fridgeluck.app/schemas/recipe-bundle-v2.schema.json", "bundle_version": 2, - "generated_at": "2026-10-15T12:45:00Z", + "generated_at": "2026-10-15T19:05:00Z", "cuisines": [ "american", "asian", @@ -47,11 +47,19 @@ }, { "key": "allspice", - "fdc_id": null, + "fdc_id": 171315, "legacy_id": null, "display_name": "Allspice", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 263.0, + "protein_g": 6.09, + "carbs_g": 72.12, + "fat_g": 8.69, + "fiber_g": 21.6, + "sugar_g": 0.0, + "sodium_mg": 77.0 + }, "aliases": [ "allspice" ] @@ -143,11 +151,19 @@ }, { "key": "apple_cider_vinegar", - "fdc_id": null, + "fdc_id": 173469, "legacy_id": null, "display_name": "Apple cider vinegar", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 21.0, + "protein_g": 0.0, + "carbs_g": 0.93, + "fat_g": 0.0, + "fiber_g": 0.0, + "sugar_g": 0.4, + "sodium_mg": 5.0 + }, "aliases": [ "apple cider vinegar", "cider vinegar" @@ -284,22 +300,38 @@ }, { "key": "baguette", - "fdc_id": null, + "fdc_id": 2707610, "legacy_id": null, "display_name": "Baguette", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 272.0, + "protein_g": 10.75, + "carbs_g": 51.88, + "fat_g": 2.42, + "fiber_g": 2.2, + "sugar_g": 4.62, + "sodium_mg": 602.0 + }, "aliases": [ "baguette" ] }, { "key": "baking_powder", - "fdc_id": null, + "fdc_id": 172803, "legacy_id": null, "display_name": "Baking powder", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 53.0, + "protein_g": 0.0, + "carbs_g": 27.7, + "fat_g": 0.0, + "fiber_g": 0.2, + "sugar_g": 0.0, + "sodium_mg": 10600.0 + }, "aliases": [ "baking powder" ] @@ -384,11 +416,19 @@ }, { "key": "beansprouts", - "fdc_id": null, + "fdc_id": 2709768, "legacy_id": null, "display_name": "Beansprouts", "category": "vegetable", - "per_100g": null, + "per_100g": { + "kcal": 30.0, + "protein_g": 3.04, + "carbs_g": 5.94, + "fat_g": 0.18, + "fiber_g": 1.8, + "sugar_g": 4.13, + "sodium_mg": 6.0 + }, "aliases": [ "beansprouts" ] @@ -426,11 +466,19 @@ }, { "key": "beef_stock", - "fdc_id": null, + "fdc_id": 172883, "legacy_id": null, "display_name": "Beef stock", "category": "condiment", - "per_100g": null, + "per_100g": { + "kcal": 13.0, + "protein_g": 1.97, + "carbs_g": 1.2, + "fat_g": 0.09, + "fiber_g": 0.0, + "sugar_g": 0.54, + "sodium_mg": 198.0 + }, "aliases": [ "beef broth", "beef stock" @@ -492,11 +540,19 @@ }, { "key": "besan", - "fdc_id": null, + "fdc_id": 174288, "legacy_id": null, "display_name": "Besan", "category": "vegetable", - "per_100g": null, + "per_100g": { + "kcal": 387.0, + "protein_g": 22.39, + "carbs_g": 57.82, + "fat_g": 6.69, + "fiber_g": 10.8, + "sugar_g": 10.85, + "sodium_mg": 64.0 + }, "aliases": [ "besan (chickpea flour)" ] @@ -538,11 +594,19 @@ }, { "key": "black_eyed_peas", - "fdc_id": null, + "fdc_id": 2707412, "legacy_id": null, "display_name": "Black eyed peas", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 166.0, + "protein_g": 7.18, + "carbs_g": 19.29, + "fat_g": 7.0, + "fiber_g": 6.0, + "sugar_g": 3.07, + "sodium_mg": 220.0 + }, "aliases": [ "black-eyed peas" ] @@ -617,11 +681,19 @@ }, { "key": "borlotti_beans", - "fdc_id": null, + "fdc_id": 173736, "legacy_id": null, "display_name": "Borlotti beans", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 136.0, + "protein_g": 9.34, + "carbs_g": 24.46, + "fat_g": 0.46, + "fiber_g": 8.6, + "sugar_g": 0.0, + "sodium_mg": 1.0 + }, "aliases": [ "borlotti beans, drained" ] @@ -658,11 +730,19 @@ }, { "key": "breadcrumbs", - "fdc_id": null, + "fdc_id": 174928, "legacy_id": null, "display_name": "Breadcrumbs", "category": "vegetable", - "per_100g": null, + "per_100g": { + "kcal": 395.0, + "protein_g": 13.35, + "carbs_g": 71.98, + "fat_g": 5.3, + "fiber_g": 4.5, + "sugar_g": 6.2, + "sodium_mg": 732.0 + }, "aliases": [ "bread crumbs", "breadcrumbs", @@ -692,11 +772,19 @@ }, { "key": "broth", - "fdc_id": null, + "fdc_id": 2707132, "legacy_id": null, "display_name": "Broth", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 6.0, + "protein_g": 0.89, + "carbs_g": 0.24, + "fat_g": 0.22, + "fiber_g": 0.0, + "sugar_g": 0.22, + "sodium_mg": 372.0 + }, "aliases": [ "broth" ] @@ -781,11 +869,19 @@ }, { "key": "burger_buns", - "fdc_id": null, + "fdc_id": 2707657, "legacy_id": null, "display_name": "Burger buns", "category": "grain", - "per_100g": null, + "per_100g": { + "kcal": 267.0, + "protein_g": 9.43, + "carbs_g": 49.2, + "fat_g": 3.59, + "fiber_g": 2.3, + "sugar_g": 5.34, + "sodium_mg": 450.0 + }, "aliases": [ "burger buns" ] @@ -1052,11 +1148,19 @@ }, { "key": "cayenne", - "fdc_id": null, + "fdc_id": 170932, "legacy_id": null, "display_name": "Cayenne", "category": "spice", - "per_100g": null, + "per_100g": { + "kcal": 318.0, + "protein_g": 12.01, + "carbs_g": 56.63, + "fat_g": 17.27, + "fiber_g": 27.2, + "sugar_g": 10.34, + "sodium_mg": 30.0 + }, "aliases": [ "cayenne" ] @@ -1181,11 +1285,19 @@ }, { "key": "chicken_stock", - "fdc_id": null, + "fdc_id": 172884, "legacy_id": null, "display_name": "Chicken stock", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 36.0, + "protein_g": 2.52, + "carbs_g": 3.53, + "fat_g": 1.2, + "fiber_g": 0.0, + "sugar_g": 1.58, + "sodium_mg": 143.0 + }, "aliases": [ "chicken bone broth", "chicken broth", @@ -1262,22 +1374,38 @@ }, { "key": "chiles", - "fdc_id": null, + "fdc_id": 168570, "legacy_id": null, "display_name": "Chiles", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 324.0, + "protein_g": 10.58, + "carbs_g": 69.86, + "fat_g": 5.81, + "fiber_g": 28.7, + "sugar_g": 41.06, + "sodium_mg": 91.0 + }, "aliases": [ "dried chiles" ] }, { "key": "chili_powder", - "fdc_id": null, + "fdc_id": 171319, "legacy_id": null, "display_name": "Chili powder", "category": "spice", - "per_100g": null, + "per_100g": { + "kcal": 282.0, + "protein_g": 13.46, + "carbs_g": 49.7, + "fat_g": 14.28, + "fiber_g": 34.8, + "sugar_g": 7.19, + "sodium_mg": 2867.0 + }, "aliases": [ "chili powder" ] @@ -1517,11 +1645,19 @@ }, { "key": "cola", - "fdc_id": null, + "fdc_id": 174852, "legacy_id": null, "display_name": "Cola", "category": "condiment", - "per_100g": null, + "per_100g": { + "kcal": 42.0, + "protein_g": 0.0, + "carbs_g": 10.36, + "fat_g": 0.25, + "fiber_g": 0.0, + "sugar_g": 9.94, + "sodium_mg": 3.0 + }, "aliases": [ "cola" ] @@ -1746,11 +1882,19 @@ }, { "key": "cranberry_sauce", - "fdc_id": null, + "fdc_id": 2709280, "legacy_id": null, "display_name": "Cranberry sauce", "category": "condiment", - "per_100g": null, + "per_100g": { + "kcal": 159.0, + "protein_g": 0.9, + "carbs_g": 40.4, + "fat_g": 0.15, + "fiber_g": 1.1, + "sugar_g": 31.75, + "sodium_mg": 5.0 + }, "aliases": [ "cranberry sauce" ] @@ -1860,11 +2004,19 @@ }, { "key": "daikon", - "fdc_id": null, + "fdc_id": 168451, "legacy_id": null, "display_name": "Daikon", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 18.0, + "protein_g": 0.6, + "carbs_g": 4.1, + "fat_g": 0.1, + "fiber_g": 1.6, + "sugar_g": 2.5, + "sodium_mg": 21.0 + }, "aliases": [ "daikon" ] @@ -2216,11 +2368,19 @@ }, { "key": "french_fries", - "fdc_id": null, + "fdc_id": 2709456, "legacy_id": null, "display_name": "French fries", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 225.0, + "protein_g": 2.5, + "carbs_g": 23.23, + "fat_g": 14.07, + "fiber_g": 1.8, + "sugar_g": 0.34, + "sodium_mg": 295.0 + }, "aliases": [ "french fries" ] @@ -2338,11 +2498,19 @@ }, { "key": "glass_noodles", - "fdc_id": null, + "fdc_id": 174258, "legacy_id": null, "display_name": "Glass noodles", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 351.0, + "protein_g": 0.16, + "carbs_g": 86.09, + "fat_g": 0.06, + "fiber_g": 0.5, + "sugar_g": 0.0, + "sodium_mg": 10.0 + }, "aliases": [ "glass noodles" ] @@ -2388,11 +2556,19 @@ }, { "key": "goat_meat", - "fdc_id": null, + "fdc_id": 175303, "legacy_id": null, "display_name": "Goat meat", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 109.0, + "protein_g": 20.6, + "carbs_g": 0.0, + "fat_g": 2.31, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 82.0 + }, "aliases": [ "goat meat" ] @@ -2521,11 +2697,19 @@ }, { "key": "green_chili", - "fdc_id": null, + "fdc_id": 170497, "legacy_id": null, "display_name": "Green chili", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 40.0, + "protein_g": 2.0, + "carbs_g": 9.46, + "fat_g": 0.2, + "fiber_g": 1.5, + "sugar_g": 5.1, + "sodium_mg": 7.0 + }, "aliases": [ "green chili", "mild green chiles" @@ -2642,22 +2826,38 @@ }, { "key": "ground_coriander", - "fdc_id": null, + "fdc_id": 170922, "legacy_id": null, "display_name": "Ground coriander", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 298.0, + "protein_g": 12.37, + "carbs_g": 54.99, + "fat_g": 17.77, + "fiber_g": 41.9, + "sugar_g": 0.0, + "sodium_mg": 35.0 + }, "aliases": [ "ground coriander" ] }, { "key": "ground_ginger", - "fdc_id": null, + "fdc_id": 170926, "legacy_id": null, "display_name": "Ground ginger", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 335.0, + "protein_g": 8.98, + "carbs_g": 71.62, + "fat_g": 4.24, + "fiber_g": 14.1, + "sugar_g": 3.39, + "sodium_mg": 27.0 + }, "aliases": [ "ground ginger" ] @@ -2685,11 +2885,19 @@ }, { "key": "ground_turmeric", - "fdc_id": null, + "fdc_id": 172231, "legacy_id": null, "display_name": "Ground turmeric", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 312.0, + "protein_g": 9.68, + "carbs_g": 67.14, + "fat_g": 3.25, + "fiber_g": 22.7, + "sugar_g": 3.21, + "sodium_mg": 27.0 + }, "aliases": [ "ground turmeric" ] @@ -2728,11 +2936,19 @@ }, { "key": "hao_you", - "fdc_id": null, + "fdc_id": 2707150, "legacy_id": null, "display_name": "Hao you", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 51.0, + "protein_g": 1.35, + "carbs_g": 10.92, + "fat_g": 0.25, + "fiber_g": 0.3, + "sugar_g": 0.0, + "sodium_mg": 2733.0 + }, "aliases": [ "hao you" ] @@ -2771,11 +2987,19 @@ }, { "key": "hoisin", - "fdc_id": null, + "fdc_id": 2707441, "legacy_id": null, "display_name": "Hoisin", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 220.0, + "protein_g": 3.31, + "carbs_g": 44.08, + "fat_g": 3.39, + "fiber_g": 2.8, + "sugar_g": 27.26, + "sodium_mg": 1615.0 + }, "aliases": [ "hoisin sauce" ] @@ -3113,11 +3337,19 @@ }, { "key": "lemon_juice", - "fdc_id": null, + "fdc_id": 2709180, "legacy_id": null, "display_name": "Lemon juice", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 22.0, + "protein_g": 0.35, + "carbs_g": 6.9, + "fat_g": 0.24, + "fiber_g": 0.3, + "sugar_g": 2.52, + "sodium_mg": 1.0 + }, "aliases": [ "lemon juice" ] @@ -3316,11 +3548,19 @@ }, { "key": "mild_curry_powder", - "fdc_id": null, + "fdc_id": 170924, "legacy_id": null, "display_name": "Mild curry powder", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 325.0, + "protein_g": 14.29, + "carbs_g": 55.83, + "fat_g": 14.01, + "fiber_g": 53.2, + "sugar_g": 2.76, + "sodium_mg": 52.0 + }, "aliases": [ "mild curry powder" ] @@ -3368,11 +3608,19 @@ }, { "key": "millet_flour", - "fdc_id": null, + "fdc_id": 172023, "legacy_id": null, "display_name": "Millet flour", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 382.0, + "protein_g": 10.75, + "carbs_g": 75.12, + "fat_g": 4.25, + "fiber_g": 3.5, + "sugar_g": 1.66, + "sodium_mg": 4.0 + }, "aliases": [ "millet flour" ] @@ -3574,11 +3822,19 @@ }, { "key": "nutmeg", - "fdc_id": null, + "fdc_id": 171326, "legacy_id": null, "display_name": "Nutmeg", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 525.0, + "protein_g": 5.84, + "carbs_g": 49.29, + "fat_g": 36.31, + "fiber_g": 20.8, + "sugar_g": 2.99, + "sodium_mg": 16.0 + }, "aliases": [ "nutmeg" ] @@ -3694,11 +3950,19 @@ }, { "key": "orange_juice", - "fdc_id": null, + "fdc_id": 2709186, "legacy_id": null, "display_name": "Orange juice", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 47.0, + "protein_g": 0.77, + "carbs_g": 10.17, + "fat_g": 0.34, + "fiber_g": 0.3, + "sugar_g": 8.18, + "sodium_mg": 2.0 + }, "aliases": [ "orange juice" ] @@ -3745,11 +4009,19 @@ }, { "key": "orzo", - "fdc_id": null, + "fdc_id": 2708357, "legacy_id": null, "display_name": "Orzo", "category": "vegetable", - "per_100g": null, + "per_100g": { + "kcal": 157.0, + "protein_g": 5.76, + "carbs_g": 30.68, + "fat_g": 0.92, + "fiber_g": 1.8, + "sugar_g": 0.56, + "sodium_mg": 232.0 + }, "aliases": [ "orzo", "risoni" @@ -3777,11 +4049,19 @@ }, { "key": "paprika", - "fdc_id": null, + "fdc_id": 171329, "legacy_id": null, "display_name": "Paprika", "category": "spice", - "per_100g": null, + "per_100g": { + "kcal": 282.0, + "protein_g": 14.14, + "carbs_g": 53.99, + "fat_g": 12.89, + "fiber_g": 34.9, + "sugar_g": 10.34, + "sodium_mg": 68.0 + }, "aliases": [ "paprika" ] @@ -4068,11 +4348,19 @@ }, { "key": "pomegranate_seeds", - "fdc_id": null, + "fdc_id": 169134, "legacy_id": null, "display_name": "Pomegranate seeds", "category": "fruit", - "per_100g": null, + "per_100g": { + "kcal": 83.0, + "protein_g": 1.67, + "carbs_g": 18.7, + "fat_g": 1.17, + "fiber_g": 4.0, + "sugar_g": 13.67, + "sodium_mg": 3.0 + }, "aliases": [ "pomegranate seeds" ] @@ -4119,11 +4407,19 @@ }, { "key": "pork_cutlets", - "fdc_id": null, + "fdc_id": 168230, "legacy_id": null, "display_name": "Pork cutlets", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 143.0, + "protein_g": 21.43, + "carbs_g": 0.0, + "fat_g": 5.66, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 52.0 + }, "aliases": [ "pork cutlets" ] @@ -4384,11 +4680,19 @@ }, { "key": "red_palm_oil", - "fdc_id": null, + "fdc_id": 171015, "legacy_id": null, "display_name": "Red palm oil", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 884.0, + "protein_g": 0.0, + "carbs_g": 0.0, + "fat_g": 100.0, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 0.0 + }, "aliases": [ "red palm oil" ] @@ -4519,11 +4823,19 @@ }, { "key": "rice_flour", - "fdc_id": null, + "fdc_id": 169714, "legacy_id": null, "display_name": "Rice flour", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 366.0, + "protein_g": 5.95, + "carbs_g": 80.13, + "fat_g": 1.42, + "fiber_g": 2.4, + "sugar_g": 0.12, + "sodium_mg": 0.0 + }, "aliases": [ "rice flour" ] @@ -4717,11 +5029,19 @@ }, { "key": "salt_cod", - "fdc_id": null, + "fdc_id": 174190, "legacy_id": null, "display_name": "Salt cod", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 290.0, + "protein_g": 62.82, + "carbs_g": 0.0, + "fat_g": 2.37, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 7027.0 + }, "aliases": [ "salt cod" ] @@ -5008,11 +5328,19 @@ }, { "key": "smoked_sausage", - "fdc_id": null, + "fdc_id": 174585, "legacy_id": null, "display_name": "Smoked sausage", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 320.0, + "protein_g": 12.0, + "carbs_g": 2.42, + "fat_g": 28.73, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 911.0 + }, "aliases": [ "smoked sausage" ] @@ -5115,22 +5443,38 @@ }, { "key": "squid", - "fdc_id": null, + "fdc_id": 174223, "legacy_id": null, "display_name": "Squid", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 92.0, + "protein_g": 15.58, + "carbs_g": 3.08, + "fat_g": 1.38, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 44.0 + }, "aliases": [ "squid" ] }, { "key": "sriracha", - "fdc_id": null, + "fdc_id": 171186, "legacy_id": null, "display_name": "Sriracha", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 93.0, + "protein_g": 1.93, + "carbs_g": 19.16, + "fat_g": 0.93, + "fiber_g": 2.2, + "sugar_g": 15.11, + "sodium_mg": 2124.0 + }, "aliases": [ "sriracha" ] @@ -5211,11 +5555,19 @@ }, { "key": "swede", - "fdc_id": null, + "fdc_id": 168454, "legacy_id": null, "display_name": "Swede", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 37.0, + "protein_g": 1.08, + "carbs_g": 8.62, + "fat_g": 0.16, + "fiber_g": 2.3, + "sugar_g": 4.46, + "sodium_mg": 12.0 + }, "aliases": [ "swede, peeled and cubed" ] @@ -5297,11 +5649,19 @@ }, { "key": "tamari", - "fdc_id": null, + "fdc_id": 174278, "legacy_id": null, "display_name": "Tamari", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 60.0, + "protein_g": 10.51, + "carbs_g": 5.57, + "fat_g": 0.1, + "fiber_g": 0.8, + "sugar_g": 1.7, + "sodium_mg": 5586.0 + }, "aliases": [ "japanese tamari", "tamari", @@ -5310,11 +5670,19 @@ }, { "key": "tamarind_paste", - "fdc_id": null, + "fdc_id": 167763, "legacy_id": null, "display_name": "Tamarind paste", "category": "condiment", - "per_100g": null, + "per_100g": { + "kcal": 239.0, + "protein_g": 2.8, + "carbs_g": 62.5, + "fat_g": 0.6, + "fiber_g": 5.1, + "sugar_g": 38.8, + "sodium_mg": 28.0 + }, "aliases": [ "tamarind paste", "tamarind paste or rice vinegar" @@ -5507,22 +5875,38 @@ }, { "key": "turmeric", - "fdc_id": null, + "fdc_id": 172231, "legacy_id": null, "display_name": "Turmeric", "category": "spice", - "per_100g": null, + "per_100g": { + "kcal": 312.0, + "protein_g": 9.68, + "carbs_g": 67.14, + "fat_g": 3.25, + "fiber_g": 22.7, + "sugar_g": 3.21, + "sodium_mg": 27.0 + }, "aliases": [ "turmeric" ] }, { "key": "udon_noodles", - "fdc_id": null, + "fdc_id": 2708352, "legacy_id": null, "display_name": "Udon noodles", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 137.0, + "protein_g": 4.51, + "carbs_g": 25.01, + "fat_g": 2.06, + "fiber_g": 1.2, + "sugar_g": 0.4, + "sodium_mg": 236.0 + }, "aliases": [ "udon noodles" ] @@ -5578,11 +5962,19 @@ }, { "key": "vegetable_stock", - "fdc_id": null, + "fdc_id": 171180, "legacy_id": null, "display_name": "Vegetable stock", "category": "condiment", - "per_100g": null, + "per_100g": { + "kcal": 6.0, + "protein_g": 0.23, + "carbs_g": 1.02, + "fat_g": 0.07, + "fiber_g": 0.0, + "sugar_g": 0.57, + "sodium_mg": 303.0 + }, "aliases": [ "veg stock", "vegetable broth", @@ -5773,22 +6165,38 @@ }, { "key": "white_vinegar", - "fdc_id": null, + "fdc_id": 172237, "legacy_id": null, "display_name": "White vinegar", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 18.0, + "protein_g": 0.0, + "carbs_g": 0.04, + "fat_g": 0.0, + "fiber_g": 0.0, + "sugar_g": 0.04, + "sodium_mg": 2.0 + }, "aliases": [ "white vinegar" ] }, { "key": "whole_wheat_flour", - "fdc_id": null, + "fdc_id": 168893, "legacy_id": null, "display_name": "Whole wheat flour", "category": "grain", - "per_100g": null, + "per_100g": { + "kcal": 340.0, + "protein_g": 13.21, + "carbs_g": 71.97, + "fat_g": 2.5, + "fiber_g": 10.7, + "sugar_g": 0.41, + "sodium_mg": 2.0 + }, "aliases": [ "whole wheat flour" ] @@ -6324,13 +6732,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 412.0, + "kcal": 413.8, "protein_g": 13.2, - "carbs_g": 54.4, + "carbs_g": 55.4, "fat_g": 15.1, "fiber_g": 2.0, - "sodium_mg": 428.9, - "coverage": "partial", + "sodium_mg": 786.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -6849,13 +7257,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 173.9, + "kcal": 174.3, "protein_g": 9.3, - "carbs_g": 30.7, + "carbs_g": 30.9, "fat_g": 6.1, "fiber_g": 4.1, - "sodium_mg": 159.2, - "coverage": "partial", + "sodium_mg": 238.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -8315,13 +8723,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 272.6, - "protein_g": 11.6, - "carbs_g": 30.5, - "fat_g": 11.9, + "kcal": 283.4, + "protein_g": 12.0, + "carbs_g": 32.4, + "fat_g": 12.0, "fiber_g": 3.2, - "sodium_mg": 659.7, - "coverage": "partial", + "sodium_mg": 1205.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -8485,13 +8893,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 306.9, - "protein_g": 25.8, - "carbs_g": 12.3, - "fat_g": 17.3, + "kcal": 436.5, + "protein_g": 34.9, + "carbs_g": 25.0, + "fat_g": 21.6, "fiber_g": 1.3, - "sodium_mg": 443.1, - "coverage": "partial", + "sodium_mg": 957.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -8832,13 +9240,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 807.9, - "protein_g": 45.0, - "carbs_g": 104.6, - "fat_g": 23.2, + "kcal": 923.1, + "protein_g": 53.0, + "carbs_g": 115.9, + "fat_g": 27.0, "fiber_g": 5.9, - "sodium_mg": 472.3, - "coverage": "partial", + "sodium_mg": 929.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -9789,13 +10197,13 @@ "dairy_free": true }, "nutrition_per_serving": { - "kcal": 829.0, - "protein_g": 38.6, - "carbs_g": 152.9, + "kcal": 838.6, + "protein_g": 40.3, + "carbs_g": 153.8, "fat_g": 4.9, - "fiber_g": 3.9, - "sodium_mg": 116.8, - "coverage": "partial", + "fiber_g": 4.1, + "sodium_mg": 1010.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -10805,13 +11213,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 325.0, - "protein_g": 22.9, - "carbs_g": 29.7, - "fat_g": 12.8, + "kcal": 359.5, + "protein_g": 25.4, + "carbs_g": 33.1, + "fat_g": 13.9, "fiber_g": 3.6, - "sodium_mg": 201.4, - "coverage": "partial", + "sodium_mg": 338.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -12649,13 +13057,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 220.6, + "kcal": 221.4, "protein_g": 5.6, - "carbs_g": 29.2, + "carbs_g": 29.6, "fat_g": 9.1, "fiber_g": 2.2, - "sodium_mg": 68.1, - "coverage": "partial", + "sodium_mg": 227.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -13454,13 +13862,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 428.2, - "protein_g": 17.2, - "carbs_g": 73.5, - "fat_g": 10.4, + "kcal": 442.6, + "protein_g": 17.7, + "carbs_g": 75.9, + "fat_g": 10.5, "fiber_g": 18.9, - "sodium_mg": 40.3, - "coverage": "partial", + "sodium_mg": 767.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -13864,13 +14272,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 276.7, - "protein_g": 26.6, - "carbs_g": 27.9, - "fat_g": 6.1, + "kcal": 363.1, + "protein_g": 32.7, + "carbs_g": 36.3, + "fat_g": 9.0, "fiber_g": 2.9, - "sodium_mg": 299.3, - "coverage": "partial", + "sodium_mg": 642.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -14075,12 +14483,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 417.2, - "protein_g": 31.8, - "carbs_g": 29.5, - "fat_g": 18.9, - "fiber_g": 2.0, - "sodium_mg": 183.8, + "kcal": 419.6, + "protein_g": 31.9, + "carbs_g": 30.0, + "fat_g": 19.0, + "fiber_g": 2.2, + "sodium_mg": 184.0, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -14470,13 +14878,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 790.1, - "protein_g": 54.2, - "carbs_g": 45.9, - "fat_g": 44.5, + "kcal": 811.7, + "protein_g": 55.7, + "carbs_g": 48.1, + "fat_g": 45.2, "fiber_g": 13.0, - "sodium_mg": 501.0, - "coverage": "partial", + "sodium_mg": 586.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -14897,13 +15305,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1255.2, - "protein_g": 17.3, - "carbs_g": 165.8, + "kcal": 1262.4, + "protein_g": 18.5, + "carbs_g": 166.5, "fat_g": 60.2, - "fiber_g": 12.3, - "sodium_mg": 1481.4, - "coverage": "partial", + "fiber_g": 12.4, + "sodium_mg": 2151.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -15311,12 +15719,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 406.6, - "protein_g": 28.6, - "carbs_g": 27.9, + "kcal": 408.9, + "protein_g": 28.7, + "carbs_g": 28.4, "fat_g": 20.0, - "fiber_g": 2.5, - "sodium_mg": 211.9, + "fiber_g": 2.7, + "sodium_mg": 212.1, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -15572,13 +15980,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 398.3, - "protein_g": 27.9, - "carbs_g": 46.4, - "fat_g": 11.6, + "kcal": 441.5, + "protein_g": 31.0, + "carbs_g": 50.6, + "fat_g": 13.0, "fiber_g": 4.2, - "sodium_mg": 310.0, - "coverage": "partial", + "sodium_mg": 481.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -16538,13 +16946,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1844.7, - "protein_g": 75.8, - "carbs_g": 326.0, - "fat_g": 27.3, + "kcal": 1866.3, + "protein_g": 76.6, + "carbs_g": 329.7, + "fat_g": 27.6, "fiber_g": 22.2, - "sodium_mg": 2269.3, - "coverage": "partial", + "sodium_mg": 3360.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -16704,13 +17112,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 280.9, + "kcal": 282.1, "protein_g": 16.8, - "carbs_g": 9.2, + "carbs_g": 9.5, "fat_g": 19.3, - "fiber_g": 0.5, - "sodium_mg": 233.2, - "coverage": "partial", + "fiber_g": 0.6, + "sodium_mg": 233.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -16880,13 +17288,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 236.0, - "protein_g": 6.0, - "carbs_g": 23.6, + "kcal": 237.2, + "protein_g": 6.1, + "carbs_g": 23.8, "fat_g": 14.7, - "fiber_g": 4.1, - "sodium_mg": 38.2, - "coverage": "partial", + "fiber_g": 4.2, + "sodium_mg": 38.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -17049,13 +17457,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 236.5, - "protein_g": 8.6, - "carbs_g": 36.4, - "fat_g": 6.8, - "fiber_g": 5.7, - "sodium_mg": 59.9, - "coverage": "partial", + "kcal": 662.7, + "protein_g": 25.2, + "carbs_g": 126.6, + "fat_g": 9.9, + "fiber_g": 19.2, + "sodium_mg": 62.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -17388,13 +17796,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 309.4, - "protein_g": 14.4, - "carbs_g": 45.7, + "kcal": 311.7, + "protein_g": 14.5, + "carbs_g": 46.2, "fat_g": 8.4, - "fiber_g": 7.8, - "sodium_mg": 111.5, - "coverage": "partial", + "fiber_g": 7.9, + "sodium_mg": 111.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -17776,13 +18184,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 412.6, + "kcal": 413.9, "protein_g": 18.0, - "carbs_g": 43.6, + "carbs_g": 43.9, "fat_g": 19.8, "fiber_g": 16.0, - "sodium_mg": 479.1, - "coverage": "partial", + "sodium_mg": 479.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -18178,13 +18586,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 368.7, - "protein_g": 26.1, - "carbs_g": 11.2, + "kcal": 371.0, + "protein_g": 26.2, + "carbs_g": 11.7, "fat_g": 25.1, - "fiber_g": 2.7, - "sodium_mg": 99.5, - "coverage": "partial", + "fiber_g": 2.8, + "sodium_mg": 99.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -18393,12 +18801,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1153.1, - "protein_g": 53.9, - "carbs_g": 170.8, + "kcal": 1155.5, + "protein_g": 54.0, + "carbs_g": 171.3, "fat_g": 32.2, - "fiber_g": 34.1, - "sodium_mg": 192.8, + "fiber_g": 34.2, + "sodium_mg": 193.0, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -19633,13 +20041,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 213.8, - "protein_g": 24.4, - "carbs_g": 4.0, - "fat_g": 10.5, + "kcal": 235.4, + "protein_g": 25.9, + "carbs_g": 6.1, + "fat_g": 11.3, "fiber_g": 0.9, - "sodium_mg": 89.9, - "coverage": "partial", + "sodium_mg": 175.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -19987,13 +20395,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 241.0, - "protein_g": 25.2, - "carbs_g": 11.5, - "fat_g": 10.8, + "kcal": 284.2, + "protein_g": 28.3, + "carbs_g": 15.8, + "fat_g": 12.2, "fiber_g": 2.7, - "sodium_mg": 92.2, - "coverage": "partial", + "sodium_mg": 263.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -21216,13 +21624,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1148.7, - "protein_g": 52.3, - "carbs_g": 163.4, - "fat_g": 36.1, + "kcal": 1155.9, + "protein_g": 52.6, + "carbs_g": 164.7, + "fat_g": 36.2, "fiber_g": 32.9, - "sodium_mg": 110.5, - "coverage": "partial", + "sodium_mg": 474.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -22458,13 +22866,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 505.0, - "protein_g": 34.1, - "carbs_g": 41.8, - "fat_g": 22.9, + "kcal": 548.2, + "protein_g": 37.1, + "carbs_g": 46.1, + "fat_g": 24.4, "fiber_g": 4.9, - "sodium_mg": 917.6, - "coverage": "partial", + "sodium_mg": 1089.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -22770,13 +23178,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 177.9, - "protein_g": 20.2, - "carbs_g": 11.9, - "fat_g": 5.0, + "kcal": 350.7, + "protein_g": 32.3, + "carbs_g": 28.8, + "fat_g": 10.8, "fiber_g": 0.9, - "sodium_mg": 619.5, - "coverage": "partial", + "sodium_mg": 1305.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -23470,13 +23878,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 462.7, - "protein_g": 22.5, - "carbs_g": 38.9, + "kcal": 472.3, + "protein_g": 24.1, + "carbs_g": 39.8, "fat_g": 23.5, - "fiber_g": 2.1, - "sodium_mg": 851.7, - "coverage": "partial", + "fiber_g": 2.2, + "sodium_mg": 1745.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -23682,12 +24090,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 431.0, - "protein_g": 31.1, - "carbs_g": 33.3, - "fat_g": 22.7, + "kcal": 441.8, + "protein_g": 31.5, + "carbs_g": 35.1, + "fat_g": 22.8, "fiber_g": 3.3, - "sodium_mg": 890.1, + "sodium_mg": 1435.5, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -24299,13 +24707,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 282.2, - "protein_g": 4.7, - "carbs_g": 36.2, - "fat_g": 14.7, + "kcal": 296.6, + "protein_g": 5.3, + "carbs_g": 38.6, + "fat_g": 14.8, "fiber_g": 8.3, - "sodium_mg": 1090.5, - "coverage": "partial", + "sodium_mg": 1817.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -25316,13 +25724,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 517.3, + "kcal": 519.7, "protein_g": 28.2, - "carbs_g": 40.6, + "carbs_g": 41.1, "fat_g": 27.9, - "fiber_g": 6.3, - "sodium_mg": 1131.9, - "coverage": "partial", + "fiber_g": 6.5, + "sodium_mg": 1132.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -25560,13 +25968,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 910.3, - "protein_g": 27.6, - "carbs_g": 89.5, - "fat_g": 52.7, - "fiber_g": 20.4, - "sodium_mg": 1635.7, - "coverage": "partial", + "kcal": 912.7, + "protein_g": 27.7, + "carbs_g": 90.0, + "fat_g": 52.8, + "fiber_g": 20.5, + "sodium_mg": 1635.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -26452,12 +26860,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 622.9, - "protein_g": 28.2, - "carbs_g": 53.1, + "kcal": 625.3, + "protein_g": 28.3, + "carbs_g": 53.6, "fat_g": 33.9, - "fiber_g": 9.6, - "sodium_mg": 1148.9, + "fiber_g": 9.8, + "sodium_mg": 1149.2, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -26819,13 +27227,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 375.6, - "protein_g": 7.6, - "carbs_g": 27.1, - "fat_g": 28.6, + "kcal": 397.2, + "protein_g": 8.4, + "carbs_g": 30.8, + "fat_g": 28.8, "fiber_g": 5.7, - "sodium_mg": 1181.6, - "coverage": "partial", + "sodium_mg": 2272.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -27690,12 +28098,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 394.3, - "protein_g": 38.8, - "carbs_g": 14.5, + "kcal": 396.6, + "protein_g": 38.9, + "carbs_g": 15.0, "fat_g": 20.1, - "fiber_g": 3.4, - "sodium_mg": 1014.1, + "fiber_g": 3.6, + "sodium_mg": 1014.3, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -28319,13 +28727,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 365.7, - "protein_g": 30.1, - "carbs_g": 12.9, - "fat_g": 22.2, + "kcal": 387.3, + "protein_g": 31.6, + "carbs_g": 15.0, + "fat_g": 22.9, "fiber_g": 3.1, - "sodium_mg": 1007.0, - "coverage": "partial", + "sodium_mg": 1092.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -29198,13 +29606,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 347.6, - "protein_g": 29.1, - "carbs_g": 32.1, - "fat_g": 11.2, + "kcal": 412.4, + "protein_g": 33.6, + "carbs_g": 38.4, + "fat_g": 13.4, "fiber_g": 4.9, - "sodium_mg": 1554.7, - "coverage": "partial", + "sodium_mg": 1812.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -29438,13 +29846,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 759.4, - "protein_g": 26.0, - "carbs_g": 55.7, - "fat_g": 53.2, - "fiber_g": 14.8, - "sodium_mg": 1298.6, - "coverage": "partial", + "kcal": 761.7, + "protein_g": 26.1, + "carbs_g": 56.2, + "fat_g": 53.3, + "fiber_g": 14.9, + "sodium_mg": 1298.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -30218,13 +30626,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 453.6, - "protein_g": 12.5, - "carbs_g": 39.1, - "fat_g": 29.3, + "kcal": 482.4, + "protein_g": 13.6, + "carbs_g": 44.0, + "fat_g": 29.6, "fiber_g": 5.3, - "sodium_mg": 1300.9, - "coverage": "partial", + "sodium_mg": 2755.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -30630,13 +31038,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1437.2, + "kcal": 1439.6, "protein_g": 64.8, - "carbs_g": 155.1, - "fat_g": 66.3, - "fiber_g": 30.0, - "sodium_mg": 1289.2, - "coverage": "partial", + "carbs_g": 155.6, + "fat_g": 66.4, + "fiber_g": 30.1, + "sodium_mg": 1289.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -31296,13 +31704,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 248.6, - "protein_g": 6.8, - "carbs_g": 37.8, - "fat_g": 8.3, + "kcal": 313.4, + "protein_g": 11.3, + "carbs_g": 44.1, + "fat_g": 10.4, "fiber_g": 4.2, - "sodium_mg": 1365.9, - "coverage": "partial", + "sodium_mg": 1623.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -31513,13 +31921,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 326.7, - "protein_g": 20.0, - "carbs_g": 37.2, - "fat_g": 10.8, + "kcal": 413.1, + "protein_g": 26.1, + "carbs_g": 45.6, + "fat_g": 13.7, "fiber_g": 7.0, - "sodium_mg": 1308.2, - "coverage": "partial", + "sodium_mg": 1651.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -31742,13 +32150,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 410.5, - "protein_g": 9.5, - "carbs_g": 44.3, - "fat_g": 21.9, + "kcal": 626.5, + "protein_g": 24.6, + "carbs_g": 65.5, + "fat_g": 29.1, "fiber_g": 5.5, - "sodium_mg": 1405.7, - "coverage": "partial", + "sodium_mg": 2263.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -33750,13 +34158,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 747.1, - "protein_g": 52.0, - "carbs_g": 64.1, - "fat_g": 32.0, - "fiber_g": 5.8, - "sodium_mg": 2012.4, - "coverage": "partial", + "kcal": 765.0, + "protein_g": 52.3, + "carbs_g": 68.8, + "fat_g": 32.1, + "fiber_g": 6.1, + "sodium_mg": 2014.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -34608,12 +35016,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 997.3, - "protein_g": 52.2, - "carbs_g": 123.9, + "kcal": 999.7, + "protein_g": 52.3, + "carbs_g": 124.4, "fat_g": 35.2, - "fiber_g": 25.0, - "sodium_mg": 1092.9, + "fiber_g": 25.1, + "sodium_mg": 1093.1, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -34803,13 +35211,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 162.5, - "protein_g": 1.1, - "carbs_g": 9.0, - "fat_g": 14.1, - "fiber_g": 1.8, - "sodium_mg": 895.7, - "coverage": "partial", + "kcal": 436.1, + "protein_g": 19.0, + "carbs_g": 57.9, + "fat_g": 15.3, + "fiber_g": 17.3, + "sodium_mg": 2351.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -35023,13 +35431,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 609.9, - "protein_g": 24.2, - "carbs_g": 67.9, - "fat_g": 28.8, + "kcal": 631.5, + "protein_g": 25.0, + "carbs_g": 71.6, + "fat_g": 29.1, "fiber_g": 16.2, - "sodium_mg": 1428.5, - "coverage": "partial", + "sodium_mg": 2519.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -35648,12 +36056,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 713.9, - "protein_g": 24.1, - "carbs_g": 84.8, + "kcal": 716.3, + "protein_g": 24.2, + "carbs_g": 85.3, "fat_g": 32.3, - "fiber_g": 20.8, - "sodium_mg": 1637.1, + "fiber_g": 21.0, + "sodium_mg": 1637.3, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -35851,13 +36259,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 466.0, - "protein_g": 22.2, - "carbs_g": 17.3, + "kcal": 467.3, + "protein_g": 22.3, + "carbs_g": 17.6, "fat_g": 36.1, - "fiber_g": 8.2, - "sodium_mg": 815.9, - "coverage": "partial", + "fiber_g": 8.3, + "sodium_mg": 816.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -36062,13 +36470,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 590.4, - "protein_g": 22.9, - "carbs_g": 71.7, - "fat_g": 27.4, + "kcal": 604.8, + "protein_g": 23.5, + "carbs_g": 74.2, + "fat_g": 27.5, "fiber_g": 27.4, - "sodium_mg": 955.1, - "coverage": "partial", + "sodium_mg": 1682.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -36282,13 +36690,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 831.3, - "protein_g": 66.5, - "carbs_g": 94.2, - "fat_g": 21.4, + "kcal": 960.9, + "protein_g": 75.5, + "carbs_g": 106.9, + "fat_g": 25.7, "fiber_g": 23.2, - "sodium_mg": 1075.6, - "coverage": "partial", + "sodium_mg": 1590.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -37072,13 +37480,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1105.9, - "protein_g": 75.2, - "carbs_g": 82.1, - "fat_g": 55.1, + "kcal": 1192.3, + "protein_g": 81.3, + "carbs_g": 90.6, + "fat_g": 58.0, "fiber_g": 16.3, - "sodium_mg": 1463.4, - "coverage": "partial", + "sodium_mg": 1806.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -37286,13 +37694,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1081.8, - "protein_g": 51.4, - "carbs_g": 162.0, - "fat_g": 29.4, + "kcal": 1103.4, + "protein_g": 52.2, + "carbs_g": 165.7, + "fat_g": 29.6, "fiber_g": 32.4, - "sodium_mg": 944.0, - "coverage": "partial", + "sodium_mg": 2034.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -37507,12 +37915,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1104.4, - "protein_g": 54.2, - "carbs_g": 163.6, - "fat_g": 30.8, + "kcal": 1126.0, + "protein_g": 55.0, + "carbs_g": 167.2, + "fat_g": 31.1, "fiber_g": 36.4, - "sodium_mg": 1006.3, + "sodium_mg": 2097.1, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -37868,13 +38276,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 627.1, - "protein_g": 49.8, - "carbs_g": 29.3, + "kcal": 639.1, + "protein_g": 51.9, + "carbs_g": 30.4, "fat_g": 37.4, - "fiber_g": 5.0, - "sodium_mg": 236.9, - "coverage": "partial", + "fiber_g": 5.2, + "sodium_mg": 1354.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -38298,13 +38706,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 798.2, - "protein_g": 56.9, - "carbs_g": 39.9, - "fat_g": 46.8, + "kcal": 906.2, + "protein_g": 64.5, + "carbs_g": 50.5, + "fat_g": 50.4, "fiber_g": 4.6, - "sodium_mg": 1763.3, - "coverage": "partial", + "sodium_mg": 2192.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -38504,13 +38912,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 768.8, - "protein_g": 54.2, - "carbs_g": 52.1, - "fat_g": 38.4, + "kcal": 833.6, + "protein_g": 58.7, + "carbs_g": 58.5, + "fat_g": 40.5, "fiber_g": 8.7, - "sodium_mg": 1307.2, - "coverage": "partial", + "sodium_mg": 1564.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -38712,13 +39120,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1202.1, - "protein_g": 50.8, - "carbs_g": 176.1, - "fat_g": 35.9, + "kcal": 1223.7, + "protein_g": 51.6, + "carbs_g": 179.8, + "fat_g": 36.1, "fiber_g": 29.5, - "sodium_mg": 1265.4, - "coverage": "partial", + "sodium_mg": 2356.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -39300,13 +39708,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 358.1, - "protein_g": 12.7, - "carbs_g": 37.9, + "kcal": 362.9, + "protein_g": 13.5, + "carbs_g": 38.3, "fat_g": 22.0, - "fiber_g": 8.7, - "sodium_mg": 107.2, - "coverage": "partial", + "fiber_g": 8.8, + "sodium_mg": 554.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -39716,13 +40124,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 650.5, - "protein_g": 48.1, - "carbs_g": 29.5, - "fat_g": 38.7, + "kcal": 715.3, + "protein_g": 52.7, + "carbs_g": 35.9, + "fat_g": 40.8, "fiber_g": 5.6, - "sodium_mg": 729.9, - "coverage": "partial", + "sodium_mg": 987.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -40191,13 +40599,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 861.0, - "protein_g": 61.8, - "carbs_g": 72.9, - "fat_g": 38.6, + "kcal": 925.8, + "protein_g": 66.4, + "carbs_g": 79.2, + "fat_g": 40.8, "fiber_g": 26.1, - "sodium_mg": 1581.9, - "coverage": "partial", + "sodium_mg": 1839.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -40838,12 +41246,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 522.1, - "protein_g": 35.5, - "carbs_g": 25.9, + "kcal": 526.9, + "protein_g": 36.4, + "carbs_g": 26.3, "fat_g": 32.3, "fiber_g": 5.4, - "sodium_mg": 157.3, + "sodium_mg": 604.2, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -41451,13 +41859,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 585.2, - "protein_g": 25.6, - "carbs_g": 75.7, - "fat_g": 22.4, + "kcal": 714.8, + "protein_g": 34.6, + "carbs_g": 88.4, + "fat_g": 26.7, "fiber_g": 19.9, - "sodium_mg": 1481.2, - "coverage": "partial", + "sodium_mg": 1996.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -41643,13 +42051,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 348.9, - "protein_g": 26.2, - "carbs_g": 21.6, + "kcal": 353.7, + "protein_g": 27.0, + "carbs_g": 22.1, "fat_g": 16.9, - "fiber_g": 1.5, - "sodium_mg": 882.6, - "coverage": "partial", + "fiber_g": 1.6, + "sodium_mg": 1329.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -41856,13 +42264,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 446.6, - "protein_g": 49.8, - "carbs_g": 31.0, + "kcal": 453.8, + "protein_g": 51.1, + "carbs_g": 31.6, "fat_g": 15.6, - "fiber_g": 7.0, - "sodium_mg": 188.4, - "coverage": "partial", + "fiber_g": 7.1, + "sodium_mg": 858.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -42071,12 +42479,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 780.1, - "protein_g": 23.5, - "carbs_g": 114.5, + "kcal": 787.3, + "protein_g": 24.8, + "carbs_g": 115.2, "fat_g": 26.8, - "fiber_g": 6.9, - "sodium_mg": 618.7, + "fiber_g": 7.0, + "sodium_mg": 1289.1, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -42285,13 +42693,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 484.0, - "protein_g": 31.7, - "carbs_g": 49.7, - "fat_g": 18.6, + "kcal": 570.4, + "protein_g": 37.7, + "carbs_g": 58.2, + "fat_g": 21.4, "fiber_g": 8.9, - "sodium_mg": 996.9, - "coverage": "partial", + "sodium_mg": 1340.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -42682,13 +43090,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 963.1, - "protein_g": 42.7, - "carbs_g": 134.9, + "kcal": 972.7, + "protein_g": 44.4, + "carbs_g": 135.8, "fat_g": 32.8, - "fiber_g": 27.7, - "sodium_mg": 735.4, - "coverage": "partial", + "fiber_g": 27.8, + "sodium_mg": 1629.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -42884,13 +43292,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 402.4, - "protein_g": 12.8, - "carbs_g": 44.3, - "fat_g": 22.8, + "kcal": 416.8, + "protein_g": 13.4, + "carbs_g": 46.7, + "fat_g": 23.0, "fiber_g": 7.5, - "sodium_mg": 1007.4, - "coverage": "partial", + "sodium_mg": 1734.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -44939,13 +45347,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 882.2, - "protein_g": 55.9, - "carbs_g": 60.3, - "fat_g": 47.8, + "kcal": 947.0, + "protein_g": 60.5, + "carbs_g": 66.6, + "fat_g": 49.9, "fiber_g": 9.6, - "sodium_mg": 1099.4, - "coverage": "partial", + "sodium_mg": 1356.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -47590,13 +47998,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 564.6, - "protein_g": 43.0, - "carbs_g": 14.5, - "fat_g": 37.6, + "kcal": 607.8, + "protein_g": 46.0, + "carbs_g": 18.7, + "fat_g": 39.1, "fiber_g": 3.8, - "sodium_mg": 740.4, - "coverage": "partial", + "sodium_mg": 912.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -48361,13 +48769,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 170.0, - "protein_g": 5.9, - "carbs_g": 34.7, - "fat_g": 0.9, + "kcal": 213.2, + "protein_g": 9.0, + "carbs_g": 38.9, + "fat_g": 2.4, "fiber_g": 3.6, - "sodium_mg": 219.7, - "coverage": "partial", + "sodium_mg": 391.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -49222,13 +49630,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 553.6, - "protein_g": 34.5, - "carbs_g": 61.6, - "fat_g": 17.8, + "kcal": 685.0, + "protein_g": 43.6, + "carbs_g": 75.3, + "fat_g": 22.1, "fiber_g": 5.4, - "sodium_mg": 228.8, - "coverage": "partial", + "sodium_mg": 1104.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -49370,13 +49778,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 626.6, - "protein_g": 27.3, - "carbs_g": 96.7, - "fat_g": 16.7, + "kcal": 648.2, + "protein_g": 28.1, + "carbs_g": 100.4, + "fat_g": 17.0, "fiber_g": 16.0, - "sodium_mg": 21.7, - "coverage": "partial", + "sodium_mg": 1112.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -49846,13 +50254,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 667.5, - "protein_g": 23.0, - "carbs_g": 62.3, - "fat_g": 37.8, + "kcal": 681.9, + "protein_g": 23.5, + "carbs_g": 64.8, + "fat_g": 38.0, "fiber_g": 15.7, - "sodium_mg": 536.4, - "coverage": "partial", + "sodium_mg": 1263.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -50133,13 +50541,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 162.4, - "protein_g": 9.5, - "carbs_g": 15.0, - "fat_g": 7.8, - "fiber_g": 3.4, - "sodium_mg": 397.3, - "coverage": "partial", + "kcal": 319.4, + "protein_g": 15.3, + "carbs_g": 45.7, + "fat_g": 8.7, + "fiber_g": 5.2, + "sodium_mg": 629.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -50296,13 +50704,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 284.2, - "protein_g": 25.7, - "carbs_g": 8.4, - "fat_g": 17.2, - "fiber_g": 1.9, - "sodium_mg": 425.8, - "coverage": "partial", + "kcal": 289.8, + "protein_g": 25.9, + "carbs_g": 9.6, + "fat_g": 17.3, + "fiber_g": 2.2, + "sodium_mg": 426.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -51169,12 +51577,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 54.6, - "protein_g": 6.5, - "carbs_g": 4.5, + "kcal": 57.9, + "protein_g": 6.6, + "carbs_g": 5.2, "fat_g": 1.4, - "fiber_g": 0.4, - "sodium_mg": 21.9, + "fiber_g": 0.5, + "sodium_mg": 22.2, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -51336,12 +51744,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 316.0, + "kcal": 317.7, "protein_g": 29.1, - "carbs_g": 25.7, + "carbs_g": 26.1, "fat_g": 10.0, "fiber_g": 1.9, - "sodium_mg": 344.0, + "sodium_mg": 344.1, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -51482,12 +51890,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 230.5, - "protein_g": 6.9, - "carbs_g": 16.2, + "kcal": 232.2, + "protein_g": 7.0, + "carbs_g": 16.6, "fat_g": 17.3, - "fiber_g": 0.0, - "sodium_mg": 85.2, + "fiber_g": 0.1, + "sodium_mg": 85.4, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -51637,12 +52045,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 357.8, - "protein_g": 6.5, - "carbs_g": 37.6, + "kcal": 360.1, + "protein_g": 6.6, + "carbs_g": 38.1, "fat_g": 21.8, - "fiber_g": 6.7, - "sodium_mg": 56.9, + "fiber_g": 6.8, + "sodium_mg": 57.1, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -51789,13 +52197,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 432.0, - "protein_g": 4.7, - "carbs_g": 15.2, - "fat_g": 43.1, - "fiber_g": 5.1, - "sodium_mg": 28.6, - "coverage": "partial", + "kcal": 442.1, + "protein_g": 5.0, + "carbs_g": 17.3, + "fat_g": 43.2, + "fiber_g": 5.5, + "sodium_mg": 29.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -51943,13 +52351,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 214.2, - "protein_g": 20.6, - "carbs_g": 24.9, - "fat_g": 2.9, + "kcal": 387.0, + "protein_g": 32.7, + "carbs_g": 41.9, + "fat_g": 8.6, "fiber_g": 1.4, - "sodium_mg": 933.7, - "coverage": "partial", + "sodium_mg": 1620.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -52816,13 +53224,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 58.0, - "protein_g": 4.3, - "carbs_g": 7.8, - "fat_g": 1.7, - "fiber_g": 1.6, - "sodium_mg": 75.6, - "coverage": "partial", + "kcal": 229.4, + "protein_g": 10.6, + "carbs_g": 41.0, + "fat_g": 2.8, + "fiber_g": 3.4, + "sodium_mg": 1034.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -53528,13 +53936,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 375.3, - "protein_g": 25.1, - "carbs_g": 66.1, - "fat_g": 3.3, - "fiber_g": 13.9, - "sodium_mg": 43.4, - "coverage": "partial", + "kcal": 377.6, + "protein_g": 25.2, + "carbs_g": 66.6, + "fat_g": 3.4, + "fiber_g": 14.0, + "sodium_mg": 43.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -53930,13 +54338,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 49.7, - "protein_g": 1.1, - "carbs_g": 10.9, - "fat_g": 0.1, + "kcal": 222.5, + "protein_g": 13.2, + "carbs_g": 27.8, + "fat_g": 5.9, "fiber_g": 0.8, - "sodium_mg": 106.8, - "coverage": "partial", + "sodium_mg": 793.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -54457,13 +54865,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 388.4, - "protein_g": 35.5, - "carbs_g": 35.0, - "fat_g": 12.1, + "kcal": 431.6, + "protein_g": 38.5, + "carbs_g": 39.2, + "fat_g": 13.5, "fiber_g": 9.2, - "sodium_mg": 354.5, - "coverage": "partial", + "sodium_mg": 526.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -55434,12 +55842,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 441.5, - "protein_g": 23.9, - "carbs_g": 42.3, + "kcal": 444.9, + "protein_g": 24.0, + "carbs_g": 43.0, "fat_g": 19.3, - "fiber_g": 5.6, - "sodium_mg": 230.4, + "fiber_g": 5.7, + "sodium_mg": 230.7, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -55575,13 +55983,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 308.8, - "protein_g": 15.1, - "carbs_g": 9.3, + "kcal": 311.1, + "protein_g": 15.2, + "carbs_g": 9.8, "fat_g": 24.4, - "fiber_g": 2.9, - "sodium_mg": 157.5, - "coverage": "partial", + "fiber_g": 3.0, + "sodium_mg": 157.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -56907,13 +57315,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 220.1, - "protein_g": 21.2, - "carbs_g": 27.3, - "fat_g": 4.1, + "kcal": 392.9, + "protein_g": 33.3, + "carbs_g": 44.2, + "fat_g": 9.8, "fiber_g": 4.9, - "sodium_mg": 87.1, - "coverage": "partial", + "sodium_mg": 773.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -58069,13 +58477,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 361.1, - "protein_g": 17.5, - "carbs_g": 54.6, - "fat_g": 9.5, + "kcal": 382.7, + "protein_g": 18.3, + "carbs_g": 58.2, + "fat_g": 9.8, "fiber_g": 12.1, - "sodium_mg": 411.8, - "coverage": "partial", + "sodium_mg": 1502.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -58636,12 +59044,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 274.8, - "protein_g": 27.2, - "carbs_g": 3.7, + "kcal": 278.2, + "protein_g": 27.3, + "carbs_g": 4.4, "fat_g": 17.4, - "fiber_g": 0.8, - "sodium_mg": 429.6, + "fiber_g": 1.0, + "sodium_mg": 429.8, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -58777,12 +59185,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 953.2, - "protein_g": 50.7, - "carbs_g": 161.1, - "fat_g": 14.9, - "fiber_g": 31.7, - "sodium_mg": 64.6, + "kcal": 956.5, + "protein_g": 50.8, + "carbs_g": 161.8, + "fat_g": 15.0, + "fiber_g": 31.8, + "sodium_mg": 64.9, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -59051,13 +59459,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 309.3, - "protein_g": 16.0, - "carbs_g": 59.8, - "fat_g": 1.3, - "fiber_g": 9.4, - "sodium_mg": 115.2, - "coverage": "partial", + "kcal": 311.6, + "protein_g": 16.1, + "carbs_g": 60.3, + "fat_g": 1.4, + "fiber_g": 9.6, + "sodium_mg": 115.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -59590,13 +59998,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 364.8, - "protein_g": 23.5, - "carbs_g": 66.1, - "fat_g": 2.4, + "kcal": 393.6, + "protein_g": 24.6, + "carbs_g": 71.0, + "fat_g": 2.8, "fiber_g": 12.0, - "sodium_mg": 29.6, - "coverage": "partial", + "sodium_mg": 1484.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -60369,13 +60777,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 88.7, - "protein_g": 6.4, - "carbs_g": 4.5, - "fat_g": 4.8, + "kcal": 218.3, + "protein_g": 15.5, + "carbs_g": 17.2, + "fat_g": 9.1, "fiber_g": 0.2, - "sodium_mg": 72.3, - "coverage": "partial", + "sodium_mg": 587.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -60632,13 +61040,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 397.0, - "protein_g": 31.9, - "carbs_g": 18.4, - "fat_g": 21.2, + "kcal": 440.2, + "protein_g": 34.9, + "carbs_g": 22.7, + "fat_g": 22.6, "fiber_g": 2.6, - "sodium_mg": 742.7, - "coverage": "partial", + "sodium_mg": 914.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -60902,13 +61310,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 170.2, - "protein_g": 19.7, - "carbs_g": 15.4, - "fat_g": 2.8, + "kcal": 343.0, + "protein_g": 31.8, + "carbs_g": 32.4, + "fat_g": 8.6, "fiber_g": 2.1, - "sodium_mg": 211.8, - "coverage": "partial", + "sodium_mg": 898.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -62023,13 +62431,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 210.0, - "protein_g": 23.6, - "carbs_g": 22.2, - "fat_g": 3.1, - "fiber_g": 3.2, - "sodium_mg": 923.5, - "coverage": "partial", + "kcal": 213.4, + "protein_g": 23.7, + "carbs_g": 22.9, + "fat_g": 3.2, + "fiber_g": 3.3, + "sodium_mg": 923.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -62308,13 +62716,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 379.2, - "protein_g": 30.2, - "carbs_g": 26.3, + "kcal": 382.6, + "protein_g": 30.3, + "carbs_g": 27.0, "fat_g": 20.4, - "fiber_g": 2.7, - "sodium_mg": 835.4, - "coverage": "partial", + "fiber_g": 2.8, + "sodium_mg": 835.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -62452,12 +62860,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 227.1, - "protein_g": 20.0, - "carbs_g": 5.7, - "fat_g": 13.8, - "fiber_g": 1.4, - "sodium_mg": 78.3, + "kcal": 230.5, + "protein_g": 20.1, + "carbs_g": 6.4, + "fat_g": 13.9, + "fiber_g": 1.6, + "sodium_mg": 78.6, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -62577,13 +62985,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 416.0, + "kcal": 418.3, "protein_g": 24.3, - "carbs_g": 62.7, - "fat_g": 9.3, - "fiber_g": 11.6, - "sodium_mg": 34.8, - "coverage": "partial", + "carbs_g": 63.2, + "fat_g": 9.4, + "fiber_g": 11.8, + "sodium_mg": 35.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -63273,13 +63681,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 389.9, - "protein_g": 29.1, - "carbs_g": 29.8, - "fat_g": 17.2, + "kcal": 476.3, + "protein_g": 35.1, + "carbs_g": 38.2, + "fat_g": 20.1, "fiber_g": 3.9, - "sodium_mg": 635.3, - "coverage": "partial", + "sodium_mg": 978.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -64395,13 +64803,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 233.0, - "protein_g": 22.0, - "carbs_g": 28.4, - "fat_g": 4.3, + "kcal": 362.6, + "protein_g": 31.0, + "carbs_g": 41.1, + "fat_g": 8.7, "fiber_g": 5.2, - "sodium_mg": 91.2, - "coverage": "partial", + "sodium_mg": 606.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -66241,13 +66649,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 304.4, - "protein_g": 21.6, - "carbs_g": 45.4, - "fat_g": 3.0, - "fiber_g": 1.9, - "sodium_mg": 540.5, - "coverage": "partial", + "kcal": 480.6, + "protein_g": 33.7, + "carbs_g": 63.0, + "fat_g": 8.8, + "fiber_g": 2.0, + "sodium_mg": 1227.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -66536,12 +66944,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 578.8, - "protein_g": 43.7, - "carbs_g": 80.4, - "fat_g": 10.2, - "fiber_g": 16.1, - "sodium_mg": 99.0, + "kcal": 582.1, + "protein_g": 43.8, + "carbs_g": 81.1, + "fat_g": 10.3, + "fiber_g": 16.2, + "sodium_mg": 99.3, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -67759,13 +68167,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 423.7, - "protein_g": 29.3, - "carbs_g": 40.9, - "fat_g": 17.2, + "kcal": 553.3, + "protein_g": 38.4, + "carbs_g": 53.6, + "fat_g": 21.6, "fiber_g": 7.0, - "sodium_mg": 479.8, - "coverage": "partial", + "sodium_mg": 994.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -68010,13 +68418,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 25.3, - "protein_g": 1.2, - "carbs_g": 5.1, + "kcal": 27.7, + "protein_g": 1.3, + "carbs_g": 5.6, "fat_g": 0.5, - "fiber_g": 1.5, - "sodium_mg": 7.7, - "coverage": "partial", + "fiber_g": 1.7, + "sodium_mg": 7.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -69410,13 +69818,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 228.5, - "protein_g": 21.4, - "carbs_g": 30.4, - "fat_g": 4.1, + "kcal": 401.3, + "protein_g": 33.5, + "carbs_g": 47.3, + "fat_g": 9.9, "fiber_g": 5.6, - "sodium_mg": 87.7, - "coverage": "partial", + "sodium_mg": 774.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -69954,13 +70362,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 301.8, - "protein_g": 24.1, - "carbs_g": 19.0, - "fat_g": 13.9, + "kcal": 474.6, + "protein_g": 36.2, + "carbs_g": 35.9, + "fat_g": 19.6, "fiber_g": 2.0, - "sodium_mg": 258.6, - "coverage": "partial", + "sodium_mg": 945.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -70233,13 +70641,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 72.5, - "protein_g": 6.3, - "carbs_g": 0.6, - "fat_g": 4.8, + "kcal": 203.7, + "protein_g": 15.5, + "carbs_g": 13.6, + "fat_g": 9.1, "fiber_g": 0.1, - "sodium_mg": 71.5, - "coverage": "partial", + "sodium_mg": 586.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -70755,13 +71163,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 59.4, - "protein_g": 3.5, - "carbs_g": 11.8, + "kcal": 61.7, + "protein_g": 3.6, + "carbs_g": 12.3, "fat_g": 0.5, - "fiber_g": 4.8, - "sodium_mg": 22.4, - "coverage": "partial", + "fiber_g": 5.0, + "sodium_mg": 22.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -72021,13 +72429,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 93.2, - "protein_g": 12.4, - "carbs_g": 5.3, + "kcal": 97.9, + "protein_g": 12.5, + "carbs_g": 6.3, "fat_g": 2.6, - "fiber_g": 0.1, - "sodium_mg": 43.3, - "coverage": "partial", + "fiber_g": 0.4, + "sodium_mg": 43.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -72835,13 +73243,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 203.2, + "kcal": 206.5, "protein_g": 23.0, - "carbs_g": 21.0, + "carbs_g": 21.7, "fat_g": 3.1, - "fiber_g": 3.1, - "sodium_mg": 699.6, - "coverage": "partial", + "fiber_g": 3.2, + "sodium_mg": 699.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -73103,12 +73511,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 305.8, + "kcal": 309.1, "protein_g": 21.0, - "carbs_g": 17.9, + "carbs_g": 18.6, "fat_g": 17.1, - "fiber_g": 2.0, - "sodium_mg": 232.0, + "fiber_g": 2.2, + "sodium_mg": 232.3, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -74765,13 +75173,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 298.3, - "protein_g": 16.6, - "carbs_g": 44.2, - "fat_g": 6.0, + "kcal": 329.0, + "protein_g": 21.8, + "carbs_g": 45.3, + "fat_g": 6.4, "fiber_g": 3.2, - "sodium_mg": 984.8, - "coverage": "partial", + "sodium_mg": 999.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -77013,13 +77421,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 952.2, - "protein_g": 39.7, - "carbs_g": 112.7, + "kcal": 954.9, + "protein_g": 39.8, + "carbs_g": 113.3, "fat_g": 41.4, "fiber_g": 14.4, - "sodium_mg": 2101.9, - "coverage": "partial", + "sodium_mg": 2247.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -77283,12 +77691,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 81.7, - "protein_g": 7.6, - "carbs_g": 3.4, - "fat_g": 5.0, - "fiber_g": 0.6, - "sodium_mg": 599.5, + "kcal": 227.8, + "protein_g": 12.4, + "carbs_g": 30.1, + "fat_g": 7.2, + "fiber_g": 1.9, + "sodium_mg": 851.2, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -77986,13 +78394,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 317.4, - "protein_g": 22.4, - "carbs_g": 14.6, - "fat_g": 21.3, - "fiber_g": 1.4, - "sodium_mg": 601.1, - "coverage": "partial", + "kcal": 326.4, + "protein_g": 22.7, + "carbs_g": 16.7, + "fat_g": 21.4, + "fiber_g": 2.2, + "sodium_mg": 611.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -78984,12 +79392,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 297.2, - "protein_g": 32.8, - "carbs_g": 10.8, - "fat_g": 13.9, - "fiber_g": 1.9, - "sodium_mg": 587.0, + "kcal": 303.6, + "protein_g": 33.1, + "carbs_g": 12.2, + "fat_g": 14.0, + "fiber_g": 2.5, + "sodium_mg": 588.8, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -79502,13 +79910,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 367.9, + "kcal": 370.0, "protein_g": 40.5, - "carbs_g": 12.9, + "carbs_g": 13.3, "fat_g": 18.0, "fiber_g": 2.7, - "sodium_mg": 1163.9, - "coverage": "partial", + "sodium_mg": 1273.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -79959,12 +80367,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 267.6, - "protein_g": 32.1, - "carbs_g": 7.5, - "fat_g": 11.4, - "fiber_g": 0.1, - "sodium_mg": 479.7, + "kcal": 288.8, + "protein_g": 32.4, + "carbs_g": 11.8, + "fat_g": 11.8, + "fiber_g": 0.4, + "sodium_mg": 634.8, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -80885,12 +81293,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 406.6, - "protein_g": 35.3, - "carbs_g": 14.7, - "fat_g": 23.0, - "fiber_g": 0.7, - "sodium_mg": 1248.0, + "kcal": 411.5, + "protein_g": 35.4, + "carbs_g": 15.8, + "fat_g": 23.1, + "fiber_g": 1.1, + "sodium_mg": 1249.4, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -81034,13 +81442,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 460.3, - "protein_g": 47.0, - "carbs_g": 3.1, - "fat_g": 27.7, - "fiber_g": 0.6, - "sodium_mg": 949.2, - "coverage": "partial", + "kcal": 465.7, + "protein_g": 47.2, + "carbs_g": 4.2, + "fat_g": 27.8, + "fiber_g": 1.1, + "sodium_mg": 950.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -81582,13 +81990,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 96.9, - "protein_g": 2.8, - "carbs_g": 13.0, - "fat_g": 5.1, - "fiber_g": 1.7, + "kcal": 151.8, + "protein_g": 3.7, + "carbs_g": 25.0, + "fat_g": 5.3, + "fiber_g": 2.0, "sodium_mg": 293.2, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -81939,13 +82347,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 328.1, - "protein_g": 23.0, - "carbs_g": 39.3, - "fat_g": 8.7, - "fiber_g": 2.9, - "sodium_mg": 1581.4, - "coverage": "partial", + "kcal": 355.0, + "protein_g": 23.3, + "carbs_g": 46.3, + "fat_g": 8.8, + "fiber_g": 3.5, + "sodium_mg": 1584.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -82469,12 +82877,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 405.0, + "kcal": 407.7, "protein_g": 33.8, - "carbs_g": 35.7, + "carbs_g": 36.2, "fat_g": 13.9, - "fiber_g": 2.0, - "sodium_mg": 906.8, + "fiber_g": 2.1, + "sodium_mg": 1052.6, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -82842,12 +83250,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 475.0, - "protein_g": 9.4, - "carbs_g": 52.2, - "fat_g": 28.0, - "fiber_g": 7.2, - "sodium_mg": 864.4, + "kcal": 489.3, + "protein_g": 9.6, + "carbs_g": 55.9, + "fat_g": 28.1, + "fiber_g": 7.5, + "sodium_mg": 866.1, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -83027,12 +83435,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 408.3, - "protein_g": 25.8, - "carbs_g": 42.9, - "fat_g": 17.1, - "fiber_g": 3.0, - "sodium_mg": 810.2, + "kcal": 420.0, + "protein_g": 26.0, + "carbs_g": 45.3, + "fat_g": 17.2, + "fiber_g": 3.2, + "sodium_mg": 896.3, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -83894,13 +84302,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 372.9, - "protein_g": 33.9, - "carbs_g": 46.7, - "fat_g": 4.7, - "fiber_g": 3.2, - "sodium_mg": 1139.0, - "coverage": "partial", + "kcal": 384.6, + "protein_g": 34.0, + "carbs_g": 49.1, + "fat_g": 4.9, + "fiber_g": 3.3, + "sodium_mg": 1225.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -84036,13 +84444,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 192.7, - "protein_g": 3.4, - "carbs_g": 15.7, - "fat_g": 15.1, + "kcal": 206.2, + "protein_g": 3.9, + "carbs_g": 18.0, + "fat_g": 15.2, "fiber_g": 3.5, - "sodium_mg": 12.7, - "coverage": "partial", + "sodium_mg": 694.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -84220,13 +84628,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 498.8, - "protein_g": 38.3, - "carbs_g": 7.5, + "kcal": 501.2, + "protein_g": 38.4, + "carbs_g": 8.0, "fat_g": 36.6, - "fiber_g": 3.0, - "sodium_mg": 940.5, - "coverage": "partial", + "fiber_g": 3.2, + "sodium_mg": 940.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -84395,12 +84803,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 28.2, + "kcal": 98.4, "protein_g": 1.4, - "carbs_g": 6.2, + "carbs_g": 23.4, "fat_g": 0.1, - "fiber_g": 2.0, - "sodium_mg": 252.5, + "fiber_g": 2.1, + "sodium_mg": 254.5, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -86023,13 +86431,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 193.5, - "protein_g": 17.2, - "carbs_g": 8.9, - "fat_g": 10.9, - "fiber_g": 2.7, - "sodium_mg": 1416.7, - "coverage": "partial", + "kcal": 440.6, + "protein_g": 21.3, + "carbs_g": 63.0, + "fat_g": 11.9, + "fiber_g": 4.6, + "sodium_mg": 1417.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -86581,13 +86989,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 493.7, - "protein_g": 25.4, - "carbs_g": 45.7, + "kcal": 497.6, + "protein_g": 25.5, + "carbs_g": 46.5, "fat_g": 23.8, - "fiber_g": 3.9, - "sodium_mg": 1346.9, - "coverage": "partial", + "fiber_g": 4.2, + "sodium_mg": 1347.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -87166,13 +87574,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 188.8, - "protein_g": 10.5, - "carbs_g": 1.5, - "fat_g": 15.4, - "fiber_g": 0.3, - "sodium_mg": 607.0, - "coverage": "partial", + "kcal": 460.8, + "protein_g": 21.2, + "carbs_g": 53.4, + "fat_g": 17.8, + "fiber_g": 2.5, + "sodium_mg": 1209.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -87683,13 +88091,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 811.1, - "protein_g": 42.9, - "carbs_g": 77.1, - "fat_g": 36.8, - "fiber_g": 2.7, - "sodium_mg": 587.0, - "coverage": "partial", + "kcal": 822.6, + "protein_g": 43.4, + "carbs_g": 79.6, + "fat_g": 37.2, + "fiber_g": 3.7, + "sodium_mg": 588.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -87833,13 +88241,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 309.4, - "protein_g": 14.2, - "carbs_g": 40.7, + "kcal": 310.7, + "protein_g": 14.3, + "carbs_g": 41.1, "fat_g": 11.2, - "fiber_g": 7.9, + "fiber_g": 8.0, "sodium_mg": 16.7, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -88157,13 +88565,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 308.6, - "protein_g": 36.7, - "carbs_g": 8.7, - "fat_g": 13.4, - "fiber_g": 0.4, - "sodium_mg": 150.6, - "coverage": "partial", + "kcal": 314.7, + "protein_g": 36.9, + "carbs_g": 10.1, + "fat_g": 13.6, + "fiber_g": 1.0, + "sodium_mg": 151.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -88482,13 +88890,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 142.7, + "kcal": 143.7, "protein_g": 6.0, - "carbs_g": 19.6, + "carbs_g": 19.9, "fat_g": 6.4, - "fiber_g": 1.8, + "fiber_g": 1.9, "sodium_mg": 34.5, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -88653,13 +89061,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 231.7, + "kcal": 233.8, "protein_g": 6.1, - "carbs_g": 34.7, + "carbs_g": 35.3, "fat_g": 9.2, - "fiber_g": 6.4, - "sodium_mg": 19.9, - "coverage": "partial", + "fiber_g": 6.5, + "sodium_mg": 20.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -88801,13 +89209,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 139.8, - "protein_g": 3.1, - "carbs_g": 10.9, + "kcal": 141.3, + "protein_g": 3.2, + "carbs_g": 11.4, "fat_g": 10.5, "fiber_g": 4.8, - "sodium_mg": 5.3, - "coverage": "partial", + "sodium_mg": 5.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -88928,13 +89336,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 708.8, + "kcal": 710.5, "protein_g": 64.2, - "carbs_g": 2.0, + "carbs_g": 2.5, "fat_g": 47.5, "fiber_g": 0.6, - "sodium_mg": 904.7, - "coverage": "partial", + "sodium_mg": 904.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -89268,13 +89676,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 334.3, - "protein_g": 17.0, - "carbs_g": 20.8, - "fat_g": 21.6, - "fiber_g": 5.1, - "sodium_mg": 373.2, - "coverage": "partial", + "kcal": 339.0, + "protein_g": 17.2, + "carbs_g": 21.7, + "fat_g": 21.8, + "fiber_g": 5.6, + "sodium_mg": 374.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -89455,12 +89863,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 146.9, + "kcal": 148.8, "protein_g": 2.3, - "carbs_g": 10.9, + "carbs_g": 11.5, "fat_g": 11.2, "fiber_g": 2.2, - "sodium_mg": 61.6, + "sodium_mg": 61.7, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -89573,9 +89981,9 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 82.5, + "kcal": 83.4, "protein_g": 0.0, - "carbs_g": 0.0, + "carbs_g": 0.3, "fat_g": 9.3, "fiber_g": 0.0, "sodium_mg": 0.2, @@ -89897,13 +90305,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 257.3, + "kcal": 258.8, "protein_g": 5.6, - "carbs_g": 38.5, + "carbs_g": 39.0, "fat_g": 10.0, "fiber_g": 6.0, - "sodium_mg": 8.7, - "coverage": "partial", + "sodium_mg": 8.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -90193,13 +90601,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 443.8, + "kcal": 444.4, "protein_g": 15.8, - "carbs_g": 60.5, + "carbs_g": 60.7, "fat_g": 15.0, "fiber_g": 2.5, "sodium_mg": 404.5, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -91209,13 +91617,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 191.1, + "kcal": 192.0, "protein_g": 10.9, - "carbs_g": 34.5, + "carbs_g": 34.7, "fat_g": 2.6, - "fiber_g": 5.5, + "fiber_g": 5.6, "sodium_mg": 64.1, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -91356,13 +91764,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 203.4, + "kcal": 204.0, "protein_g": 8.3, - "carbs_g": 20.6, - "fat_g": 10.2, + "carbs_g": 20.8, + "fat_g": 10.3, "fiber_g": 3.2, "sodium_mg": 340.7, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -91522,13 +91930,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 431.4, - "protein_g": 21.0, - "carbs_g": 19.6, - "fat_g": 29.7, - "fiber_g": 1.2, - "sodium_mg": 646.7, - "coverage": "partial", + "kcal": 439.0, + "protein_g": 21.3, + "carbs_g": 21.3, + "fat_g": 30.0, + "fiber_g": 2.0, + "sodium_mg": 648.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -91696,13 +92104,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 580.0, - "protein_g": 27.4, - "carbs_g": 103.7, - "fat_g": 7.8, - "fiber_g": 17.1, - "sodium_mg": 320.2, - "coverage": "partial", + "kcal": 585.7, + "protein_g": 27.7, + "carbs_g": 104.8, + "fat_g": 8.0, + "fiber_g": 17.8, + "sodium_mg": 321.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -92001,12 +92409,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 79.9, - "protein_g": 5.3, - "carbs_g": 9.0, - "fat_g": 3.2, - "fiber_g": 2.5, - "sodium_mg": 49.6, + "kcal": 84.1, + "protein_g": 5.5, + "carbs_g": 9.8, + "fat_g": 3.4, + "fiber_g": 3.0, + "sodium_mg": 50.7, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -92172,13 +92580,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 131.6, - "protein_g": 2.5, - "carbs_g": 12.5, - "fat_g": 9.1, - "fiber_g": 5.1, - "sodium_mg": 11.4, - "coverage": "partial", + "kcal": 134.9, + "protein_g": 2.7, + "carbs_g": 13.2, + "fat_g": 9.3, + "fiber_g": 5.5, + "sodium_mg": 12.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -92329,13 +92737,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 334.5, - "protein_g": 13.2, - "carbs_g": 48.5, + "kcal": 335.7, + "protein_g": 13.3, + "carbs_g": 48.9, "fat_g": 12.2, "fiber_g": 9.3, - "sodium_mg": 297.9, - "coverage": "partial", + "sodium_mg": 298.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -92473,13 +92881,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 168.9, - "protein_g": 6.4, - "carbs_g": 14.9, - "fat_g": 11.4, - "fiber_g": 5.8, - "sodium_mg": 22.0, - "coverage": "partial", + "kcal": 172.4, + "protein_g": 6.5, + "carbs_g": 15.6, + "fat_g": 11.5, + "fiber_g": 6.2, + "sodium_mg": 22.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -93022,10 +93430,10 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 36.4, + "kcal": 108.8, "protein_g": 2.0, "carbs_g": 7.6, - "fat_g": 0.5, + "fat_g": 8.7, "fiber_g": 2.6, "sodium_mg": 25.9, "coverage": "partial", @@ -93179,13 +93587,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 221.5, - "protein_g": 4.4, - "carbs_g": 43.9, - "fat_g": 5.7, - "fiber_g": 3.0, - "sodium_mg": 27.9, - "coverage": "partial", + "kcal": 223.9, + "protein_g": 4.5, + "carbs_g": 44.3, + "fat_g": 5.8, + "fiber_g": 3.2, + "sodium_mg": 28.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -93348,13 +93756,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 344.3, - "protein_g": 6.2, - "carbs_g": 45.2, - "fat_g": 16.7, - "fiber_g": 4.9, - "sodium_mg": 577.4, - "coverage": "partial", + "kcal": 355.3, + "protein_g": 6.7, + "carbs_g": 47.3, + "fat_g": 17.2, + "fiber_g": 6.1, + "sodium_mg": 579.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -93507,13 +93915,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 240.1, - "protein_g": 4.9, - "carbs_g": 52.4, - "fat_g": 0.5, - "fiber_g": 1.4, - "sodium_mg": 4.2, - "coverage": "partial", + "kcal": 306.5, + "protein_g": 7.8, + "carbs_g": 60.1, + "fat_g": 3.3, + "fiber_g": 3.8, + "sodium_mg": 92.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -93816,13 +94224,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 198.4, + "kcal": 258.1, "protein_g": 3.6, "carbs_g": 46.1, - "fat_g": 0.6, + "fat_g": 7.4, "fiber_g": 7.8, "sodium_mg": 35.6, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -93968,13 +94376,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 278.6, + "kcal": 280.6, "protein_g": 6.9, - "carbs_g": 39.4, - "fat_g": 9.9, + "carbs_g": 39.6, + "fat_g": 10.0, "fiber_g": 1.6, "sodium_mg": 71.6, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -94118,13 +94526,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 357.6, + "kcal": 359.3, "protein_g": 5.1, - "carbs_g": 51.5, + "carbs_g": 52.0, "fat_g": 15.7, - "fiber_g": 5.3, - "sodium_mg": 625.0, - "coverage": "partial", + "fiber_g": 5.4, + "sodium_mg": 625.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -94313,12 +94721,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 351.5, - "protein_g": 32.7, - "carbs_g": 7.6, - "fat_g": 21.7, - "fiber_g": 1.6, - "sodium_mg": 898.7, + "kcal": 356.8, + "protein_g": 32.8, + "carbs_g": 9.0, + "fat_g": 21.9, + "fiber_g": 2.0, + "sodium_mg": 900.3, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -94662,12 +95070,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 101.6, - "protein_g": 1.4, + "kcal": 282.9, + "protein_g": 40.7, "carbs_g": 9.1, - "fat_g": 7.4, + "fat_g": 8.9, "fiber_g": 2.9, - "sodium_mg": 6.8, + "sodium_mg": 4398.6, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -94839,13 +95247,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 87.5, - "protein_g": 2.7, + "kcal": 240.1, + "protein_g": 31.5, "carbs_g": 19.0, - "fat_g": 1.0, + "fat_g": 4.2, "fiber_g": 5.3, - "sodium_mg": 9.6, - "coverage": "partial", + "sodium_mg": 124.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -95111,12 +95519,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 164.9, - "protein_g": 2.5, - "carbs_g": 9.0, - "fat_g": 14.6, + "kcal": 176.9, + "protein_g": 3.0, + "carbs_g": 11.0, + "fat_g": 14.8, "fiber_g": 3.0, - "sodium_mg": 13.0, + "sodium_mg": 619.0, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -95291,13 +95699,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 638.2, - "protein_g": 27.2, - "carbs_g": 118.1, + "kcal": 656.1, + "protein_g": 27.5, + "carbs_g": 122.8, "fat_g": 7.2, - "fiber_g": 15.3, - "sodium_mg": 29.0, - "coverage": "partial", + "fiber_g": 15.7, + "sodium_mg": 31.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -95452,13 +95860,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 355.5, + "kcal": 361.5, "protein_g": 21.2, - "carbs_g": 24.6, - "fat_g": 18.9, - "fiber_g": 2.7, - "sodium_mg": 658.8, - "coverage": "partial", + "carbs_g": 25.5, + "fat_g": 19.0, + "fiber_g": 2.9, + "sodium_mg": 660.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -95629,13 +96037,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 352.3, - "protein_g": 5.9, - "carbs_g": 49.9, - "fat_g": 16.0, + "kcal": 370.5, + "protein_g": 8.6, + "carbs_g": 51.6, + "fat_g": 16.1, "fiber_g": 6.8, - "sodium_mg": 534.3, - "coverage": "partial", + "sodium_mg": 811.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -95762,12 +96170,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 280.3, - "protein_g": 2.1, - "carbs_g": 48.8, - "fat_g": 11.0, + "kcal": 284.8, + "protein_g": 2.8, + "carbs_g": 49.0, + "fat_g": 11.2, "fiber_g": 2.6, - "sodium_mg": 6.7, + "sodium_mg": 285.7, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -96390,13 +96798,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 336.4, - "protein_g": 25.6, - "carbs_g": 20.2, - "fat_g": 17.2, - "fiber_g": 5.9, - "sodium_mg": 196.1, - "coverage": "partial", + "kcal": 344.8, + "protein_g": 26.0, + "carbs_g": 21.7, + "fat_g": 17.6, + "fiber_g": 6.9, + "sodium_mg": 282.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -96701,13 +97109,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 218.0, - "protein_g": 26.8, - "carbs_g": 4.3, + "kcal": 221.6, + "protein_g": 26.9, + "carbs_g": 5.1, "fat_g": 9.9, "fiber_g": 1.0, - "sodium_mg": 105.2, - "coverage": "partial", + "sodium_mg": 105.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -97001,13 +97409,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 420.5, - "protein_g": 26.2, - "carbs_g": 33.5, - "fat_g": 20.0, - "fiber_g": 6.8, - "sodium_mg": 171.3, - "coverage": "partial", + "kcal": 427.5, + "protein_g": 26.5, + "carbs_g": 34.7, + "fat_g": 20.4, + "fiber_g": 7.7, + "sodium_mg": 242.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -97505,13 +97913,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 220.9, - "protein_g": 5.3, - "carbs_g": 41.1, - "fat_g": 4.9, - "fiber_g": 4.9, - "sodium_mg": 919.5, - "coverage": "partial", + "kcal": 390.3, + "protein_g": 7.1, + "carbs_g": 58.6, + "fat_g": 15.5, + "fiber_g": 6.2, + "sodium_mg": 1140.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -98622,13 +99030,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 204.7, + "kcal": 205.1, "protein_g": 4.9, "carbs_g": 38.0, "fat_g": 4.7, "fiber_g": 6.4, "sodium_mg": 412.5, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -98967,13 +99375,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 181.0, - "protein_g": 15.5, - "carbs_g": 19.8, - "fat_g": 5.0, + "kcal": 341.0, + "protein_g": 21.5, + "carbs_g": 21.0, + "fat_g": 19.4, "fiber_g": 5.0, - "sodium_mg": 513.4, - "coverage": "partial", + "sodium_mg": 968.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -99284,13 +99692,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 592.9, - "protein_g": 14.2, - "carbs_g": 88.2, - "fat_g": 23.0, + "kcal": 605.9, + "protein_g": 16.2, + "carbs_g": 89.4, + "fat_g": 23.1, "fiber_g": 9.6, - "sodium_mg": 1176.7, - "coverage": "partial", + "sodium_mg": 1374.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -99570,13 +99978,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 49.9, - "protein_g": 2.0, - "carbs_g": 11.3, - "fat_g": 0.5, + "kcal": 81.1, + "protein_g": 6.7, + "carbs_g": 14.2, + "fat_g": 0.7, "fiber_g": 3.7, - "sodium_mg": 38.4, - "coverage": "partial", + "sodium_mg": 513.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -99894,13 +100302,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 755.5, - "protein_g": 43.7, - "carbs_g": 57.3, - "fat_g": 41.1, - "fiber_g": 7.0, - "sodium_mg": 1245.2, - "coverage": "partial", + "kcal": 769.6, + "protein_g": 44.4, + "carbs_g": 60.0, + "fat_g": 41.8, + "fiber_g": 8.8, + "sodium_mg": 1248.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -100065,13 +100473,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 262.6, - "protein_g": 5.8, - "carbs_g": 51.5, - "fat_g": 4.9, - "fiber_g": 6.8, - "sodium_mg": 457.7, - "coverage": "partial", + "kcal": 294.6, + "protein_g": 9.5, + "carbs_g": 55.6, + "fat_g": 5.6, + "fiber_g": 8.2, + "sodium_mg": 777.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -100211,13 +100619,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 57.5, - "protein_g": 2.3, - "carbs_g": 13.0, - "fat_g": 0.5, - "fiber_g": 3.7, - "sodium_mg": 10.5, - "coverage": "partial", + "kcal": 322.0, + "protein_g": 12.3, + "carbs_g": 16.6, + "fat_g": 23.9, + "fiber_g": 4.8, + "sodium_mg": 741.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -100965,13 +101373,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 161.9, - "protein_g": 7.1, - "carbs_g": 25.3, - "fat_g": 3.3, + "kcal": 377.7, + "protein_g": 39.3, + "carbs_g": 25.7, + "fat_g": 11.8, "fiber_g": 1.0, - "sodium_mg": 125.9, - "coverage": "partial", + "sodium_mg": 204.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -101105,13 +101513,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 71.4, - "protein_g": 6.7, - "carbs_g": 12.8, - "fat_g": 0.6, - "fiber_g": 4.5, - "sodium_mg": 835.1, - "coverage": "partial", + "kcal": 214.7, + "protein_g": 10.8, + "carbs_g": 41.0, + "fat_g": 2.2, + "fiber_g": 5.8, + "sodium_mg": 836.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -101229,13 +101637,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 12.0, - "protein_g": 0.3, - "carbs_g": 2.8, - "fat_g": 0.0, - "fiber_g": 0.5, - "sodium_mg": 1.3, - "coverage": "partial", + "kcal": 136.5, + "protein_g": 5.7, + "carbs_g": 17.2, + "fat_g": 5.3, + "fiber_g": 5.0, + "sodium_mg": 166.3, + "coverage": "computed", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -101383,13 +101791,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 321.8, + "kcal": 324.4, "protein_g": 7.6, - "carbs_g": 38.5, - "fat_g": 17.0, - "fiber_g": 6.9, - "sodium_mg": 566.7, - "coverage": "partial", + "carbs_g": 38.8, + "fat_g": 17.2, + "fiber_g": 7.0, + "sodium_mg": 566.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -101992,13 +102400,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 400.0, - "protein_g": 13.5, - "carbs_g": 71.7, - "fat_g": 5.4, + "kcal": 486.4, + "protein_g": 19.6, + "carbs_g": 80.2, + "fat_g": 8.3, "fiber_g": 1.4, - "sodium_mg": 1686.3, - "coverage": "partial", + "sodium_mg": 2029.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -102153,13 +102561,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 181.9, - "protein_g": 8.1, - "carbs_g": 6.9, - "fat_g": 14.3, - "fiber_g": 1.0, - "sodium_mg": 1552.6, - "coverage": "partial", + "kcal": 338.9, + "protein_g": 13.9, + "carbs_g": 37.5, + "fat_g": 15.2, + "fiber_g": 2.8, + "sodium_mg": 1784.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -103258,13 +103666,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 238.2, - "protein_g": 12.5, - "carbs_g": 38.1, - "fat_g": 4.9, + "kcal": 252.6, + "protein_g": 13.1, + "carbs_g": 40.5, + "fat_g": 5.1, "fiber_g": 7.2, - "sodium_mg": 609.8, - "coverage": "partial", + "sodium_mg": 1337.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -103636,13 +104044,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 599.0, - "protein_g": 12.6, - "carbs_g": 103.9, + "kcal": 601.3, + "protein_g": 12.7, + "carbs_g": 104.4, "fat_g": 15.3, - "fiber_g": 7.8, - "sodium_mg": 606.3, - "coverage": "partial", + "fiber_g": 7.9, + "sodium_mg": 606.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -103996,13 +104404,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 817.0, - "protein_g": 41.8, - "carbs_g": 98.2, - "fat_g": 28.0, + "kcal": 845.8, + "protein_g": 43.8, + "carbs_g": 101.0, + "fat_g": 29.0, "fiber_g": 2.8, - "sodium_mg": 1344.2, - "coverage": "partial", + "sodium_mg": 1458.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -105341,13 +105749,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 588.0, + "kcal": 589.9, "protein_g": 20.7, - "carbs_g": 98.3, - "fat_g": 13.3, - "fiber_g": 9.0, - "sodium_mg": 496.0, - "coverage": "partial", + "carbs_g": 98.7, + "fat_g": 13.4, + "fiber_g": 9.1, + "sodium_mg": 496.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { diff --git a/data/recipe-bundle/manifest.json b/data/recipe-bundle/manifest.json index 517450803..ecaeabb22 100644 --- a/data/recipe-bundle/manifest.json +++ b/data/recipe-bundle/manifest.json @@ -4,9 +4,9 @@ "path": "apps/ios/Resources/RecipeCatalog/recipes-v2.json", "build_copy": "data/recipes/build/recipes-v2.json", "bundle_version": 2, - "generated_at": "2026-10-15T12:45:00Z", - "sha256": "87f4f2c1bbd43b1c9fcd5f235e169f5d386a73035a9f1b5b718b0d13e599eb7f", - "bytes": 2603827, + "generated_at": "2026-10-15T19:05:00Z", + "sha256": "8fd5941260f0385896ca6cce12dd94b5a52629612bfa58fcbd180c392375b351", + "bytes": 2611873, "schema_url": "https://fridgeluck.app/schemas/recipe-bundle-v2.schema.json" }, "contents": { @@ -15,7 +15,7 @@ "catalog_id_band": ["rcp-000167", "rcp-000934"], "cuisines": { "asian": 191, "american": 161, "mediterranean": 132, "italian": 105, "mexican": 98, "indian": 76 }, "rights_status": { "original": 461, "quarantined": 302 }, - "nutrition_coverage": { "estimated": 345, "partial": 255, "computed": 163 }, + "nutrition_coverage": { "estimated": 500, "partial": 99, "computed": 164 }, "steps_with_timers": 258, "recipes_without_lines": 0, "recipes_without_steps": 0, @@ -24,7 +24,7 @@ "rcp-000001..rcp-000166 stay reserved for migrated legacy rows; the corpus band starts at rcp-000167.", "No recipe ships without at least one structured line and one structured step.", "Every recipe carries a rights status with pinned evidence; nothing is guessed.", - "97 vocabulary keys (mostly world-cuisine specialties) have no FNDDS per-100g row; their recipes carry partial nutrition coverage rather than synthesized values." + "51 vocabulary keys resolved to same-product FDC rows in the 2026-10 nutrition-completion pass; the 46 keys with no honest FDC row (mostly world-cuisine specialties) stay unresolved with their rejected candidates recorded in data/ingredients/unresolved-candidates.json." ] }, "provenance": { @@ -39,19 +39,20 @@ ], "id_mapping": "data/recipes/evidence/ingest-2026-10-map.json (packet id -> corpus id, produced by data/recipe-bundle/ingest_packets_2026_10.py)" }, - "compiler": { "pull_request": 158, "branch": "obv/burst5-fridgeluck-rcp-pipeline", "commit": "3644321", "tool": "data/recipes/tools/compile_bundle.py", "changes_on_this_branch": "GENERATED_AT bumped to 2026-10-15T12:45:00Z per the tool's recompile instruction" }, - "vocabulary": { "tool": "data/recipes/tools/build_vocab.py", "keys": 329, "surfaces": 555, "fdc_new_rows": 97, "inputs": "extended corpus + /tmp/canon identities + /tmp/fdc FNDDS/SR CSVs (CC0)" }, + "compiler": { "pull_request": 158, "branch": "obv/burst5-fridgeluck-rcp-pipeline", "commit": "3644321", "tool": "data/recipes/tools/compile_bundle.py", "changes_on_this_branch": "GENERATED_AT bumped to 2026-10-15T19:05:00Z per the tool's recompile instruction" }, + "vocabulary": { "tool": "data/recipes/tools/build_vocab.py", "keys": 329, "surfaces": 555, "fdc_new_rows": 97, "inputs": "extended corpus + /tmp/canon identities + /tmp/fdc FNDDS/SR CSVs (CC0)", "nutrition_completion_2026_10": "51 keys pinned to same-product FDC rows in build_vocab.py FDC_PINS; 46 keys stay unresolved with rejected candidates in data/ingredients/unresolved-candidates.json (build_vocab.py fails if that audit drifts); legacy identity map now 32 resolved / 18 proposed / 0 unresolved, with 'tortilla' resolved via the plural key 'tortillas' (fdc 2707822)" }, "validator": "data/recipes/tools/validate_bundle.py", "loader": { "pull_request": 151, "branch": "obv/burst5-fridgeluck-rcp-loader" }, "contracts": { "spec_pull_requests": [148, 146], "schema": "docs/spec/recipes/contracts/recipe-bundle-v2.schema.json" } }, "verification": { - "pipeline_unit_tests": { "command": "python3 -m pytest data/recipes/tools/tests/test_pipeline.py -q", "result": "14 passed (corpus-size pin updated 401 -> 763)" }, + "pipeline_unit_tests": { "command": "python3 -m pytest data/recipes/tools/tests/ -q", "result": "18 passed (14 pipeline + 4 kcal-drift; corpus-size pin 763)" }, "bundle_validation": { "command": "python3 data/recipes/tools/validate_bundle.py", "result": "PASS" }, + "kcal_drift_check": { "command": "python3 data/recipes/tools/validate_bundle.py data/recipes/build/recipes-v2.json --previous --changes data/recipe-bundle/nutrition-changes-2026-10.json", "result": "PASS, 0 unrecorded/exempted problems; 33 of 763 recipes moved >40% in kcal and each carries an exemption naming the resolved keys in its lines" }, "determinism": { - "command": "python3 data/recipes/tools/compile_bundle.py (run twice, sha256 compared)", - "result": "byte-identical: 87f4f2c1bbd43b1c9fcd5f235e169f5d386a73035a9f1b5b718b0d13e599eb7f" + "command": "python3 data/recipes/tools/compile_bundle.py (run three times, md5 compared)", + "result": "byte-identical: 8fd5941260f0385896ca6cce12dd94b5a52629612bfa58fcbd180c392375b351" }, - "nutrition_stability": "per_100g and fdc_id unchanged for all 220 pre-existing vocabulary keys after the vocabulary rebuild; only unit weights and aliases were recomputed" + "nutrition_changes": "51 keys gained per-100g; 193 recipes changed kcal (median +11.5 kcal, max +426.2 on rcp-000229, the previously under-reported ones); 33 moves >40% are exempted in data/recipe-bundle/nutrition-changes-2026-10.json and enforced by validate_bundle.py --previous --changes" } } diff --git a/data/recipe-bundle/nutrition-changes-2026-10.json b/data/recipe-bundle/nutrition-changes-2026-10.json new file mode 100644 index 000000000..76e1a93aa --- /dev/null +++ b/data/recipe-bundle/nutrition-changes-2026-10.json @@ -0,0 +1,206 @@ +{ + "note": "Recipes whose per-serving kcal moved more than 40 percent against the previously published bundle, with the vocabulary resolution that caused each move. Recorded by data/recipes/tools/record_nutrition_changes.py; enforced by validate_bundle.py --previous --changes.", + "policy": "A >40% kcal move between published bundles must be exempted here with the vocabulary change that caused it; exemption entries must reproduce both kcal values.", + "previous_bundle": "data/recipes/build/recipes-v2.json as shipped before the 2026-10 nutrition-completion vocabulary revision (commit ac5a535)", + "threshold": 0.4, + "entries": [ + { + "catalog_id": "rcp-000182", + "old_kcal": 306.9, + "new_kcal": 436.5, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: chicken_stock (fdc 172884)" + }, + { + "catalog_id": "rcp-000229", + "old_kcal": 236.5, + "new_kcal": 662.7, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: ground_turmeric (fdc 172231), whole_wheat_flour (fdc 168893)" + }, + { + "catalog_id": "rcp-000262", + "old_kcal": 177.9, + "new_kcal": 350.7, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: chicken_stock (fdc 172884)" + }, + { + "catalog_id": "rcp-000305", + "old_kcal": 410.5, + "new_kcal": 626.5, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: chicken_stock (fdc 172884)" + }, + { + "catalog_id": "rcp-000319", + "old_kcal": 162.5, + "new_kcal": 436.1, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: borlotti_beans (fdc 173736), vegetable_stock (fdc 171180)" + }, + { + "catalog_id": "rcp-000401", + "old_kcal": 162.4, + "new_kcal": 319.4, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: orzo (fdc 2708357)" + }, + { + "catalog_id": "rcp-000414", + "old_kcal": 214.2, + "new_kcal": 387.0, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: chicken_stock (fdc 172884)" + }, + { + "catalog_id": "rcp-000420", + "old_kcal": 58.0, + "new_kcal": 229.4, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: orzo (fdc 2708357), vegetable_stock (fdc 171180)" + }, + { + "catalog_id": "rcp-000428", + "old_kcal": 49.7, + "new_kcal": 222.5, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: chicken_stock (fdc 172884)" + }, + { + "catalog_id": "rcp-000449", + "old_kcal": 220.1, + "new_kcal": 392.9, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: chicken_stock (fdc 172884)" + }, + { + "catalog_id": "rcp-000474", + "old_kcal": 88.7, + "new_kcal": 218.3, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: chicken_stock (fdc 172884)" + }, + { + "catalog_id": "rcp-000478", + "old_kcal": 170.2, + "new_kcal": 343.0, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: chicken_stock (fdc 172884)" + }, + { + "catalog_id": "rcp-000503", + "old_kcal": 233.0, + "new_kcal": 362.6, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: chicken_stock (fdc 172884)" + }, + { + "catalog_id": "rcp-000517", + "old_kcal": 304.4, + "new_kcal": 480.6, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: chicken_stock (fdc 172884), ground_ginger (fdc 170926)" + }, + { + "catalog_id": "rcp-000541", + "old_kcal": 228.5, + "new_kcal": 401.3, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: chicken_stock (fdc 172884)" + }, + { + "catalog_id": "rcp-000545", + "old_kcal": 301.8, + "new_kcal": 474.6, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: breadcrumbs (fdc 174928), chicken_stock (fdc 172884)" + }, + { + "catalog_id": "rcp-000547", + "old_kcal": 72.5, + "new_kcal": 203.7, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: chicken_stock (fdc 172884), ground_ginger (fdc 170926)" + }, + { + "catalog_id": "rcp-000596", + "old_kcal": 81.7, + "new_kcal": 227.8, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: udon_noodles (fdc 2708352)" + }, + { + "catalog_id": "rcp-000626", + "old_kcal": 96.9, + "new_kcal": 151.8, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: rice_flour (fdc 169714)" + }, + { + "catalog_id": "rcp-000642", + "old_kcal": 28.2, + "new_kcal": 98.4, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: glass_noodles (fdc 174258)" + }, + { + "catalog_id": "rcp-000651", + "old_kcal": 193.5, + "new_kcal": 440.6, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: rice_flour (fdc 169714), turmeric (fdc 172231)" + }, + { + "catalog_id": "rcp-000658", + "old_kcal": 188.8, + "new_kcal": 460.8, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: baguette (fdc 2707610)" + }, + { + "catalog_id": "rcp-000694", + "old_kcal": 36.4, + "new_kcal": 108.8, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: red_palm_oil (fdc 171015)" + }, + { + "catalog_id": "rcp-000704", + "old_kcal": 101.6, + "new_kcal": 282.9, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: salt_cod (fdc 174190)" + }, + { + "catalog_id": "rcp-000705", + "old_kcal": 87.5, + "new_kcal": 240.1, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: goat_meat (fdc 175303)" + }, + { + "catalog_id": "rcp-000723", + "old_kcal": 220.9, + "new_kcal": 390.3, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: french_fries (fdc 2709456), white_vinegar (fdc 172237)" + }, + { + "catalog_id": "rcp-000732", + "old_kcal": 181.0, + "new_kcal": 341.0, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: smoked_sausage (fdc 174585)" + }, + { + "catalog_id": "rcp-000736", + "old_kcal": 49.9, + "new_kcal": 81.1, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: beef_stock (fdc 172883)" + }, + { + "catalog_id": "rcp-000740", + "old_kcal": 57.5, + "new_kcal": 322.0, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: paprika (fdc 171329), smoked_sausage (fdc 174585)" + }, + { + "catalog_id": "rcp-000745", + "old_kcal": 161.9, + "new_kcal": 377.7, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: lemon_juice (fdc 2709180), pork_cutlets (fdc 168230)" + }, + { + "catalog_id": "rcp-000746", + "old_kcal": 71.4, + "new_kcal": 214.7, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: millet_flour (fdc 172023)" + }, + { + "catalog_id": "rcp-000747", + "old_kcal": 12.0, + "new_kcal": 136.5, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: black_eyed_peas (fdc 2707412)" + }, + { + "catalog_id": "rcp-000753", + "old_kcal": 181.9, + "new_kcal": 338.9, + "vocabulary_change": "keys in this recipe resolved to per-100g rows in this revision: orzo (fdc 2708357)" + } + ] +} diff --git a/data/recipe-bundle/validation-report.md b/data/recipe-bundle/validation-report.md index 4cfc3ff54..a488446c9 100644 --- a/data/recipe-bundle/validation-report.md +++ b/data/recipe-bundle/validation-report.md @@ -119,3 +119,32 @@ carry no collection tags. If the enum should grow, that is a schema change (PR # corpus-level linting of the ingested records ran through the packets' own checkers and the compiled-output validator instead. - Bundle size impact on the app binary (2.6 MB resource) is unmeasured beyond file size. + +--- + +# Addendum — 2026-10-15 nutrition-completion revision (branch `obv/burst6-fridgeluck-recipe-nutrition`) + +The bundle was recompiled after a vocabulary revision that resolves 51 specialty keys +(mostly world-cuisine) to same-product FDC rows in the FNDDS 2024-10-31 / SR Legacy +2018-04 bulk CSVs — e.g. hoisin → Hoisin sauce 2707441, oyster sauce ("hao you") 2707150, +salt cod 174190, borlotti beans → cranberry (roman) beans 173736, daikon → oriental +radish 168451. Every pin cites the row's own description and is the same product as the +key; keys whose only candidate rows are a different product (gochujang, mirin, labneh, +dashi, halloumi, species-unspecified stock, …) stay unresolved with their rejected +candidates recorded in `data/ingredients/unresolved-candidates.json`, and +`build_vocab.py` now fails if that audit drifts from the vocabulary. The legacy identity +map is fully resolved (32 resolved / 18 proposed / 0 unresolved; `tortilla` resolves via +the plural key `tortillas`). + +Effect on the shipped bundle (sha256 `8fd59412…375b351`, 2,611,873 bytes, `GENERATED_AT` +`2026-10-15T19:05:00Z`): nutrition coverage moved from 163 computed / 345 estimated / +255 partial to **164 computed / 500 estimated / 99 partial**. 193 recipes changed kcal +(median +11.5); the 33 recipes that moved more than 40 percent are the previously +under-reported ones, and each carries a recorded cause in +`data/recipe-bundle/nutrition-changes-2026-10.json` naming the resolved keys in its +lines. The validator gained a `--previous`/`--changes` kcal-drift check that fails on +any unrecorded >40% move between published bundles, with planted-violation tests in +`data/recipes/tools/tests/test_kcal_drift.py`. + +Nothing recipe-level was authored or edited; all changes flow from the audited +vocabulary revision through the pipeline's own rebuild. diff --git a/data/recipes/build/recipes-v2.json b/data/recipes/build/recipes-v2.json index c7c89ad6f..7a9e30ba7 100644 --- a/data/recipes/build/recipes-v2.json +++ b/data/recipes/build/recipes-v2.json @@ -1,7 +1,7 @@ { "schema": "https://fridgeluck.app/schemas/recipe-bundle-v2.schema.json", "bundle_version": 2, - "generated_at": "2026-10-15T12:45:00Z", + "generated_at": "2026-10-15T19:05:00Z", "cuisines": [ "american", "asian", @@ -47,11 +47,19 @@ }, { "key": "allspice", - "fdc_id": null, + "fdc_id": 171315, "legacy_id": null, "display_name": "Allspice", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 263.0, + "protein_g": 6.09, + "carbs_g": 72.12, + "fat_g": 8.69, + "fiber_g": 21.6, + "sugar_g": 0.0, + "sodium_mg": 77.0 + }, "aliases": [ "allspice" ] @@ -143,11 +151,19 @@ }, { "key": "apple_cider_vinegar", - "fdc_id": null, + "fdc_id": 173469, "legacy_id": null, "display_name": "Apple cider vinegar", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 21.0, + "protein_g": 0.0, + "carbs_g": 0.93, + "fat_g": 0.0, + "fiber_g": 0.0, + "sugar_g": 0.4, + "sodium_mg": 5.0 + }, "aliases": [ "apple cider vinegar", "cider vinegar" @@ -284,22 +300,38 @@ }, { "key": "baguette", - "fdc_id": null, + "fdc_id": 2707610, "legacy_id": null, "display_name": "Baguette", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 272.0, + "protein_g": 10.75, + "carbs_g": 51.88, + "fat_g": 2.42, + "fiber_g": 2.2, + "sugar_g": 4.62, + "sodium_mg": 602.0 + }, "aliases": [ "baguette" ] }, { "key": "baking_powder", - "fdc_id": null, + "fdc_id": 172803, "legacy_id": null, "display_name": "Baking powder", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 53.0, + "protein_g": 0.0, + "carbs_g": 27.7, + "fat_g": 0.0, + "fiber_g": 0.2, + "sugar_g": 0.0, + "sodium_mg": 10600.0 + }, "aliases": [ "baking powder" ] @@ -384,11 +416,19 @@ }, { "key": "beansprouts", - "fdc_id": null, + "fdc_id": 2709768, "legacy_id": null, "display_name": "Beansprouts", "category": "vegetable", - "per_100g": null, + "per_100g": { + "kcal": 30.0, + "protein_g": 3.04, + "carbs_g": 5.94, + "fat_g": 0.18, + "fiber_g": 1.8, + "sugar_g": 4.13, + "sodium_mg": 6.0 + }, "aliases": [ "beansprouts" ] @@ -426,11 +466,19 @@ }, { "key": "beef_stock", - "fdc_id": null, + "fdc_id": 172883, "legacy_id": null, "display_name": "Beef stock", "category": "condiment", - "per_100g": null, + "per_100g": { + "kcal": 13.0, + "protein_g": 1.97, + "carbs_g": 1.2, + "fat_g": 0.09, + "fiber_g": 0.0, + "sugar_g": 0.54, + "sodium_mg": 198.0 + }, "aliases": [ "beef broth", "beef stock" @@ -492,11 +540,19 @@ }, { "key": "besan", - "fdc_id": null, + "fdc_id": 174288, "legacy_id": null, "display_name": "Besan", "category": "vegetable", - "per_100g": null, + "per_100g": { + "kcal": 387.0, + "protein_g": 22.39, + "carbs_g": 57.82, + "fat_g": 6.69, + "fiber_g": 10.8, + "sugar_g": 10.85, + "sodium_mg": 64.0 + }, "aliases": [ "besan (chickpea flour)" ] @@ -538,11 +594,19 @@ }, { "key": "black_eyed_peas", - "fdc_id": null, + "fdc_id": 2707412, "legacy_id": null, "display_name": "Black eyed peas", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 166.0, + "protein_g": 7.18, + "carbs_g": 19.29, + "fat_g": 7.0, + "fiber_g": 6.0, + "sugar_g": 3.07, + "sodium_mg": 220.0 + }, "aliases": [ "black-eyed peas" ] @@ -617,11 +681,19 @@ }, { "key": "borlotti_beans", - "fdc_id": null, + "fdc_id": 173736, "legacy_id": null, "display_name": "Borlotti beans", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 136.0, + "protein_g": 9.34, + "carbs_g": 24.46, + "fat_g": 0.46, + "fiber_g": 8.6, + "sugar_g": 0.0, + "sodium_mg": 1.0 + }, "aliases": [ "borlotti beans, drained" ] @@ -658,11 +730,19 @@ }, { "key": "breadcrumbs", - "fdc_id": null, + "fdc_id": 174928, "legacy_id": null, "display_name": "Breadcrumbs", "category": "vegetable", - "per_100g": null, + "per_100g": { + "kcal": 395.0, + "protein_g": 13.35, + "carbs_g": 71.98, + "fat_g": 5.3, + "fiber_g": 4.5, + "sugar_g": 6.2, + "sodium_mg": 732.0 + }, "aliases": [ "bread crumbs", "breadcrumbs", @@ -692,11 +772,19 @@ }, { "key": "broth", - "fdc_id": null, + "fdc_id": 2707132, "legacy_id": null, "display_name": "Broth", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 6.0, + "protein_g": 0.89, + "carbs_g": 0.24, + "fat_g": 0.22, + "fiber_g": 0.0, + "sugar_g": 0.22, + "sodium_mg": 372.0 + }, "aliases": [ "broth" ] @@ -781,11 +869,19 @@ }, { "key": "burger_buns", - "fdc_id": null, + "fdc_id": 2707657, "legacy_id": null, "display_name": "Burger buns", "category": "grain", - "per_100g": null, + "per_100g": { + "kcal": 267.0, + "protein_g": 9.43, + "carbs_g": 49.2, + "fat_g": 3.59, + "fiber_g": 2.3, + "sugar_g": 5.34, + "sodium_mg": 450.0 + }, "aliases": [ "burger buns" ] @@ -1052,11 +1148,19 @@ }, { "key": "cayenne", - "fdc_id": null, + "fdc_id": 170932, "legacy_id": null, "display_name": "Cayenne", "category": "spice", - "per_100g": null, + "per_100g": { + "kcal": 318.0, + "protein_g": 12.01, + "carbs_g": 56.63, + "fat_g": 17.27, + "fiber_g": 27.2, + "sugar_g": 10.34, + "sodium_mg": 30.0 + }, "aliases": [ "cayenne" ] @@ -1181,11 +1285,19 @@ }, { "key": "chicken_stock", - "fdc_id": null, + "fdc_id": 172884, "legacy_id": null, "display_name": "Chicken stock", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 36.0, + "protein_g": 2.52, + "carbs_g": 3.53, + "fat_g": 1.2, + "fiber_g": 0.0, + "sugar_g": 1.58, + "sodium_mg": 143.0 + }, "aliases": [ "chicken bone broth", "chicken broth", @@ -1262,22 +1374,38 @@ }, { "key": "chiles", - "fdc_id": null, + "fdc_id": 168570, "legacy_id": null, "display_name": "Chiles", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 324.0, + "protein_g": 10.58, + "carbs_g": 69.86, + "fat_g": 5.81, + "fiber_g": 28.7, + "sugar_g": 41.06, + "sodium_mg": 91.0 + }, "aliases": [ "dried chiles" ] }, { "key": "chili_powder", - "fdc_id": null, + "fdc_id": 171319, "legacy_id": null, "display_name": "Chili powder", "category": "spice", - "per_100g": null, + "per_100g": { + "kcal": 282.0, + "protein_g": 13.46, + "carbs_g": 49.7, + "fat_g": 14.28, + "fiber_g": 34.8, + "sugar_g": 7.19, + "sodium_mg": 2867.0 + }, "aliases": [ "chili powder" ] @@ -1517,11 +1645,19 @@ }, { "key": "cola", - "fdc_id": null, + "fdc_id": 174852, "legacy_id": null, "display_name": "Cola", "category": "condiment", - "per_100g": null, + "per_100g": { + "kcal": 42.0, + "protein_g": 0.0, + "carbs_g": 10.36, + "fat_g": 0.25, + "fiber_g": 0.0, + "sugar_g": 9.94, + "sodium_mg": 3.0 + }, "aliases": [ "cola" ] @@ -1746,11 +1882,19 @@ }, { "key": "cranberry_sauce", - "fdc_id": null, + "fdc_id": 2709280, "legacy_id": null, "display_name": "Cranberry sauce", "category": "condiment", - "per_100g": null, + "per_100g": { + "kcal": 159.0, + "protein_g": 0.9, + "carbs_g": 40.4, + "fat_g": 0.15, + "fiber_g": 1.1, + "sugar_g": 31.75, + "sodium_mg": 5.0 + }, "aliases": [ "cranberry sauce" ] @@ -1860,11 +2004,19 @@ }, { "key": "daikon", - "fdc_id": null, + "fdc_id": 168451, "legacy_id": null, "display_name": "Daikon", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 18.0, + "protein_g": 0.6, + "carbs_g": 4.1, + "fat_g": 0.1, + "fiber_g": 1.6, + "sugar_g": 2.5, + "sodium_mg": 21.0 + }, "aliases": [ "daikon" ] @@ -2216,11 +2368,19 @@ }, { "key": "french_fries", - "fdc_id": null, + "fdc_id": 2709456, "legacy_id": null, "display_name": "French fries", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 225.0, + "protein_g": 2.5, + "carbs_g": 23.23, + "fat_g": 14.07, + "fiber_g": 1.8, + "sugar_g": 0.34, + "sodium_mg": 295.0 + }, "aliases": [ "french fries" ] @@ -2338,11 +2498,19 @@ }, { "key": "glass_noodles", - "fdc_id": null, + "fdc_id": 174258, "legacy_id": null, "display_name": "Glass noodles", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 351.0, + "protein_g": 0.16, + "carbs_g": 86.09, + "fat_g": 0.06, + "fiber_g": 0.5, + "sugar_g": 0.0, + "sodium_mg": 10.0 + }, "aliases": [ "glass noodles" ] @@ -2388,11 +2556,19 @@ }, { "key": "goat_meat", - "fdc_id": null, + "fdc_id": 175303, "legacy_id": null, "display_name": "Goat meat", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 109.0, + "protein_g": 20.6, + "carbs_g": 0.0, + "fat_g": 2.31, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 82.0 + }, "aliases": [ "goat meat" ] @@ -2521,11 +2697,19 @@ }, { "key": "green_chili", - "fdc_id": null, + "fdc_id": 170497, "legacy_id": null, "display_name": "Green chili", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 40.0, + "protein_g": 2.0, + "carbs_g": 9.46, + "fat_g": 0.2, + "fiber_g": 1.5, + "sugar_g": 5.1, + "sodium_mg": 7.0 + }, "aliases": [ "green chili", "mild green chiles" @@ -2642,22 +2826,38 @@ }, { "key": "ground_coriander", - "fdc_id": null, + "fdc_id": 170922, "legacy_id": null, "display_name": "Ground coriander", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 298.0, + "protein_g": 12.37, + "carbs_g": 54.99, + "fat_g": 17.77, + "fiber_g": 41.9, + "sugar_g": 0.0, + "sodium_mg": 35.0 + }, "aliases": [ "ground coriander" ] }, { "key": "ground_ginger", - "fdc_id": null, + "fdc_id": 170926, "legacy_id": null, "display_name": "Ground ginger", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 335.0, + "protein_g": 8.98, + "carbs_g": 71.62, + "fat_g": 4.24, + "fiber_g": 14.1, + "sugar_g": 3.39, + "sodium_mg": 27.0 + }, "aliases": [ "ground ginger" ] @@ -2685,11 +2885,19 @@ }, { "key": "ground_turmeric", - "fdc_id": null, + "fdc_id": 172231, "legacy_id": null, "display_name": "Ground turmeric", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 312.0, + "protein_g": 9.68, + "carbs_g": 67.14, + "fat_g": 3.25, + "fiber_g": 22.7, + "sugar_g": 3.21, + "sodium_mg": 27.0 + }, "aliases": [ "ground turmeric" ] @@ -2728,11 +2936,19 @@ }, { "key": "hao_you", - "fdc_id": null, + "fdc_id": 2707150, "legacy_id": null, "display_name": "Hao you", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 51.0, + "protein_g": 1.35, + "carbs_g": 10.92, + "fat_g": 0.25, + "fiber_g": 0.3, + "sugar_g": 0.0, + "sodium_mg": 2733.0 + }, "aliases": [ "hao you" ] @@ -2771,11 +2987,19 @@ }, { "key": "hoisin", - "fdc_id": null, + "fdc_id": 2707441, "legacy_id": null, "display_name": "Hoisin", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 220.0, + "protein_g": 3.31, + "carbs_g": 44.08, + "fat_g": 3.39, + "fiber_g": 2.8, + "sugar_g": 27.26, + "sodium_mg": 1615.0 + }, "aliases": [ "hoisin sauce" ] @@ -3113,11 +3337,19 @@ }, { "key": "lemon_juice", - "fdc_id": null, + "fdc_id": 2709180, "legacy_id": null, "display_name": "Lemon juice", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 22.0, + "protein_g": 0.35, + "carbs_g": 6.9, + "fat_g": 0.24, + "fiber_g": 0.3, + "sugar_g": 2.52, + "sodium_mg": 1.0 + }, "aliases": [ "lemon juice" ] @@ -3316,11 +3548,19 @@ }, { "key": "mild_curry_powder", - "fdc_id": null, + "fdc_id": 170924, "legacy_id": null, "display_name": "Mild curry powder", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 325.0, + "protein_g": 14.29, + "carbs_g": 55.83, + "fat_g": 14.01, + "fiber_g": 53.2, + "sugar_g": 2.76, + "sodium_mg": 52.0 + }, "aliases": [ "mild curry powder" ] @@ -3368,11 +3608,19 @@ }, { "key": "millet_flour", - "fdc_id": null, + "fdc_id": 172023, "legacy_id": null, "display_name": "Millet flour", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 382.0, + "protein_g": 10.75, + "carbs_g": 75.12, + "fat_g": 4.25, + "fiber_g": 3.5, + "sugar_g": 1.66, + "sodium_mg": 4.0 + }, "aliases": [ "millet flour" ] @@ -3574,11 +3822,19 @@ }, { "key": "nutmeg", - "fdc_id": null, + "fdc_id": 171326, "legacy_id": null, "display_name": "Nutmeg", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 525.0, + "protein_g": 5.84, + "carbs_g": 49.29, + "fat_g": 36.31, + "fiber_g": 20.8, + "sugar_g": 2.99, + "sodium_mg": 16.0 + }, "aliases": [ "nutmeg" ] @@ -3694,11 +3950,19 @@ }, { "key": "orange_juice", - "fdc_id": null, + "fdc_id": 2709186, "legacy_id": null, "display_name": "Orange juice", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 47.0, + "protein_g": 0.77, + "carbs_g": 10.17, + "fat_g": 0.34, + "fiber_g": 0.3, + "sugar_g": 8.18, + "sodium_mg": 2.0 + }, "aliases": [ "orange juice" ] @@ -3745,11 +4009,19 @@ }, { "key": "orzo", - "fdc_id": null, + "fdc_id": 2708357, "legacy_id": null, "display_name": "Orzo", "category": "vegetable", - "per_100g": null, + "per_100g": { + "kcal": 157.0, + "protein_g": 5.76, + "carbs_g": 30.68, + "fat_g": 0.92, + "fiber_g": 1.8, + "sugar_g": 0.56, + "sodium_mg": 232.0 + }, "aliases": [ "orzo", "risoni" @@ -3777,11 +4049,19 @@ }, { "key": "paprika", - "fdc_id": null, + "fdc_id": 171329, "legacy_id": null, "display_name": "Paprika", "category": "spice", - "per_100g": null, + "per_100g": { + "kcal": 282.0, + "protein_g": 14.14, + "carbs_g": 53.99, + "fat_g": 12.89, + "fiber_g": 34.9, + "sugar_g": 10.34, + "sodium_mg": 68.0 + }, "aliases": [ "paprika" ] @@ -4068,11 +4348,19 @@ }, { "key": "pomegranate_seeds", - "fdc_id": null, + "fdc_id": 169134, "legacy_id": null, "display_name": "Pomegranate seeds", "category": "fruit", - "per_100g": null, + "per_100g": { + "kcal": 83.0, + "protein_g": 1.67, + "carbs_g": 18.7, + "fat_g": 1.17, + "fiber_g": 4.0, + "sugar_g": 13.67, + "sodium_mg": 3.0 + }, "aliases": [ "pomegranate seeds" ] @@ -4119,11 +4407,19 @@ }, { "key": "pork_cutlets", - "fdc_id": null, + "fdc_id": 168230, "legacy_id": null, "display_name": "Pork cutlets", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 143.0, + "protein_g": 21.43, + "carbs_g": 0.0, + "fat_g": 5.66, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 52.0 + }, "aliases": [ "pork cutlets" ] @@ -4384,11 +4680,19 @@ }, { "key": "red_palm_oil", - "fdc_id": null, + "fdc_id": 171015, "legacy_id": null, "display_name": "Red palm oil", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 884.0, + "protein_g": 0.0, + "carbs_g": 0.0, + "fat_g": 100.0, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 0.0 + }, "aliases": [ "red palm oil" ] @@ -4519,11 +4823,19 @@ }, { "key": "rice_flour", - "fdc_id": null, + "fdc_id": 169714, "legacy_id": null, "display_name": "Rice flour", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 366.0, + "protein_g": 5.95, + "carbs_g": 80.13, + "fat_g": 1.42, + "fiber_g": 2.4, + "sugar_g": 0.12, + "sodium_mg": 0.0 + }, "aliases": [ "rice flour" ] @@ -4717,11 +5029,19 @@ }, { "key": "salt_cod", - "fdc_id": null, + "fdc_id": 174190, "legacy_id": null, "display_name": "Salt cod", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 290.0, + "protein_g": 62.82, + "carbs_g": 0.0, + "fat_g": 2.37, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 7027.0 + }, "aliases": [ "salt cod" ] @@ -5008,11 +5328,19 @@ }, { "key": "smoked_sausage", - "fdc_id": null, + "fdc_id": 174585, "legacy_id": null, "display_name": "Smoked sausage", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 320.0, + "protein_g": 12.0, + "carbs_g": 2.42, + "fat_g": 28.73, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 911.0 + }, "aliases": [ "smoked sausage" ] @@ -5115,22 +5443,38 @@ }, { "key": "squid", - "fdc_id": null, + "fdc_id": 174223, "legacy_id": null, "display_name": "Squid", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 92.0, + "protein_g": 15.58, + "carbs_g": 3.08, + "fat_g": 1.38, + "fiber_g": 0.0, + "sugar_g": 0.0, + "sodium_mg": 44.0 + }, "aliases": [ "squid" ] }, { "key": "sriracha", - "fdc_id": null, + "fdc_id": 171186, "legacy_id": null, "display_name": "Sriracha", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 93.0, + "protein_g": 1.93, + "carbs_g": 19.16, + "fat_g": 0.93, + "fiber_g": 2.2, + "sugar_g": 15.11, + "sodium_mg": 2124.0 + }, "aliases": [ "sriracha" ] @@ -5211,11 +5555,19 @@ }, { "key": "swede", - "fdc_id": null, + "fdc_id": 168454, "legacy_id": null, "display_name": "Swede", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 37.0, + "protein_g": 1.08, + "carbs_g": 8.62, + "fat_g": 0.16, + "fiber_g": 2.3, + "sugar_g": 4.46, + "sodium_mg": 12.0 + }, "aliases": [ "swede, peeled and cubed" ] @@ -5297,11 +5649,19 @@ }, { "key": "tamari", - "fdc_id": null, + "fdc_id": 174278, "legacy_id": null, "display_name": "Tamari", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 60.0, + "protein_g": 10.51, + "carbs_g": 5.57, + "fat_g": 0.1, + "fiber_g": 0.8, + "sugar_g": 1.7, + "sodium_mg": 5586.0 + }, "aliases": [ "japanese tamari", "tamari", @@ -5310,11 +5670,19 @@ }, { "key": "tamarind_paste", - "fdc_id": null, + "fdc_id": 167763, "legacy_id": null, "display_name": "Tamarind paste", "category": "condiment", - "per_100g": null, + "per_100g": { + "kcal": 239.0, + "protein_g": 2.8, + "carbs_g": 62.5, + "fat_g": 0.6, + "fiber_g": 5.1, + "sugar_g": 38.8, + "sodium_mg": 28.0 + }, "aliases": [ "tamarind paste", "tamarind paste or rice vinegar" @@ -5507,22 +5875,38 @@ }, { "key": "turmeric", - "fdc_id": null, + "fdc_id": 172231, "legacy_id": null, "display_name": "Turmeric", "category": "spice", - "per_100g": null, + "per_100g": { + "kcal": 312.0, + "protein_g": 9.68, + "carbs_g": 67.14, + "fat_g": 3.25, + "fiber_g": 22.7, + "sugar_g": 3.21, + "sodium_mg": 27.0 + }, "aliases": [ "turmeric" ] }, { "key": "udon_noodles", - "fdc_id": null, + "fdc_id": 2708352, "legacy_id": null, "display_name": "Udon noodles", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 137.0, + "protein_g": 4.51, + "carbs_g": 25.01, + "fat_g": 2.06, + "fiber_g": 1.2, + "sugar_g": 0.4, + "sodium_mg": 236.0 + }, "aliases": [ "udon noodles" ] @@ -5578,11 +5962,19 @@ }, { "key": "vegetable_stock", - "fdc_id": null, + "fdc_id": 171180, "legacy_id": null, "display_name": "Vegetable stock", "category": "condiment", - "per_100g": null, + "per_100g": { + "kcal": 6.0, + "protein_g": 0.23, + "carbs_g": 1.02, + "fat_g": 0.07, + "fiber_g": 0.0, + "sugar_g": 0.57, + "sodium_mg": 303.0 + }, "aliases": [ "veg stock", "vegetable broth", @@ -5773,22 +6165,38 @@ }, { "key": "white_vinegar", - "fdc_id": null, + "fdc_id": 172237, "legacy_id": null, "display_name": "White vinegar", "category": "other", - "per_100g": null, + "per_100g": { + "kcal": 18.0, + "protein_g": 0.0, + "carbs_g": 0.04, + "fat_g": 0.0, + "fiber_g": 0.0, + "sugar_g": 0.04, + "sodium_mg": 2.0 + }, "aliases": [ "white vinegar" ] }, { "key": "whole_wheat_flour", - "fdc_id": null, + "fdc_id": 168893, "legacy_id": null, "display_name": "Whole wheat flour", "category": "grain", - "per_100g": null, + "per_100g": { + "kcal": 340.0, + "protein_g": 13.21, + "carbs_g": 71.97, + "fat_g": 2.5, + "fiber_g": 10.7, + "sugar_g": 0.41, + "sodium_mg": 2.0 + }, "aliases": [ "whole wheat flour" ] @@ -6324,13 +6732,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 412.0, + "kcal": 413.8, "protein_g": 13.2, - "carbs_g": 54.4, + "carbs_g": 55.4, "fat_g": 15.1, "fiber_g": 2.0, - "sodium_mg": 428.9, - "coverage": "partial", + "sodium_mg": 786.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -6849,13 +7257,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 173.9, + "kcal": 174.3, "protein_g": 9.3, - "carbs_g": 30.7, + "carbs_g": 30.9, "fat_g": 6.1, "fiber_g": 4.1, - "sodium_mg": 159.2, - "coverage": "partial", + "sodium_mg": 238.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -8315,13 +8723,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 272.6, - "protein_g": 11.6, - "carbs_g": 30.5, - "fat_g": 11.9, + "kcal": 283.4, + "protein_g": 12.0, + "carbs_g": 32.4, + "fat_g": 12.0, "fiber_g": 3.2, - "sodium_mg": 659.7, - "coverage": "partial", + "sodium_mg": 1205.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -8485,13 +8893,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 306.9, - "protein_g": 25.8, - "carbs_g": 12.3, - "fat_g": 17.3, + "kcal": 436.5, + "protein_g": 34.9, + "carbs_g": 25.0, + "fat_g": 21.6, "fiber_g": 1.3, - "sodium_mg": 443.1, - "coverage": "partial", + "sodium_mg": 957.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -8832,13 +9240,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 807.9, - "protein_g": 45.0, - "carbs_g": 104.6, - "fat_g": 23.2, + "kcal": 923.1, + "protein_g": 53.0, + "carbs_g": 115.9, + "fat_g": 27.0, "fiber_g": 5.9, - "sodium_mg": 472.3, - "coverage": "partial", + "sodium_mg": 929.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -9789,13 +10197,13 @@ "dairy_free": true }, "nutrition_per_serving": { - "kcal": 829.0, - "protein_g": 38.6, - "carbs_g": 152.9, + "kcal": 838.6, + "protein_g": 40.3, + "carbs_g": 153.8, "fat_g": 4.9, - "fiber_g": 3.9, - "sodium_mg": 116.8, - "coverage": "partial", + "fiber_g": 4.1, + "sodium_mg": 1010.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -10805,13 +11213,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 325.0, - "protein_g": 22.9, - "carbs_g": 29.7, - "fat_g": 12.8, + "kcal": 359.5, + "protein_g": 25.4, + "carbs_g": 33.1, + "fat_g": 13.9, "fiber_g": 3.6, - "sodium_mg": 201.4, - "coverage": "partial", + "sodium_mg": 338.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -12649,13 +13057,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 220.6, + "kcal": 221.4, "protein_g": 5.6, - "carbs_g": 29.2, + "carbs_g": 29.6, "fat_g": 9.1, "fiber_g": 2.2, - "sodium_mg": 68.1, - "coverage": "partial", + "sodium_mg": 227.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -13454,13 +13862,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 428.2, - "protein_g": 17.2, - "carbs_g": 73.5, - "fat_g": 10.4, + "kcal": 442.6, + "protein_g": 17.7, + "carbs_g": 75.9, + "fat_g": 10.5, "fiber_g": 18.9, - "sodium_mg": 40.3, - "coverage": "partial", + "sodium_mg": 767.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -13864,13 +14272,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 276.7, - "protein_g": 26.6, - "carbs_g": 27.9, - "fat_g": 6.1, + "kcal": 363.1, + "protein_g": 32.7, + "carbs_g": 36.3, + "fat_g": 9.0, "fiber_g": 2.9, - "sodium_mg": 299.3, - "coverage": "partial", + "sodium_mg": 642.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -14075,12 +14483,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 417.2, - "protein_g": 31.8, - "carbs_g": 29.5, - "fat_g": 18.9, - "fiber_g": 2.0, - "sodium_mg": 183.8, + "kcal": 419.6, + "protein_g": 31.9, + "carbs_g": 30.0, + "fat_g": 19.0, + "fiber_g": 2.2, + "sodium_mg": 184.0, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -14470,13 +14878,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 790.1, - "protein_g": 54.2, - "carbs_g": 45.9, - "fat_g": 44.5, + "kcal": 811.7, + "protein_g": 55.7, + "carbs_g": 48.1, + "fat_g": 45.2, "fiber_g": 13.0, - "sodium_mg": 501.0, - "coverage": "partial", + "sodium_mg": 586.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -14897,13 +15305,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1255.2, - "protein_g": 17.3, - "carbs_g": 165.8, + "kcal": 1262.4, + "protein_g": 18.5, + "carbs_g": 166.5, "fat_g": 60.2, - "fiber_g": 12.3, - "sodium_mg": 1481.4, - "coverage": "partial", + "fiber_g": 12.4, + "sodium_mg": 2151.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -15311,12 +15719,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 406.6, - "protein_g": 28.6, - "carbs_g": 27.9, + "kcal": 408.9, + "protein_g": 28.7, + "carbs_g": 28.4, "fat_g": 20.0, - "fiber_g": 2.5, - "sodium_mg": 211.9, + "fiber_g": 2.7, + "sodium_mg": 212.1, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -15572,13 +15980,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 398.3, - "protein_g": 27.9, - "carbs_g": 46.4, - "fat_g": 11.6, + "kcal": 441.5, + "protein_g": 31.0, + "carbs_g": 50.6, + "fat_g": 13.0, "fiber_g": 4.2, - "sodium_mg": 310.0, - "coverage": "partial", + "sodium_mg": 481.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -16538,13 +16946,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1844.7, - "protein_g": 75.8, - "carbs_g": 326.0, - "fat_g": 27.3, + "kcal": 1866.3, + "protein_g": 76.6, + "carbs_g": 329.7, + "fat_g": 27.6, "fiber_g": 22.2, - "sodium_mg": 2269.3, - "coverage": "partial", + "sodium_mg": 3360.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -16704,13 +17112,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 280.9, + "kcal": 282.1, "protein_g": 16.8, - "carbs_g": 9.2, + "carbs_g": 9.5, "fat_g": 19.3, - "fiber_g": 0.5, - "sodium_mg": 233.2, - "coverage": "partial", + "fiber_g": 0.6, + "sodium_mg": 233.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -16880,13 +17288,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 236.0, - "protein_g": 6.0, - "carbs_g": 23.6, + "kcal": 237.2, + "protein_g": 6.1, + "carbs_g": 23.8, "fat_g": 14.7, - "fiber_g": 4.1, - "sodium_mg": 38.2, - "coverage": "partial", + "fiber_g": 4.2, + "sodium_mg": 38.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -17049,13 +17457,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 236.5, - "protein_g": 8.6, - "carbs_g": 36.4, - "fat_g": 6.8, - "fiber_g": 5.7, - "sodium_mg": 59.9, - "coverage": "partial", + "kcal": 662.7, + "protein_g": 25.2, + "carbs_g": 126.6, + "fat_g": 9.9, + "fiber_g": 19.2, + "sodium_mg": 62.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -17388,13 +17796,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 309.4, - "protein_g": 14.4, - "carbs_g": 45.7, + "kcal": 311.7, + "protein_g": 14.5, + "carbs_g": 46.2, "fat_g": 8.4, - "fiber_g": 7.8, - "sodium_mg": 111.5, - "coverage": "partial", + "fiber_g": 7.9, + "sodium_mg": 111.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -17776,13 +18184,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 412.6, + "kcal": 413.9, "protein_g": 18.0, - "carbs_g": 43.6, + "carbs_g": 43.9, "fat_g": 19.8, "fiber_g": 16.0, - "sodium_mg": 479.1, - "coverage": "partial", + "sodium_mg": 479.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -18178,13 +18586,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 368.7, - "protein_g": 26.1, - "carbs_g": 11.2, + "kcal": 371.0, + "protein_g": 26.2, + "carbs_g": 11.7, "fat_g": 25.1, - "fiber_g": 2.7, - "sodium_mg": 99.5, - "coverage": "partial", + "fiber_g": 2.8, + "sodium_mg": 99.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -18393,12 +18801,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1153.1, - "protein_g": 53.9, - "carbs_g": 170.8, + "kcal": 1155.5, + "protein_g": 54.0, + "carbs_g": 171.3, "fat_g": 32.2, - "fiber_g": 34.1, - "sodium_mg": 192.8, + "fiber_g": 34.2, + "sodium_mg": 193.0, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -19633,13 +20041,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 213.8, - "protein_g": 24.4, - "carbs_g": 4.0, - "fat_g": 10.5, + "kcal": 235.4, + "protein_g": 25.9, + "carbs_g": 6.1, + "fat_g": 11.3, "fiber_g": 0.9, - "sodium_mg": 89.9, - "coverage": "partial", + "sodium_mg": 175.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -19987,13 +20395,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 241.0, - "protein_g": 25.2, - "carbs_g": 11.5, - "fat_g": 10.8, + "kcal": 284.2, + "protein_g": 28.3, + "carbs_g": 15.8, + "fat_g": 12.2, "fiber_g": 2.7, - "sodium_mg": 92.2, - "coverage": "partial", + "sodium_mg": 263.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -21216,13 +21624,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1148.7, - "protein_g": 52.3, - "carbs_g": 163.4, - "fat_g": 36.1, + "kcal": 1155.9, + "protein_g": 52.6, + "carbs_g": 164.7, + "fat_g": 36.2, "fiber_g": 32.9, - "sodium_mg": 110.5, - "coverage": "partial", + "sodium_mg": 474.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -22458,13 +22866,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 505.0, - "protein_g": 34.1, - "carbs_g": 41.8, - "fat_g": 22.9, + "kcal": 548.2, + "protein_g": 37.1, + "carbs_g": 46.1, + "fat_g": 24.4, "fiber_g": 4.9, - "sodium_mg": 917.6, - "coverage": "partial", + "sodium_mg": 1089.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -22770,13 +23178,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 177.9, - "protein_g": 20.2, - "carbs_g": 11.9, - "fat_g": 5.0, + "kcal": 350.7, + "protein_g": 32.3, + "carbs_g": 28.8, + "fat_g": 10.8, "fiber_g": 0.9, - "sodium_mg": 619.5, - "coverage": "partial", + "sodium_mg": 1305.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -23470,13 +23878,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 462.7, - "protein_g": 22.5, - "carbs_g": 38.9, + "kcal": 472.3, + "protein_g": 24.1, + "carbs_g": 39.8, "fat_g": 23.5, - "fiber_g": 2.1, - "sodium_mg": 851.7, - "coverage": "partial", + "fiber_g": 2.2, + "sodium_mg": 1745.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -23682,12 +24090,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 431.0, - "protein_g": 31.1, - "carbs_g": 33.3, - "fat_g": 22.7, + "kcal": 441.8, + "protein_g": 31.5, + "carbs_g": 35.1, + "fat_g": 22.8, "fiber_g": 3.3, - "sodium_mg": 890.1, + "sodium_mg": 1435.5, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -24299,13 +24707,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 282.2, - "protein_g": 4.7, - "carbs_g": 36.2, - "fat_g": 14.7, + "kcal": 296.6, + "protein_g": 5.3, + "carbs_g": 38.6, + "fat_g": 14.8, "fiber_g": 8.3, - "sodium_mg": 1090.5, - "coverage": "partial", + "sodium_mg": 1817.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -25316,13 +25724,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 517.3, + "kcal": 519.7, "protein_g": 28.2, - "carbs_g": 40.6, + "carbs_g": 41.1, "fat_g": 27.9, - "fiber_g": 6.3, - "sodium_mg": 1131.9, - "coverage": "partial", + "fiber_g": 6.5, + "sodium_mg": 1132.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -25560,13 +25968,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 910.3, - "protein_g": 27.6, - "carbs_g": 89.5, - "fat_g": 52.7, - "fiber_g": 20.4, - "sodium_mg": 1635.7, - "coverage": "partial", + "kcal": 912.7, + "protein_g": 27.7, + "carbs_g": 90.0, + "fat_g": 52.8, + "fiber_g": 20.5, + "sodium_mg": 1635.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -26452,12 +26860,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 622.9, - "protein_g": 28.2, - "carbs_g": 53.1, + "kcal": 625.3, + "protein_g": 28.3, + "carbs_g": 53.6, "fat_g": 33.9, - "fiber_g": 9.6, - "sodium_mg": 1148.9, + "fiber_g": 9.8, + "sodium_mg": 1149.2, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -26819,13 +27227,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 375.6, - "protein_g": 7.6, - "carbs_g": 27.1, - "fat_g": 28.6, + "kcal": 397.2, + "protein_g": 8.4, + "carbs_g": 30.8, + "fat_g": 28.8, "fiber_g": 5.7, - "sodium_mg": 1181.6, - "coverage": "partial", + "sodium_mg": 2272.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -27690,12 +28098,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 394.3, - "protein_g": 38.8, - "carbs_g": 14.5, + "kcal": 396.6, + "protein_g": 38.9, + "carbs_g": 15.0, "fat_g": 20.1, - "fiber_g": 3.4, - "sodium_mg": 1014.1, + "fiber_g": 3.6, + "sodium_mg": 1014.3, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -28319,13 +28727,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 365.7, - "protein_g": 30.1, - "carbs_g": 12.9, - "fat_g": 22.2, + "kcal": 387.3, + "protein_g": 31.6, + "carbs_g": 15.0, + "fat_g": 22.9, "fiber_g": 3.1, - "sodium_mg": 1007.0, - "coverage": "partial", + "sodium_mg": 1092.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -29198,13 +29606,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 347.6, - "protein_g": 29.1, - "carbs_g": 32.1, - "fat_g": 11.2, + "kcal": 412.4, + "protein_g": 33.6, + "carbs_g": 38.4, + "fat_g": 13.4, "fiber_g": 4.9, - "sodium_mg": 1554.7, - "coverage": "partial", + "sodium_mg": 1812.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -29438,13 +29846,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 759.4, - "protein_g": 26.0, - "carbs_g": 55.7, - "fat_g": 53.2, - "fiber_g": 14.8, - "sodium_mg": 1298.6, - "coverage": "partial", + "kcal": 761.7, + "protein_g": 26.1, + "carbs_g": 56.2, + "fat_g": 53.3, + "fiber_g": 14.9, + "sodium_mg": 1298.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -30218,13 +30626,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 453.6, - "protein_g": 12.5, - "carbs_g": 39.1, - "fat_g": 29.3, + "kcal": 482.4, + "protein_g": 13.6, + "carbs_g": 44.0, + "fat_g": 29.6, "fiber_g": 5.3, - "sodium_mg": 1300.9, - "coverage": "partial", + "sodium_mg": 2755.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -30630,13 +31038,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1437.2, + "kcal": 1439.6, "protein_g": 64.8, - "carbs_g": 155.1, - "fat_g": 66.3, - "fiber_g": 30.0, - "sodium_mg": 1289.2, - "coverage": "partial", + "carbs_g": 155.6, + "fat_g": 66.4, + "fiber_g": 30.1, + "sodium_mg": 1289.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -31296,13 +31704,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 248.6, - "protein_g": 6.8, - "carbs_g": 37.8, - "fat_g": 8.3, + "kcal": 313.4, + "protein_g": 11.3, + "carbs_g": 44.1, + "fat_g": 10.4, "fiber_g": 4.2, - "sodium_mg": 1365.9, - "coverage": "partial", + "sodium_mg": 1623.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -31513,13 +31921,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 326.7, - "protein_g": 20.0, - "carbs_g": 37.2, - "fat_g": 10.8, + "kcal": 413.1, + "protein_g": 26.1, + "carbs_g": 45.6, + "fat_g": 13.7, "fiber_g": 7.0, - "sodium_mg": 1308.2, - "coverage": "partial", + "sodium_mg": 1651.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -31742,13 +32150,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 410.5, - "protein_g": 9.5, - "carbs_g": 44.3, - "fat_g": 21.9, + "kcal": 626.5, + "protein_g": 24.6, + "carbs_g": 65.5, + "fat_g": 29.1, "fiber_g": 5.5, - "sodium_mg": 1405.7, - "coverage": "partial", + "sodium_mg": 2263.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -33750,13 +34158,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 747.1, - "protein_g": 52.0, - "carbs_g": 64.1, - "fat_g": 32.0, - "fiber_g": 5.8, - "sodium_mg": 2012.4, - "coverage": "partial", + "kcal": 765.0, + "protein_g": 52.3, + "carbs_g": 68.8, + "fat_g": 32.1, + "fiber_g": 6.1, + "sodium_mg": 2014.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -34608,12 +35016,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 997.3, - "protein_g": 52.2, - "carbs_g": 123.9, + "kcal": 999.7, + "protein_g": 52.3, + "carbs_g": 124.4, "fat_g": 35.2, - "fiber_g": 25.0, - "sodium_mg": 1092.9, + "fiber_g": 25.1, + "sodium_mg": 1093.1, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -34803,13 +35211,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 162.5, - "protein_g": 1.1, - "carbs_g": 9.0, - "fat_g": 14.1, - "fiber_g": 1.8, - "sodium_mg": 895.7, - "coverage": "partial", + "kcal": 436.1, + "protein_g": 19.0, + "carbs_g": 57.9, + "fat_g": 15.3, + "fiber_g": 17.3, + "sodium_mg": 2351.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -35023,13 +35431,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 609.9, - "protein_g": 24.2, - "carbs_g": 67.9, - "fat_g": 28.8, + "kcal": 631.5, + "protein_g": 25.0, + "carbs_g": 71.6, + "fat_g": 29.1, "fiber_g": 16.2, - "sodium_mg": 1428.5, - "coverage": "partial", + "sodium_mg": 2519.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -35648,12 +36056,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 713.9, - "protein_g": 24.1, - "carbs_g": 84.8, + "kcal": 716.3, + "protein_g": 24.2, + "carbs_g": 85.3, "fat_g": 32.3, - "fiber_g": 20.8, - "sodium_mg": 1637.1, + "fiber_g": 21.0, + "sodium_mg": 1637.3, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -35851,13 +36259,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 466.0, - "protein_g": 22.2, - "carbs_g": 17.3, + "kcal": 467.3, + "protein_g": 22.3, + "carbs_g": 17.6, "fat_g": 36.1, - "fiber_g": 8.2, - "sodium_mg": 815.9, - "coverage": "partial", + "fiber_g": 8.3, + "sodium_mg": 816.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -36062,13 +36470,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 590.4, - "protein_g": 22.9, - "carbs_g": 71.7, - "fat_g": 27.4, + "kcal": 604.8, + "protein_g": 23.5, + "carbs_g": 74.2, + "fat_g": 27.5, "fiber_g": 27.4, - "sodium_mg": 955.1, - "coverage": "partial", + "sodium_mg": 1682.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -36282,13 +36690,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 831.3, - "protein_g": 66.5, - "carbs_g": 94.2, - "fat_g": 21.4, + "kcal": 960.9, + "protein_g": 75.5, + "carbs_g": 106.9, + "fat_g": 25.7, "fiber_g": 23.2, - "sodium_mg": 1075.6, - "coverage": "partial", + "sodium_mg": 1590.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -37072,13 +37480,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1105.9, - "protein_g": 75.2, - "carbs_g": 82.1, - "fat_g": 55.1, + "kcal": 1192.3, + "protein_g": 81.3, + "carbs_g": 90.6, + "fat_g": 58.0, "fiber_g": 16.3, - "sodium_mg": 1463.4, - "coverage": "partial", + "sodium_mg": 1806.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -37286,13 +37694,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1081.8, - "protein_g": 51.4, - "carbs_g": 162.0, - "fat_g": 29.4, + "kcal": 1103.4, + "protein_g": 52.2, + "carbs_g": 165.7, + "fat_g": 29.6, "fiber_g": 32.4, - "sodium_mg": 944.0, - "coverage": "partial", + "sodium_mg": 2034.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -37507,12 +37915,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1104.4, - "protein_g": 54.2, - "carbs_g": 163.6, - "fat_g": 30.8, + "kcal": 1126.0, + "protein_g": 55.0, + "carbs_g": 167.2, + "fat_g": 31.1, "fiber_g": 36.4, - "sodium_mg": 1006.3, + "sodium_mg": 2097.1, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -37868,13 +38276,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 627.1, - "protein_g": 49.8, - "carbs_g": 29.3, + "kcal": 639.1, + "protein_g": 51.9, + "carbs_g": 30.4, "fat_g": 37.4, - "fiber_g": 5.0, - "sodium_mg": 236.9, - "coverage": "partial", + "fiber_g": 5.2, + "sodium_mg": 1354.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -38298,13 +38706,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 798.2, - "protein_g": 56.9, - "carbs_g": 39.9, - "fat_g": 46.8, + "kcal": 906.2, + "protein_g": 64.5, + "carbs_g": 50.5, + "fat_g": 50.4, "fiber_g": 4.6, - "sodium_mg": 1763.3, - "coverage": "partial", + "sodium_mg": 2192.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -38504,13 +38912,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 768.8, - "protein_g": 54.2, - "carbs_g": 52.1, - "fat_g": 38.4, + "kcal": 833.6, + "protein_g": 58.7, + "carbs_g": 58.5, + "fat_g": 40.5, "fiber_g": 8.7, - "sodium_mg": 1307.2, - "coverage": "partial", + "sodium_mg": 1564.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -38712,13 +39120,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 1202.1, - "protein_g": 50.8, - "carbs_g": 176.1, - "fat_g": 35.9, + "kcal": 1223.7, + "protein_g": 51.6, + "carbs_g": 179.8, + "fat_g": 36.1, "fiber_g": 29.5, - "sodium_mg": 1265.4, - "coverage": "partial", + "sodium_mg": 2356.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -39300,13 +39708,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 358.1, - "protein_g": 12.7, - "carbs_g": 37.9, + "kcal": 362.9, + "protein_g": 13.5, + "carbs_g": 38.3, "fat_g": 22.0, - "fiber_g": 8.7, - "sodium_mg": 107.2, - "coverage": "partial", + "fiber_g": 8.8, + "sodium_mg": 554.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -39716,13 +40124,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 650.5, - "protein_g": 48.1, - "carbs_g": 29.5, - "fat_g": 38.7, + "kcal": 715.3, + "protein_g": 52.7, + "carbs_g": 35.9, + "fat_g": 40.8, "fiber_g": 5.6, - "sodium_mg": 729.9, - "coverage": "partial", + "sodium_mg": 987.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -40191,13 +40599,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 861.0, - "protein_g": 61.8, - "carbs_g": 72.9, - "fat_g": 38.6, + "kcal": 925.8, + "protein_g": 66.4, + "carbs_g": 79.2, + "fat_g": 40.8, "fiber_g": 26.1, - "sodium_mg": 1581.9, - "coverage": "partial", + "sodium_mg": 1839.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -40838,12 +41246,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 522.1, - "protein_g": 35.5, - "carbs_g": 25.9, + "kcal": 526.9, + "protein_g": 36.4, + "carbs_g": 26.3, "fat_g": 32.3, "fiber_g": 5.4, - "sodium_mg": 157.3, + "sodium_mg": 604.2, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -41451,13 +41859,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 585.2, - "protein_g": 25.6, - "carbs_g": 75.7, - "fat_g": 22.4, + "kcal": 714.8, + "protein_g": 34.6, + "carbs_g": 88.4, + "fat_g": 26.7, "fiber_g": 19.9, - "sodium_mg": 1481.2, - "coverage": "partial", + "sodium_mg": 1996.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -41643,13 +42051,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 348.9, - "protein_g": 26.2, - "carbs_g": 21.6, + "kcal": 353.7, + "protein_g": 27.0, + "carbs_g": 22.1, "fat_g": 16.9, - "fiber_g": 1.5, - "sodium_mg": 882.6, - "coverage": "partial", + "fiber_g": 1.6, + "sodium_mg": 1329.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -41856,13 +42264,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 446.6, - "protein_g": 49.8, - "carbs_g": 31.0, + "kcal": 453.8, + "protein_g": 51.1, + "carbs_g": 31.6, "fat_g": 15.6, - "fiber_g": 7.0, - "sodium_mg": 188.4, - "coverage": "partial", + "fiber_g": 7.1, + "sodium_mg": 858.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -42071,12 +42479,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 780.1, - "protein_g": 23.5, - "carbs_g": 114.5, + "kcal": 787.3, + "protein_g": 24.8, + "carbs_g": 115.2, "fat_g": 26.8, - "fiber_g": 6.9, - "sodium_mg": 618.7, + "fiber_g": 7.0, + "sodium_mg": 1289.1, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -42285,13 +42693,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 484.0, - "protein_g": 31.7, - "carbs_g": 49.7, - "fat_g": 18.6, + "kcal": 570.4, + "protein_g": 37.7, + "carbs_g": 58.2, + "fat_g": 21.4, "fiber_g": 8.9, - "sodium_mg": 996.9, - "coverage": "partial", + "sodium_mg": 1340.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -42682,13 +43090,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 963.1, - "protein_g": 42.7, - "carbs_g": 134.9, + "kcal": 972.7, + "protein_g": 44.4, + "carbs_g": 135.8, "fat_g": 32.8, - "fiber_g": 27.7, - "sodium_mg": 735.4, - "coverage": "partial", + "fiber_g": 27.8, + "sodium_mg": 1629.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -42884,13 +43292,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 402.4, - "protein_g": 12.8, - "carbs_g": 44.3, - "fat_g": 22.8, + "kcal": 416.8, + "protein_g": 13.4, + "carbs_g": 46.7, + "fat_g": 23.0, "fiber_g": 7.5, - "sodium_mg": 1007.4, - "coverage": "partial", + "sodium_mg": 1734.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -44939,13 +45347,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 882.2, - "protein_g": 55.9, - "carbs_g": 60.3, - "fat_g": 47.8, + "kcal": 947.0, + "protein_g": 60.5, + "carbs_g": 66.6, + "fat_g": 49.9, "fiber_g": 9.6, - "sodium_mg": 1099.4, - "coverage": "partial", + "sodium_mg": 1356.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -47590,13 +47998,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 564.6, - "protein_g": 43.0, - "carbs_g": 14.5, - "fat_g": 37.6, + "kcal": 607.8, + "protein_g": 46.0, + "carbs_g": 18.7, + "fat_g": 39.1, "fiber_g": 3.8, - "sodium_mg": 740.4, - "coverage": "partial", + "sodium_mg": 912.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -48361,13 +48769,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 170.0, - "protein_g": 5.9, - "carbs_g": 34.7, - "fat_g": 0.9, + "kcal": 213.2, + "protein_g": 9.0, + "carbs_g": 38.9, + "fat_g": 2.4, "fiber_g": 3.6, - "sodium_mg": 219.7, - "coverage": "partial", + "sodium_mg": 391.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -49222,13 +49630,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 553.6, - "protein_g": 34.5, - "carbs_g": 61.6, - "fat_g": 17.8, + "kcal": 685.0, + "protein_g": 43.6, + "carbs_g": 75.3, + "fat_g": 22.1, "fiber_g": 5.4, - "sodium_mg": 228.8, - "coverage": "partial", + "sodium_mg": 1104.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -49370,13 +49778,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 626.6, - "protein_g": 27.3, - "carbs_g": 96.7, - "fat_g": 16.7, + "kcal": 648.2, + "protein_g": 28.1, + "carbs_g": 100.4, + "fat_g": 17.0, "fiber_g": 16.0, - "sodium_mg": 21.7, - "coverage": "partial", + "sodium_mg": 1112.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -49846,13 +50254,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 667.5, - "protein_g": 23.0, - "carbs_g": 62.3, - "fat_g": 37.8, + "kcal": 681.9, + "protein_g": 23.5, + "carbs_g": 64.8, + "fat_g": 38.0, "fiber_g": 15.7, - "sodium_mg": 536.4, - "coverage": "partial", + "sodium_mg": 1263.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -50133,13 +50541,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 162.4, - "protein_g": 9.5, - "carbs_g": 15.0, - "fat_g": 7.8, - "fiber_g": 3.4, - "sodium_mg": 397.3, - "coverage": "partial", + "kcal": 319.4, + "protein_g": 15.3, + "carbs_g": 45.7, + "fat_g": 8.7, + "fiber_g": 5.2, + "sodium_mg": 629.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -50296,13 +50704,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 284.2, - "protein_g": 25.7, - "carbs_g": 8.4, - "fat_g": 17.2, - "fiber_g": 1.9, - "sodium_mg": 425.8, - "coverage": "partial", + "kcal": 289.8, + "protein_g": 25.9, + "carbs_g": 9.6, + "fat_g": 17.3, + "fiber_g": 2.2, + "sodium_mg": 426.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -51169,12 +51577,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 54.6, - "protein_g": 6.5, - "carbs_g": 4.5, + "kcal": 57.9, + "protein_g": 6.6, + "carbs_g": 5.2, "fat_g": 1.4, - "fiber_g": 0.4, - "sodium_mg": 21.9, + "fiber_g": 0.5, + "sodium_mg": 22.2, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -51336,12 +51744,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 316.0, + "kcal": 317.7, "protein_g": 29.1, - "carbs_g": 25.7, + "carbs_g": 26.1, "fat_g": 10.0, "fiber_g": 1.9, - "sodium_mg": 344.0, + "sodium_mg": 344.1, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -51482,12 +51890,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 230.5, - "protein_g": 6.9, - "carbs_g": 16.2, + "kcal": 232.2, + "protein_g": 7.0, + "carbs_g": 16.6, "fat_g": 17.3, - "fiber_g": 0.0, - "sodium_mg": 85.2, + "fiber_g": 0.1, + "sodium_mg": 85.4, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -51637,12 +52045,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 357.8, - "protein_g": 6.5, - "carbs_g": 37.6, + "kcal": 360.1, + "protein_g": 6.6, + "carbs_g": 38.1, "fat_g": 21.8, - "fiber_g": 6.7, - "sodium_mg": 56.9, + "fiber_g": 6.8, + "sodium_mg": 57.1, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -51789,13 +52197,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 432.0, - "protein_g": 4.7, - "carbs_g": 15.2, - "fat_g": 43.1, - "fiber_g": 5.1, - "sodium_mg": 28.6, - "coverage": "partial", + "kcal": 442.1, + "protein_g": 5.0, + "carbs_g": 17.3, + "fat_g": 43.2, + "fiber_g": 5.5, + "sodium_mg": 29.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -51943,13 +52351,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 214.2, - "protein_g": 20.6, - "carbs_g": 24.9, - "fat_g": 2.9, + "kcal": 387.0, + "protein_g": 32.7, + "carbs_g": 41.9, + "fat_g": 8.6, "fiber_g": 1.4, - "sodium_mg": 933.7, - "coverage": "partial", + "sodium_mg": 1620.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -52816,13 +53224,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 58.0, - "protein_g": 4.3, - "carbs_g": 7.8, - "fat_g": 1.7, - "fiber_g": 1.6, - "sodium_mg": 75.6, - "coverage": "partial", + "kcal": 229.4, + "protein_g": 10.6, + "carbs_g": 41.0, + "fat_g": 2.8, + "fiber_g": 3.4, + "sodium_mg": 1034.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -53528,13 +53936,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 375.3, - "protein_g": 25.1, - "carbs_g": 66.1, - "fat_g": 3.3, - "fiber_g": 13.9, - "sodium_mg": 43.4, - "coverage": "partial", + "kcal": 377.6, + "protein_g": 25.2, + "carbs_g": 66.6, + "fat_g": 3.4, + "fiber_g": 14.0, + "sodium_mg": 43.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -53930,13 +54338,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 49.7, - "protein_g": 1.1, - "carbs_g": 10.9, - "fat_g": 0.1, + "kcal": 222.5, + "protein_g": 13.2, + "carbs_g": 27.8, + "fat_g": 5.9, "fiber_g": 0.8, - "sodium_mg": 106.8, - "coverage": "partial", + "sodium_mg": 793.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -54457,13 +54865,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 388.4, - "protein_g": 35.5, - "carbs_g": 35.0, - "fat_g": 12.1, + "kcal": 431.6, + "protein_g": 38.5, + "carbs_g": 39.2, + "fat_g": 13.5, "fiber_g": 9.2, - "sodium_mg": 354.5, - "coverage": "partial", + "sodium_mg": 526.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -55434,12 +55842,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 441.5, - "protein_g": 23.9, - "carbs_g": 42.3, + "kcal": 444.9, + "protein_g": 24.0, + "carbs_g": 43.0, "fat_g": 19.3, - "fiber_g": 5.6, - "sodium_mg": 230.4, + "fiber_g": 5.7, + "sodium_mg": 230.7, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -55575,13 +55983,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 308.8, - "protein_g": 15.1, - "carbs_g": 9.3, + "kcal": 311.1, + "protein_g": 15.2, + "carbs_g": 9.8, "fat_g": 24.4, - "fiber_g": 2.9, - "sodium_mg": 157.5, - "coverage": "partial", + "fiber_g": 3.0, + "sodium_mg": 157.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -56907,13 +57315,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 220.1, - "protein_g": 21.2, - "carbs_g": 27.3, - "fat_g": 4.1, + "kcal": 392.9, + "protein_g": 33.3, + "carbs_g": 44.2, + "fat_g": 9.8, "fiber_g": 4.9, - "sodium_mg": 87.1, - "coverage": "partial", + "sodium_mg": 773.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -58069,13 +58477,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 361.1, - "protein_g": 17.5, - "carbs_g": 54.6, - "fat_g": 9.5, + "kcal": 382.7, + "protein_g": 18.3, + "carbs_g": 58.2, + "fat_g": 9.8, "fiber_g": 12.1, - "sodium_mg": 411.8, - "coverage": "partial", + "sodium_mg": 1502.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -58636,12 +59044,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 274.8, - "protein_g": 27.2, - "carbs_g": 3.7, + "kcal": 278.2, + "protein_g": 27.3, + "carbs_g": 4.4, "fat_g": 17.4, - "fiber_g": 0.8, - "sodium_mg": 429.6, + "fiber_g": 1.0, + "sodium_mg": 429.8, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -58777,12 +59185,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 953.2, - "protein_g": 50.7, - "carbs_g": 161.1, - "fat_g": 14.9, - "fiber_g": 31.7, - "sodium_mg": 64.6, + "kcal": 956.5, + "protein_g": 50.8, + "carbs_g": 161.8, + "fat_g": 15.0, + "fiber_g": 31.8, + "sodium_mg": 64.9, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -59051,13 +59459,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 309.3, - "protein_g": 16.0, - "carbs_g": 59.8, - "fat_g": 1.3, - "fiber_g": 9.4, - "sodium_mg": 115.2, - "coverage": "partial", + "kcal": 311.6, + "protein_g": 16.1, + "carbs_g": 60.3, + "fat_g": 1.4, + "fiber_g": 9.6, + "sodium_mg": 115.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -59590,13 +59998,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 364.8, - "protein_g": 23.5, - "carbs_g": 66.1, - "fat_g": 2.4, + "kcal": 393.6, + "protein_g": 24.6, + "carbs_g": 71.0, + "fat_g": 2.8, "fiber_g": 12.0, - "sodium_mg": 29.6, - "coverage": "partial", + "sodium_mg": 1484.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -60369,13 +60777,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 88.7, - "protein_g": 6.4, - "carbs_g": 4.5, - "fat_g": 4.8, + "kcal": 218.3, + "protein_g": 15.5, + "carbs_g": 17.2, + "fat_g": 9.1, "fiber_g": 0.2, - "sodium_mg": 72.3, - "coverage": "partial", + "sodium_mg": 587.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -60632,13 +61040,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 397.0, - "protein_g": 31.9, - "carbs_g": 18.4, - "fat_g": 21.2, + "kcal": 440.2, + "protein_g": 34.9, + "carbs_g": 22.7, + "fat_g": 22.6, "fiber_g": 2.6, - "sodium_mg": 742.7, - "coverage": "partial", + "sodium_mg": 914.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -60902,13 +61310,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 170.2, - "protein_g": 19.7, - "carbs_g": 15.4, - "fat_g": 2.8, + "kcal": 343.0, + "protein_g": 31.8, + "carbs_g": 32.4, + "fat_g": 8.6, "fiber_g": 2.1, - "sodium_mg": 211.8, - "coverage": "partial", + "sodium_mg": 898.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -62023,13 +62431,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 210.0, - "protein_g": 23.6, - "carbs_g": 22.2, - "fat_g": 3.1, - "fiber_g": 3.2, - "sodium_mg": 923.5, - "coverage": "partial", + "kcal": 213.4, + "protein_g": 23.7, + "carbs_g": 22.9, + "fat_g": 3.2, + "fiber_g": 3.3, + "sodium_mg": 923.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -62308,13 +62716,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 379.2, - "protein_g": 30.2, - "carbs_g": 26.3, + "kcal": 382.6, + "protein_g": 30.3, + "carbs_g": 27.0, "fat_g": 20.4, - "fiber_g": 2.7, - "sodium_mg": 835.4, - "coverage": "partial", + "fiber_g": 2.8, + "sodium_mg": 835.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -62452,12 +62860,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 227.1, - "protein_g": 20.0, - "carbs_g": 5.7, - "fat_g": 13.8, - "fiber_g": 1.4, - "sodium_mg": 78.3, + "kcal": 230.5, + "protein_g": 20.1, + "carbs_g": 6.4, + "fat_g": 13.9, + "fiber_g": 1.6, + "sodium_mg": 78.6, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -62577,13 +62985,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 416.0, + "kcal": 418.3, "protein_g": 24.3, - "carbs_g": 62.7, - "fat_g": 9.3, - "fiber_g": 11.6, - "sodium_mg": 34.8, - "coverage": "partial", + "carbs_g": 63.2, + "fat_g": 9.4, + "fiber_g": 11.8, + "sodium_mg": 35.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -63273,13 +63681,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 389.9, - "protein_g": 29.1, - "carbs_g": 29.8, - "fat_g": 17.2, + "kcal": 476.3, + "protein_g": 35.1, + "carbs_g": 38.2, + "fat_g": 20.1, "fiber_g": 3.9, - "sodium_mg": 635.3, - "coverage": "partial", + "sodium_mg": 978.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -64395,13 +64803,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 233.0, - "protein_g": 22.0, - "carbs_g": 28.4, - "fat_g": 4.3, + "kcal": 362.6, + "protein_g": 31.0, + "carbs_g": 41.1, + "fat_g": 8.7, "fiber_g": 5.2, - "sodium_mg": 91.2, - "coverage": "partial", + "sodium_mg": 606.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -66241,13 +66649,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 304.4, - "protein_g": 21.6, - "carbs_g": 45.4, - "fat_g": 3.0, - "fiber_g": 1.9, - "sodium_mg": 540.5, - "coverage": "partial", + "kcal": 480.6, + "protein_g": 33.7, + "carbs_g": 63.0, + "fat_g": 8.8, + "fiber_g": 2.0, + "sodium_mg": 1227.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -66536,12 +66944,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 578.8, - "protein_g": 43.7, - "carbs_g": 80.4, - "fat_g": 10.2, - "fiber_g": 16.1, - "sodium_mg": 99.0, + "kcal": 582.1, + "protein_g": 43.8, + "carbs_g": 81.1, + "fat_g": 10.3, + "fiber_g": 16.2, + "sodium_mg": 99.3, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -67759,13 +68167,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 423.7, - "protein_g": 29.3, - "carbs_g": 40.9, - "fat_g": 17.2, + "kcal": 553.3, + "protein_g": 38.4, + "carbs_g": 53.6, + "fat_g": 21.6, "fiber_g": 7.0, - "sodium_mg": 479.8, - "coverage": "partial", + "sodium_mg": 994.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -68010,13 +68418,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 25.3, - "protein_g": 1.2, - "carbs_g": 5.1, + "kcal": 27.7, + "protein_g": 1.3, + "carbs_g": 5.6, "fat_g": 0.5, - "fiber_g": 1.5, - "sodium_mg": 7.7, - "coverage": "partial", + "fiber_g": 1.7, + "sodium_mg": 7.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -69410,13 +69818,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 228.5, - "protein_g": 21.4, - "carbs_g": 30.4, - "fat_g": 4.1, + "kcal": 401.3, + "protein_g": 33.5, + "carbs_g": 47.3, + "fat_g": 9.9, "fiber_g": 5.6, - "sodium_mg": 87.7, - "coverage": "partial", + "sodium_mg": 774.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -69954,13 +70362,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 301.8, - "protein_g": 24.1, - "carbs_g": 19.0, - "fat_g": 13.9, + "kcal": 474.6, + "protein_g": 36.2, + "carbs_g": 35.9, + "fat_g": 19.6, "fiber_g": 2.0, - "sodium_mg": 258.6, - "coverage": "partial", + "sodium_mg": 945.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -70233,13 +70641,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 72.5, - "protein_g": 6.3, - "carbs_g": 0.6, - "fat_g": 4.8, + "kcal": 203.7, + "protein_g": 15.5, + "carbs_g": 13.6, + "fat_g": 9.1, "fiber_g": 0.1, - "sodium_mg": 71.5, - "coverage": "partial", + "sodium_mg": 586.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -70755,13 +71163,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 59.4, - "protein_g": 3.5, - "carbs_g": 11.8, + "kcal": 61.7, + "protein_g": 3.6, + "carbs_g": 12.3, "fat_g": 0.5, - "fiber_g": 4.8, - "sodium_mg": 22.4, - "coverage": "partial", + "fiber_g": 5.0, + "sodium_mg": 22.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -72021,13 +72429,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 93.2, - "protein_g": 12.4, - "carbs_g": 5.3, + "kcal": 97.9, + "protein_g": 12.5, + "carbs_g": 6.3, "fat_g": 2.6, - "fiber_g": 0.1, - "sodium_mg": 43.3, - "coverage": "partial", + "fiber_g": 0.4, + "sodium_mg": 43.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -72835,13 +73243,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 203.2, + "kcal": 206.5, "protein_g": 23.0, - "carbs_g": 21.0, + "carbs_g": 21.7, "fat_g": 3.1, - "fiber_g": 3.1, - "sodium_mg": 699.6, - "coverage": "partial", + "fiber_g": 3.2, + "sodium_mg": 699.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -73103,12 +73511,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 305.8, + "kcal": 309.1, "protein_g": 21.0, - "carbs_g": 17.9, + "carbs_g": 18.6, "fat_g": 17.1, - "fiber_g": 2.0, - "sodium_mg": 232.0, + "fiber_g": 2.2, + "sodium_mg": 232.3, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -74765,13 +75173,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 298.3, - "protein_g": 16.6, - "carbs_g": 44.2, - "fat_g": 6.0, + "kcal": 329.0, + "protein_g": 21.8, + "carbs_g": 45.3, + "fat_g": 6.4, "fiber_g": 3.2, - "sodium_mg": 984.8, - "coverage": "partial", + "sodium_mg": 999.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -77013,13 +77421,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 952.2, - "protein_g": 39.7, - "carbs_g": 112.7, + "kcal": 954.9, + "protein_g": 39.8, + "carbs_g": 113.3, "fat_g": 41.4, "fiber_g": 14.4, - "sodium_mg": 2101.9, - "coverage": "partial", + "sodium_mg": 2247.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -77283,12 +77691,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 81.7, - "protein_g": 7.6, - "carbs_g": 3.4, - "fat_g": 5.0, - "fiber_g": 0.6, - "sodium_mg": 599.5, + "kcal": 227.8, + "protein_g": 12.4, + "carbs_g": 30.1, + "fat_g": 7.2, + "fiber_g": 1.9, + "sodium_mg": 851.2, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -77986,13 +78394,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 317.4, - "protein_g": 22.4, - "carbs_g": 14.6, - "fat_g": 21.3, - "fiber_g": 1.4, - "sodium_mg": 601.1, - "coverage": "partial", + "kcal": 326.4, + "protein_g": 22.7, + "carbs_g": 16.7, + "fat_g": 21.4, + "fiber_g": 2.2, + "sodium_mg": 611.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -78984,12 +79392,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 297.2, - "protein_g": 32.8, - "carbs_g": 10.8, - "fat_g": 13.9, - "fiber_g": 1.9, - "sodium_mg": 587.0, + "kcal": 303.6, + "protein_g": 33.1, + "carbs_g": 12.2, + "fat_g": 14.0, + "fiber_g": 2.5, + "sodium_mg": 588.8, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -79502,13 +79910,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 367.9, + "kcal": 370.0, "protein_g": 40.5, - "carbs_g": 12.9, + "carbs_g": 13.3, "fat_g": 18.0, "fiber_g": 2.7, - "sodium_mg": 1163.9, - "coverage": "partial", + "sodium_mg": 1273.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -79959,12 +80367,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 267.6, - "protein_g": 32.1, - "carbs_g": 7.5, - "fat_g": 11.4, - "fiber_g": 0.1, - "sodium_mg": 479.7, + "kcal": 288.8, + "protein_g": 32.4, + "carbs_g": 11.8, + "fat_g": 11.8, + "fiber_g": 0.4, + "sodium_mg": 634.8, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -80885,12 +81293,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 406.6, - "protein_g": 35.3, - "carbs_g": 14.7, - "fat_g": 23.0, - "fiber_g": 0.7, - "sodium_mg": 1248.0, + "kcal": 411.5, + "protein_g": 35.4, + "carbs_g": 15.8, + "fat_g": 23.1, + "fiber_g": 1.1, + "sodium_mg": 1249.4, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -81034,13 +81442,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 460.3, - "protein_g": 47.0, - "carbs_g": 3.1, - "fat_g": 27.7, - "fiber_g": 0.6, - "sodium_mg": 949.2, - "coverage": "partial", + "kcal": 465.7, + "protein_g": 47.2, + "carbs_g": 4.2, + "fat_g": 27.8, + "fiber_g": 1.1, + "sodium_mg": 950.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -81582,13 +81990,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 96.9, - "protein_g": 2.8, - "carbs_g": 13.0, - "fat_g": 5.1, - "fiber_g": 1.7, + "kcal": 151.8, + "protein_g": 3.7, + "carbs_g": 25.0, + "fat_g": 5.3, + "fiber_g": 2.0, "sodium_mg": 293.2, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -81939,13 +82347,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 328.1, - "protein_g": 23.0, - "carbs_g": 39.3, - "fat_g": 8.7, - "fiber_g": 2.9, - "sodium_mg": 1581.4, - "coverage": "partial", + "kcal": 355.0, + "protein_g": 23.3, + "carbs_g": 46.3, + "fat_g": 8.8, + "fiber_g": 3.5, + "sodium_mg": 1584.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -82469,12 +82877,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 405.0, + "kcal": 407.7, "protein_g": 33.8, - "carbs_g": 35.7, + "carbs_g": 36.2, "fat_g": 13.9, - "fiber_g": 2.0, - "sodium_mg": 906.8, + "fiber_g": 2.1, + "sodium_mg": 1052.6, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -82842,12 +83250,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 475.0, - "protein_g": 9.4, - "carbs_g": 52.2, - "fat_g": 28.0, - "fiber_g": 7.2, - "sodium_mg": 864.4, + "kcal": 489.3, + "protein_g": 9.6, + "carbs_g": 55.9, + "fat_g": 28.1, + "fiber_g": 7.5, + "sodium_mg": 866.1, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -83027,12 +83435,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 408.3, - "protein_g": 25.8, - "carbs_g": 42.9, - "fat_g": 17.1, - "fiber_g": 3.0, - "sodium_mg": 810.2, + "kcal": 420.0, + "protein_g": 26.0, + "carbs_g": 45.3, + "fat_g": 17.2, + "fiber_g": 3.2, + "sodium_mg": 896.3, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -83894,13 +84302,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 372.9, - "protein_g": 33.9, - "carbs_g": 46.7, - "fat_g": 4.7, - "fiber_g": 3.2, - "sodium_mg": 1139.0, - "coverage": "partial", + "kcal": 384.6, + "protein_g": 34.0, + "carbs_g": 49.1, + "fat_g": 4.9, + "fiber_g": 3.3, + "sodium_mg": 1225.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -84036,13 +84444,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 192.7, - "protein_g": 3.4, - "carbs_g": 15.7, - "fat_g": 15.1, + "kcal": 206.2, + "protein_g": 3.9, + "carbs_g": 18.0, + "fat_g": 15.2, "fiber_g": 3.5, - "sodium_mg": 12.7, - "coverage": "partial", + "sodium_mg": 694.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -84220,13 +84628,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 498.8, - "protein_g": 38.3, - "carbs_g": 7.5, + "kcal": 501.2, + "protein_g": 38.4, + "carbs_g": 8.0, "fat_g": 36.6, - "fiber_g": 3.0, - "sodium_mg": 940.5, - "coverage": "partial", + "fiber_g": 3.2, + "sodium_mg": 940.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -84395,12 +84803,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 28.2, + "kcal": 98.4, "protein_g": 1.4, - "carbs_g": 6.2, + "carbs_g": 23.4, "fat_g": 0.1, - "fiber_g": 2.0, - "sodium_mg": 252.5, + "fiber_g": 2.1, + "sodium_mg": 254.5, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -86023,13 +86431,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 193.5, - "protein_g": 17.2, - "carbs_g": 8.9, - "fat_g": 10.9, - "fiber_g": 2.7, - "sodium_mg": 1416.7, - "coverage": "partial", + "kcal": 440.6, + "protein_g": 21.3, + "carbs_g": 63.0, + "fat_g": 11.9, + "fiber_g": 4.6, + "sodium_mg": 1417.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -86581,13 +86989,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 493.7, - "protein_g": 25.4, - "carbs_g": 45.7, + "kcal": 497.6, + "protein_g": 25.5, + "carbs_g": 46.5, "fat_g": 23.8, - "fiber_g": 3.9, - "sodium_mg": 1346.9, - "coverage": "partial", + "fiber_g": 4.2, + "sodium_mg": 1347.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -87166,13 +87574,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 188.8, - "protein_g": 10.5, - "carbs_g": 1.5, - "fat_g": 15.4, - "fiber_g": 0.3, - "sodium_mg": 607.0, - "coverage": "partial", + "kcal": 460.8, + "protein_g": 21.2, + "carbs_g": 53.4, + "fat_g": 17.8, + "fiber_g": 2.5, + "sodium_mg": 1209.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -87683,13 +88091,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 811.1, - "protein_g": 42.9, - "carbs_g": 77.1, - "fat_g": 36.8, - "fiber_g": 2.7, - "sodium_mg": 587.0, - "coverage": "partial", + "kcal": 822.6, + "protein_g": 43.4, + "carbs_g": 79.6, + "fat_g": 37.2, + "fiber_g": 3.7, + "sodium_mg": 588.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -87833,13 +88241,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 309.4, - "protein_g": 14.2, - "carbs_g": 40.7, + "kcal": 310.7, + "protein_g": 14.3, + "carbs_g": 41.1, "fat_g": 11.2, - "fiber_g": 7.9, + "fiber_g": 8.0, "sodium_mg": 16.7, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -88157,13 +88565,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 308.6, - "protein_g": 36.7, - "carbs_g": 8.7, - "fat_g": 13.4, - "fiber_g": 0.4, - "sodium_mg": 150.6, - "coverage": "partial", + "kcal": 314.7, + "protein_g": 36.9, + "carbs_g": 10.1, + "fat_g": 13.6, + "fiber_g": 1.0, + "sodium_mg": 151.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -88482,13 +88890,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 142.7, + "kcal": 143.7, "protein_g": 6.0, - "carbs_g": 19.6, + "carbs_g": 19.9, "fat_g": 6.4, - "fiber_g": 1.8, + "fiber_g": 1.9, "sodium_mg": 34.5, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -88653,13 +89061,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 231.7, + "kcal": 233.8, "protein_g": 6.1, - "carbs_g": 34.7, + "carbs_g": 35.3, "fat_g": 9.2, - "fiber_g": 6.4, - "sodium_mg": 19.9, - "coverage": "partial", + "fiber_g": 6.5, + "sodium_mg": 20.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -88801,13 +89209,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 139.8, - "protein_g": 3.1, - "carbs_g": 10.9, + "kcal": 141.3, + "protein_g": 3.2, + "carbs_g": 11.4, "fat_g": 10.5, "fiber_g": 4.8, - "sodium_mg": 5.3, - "coverage": "partial", + "sodium_mg": 5.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -88928,13 +89336,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 708.8, + "kcal": 710.5, "protein_g": 64.2, - "carbs_g": 2.0, + "carbs_g": 2.5, "fat_g": 47.5, "fiber_g": 0.6, - "sodium_mg": 904.7, - "coverage": "partial", + "sodium_mg": 904.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -89268,13 +89676,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 334.3, - "protein_g": 17.0, - "carbs_g": 20.8, - "fat_g": 21.6, - "fiber_g": 5.1, - "sodium_mg": 373.2, - "coverage": "partial", + "kcal": 339.0, + "protein_g": 17.2, + "carbs_g": 21.7, + "fat_g": 21.8, + "fiber_g": 5.6, + "sodium_mg": 374.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -89455,12 +89863,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 146.9, + "kcal": 148.8, "protein_g": 2.3, - "carbs_g": 10.9, + "carbs_g": 11.5, "fat_g": 11.2, "fiber_g": 2.2, - "sodium_mg": 61.6, + "sodium_mg": 61.7, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -89573,9 +89981,9 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 82.5, + "kcal": 83.4, "protein_g": 0.0, - "carbs_g": 0.0, + "carbs_g": 0.3, "fat_g": 9.3, "fiber_g": 0.0, "sodium_mg": 0.2, @@ -89897,13 +90305,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 257.3, + "kcal": 258.8, "protein_g": 5.6, - "carbs_g": 38.5, + "carbs_g": 39.0, "fat_g": 10.0, "fiber_g": 6.0, - "sodium_mg": 8.7, - "coverage": "partial", + "sodium_mg": 8.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -90193,13 +90601,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 443.8, + "kcal": 444.4, "protein_g": 15.8, - "carbs_g": 60.5, + "carbs_g": 60.7, "fat_g": 15.0, "fiber_g": 2.5, "sodium_mg": 404.5, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -91209,13 +91617,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 191.1, + "kcal": 192.0, "protein_g": 10.9, - "carbs_g": 34.5, + "carbs_g": 34.7, "fat_g": 2.6, - "fiber_g": 5.5, + "fiber_g": 5.6, "sodium_mg": 64.1, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -91356,13 +91764,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 203.4, + "kcal": 204.0, "protein_g": 8.3, - "carbs_g": 20.6, - "fat_g": 10.2, + "carbs_g": 20.8, + "fat_g": 10.3, "fiber_g": 3.2, "sodium_mg": 340.7, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -91522,13 +91930,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 431.4, - "protein_g": 21.0, - "carbs_g": 19.6, - "fat_g": 29.7, - "fiber_g": 1.2, - "sodium_mg": 646.7, - "coverage": "partial", + "kcal": 439.0, + "protein_g": 21.3, + "carbs_g": 21.3, + "fat_g": 30.0, + "fiber_g": 2.0, + "sodium_mg": 648.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -91696,13 +92104,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 580.0, - "protein_g": 27.4, - "carbs_g": 103.7, - "fat_g": 7.8, - "fiber_g": 17.1, - "sodium_mg": 320.2, - "coverage": "partial", + "kcal": 585.7, + "protein_g": 27.7, + "carbs_g": 104.8, + "fat_g": 8.0, + "fiber_g": 17.8, + "sodium_mg": 321.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -92001,12 +92409,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 79.9, - "protein_g": 5.3, - "carbs_g": 9.0, - "fat_g": 3.2, - "fiber_g": 2.5, - "sodium_mg": 49.6, + "kcal": 84.1, + "protein_g": 5.5, + "carbs_g": 9.8, + "fat_g": 3.4, + "fiber_g": 3.0, + "sodium_mg": 50.7, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -92172,13 +92580,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 131.6, - "protein_g": 2.5, - "carbs_g": 12.5, - "fat_g": 9.1, - "fiber_g": 5.1, - "sodium_mg": 11.4, - "coverage": "partial", + "kcal": 134.9, + "protein_g": 2.7, + "carbs_g": 13.2, + "fat_g": 9.3, + "fiber_g": 5.5, + "sodium_mg": 12.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -92329,13 +92737,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 334.5, - "protein_g": 13.2, - "carbs_g": 48.5, + "kcal": 335.7, + "protein_g": 13.3, + "carbs_g": 48.9, "fat_g": 12.2, "fiber_g": 9.3, - "sodium_mg": 297.9, - "coverage": "partial", + "sodium_mg": 298.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -92473,13 +92881,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 168.9, - "protein_g": 6.4, - "carbs_g": 14.9, - "fat_g": 11.4, - "fiber_g": 5.8, - "sodium_mg": 22.0, - "coverage": "partial", + "kcal": 172.4, + "protein_g": 6.5, + "carbs_g": 15.6, + "fat_g": 11.5, + "fiber_g": 6.2, + "sodium_mg": 22.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -93022,10 +93430,10 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 36.4, + "kcal": 108.8, "protein_g": 2.0, "carbs_g": 7.6, - "fat_g": 0.5, + "fat_g": 8.7, "fiber_g": 2.6, "sodium_mg": 25.9, "coverage": "partial", @@ -93179,13 +93587,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 221.5, - "protein_g": 4.4, - "carbs_g": 43.9, - "fat_g": 5.7, - "fiber_g": 3.0, - "sodium_mg": 27.9, - "coverage": "partial", + "kcal": 223.9, + "protein_g": 4.5, + "carbs_g": 44.3, + "fat_g": 5.8, + "fiber_g": 3.2, + "sodium_mg": 28.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -93348,13 +93756,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 344.3, - "protein_g": 6.2, - "carbs_g": 45.2, - "fat_g": 16.7, - "fiber_g": 4.9, - "sodium_mg": 577.4, - "coverage": "partial", + "kcal": 355.3, + "protein_g": 6.7, + "carbs_g": 47.3, + "fat_g": 17.2, + "fiber_g": 6.1, + "sodium_mg": 579.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -93507,13 +93915,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 240.1, - "protein_g": 4.9, - "carbs_g": 52.4, - "fat_g": 0.5, - "fiber_g": 1.4, - "sodium_mg": 4.2, - "coverage": "partial", + "kcal": 306.5, + "protein_g": 7.8, + "carbs_g": 60.1, + "fat_g": 3.3, + "fiber_g": 3.8, + "sodium_mg": 92.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -93816,13 +94224,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 198.4, + "kcal": 258.1, "protein_g": 3.6, "carbs_g": 46.1, - "fat_g": 0.6, + "fat_g": 7.4, "fiber_g": 7.8, "sodium_mg": 35.6, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -93968,13 +94376,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 278.6, + "kcal": 280.6, "protein_g": 6.9, - "carbs_g": 39.4, - "fat_g": 9.9, + "carbs_g": 39.6, + "fat_g": 10.0, "fiber_g": 1.6, "sodium_mg": 71.6, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -94118,13 +94526,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 357.6, + "kcal": 359.3, "protein_g": 5.1, - "carbs_g": 51.5, + "carbs_g": 52.0, "fat_g": 15.7, - "fiber_g": 5.3, - "sodium_mg": 625.0, - "coverage": "partial", + "fiber_g": 5.4, + "sodium_mg": 625.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -94313,12 +94721,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 351.5, - "protein_g": 32.7, - "carbs_g": 7.6, - "fat_g": 21.7, - "fiber_g": 1.6, - "sodium_mg": 898.7, + "kcal": 356.8, + "protein_g": 32.8, + "carbs_g": 9.0, + "fat_g": 21.9, + "fiber_g": 2.0, + "sodium_mg": 900.3, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -94662,12 +95070,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 101.6, - "protein_g": 1.4, + "kcal": 282.9, + "protein_g": 40.7, "carbs_g": 9.1, - "fat_g": 7.4, + "fat_g": 8.9, "fiber_g": 2.9, - "sodium_mg": 6.8, + "sodium_mg": 4398.6, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -94839,13 +95247,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 87.5, - "protein_g": 2.7, + "kcal": 240.1, + "protein_g": 31.5, "carbs_g": 19.0, - "fat_g": 1.0, + "fat_g": 4.2, "fiber_g": 5.3, - "sodium_mg": 9.6, - "coverage": "partial", + "sodium_mg": 124.4, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -95111,12 +95519,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 164.9, - "protein_g": 2.5, - "carbs_g": 9.0, - "fat_g": 14.6, + "kcal": 176.9, + "protein_g": 3.0, + "carbs_g": 11.0, + "fat_g": 14.8, "fiber_g": 3.0, - "sodium_mg": 13.0, + "sodium_mg": 619.0, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -95291,13 +95699,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 638.2, - "protein_g": 27.2, - "carbs_g": 118.1, + "kcal": 656.1, + "protein_g": 27.5, + "carbs_g": 122.8, "fat_g": 7.2, - "fiber_g": 15.3, - "sodium_mg": 29.0, - "coverage": "partial", + "fiber_g": 15.7, + "sodium_mg": 31.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -95452,13 +95860,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 355.5, + "kcal": 361.5, "protein_g": 21.2, - "carbs_g": 24.6, - "fat_g": 18.9, - "fiber_g": 2.7, - "sodium_mg": 658.8, - "coverage": "partial", + "carbs_g": 25.5, + "fat_g": 19.0, + "fiber_g": 2.9, + "sodium_mg": 660.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -95629,13 +96037,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 352.3, - "protein_g": 5.9, - "carbs_g": 49.9, - "fat_g": 16.0, + "kcal": 370.5, + "protein_g": 8.6, + "carbs_g": 51.6, + "fat_g": 16.1, "fiber_g": 6.8, - "sodium_mg": 534.3, - "coverage": "partial", + "sodium_mg": 811.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -95762,12 +96170,12 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 280.3, - "protein_g": 2.1, - "carbs_g": 48.8, - "fat_g": 11.0, + "kcal": 284.8, + "protein_g": 2.8, + "carbs_g": 49.0, + "fat_g": 11.2, "fiber_g": 2.6, - "sodium_mg": 6.7, + "sodium_mg": 285.7, "coverage": "partial", "basis": "catalog per-100g rows x line grams / servings" }, @@ -96390,13 +96798,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 336.4, - "protein_g": 25.6, - "carbs_g": 20.2, - "fat_g": 17.2, - "fiber_g": 5.9, - "sodium_mg": 196.1, - "coverage": "partial", + "kcal": 344.8, + "protein_g": 26.0, + "carbs_g": 21.7, + "fat_g": 17.6, + "fiber_g": 6.9, + "sodium_mg": 282.1, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -96701,13 +97109,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 218.0, - "protein_g": 26.8, - "carbs_g": 4.3, + "kcal": 221.6, + "protein_g": 26.9, + "carbs_g": 5.1, "fat_g": 9.9, "fiber_g": 1.0, - "sodium_mg": 105.2, - "coverage": "partial", + "sodium_mg": 105.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -97001,13 +97409,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 420.5, - "protein_g": 26.2, - "carbs_g": 33.5, - "fat_g": 20.0, - "fiber_g": 6.8, - "sodium_mg": 171.3, - "coverage": "partial", + "kcal": 427.5, + "protein_g": 26.5, + "carbs_g": 34.7, + "fat_g": 20.4, + "fiber_g": 7.7, + "sodium_mg": 242.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -97505,13 +97913,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 220.9, - "protein_g": 5.3, - "carbs_g": 41.1, - "fat_g": 4.9, - "fiber_g": 4.9, - "sodium_mg": 919.5, - "coverage": "partial", + "kcal": 390.3, + "protein_g": 7.1, + "carbs_g": 58.6, + "fat_g": 15.5, + "fiber_g": 6.2, + "sodium_mg": 1140.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -98622,13 +99030,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 204.7, + "kcal": 205.1, "protein_g": 4.9, "carbs_g": 38.0, "fat_g": 4.7, "fiber_g": 6.4, "sodium_mg": 412.5, - "coverage": "partial", + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -98967,13 +99375,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 181.0, - "protein_g": 15.5, - "carbs_g": 19.8, - "fat_g": 5.0, + "kcal": 341.0, + "protein_g": 21.5, + "carbs_g": 21.0, + "fat_g": 19.4, "fiber_g": 5.0, - "sodium_mg": 513.4, - "coverage": "partial", + "sodium_mg": 968.9, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -99284,13 +99692,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 592.9, - "protein_g": 14.2, - "carbs_g": 88.2, - "fat_g": 23.0, + "kcal": 605.9, + "protein_g": 16.2, + "carbs_g": 89.4, + "fat_g": 23.1, "fiber_g": 9.6, - "sodium_mg": 1176.7, - "coverage": "partial", + "sodium_mg": 1374.7, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -99570,13 +99978,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 49.9, - "protein_g": 2.0, - "carbs_g": 11.3, - "fat_g": 0.5, + "kcal": 81.1, + "protein_g": 6.7, + "carbs_g": 14.2, + "fat_g": 0.7, "fiber_g": 3.7, - "sodium_mg": 38.4, - "coverage": "partial", + "sodium_mg": 513.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -99894,13 +100302,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 755.5, - "protein_g": 43.7, - "carbs_g": 57.3, - "fat_g": 41.1, - "fiber_g": 7.0, - "sodium_mg": 1245.2, - "coverage": "partial", + "kcal": 769.6, + "protein_g": 44.4, + "carbs_g": 60.0, + "fat_g": 41.8, + "fiber_g": 8.8, + "sodium_mg": 1248.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -100065,13 +100473,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 262.6, - "protein_g": 5.8, - "carbs_g": 51.5, - "fat_g": 4.9, - "fiber_g": 6.8, - "sodium_mg": 457.7, - "coverage": "partial", + "kcal": 294.6, + "protein_g": 9.5, + "carbs_g": 55.6, + "fat_g": 5.6, + "fiber_g": 8.2, + "sodium_mg": 777.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -100211,13 +100619,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 57.5, - "protein_g": 2.3, - "carbs_g": 13.0, - "fat_g": 0.5, - "fiber_g": 3.7, - "sodium_mg": 10.5, - "coverage": "partial", + "kcal": 322.0, + "protein_g": 12.3, + "carbs_g": 16.6, + "fat_g": 23.9, + "fiber_g": 4.8, + "sodium_mg": 741.3, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -100965,13 +101373,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 161.9, - "protein_g": 7.1, - "carbs_g": 25.3, - "fat_g": 3.3, + "kcal": 377.7, + "protein_g": 39.3, + "carbs_g": 25.7, + "fat_g": 11.8, "fiber_g": 1.0, - "sodium_mg": 125.9, - "coverage": "partial", + "sodium_mg": 204.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -101105,13 +101513,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 71.4, - "protein_g": 6.7, - "carbs_g": 12.8, - "fat_g": 0.6, - "fiber_g": 4.5, - "sodium_mg": 835.1, - "coverage": "partial", + "kcal": 214.7, + "protein_g": 10.8, + "carbs_g": 41.0, + "fat_g": 2.2, + "fiber_g": 5.8, + "sodium_mg": 836.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -101229,13 +101637,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 12.0, - "protein_g": 0.3, - "carbs_g": 2.8, - "fat_g": 0.0, - "fiber_g": 0.5, - "sodium_mg": 1.3, - "coverage": "partial", + "kcal": 136.5, + "protein_g": 5.7, + "carbs_g": 17.2, + "fat_g": 5.3, + "fiber_g": 5.0, + "sodium_mg": 166.3, + "coverage": "computed", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -101383,13 +101791,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 321.8, + "kcal": 324.4, "protein_g": 7.6, - "carbs_g": 38.5, - "fat_g": 17.0, - "fiber_g": 6.9, - "sodium_mg": 566.7, - "coverage": "partial", + "carbs_g": 38.8, + "fat_g": 17.2, + "fiber_g": 7.0, + "sodium_mg": 566.8, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -101992,13 +102400,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 400.0, - "protein_g": 13.5, - "carbs_g": 71.7, - "fat_g": 5.4, + "kcal": 486.4, + "protein_g": 19.6, + "carbs_g": 80.2, + "fat_g": 8.3, "fiber_g": 1.4, - "sodium_mg": 1686.3, - "coverage": "partial", + "sodium_mg": 2029.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -102153,13 +102561,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 181.9, - "protein_g": 8.1, - "carbs_g": 6.9, - "fat_g": 14.3, - "fiber_g": 1.0, - "sodium_mg": 1552.6, - "coverage": "partial", + "kcal": 338.9, + "protein_g": 13.9, + "carbs_g": 37.5, + "fat_g": 15.2, + "fiber_g": 2.8, + "sodium_mg": 1784.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -103258,13 +103666,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 238.2, - "protein_g": 12.5, - "carbs_g": 38.1, - "fat_g": 4.9, + "kcal": 252.6, + "protein_g": 13.1, + "carbs_g": 40.5, + "fat_g": 5.1, "fiber_g": 7.2, - "sodium_mg": 609.8, - "coverage": "partial", + "sodium_mg": 1337.0, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -103636,13 +104044,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 599.0, - "protein_g": 12.6, - "carbs_g": 103.9, + "kcal": 601.3, + "protein_g": 12.7, + "carbs_g": 104.4, "fat_g": 15.3, - "fiber_g": 7.8, - "sodium_mg": 606.3, - "coverage": "partial", + "fiber_g": 7.9, + "sodium_mg": 606.5, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -103996,13 +104404,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 817.0, - "protein_g": 41.8, - "carbs_g": 98.2, - "fat_g": 28.0, + "kcal": 845.8, + "protein_g": 43.8, + "carbs_g": 101.0, + "fat_g": 29.0, "fiber_g": 2.8, - "sodium_mg": 1344.2, - "coverage": "partial", + "sodium_mg": 1458.6, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { @@ -105341,13 +105749,13 @@ "dairy_free": null }, "nutrition_per_serving": { - "kcal": 588.0, + "kcal": 589.9, "protein_g": 20.7, - "carbs_g": 98.3, - "fat_g": 13.3, - "fiber_g": 9.0, - "sodium_mg": 496.0, - "coverage": "partial", + "carbs_g": 98.7, + "fat_g": 13.4, + "fiber_g": 9.1, + "sodium_mg": 496.2, + "coverage": "estimated", "basis": "catalog per-100g rows x line grams / servings" }, "rights": { diff --git a/data/recipes/tools/compile_bundle.py b/data/recipes/tools/compile_bundle.py index ada539492..f2ddb664d 100644 --- a/data/recipes/tools/compile_bundle.py +++ b/data/recipes/tools/compile_bundle.py @@ -28,7 +28,7 @@ OUT = REPO / "data/recipes/build/recipes-v2.json" # Pinned so repeat runs are byte identical; bump deliberately when recompiling. -GENERATED_AT = "2026-10-15T12:45:00Z" +GENERATED_AT = "2026-10-15T19:05:00Z" # First corpus id maps to rcp-000167: rcp-000001..rcp-000166 are reserved for # migrated legacy rows per the bundle-v2 contract. diff --git a/data/recipes/tools/find_candidates.py b/data/recipes/tools/find_candidates.py new file mode 100644 index 000000000..073c5ca62 --- /dev/null +++ b/data/recipes/tools/find_candidates.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +"""List FDC candidate rows for the keys that lack per-100g data. + +Exact-word search over FNDDS survey + SR Legacy (+ optional Foundation Foods) +descriptions: every key word must appear as an exact word form (singular or +plural); prints candidates with nutrient availability for hand review. +No scoring, no ranking, no fuzzy: this is an evidence dump for a human decision. +""" +from __future__ import annotations + +import csv +import json +import re +import sys +from pathlib import Path + +FDC_DIRS = { + "fndds": Path("/tmp/fdc/FoodData_Central_survey_food_csv_2024-10-31"), + "sr": Path("/tmp/fdc/FoodData_Central_sr_legacy_food_csv_2018-04"), +} +FF_DIR = Path("/tmp/fdc/FoodData_Central_foundation_food_csv_2024-10-31") + +NUTRIENT_IDS = {"kcal": {1008, 208}, "protein_g": {1003, 203}, + "carbs_g": {1005, 205}, "fat_g": {1004, 204}, + "fiber_g": {1079, 291}, "sugar_g": {2000, 1063, 269}, + "sodium_mg": {1093, 307}} + +def load(): + foods = {} + nutrients: dict[int, set[str]] = {} + for d in [FF_DIR] if FF_DIR.exists() else []: + pass + for tag, d in FDC_DIRS.items(): + with (d / "food.csv").open() as f: + for row in csv.DictReader(f): + foods[int(row["fdc_id"])] = (row["description"], tag) + with (d / "food_nutrient.csv").open() as f: + for row in csv.DictReader(f): + fid = int(row["fdc_id"]) + nid = int(row["nutrient_id"]) + for field, ids in NUTRIENT_IDS.items(): + if nid in ids: + nutrients.setdefault(fid, set()).add(field) + if FF_DIR.exists(): + with (FF_DIR / "food.csv").open() as f: + for row in csv.DictReader(f): + foods[int(row["fdc_id"])] = (row["description"], "ff") + with (FF_DIR / "food_nutrient.csv").open() as f: + for row in csv.DictReader(f): + fid = int(row["fdc_id"]) + nid = int(row["nutrient_id"]) + for field, ids in NUTRIENT_IDS.items(): + if nid in ids: + nutrients.setdefault(fid, set()).add(field) + return foods, nutrients + +def word_forms(w: str) -> set[str]: + f = {w, w + "s", w + "es"} + if w.endswith("y"): + f.add(w[:-1] + "ies") + # rough singulars + if w.endswith("es"): + f.add(w[:-2]) + if w.endswith("s"): + f.add(w[:-1]) + return f + +def main() -> None: + foods, nutrients = load() + vocab = json.load(open(sys.argv[1]))["entries"] + targets = [e["key"] for e in vocab if e["per_100g"] is None] + if len(sys.argv) > 2: + targets = sys.argv[2:] + for key in targets: + words = [w for w in key.split("_") if w] + forms = {w: word_forms(w) for w in words} + print(f"### {key}") + hits = [] + for fid, (desc, tag) in foods.items(): + dl = desc.lower() + tokens = set(re.findall(r"[a-z]+", dl)) + if all(any(t in forms[w] for t in tokens) for w in words): + hits.append((fid, desc, tag, len(nutrients.get(fid, ())))) + for fid, desc, tag, nfields in sorted(hits, key=lambda h: (-h[3], h[1]))[:14]: + print(f" {fid} [{tag}] ({nfields}/7 nutrients) {desc}") + if not hits: + print(" (no exact-word candidates)") + return + +if __name__ == "__main__": + main() diff --git a/data/recipes/tools/record_nutrition_changes.py b/data/recipes/tools/record_nutrition_changes.py new file mode 100644 index 000000000..0e16e51ac --- /dev/null +++ b/data/recipes/tools/record_nutrition_changes.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 +"""Record >40% per-serving kcal moves between two published recipe bundles. + +When a vocabulary revision resolves ingredient keys that previously shipped +without per-100g nutrition, recipes can move materially. Every move of more +than 40 percent must be recorded in data/recipe-bundle/nutrition-changes-2026-10.json +naming the vocabulary keys that were resolved and are used by that recipe. +validate_bundle.py --previous --changes enforces it. + +The cause is computed honestly: a recipe's entry lists exactly the keys in its +lines that gained a per-100g row between the previous and current vocabulary. +If a swing cannot be traced to any resolved key in the recipe, the tool fails +closed instead of writing an unexplained exemption. +""" +from __future__ import annotations + +import argparse +import json +from pathlib import Path + +REPO = Path(__file__).resolve().parents[3] +OUT_DEFAULT = REPO / "data/recipe-bundle/nutrition-changes-2026-10.json" +VOCAB = REPO / "data/ingredients/vocabulary.json" +DRIFT_THRESHOLD = 0.40 + + +def kcal_swing(old: float, new: float) -> float: + if old == 0: + return 0.0 if new == 0 else float("inf") + return abs(new - old) / old + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument("--new", default=str(REPO / "data/recipes/build/recipes-v2.json"), + help="newly compiled bundle") + ap.add_argument("--previous", required=True, help="previously published bundle") + ap.add_argument("--previous-vocab", required=True, + help="vocabulary.json as committed with the previous bundle") + ap.add_argument("--out", default=str(OUT_DEFAULT)) + ap.add_argument("--previous-note", required=True, + help="provenance of the previous bundle, e.g. the commit sha it ships in") + args = ap.parse_args() + + new = json.load(open(args.new)) + prev = json.load(open(args.previous)) + cur_vocab = {e["key"]: e for e in json.load(VOCAB.open())["entries"]} + prev_vocab = {e["key"]: e for e in json.load(open(args.previous_vocab))["entries"]} + + # Keys that gained a per-100g row between the two vocabulary revisions. + resolved = { + k: cur_vocab[k] for k in cur_vocab + if cur_vocab[k].get("per_100g") is not None + and prev_vocab.get(k, {}).get("per_100g") is None + } + print(f"vocabulary keys resolved between revisions: {len(resolved)}") + + prev_n = {r["catalog_id"]: r["nutrition_per_serving"] for r in prev["recipes"]} + entries = [] + unexplained = [] + for recipe in new["recipes"]: + rid = recipe["catalog_id"] + old_n = prev_n.get(rid) + if old_n is None: + continue + n = recipe["nutrition_per_serving"] + swing = kcal_swing(old_n["kcal"], n["kcal"]) + if swing <= DRIFT_THRESHOLD: + continue + line_keys = {line["key"] for line in recipe["ingredients"]} + cause = sorted(k for k in line_keys if k in resolved) + if not cause: + unexplained.append(rid) + continue + detail = ", ".join(f"{k} (fdc {resolved[k]['fdc_id']})" for k in cause) + entries.append({ + "catalog_id": rid, + "old_kcal": old_n["kcal"], + "new_kcal": n["kcal"], + "vocabulary_change": f"keys in this recipe resolved to per-100g rows " + f"in this revision: {detail}", + }) + if unexplained: + raise SystemExit( + "kcal swings with no resolved vocabulary key in the recipe lines: " + f"{sorted(unexplained)} — investigate before exempting") + + entries.sort(key=lambda e: e["catalog_id"]) + doc = { + "note": "Recipes whose per-serving kcal moved more than 40 percent against the " + "previously published bundle, with the vocabulary resolution that caused " + "each move. Recorded by data/recipes/tools/record_nutrition_changes.py; " + "enforced by validate_bundle.py --previous --changes.", + "policy": "A >40% kcal move between published bundles must be exempted here with " + "the vocabulary change that caused it; exemption entries must reproduce " + "both kcal values.", + "previous_bundle": args.previous_note, + "threshold": DRIFT_THRESHOLD, + "entries": entries, + } + Path(args.out).write_text(json.dumps(doc, indent=2, ensure_ascii=False) + "\n") + print(f"wrote {args.out}: {len(entries)} exempted kcal moves " + f"(of {len(new['recipes'])} recipes)") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/data/recipes/tools/tests/test_kcal_drift.py b/data/recipes/tools/tests/test_kcal_drift.py new file mode 100644 index 000000000..00544ba8c --- /dev/null +++ b/data/recipes/tools/tests/test_kcal_drift.py @@ -0,0 +1,108 @@ +"""Kcal-drift validation: a per-serving kcal move of more than 40 percent +against the previously published bundle must be recorded in +data/recipe-bundle/nutrition-changes-2026-10.json naming the vocabulary change +that caused it. Planted violations prove the check fails closed. +""" +from __future__ import annotations + +import json +import subprocess +import sys +from pathlib import Path + +import pytest + +REPO = Path(__file__).resolve().parents[4] +TOOLS = REPO / "data/recipes/tools" +sys.path.insert(0, str(TOOLS)) + +from validate_bundle import check_kcal_drift, kcal_swing # noqa: E402 + +BUNDLE = REPO / "data/recipes/build/recipes-v2.json" +CHANGES = REPO / "data/recipe-bundle/nutrition-changes-2026-10.json" + + +def recipe(rid: str, kcal: float) -> dict: + return {"catalog_id": rid, "nutrition_per_serving": {"kcal": kcal}} + + +def doc(*recipes: dict) -> dict: + return {"recipes": list(recipes)} + + +def entry(rid: str, old: float, new: float, + cause: str = "gochujang resolved to per-100g rows") -> dict: + return {"catalog_id": rid, "old_kcal": old, "new_kcal": new, + "vocabulary_change": cause} + + +# ---- 1. swing math and the no-previous skip -------------------------------- + +def test_kcal_swing_math_and_no_previous_skip(): + assert kcal_swing(100, 150) == pytest.approx(0.5) + assert kcal_swing(100, 60) == pytest.approx(0.4) # exactly 40% is allowed + assert kcal_swing(100, 59) == pytest.approx(0.41) # over 40% is not + assert kcal_swing(0, 0) == 0.0 + assert kcal_swing(0, 10) == float("inf") + # no previous bundle: nothing to compare against + assert check_kcal_drift(doc(recipe("rcp-1", 500.0)), None, None) == [] + + +# ---- 2. planted violations around exemptions -------------------------------- + +def test_drift_requires_matching_exemption_with_cause(): + new, prev = doc(recipe("rcp-1", 180.0)), doc(recipe("rcp-1", 100.0)) + # unrecorded move fails, naming the recipe + errs = check_kcal_drift(new, prev, None) + assert len(errs) == 1 and "rcp-1" in errs[0] + # matching exemption with a cause passes + ok = {"entries": [entry("rcp-1", 100.0, 180.0)]} + assert check_kcal_drift(new, prev, ok) == [] + # stale kcal values in the exemption fail + stale = {"entries": [entry("rcp-1", 100.0, 150.0)]} + assert any("stale exemption" in e for e in check_kcal_drift(new, prev, stale)) + # blank cause fails + blank = {"entries": [entry("rcp-1", 100.0, 180.0, cause=" ")]} + assert any("vocabulary change" in e for e in check_kcal_drift(new, prev, blank)) + + +# ---- 3. zero-kcal and new-recipe edges --------------------------------------- + +def test_zero_kcal_and_new_recipe_edges(): + # a recipe that previously shipped kcal 0 and now has energy needs an entry + errs = check_kcal_drift(doc(recipe("rcp-1", 50.0)), doc(recipe("rcp-1", 0.0)), None) + assert len(errs) == 1 and "rcp-1" in errs[0] + assert check_kcal_drift(doc(recipe("rcp-1", 0.0)), doc(recipe("rcp-1", 0.0)), None) == [] + # a brand-new recipe has no previous line to compare against + assert check_kcal_drift( + doc(recipe("rcp-new", 900.0)), doc(recipe("rcp-old", 100.0)), None) == [] + + +# ---- 4. real bundles: seeded violation caught, committed file consistent ---- + +def test_seeded_drift_violation_and_real_changes_file_consistency(): + bundle = json.load(BUNDLE.open()) + rid = bundle["recipes"][0]["catalog_id"] + n = bundle["recipes"][0]["nutrition_per_serving"] + n["kcal"] = round(n["kcal"] * 3, 1) # a 200% move with no exemption + bad = REPO / "data/recipes/build/_seeded-drift.json" + bad.write_text(json.dumps(bundle)) + try: + out = subprocess.run( + [sys.executable, str(TOOLS / "validate_bundle.py"), str(bad), + "--previous", str(BUNDLE), "--changes", str(CHANGES)], + capture_output=True, text=True, cwd=REPO) + assert out.returncode == 1 + assert rid in out.stdout + assert "against the previous published" in out.stdout + finally: + bad.unlink() + + # the committed changes file must reproduce the shipped bundle's kcal for + # every exemption and name a vocabulary change (no stale entries) + changes = json.load(CHANGES.open()) + assert changes["entries"], "changes file must not be empty" + kcal = {r["catalog_id"]: r["nutrition_per_serving"]["kcal"] for r in bundle["recipes"]} + for e in changes["entries"]: + assert abs(e["new_kcal"] - kcal[e["catalog_id"]]) <= 0.05 + assert (e["vocabulary_change"] or "").strip() diff --git a/data/recipes/tools/validate_bundle.py b/data/recipes/tools/validate_bundle.py index 2db0b6aac..540a4089c 100644 --- a/data/recipes/tools/validate_bundle.py +++ b/data/recipes/tools/validate_bundle.py @@ -11,6 +11,9 @@ 5. Rights: every recipe carries an original/quarantined status with evidence. 6. FSIS: a thermometer endpoint may only appear on a step of a recipe that uses a meat/fish class ingredient, and endpoints must match FSIS tables. +7. (optional) Kcal drift: with --previous, a per-serving kcal move of more + than 40 percent against the previously published bundle must be recorded + in a changes file (--changes) naming the vocabulary change that caused it. Exit code 0 and "PASS" on success; every failure is printed with its recipe id. """ @@ -38,6 +41,9 @@ # 7 kcal/g that the shipped macros cannot express. ATWATER = {"protein_g": 4, "carbs_g": 4, "fat_g": 9} ATWATER_FIBER = 2 +KCAL_DRIFT_THRESHOLD = 0.40 +KCAL_MATCH_TOLERANCE = 0.05 +CHANGES_FILE = REPO / "data/recipe-bundle/nutrition-changes-2026-10.json" ALCOHOL_KEYS = { "red_wine", "white_wine", "beer", "lager", "ale", "rum", "vodka", "brandy", "whiskey", "sherry", "mirin", "cooking_wine", "kahlua", "cointreau", @@ -62,7 +68,54 @@ def atwater_ok(n: dict, has_alcohol: bool) -> bool: return abs(n["kcal"] - expected) <= max(50.0, 0.40 * expected) -def main(path: str) -> int: +def kcal_swing(old: float, new: float) -> float: + """Relative per-serving kcal move; infinite when the old value was zero.""" + if old == 0: + return 0.0 if new == 0 else float("inf") + return abs(new - old) / old + + +def check_kcal_drift(new: dict, prev: dict | None, changes: dict | None) -> list[str]: + """Every >40 percent kcal move against the previous published bundle must + be exempted in the changes file with the vocabulary change that caused it. + Entries must reproduce both kcal values so stale exemptions fail loudly.""" + errors: list[str] = [] + if prev is None: + return errors + prev_n = {r["catalog_id"]: r.get("nutrition_per_serving", {}) for r in prev["recipes"]} + exemptions = {e["catalog_id"]: e for e in (changes or {}).get("entries", [])} + swings = 0 + for recipe in new["recipes"]: + rid = recipe["catalog_id"] + old_n = prev_n.get(rid) + if old_n is None or "kcal" not in old_n: + continue # new or re-keyed recipe: nothing to compare against + n = recipe.get("nutrition_per_serving", {}) + if "kcal" not in n: + continue + swing = kcal_swing(old_n["kcal"], n["kcal"]) + if swing <= KCAL_DRIFT_THRESHOLD: + continue + swings += 1 + entry = exemptions.get(rid) + if entry is None: + errors.append( + f"{rid}: kcal moved {old_n['kcal']} -> {n['kcal']} " + f"(>{KCAL_DRIFT_THRESHOLD:.0%}) against the previous published " + f"bundle; record the vocabulary change that caused it in " + f"{CHANGES_FILE.name}") + continue + for field, value in (("old_kcal", old_n["kcal"]), ("new_kcal", n["kcal"])): + if abs(entry.get(field, float("nan")) - value) > KCAL_MATCH_TOLERANCE: + errors.append( + f"{rid}: exemption {field} is {entry.get(field)!r} but the " + f"bundle value is {value!r}; stale exemption") + if not (entry.get("vocabulary_change") or "").strip(): + errors.append(f"{rid}: exemption must name the vocabulary change that caused it") + return errors + + +def main(path: str, previous: str | None = None, changes: str | None = None) -> int: bundle = json.load(open(path)) schema = json.load(SCHEMA.open()) errors: list[str] = [] @@ -72,6 +125,16 @@ def main(path: str) -> int: loc = "/".join(str(p) for p in err.absolute_path) or "" fail(errors, loc, err.message[:160]) + prev_bundle = json.load(open(previous)) if previous else None + changes_doc = json.load(open(changes)) if changes else None + if previous and not changes_doc: + print("note: no changes file supplied; any kcal swing will fail") + drift_errors = check_kcal_drift(bundle, prev_bundle, changes_doc) + errors.extend(drift_errors) + if prev_bundle is not None: + print(f"kcal drift: compared against {previous}; " + f"{len(drift_errors)} unrecorded/exempted problems") + ingredients = {i["key"]: i for i in bundle["ingredients"]} # Bundle ingredients carry no class field (schema forbids extras); the # fail-closed claims and FSIS checks read classes from the vocabulary. @@ -124,4 +187,11 @@ def main(path: str) -> int: if __name__ == "__main__": - sys.exit(main(sys.argv[1] if len(sys.argv) > 1 else "data/recipes/build/recipes-v2.json")) + import argparse + + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument("bundle", nargs="?", default="data/recipes/build/recipes-v2.json") + ap.add_argument("--previous", help="previously published bundle to compare kcal against") + ap.add_argument("--changes", help="changes file exempting >40%% kcal moves") + args = ap.parse_args() + sys.exit(main(args.bundle, args.previous, args.changes)) From 02de2fb3b9dd421f96dd82cb5cf94f8679e6e895 Mon Sep 17 00:00:00 2001 From: Sam Gu <127461594+SamGu-NRX@users.noreply.github.com> Date: Thu, 15 Oct 2026 16:47:36 +0000 Subject: [PATCH 3/7] data(bundle): correct GENERATED_AT to the actual build time and manifest hashes GENERATED_AT had been pinned to a future timestamp (19:05Z); pinned to the actual recompile time (16:46:35Z) and recompiled. Also states the determinism evidence honestly: three compiles compared by MD5 (de834f81...), with the committed bundle's sha256 recorded separately (d442a11f...3edcbc2), instead of labeling an md5 comparison with a sha256 value. kcal values, coverage counts, and the changes file are unchanged. Re-verified: validator PASS (plain and --previous/--changes drift check), pytest 18 passed, shipped copy byte-identical. Co-authored-by: Sam Gu Co-authored-by: obvious-autobuild[bot] <262744130+obvious-autobuild[bot]@users.noreply.github.com> --- apps/ios/Resources/RecipeCatalog/recipes-v2.json | 2 +- data/recipe-bundle/manifest.json | 10 +++++----- data/recipe-bundle/validation-report.md | 4 ++-- data/recipes/build/recipes-v2.json | 2 +- data/recipes/tools/compile_bundle.py | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/ios/Resources/RecipeCatalog/recipes-v2.json b/apps/ios/Resources/RecipeCatalog/recipes-v2.json index 7a9e30ba7..d65eed44e 100644 --- a/apps/ios/Resources/RecipeCatalog/recipes-v2.json +++ b/apps/ios/Resources/RecipeCatalog/recipes-v2.json @@ -1,7 +1,7 @@ { "schema": "https://fridgeluck.app/schemas/recipe-bundle-v2.schema.json", "bundle_version": 2, - "generated_at": "2026-10-15T19:05:00Z", + "generated_at": "2026-10-15T16:46:35Z", "cuisines": [ "american", "asian", diff --git a/data/recipe-bundle/manifest.json b/data/recipe-bundle/manifest.json index ecaeabb22..dc95e8764 100644 --- a/data/recipe-bundle/manifest.json +++ b/data/recipe-bundle/manifest.json @@ -4,8 +4,8 @@ "path": "apps/ios/Resources/RecipeCatalog/recipes-v2.json", "build_copy": "data/recipes/build/recipes-v2.json", "bundle_version": 2, - "generated_at": "2026-10-15T19:05:00Z", - "sha256": "8fd5941260f0385896ca6cce12dd94b5a52629612bfa58fcbd180c392375b351", + "generated_at": "2026-10-15T16:46:35Z", + "sha256": "d442a11fae65a03e84066a03f195604aeecb1bfadbdce9ad02e48671e3edcbc2", "bytes": 2611873, "schema_url": "https://fridgeluck.app/schemas/recipe-bundle-v2.schema.json" }, @@ -39,7 +39,7 @@ ], "id_mapping": "data/recipes/evidence/ingest-2026-10-map.json (packet id -> corpus id, produced by data/recipe-bundle/ingest_packets_2026_10.py)" }, - "compiler": { "pull_request": 158, "branch": "obv/burst5-fridgeluck-rcp-pipeline", "commit": "3644321", "tool": "data/recipes/tools/compile_bundle.py", "changes_on_this_branch": "GENERATED_AT bumped to 2026-10-15T19:05:00Z per the tool's recompile instruction" }, + "compiler": { "pull_request": 158, "branch": "obv/burst5-fridgeluck-rcp-pipeline", "commit": "3644321", "tool": "data/recipes/tools/compile_bundle.py", "changes_on_this_branch": "GENERATED_AT bumped to 2026-10-15T16:46:35Z per the tool's recompile instruction" }, "vocabulary": { "tool": "data/recipes/tools/build_vocab.py", "keys": 329, "surfaces": 555, "fdc_new_rows": 97, "inputs": "extended corpus + /tmp/canon identities + /tmp/fdc FNDDS/SR CSVs (CC0)", "nutrition_completion_2026_10": "51 keys pinned to same-product FDC rows in build_vocab.py FDC_PINS; 46 keys stay unresolved with rejected candidates in data/ingredients/unresolved-candidates.json (build_vocab.py fails if that audit drifts); legacy identity map now 32 resolved / 18 proposed / 0 unresolved, with 'tortilla' resolved via the plural key 'tortillas' (fdc 2707822)" }, "validator": "data/recipes/tools/validate_bundle.py", "loader": { "pull_request": 151, "branch": "obv/burst5-fridgeluck-rcp-loader" }, @@ -50,8 +50,8 @@ "bundle_validation": { "command": "python3 data/recipes/tools/validate_bundle.py", "result": "PASS" }, "kcal_drift_check": { "command": "python3 data/recipes/tools/validate_bundle.py data/recipes/build/recipes-v2.json --previous --changes data/recipe-bundle/nutrition-changes-2026-10.json", "result": "PASS, 0 unrecorded/exempted problems; 33 of 763 recipes moved >40% in kcal and each carries an exemption naming the resolved keys in its lines" }, "determinism": { - "command": "python3 data/recipes/tools/compile_bundle.py (run three times, md5 compared)", - "result": "byte-identical: 8fd5941260f0385896ca6cce12dd94b5a52629612bfa58fcbd180c392375b351" + "command": "python3 data/recipes/tools/compile_bundle.py (run three times, MD5 compared)", + "result": "byte-identical across the three runs (MD5 de834f81e2ef611d02ff6779915e453f); committed bundle sha256 d442a11fae65a03e84066a03f195604aeecb1bfadbdce9ad02e48671e3edcbc2" }, "nutrition_changes": "51 keys gained per-100g; 193 recipes changed kcal (median +11.5 kcal, max +426.2 on rcp-000229, the previously under-reported ones); 33 moves >40% are exempted in data/recipe-bundle/nutrition-changes-2026-10.json and enforced by validate_bundle.py --previous --changes" } diff --git a/data/recipe-bundle/validation-report.md b/data/recipe-bundle/validation-report.md index a488446c9..26cc8b345 100644 --- a/data/recipe-bundle/validation-report.md +++ b/data/recipe-bundle/validation-report.md @@ -136,8 +136,8 @@ candidates recorded in `data/ingredients/unresolved-candidates.json`, and map is fully resolved (32 resolved / 18 proposed / 0 unresolved; `tortilla` resolves via the plural key `tortillas`). -Effect on the shipped bundle (sha256 `8fd59412…375b351`, 2,611,873 bytes, `GENERATED_AT` -`2026-10-15T19:05:00Z`): nutrition coverage moved from 163 computed / 345 estimated / +Effect on the shipped bundle (sha256 `d442a11f…3edcbc2`, 2,611,873 bytes, `GENERATED_AT` +`2026-10-15T16:46:35Z`): nutrition coverage moved from 163 computed / 345 estimated / 255 partial to **164 computed / 500 estimated / 99 partial**. 193 recipes changed kcal (median +11.5); the 33 recipes that moved more than 40 percent are the previously under-reported ones, and each carries a recorded cause in diff --git a/data/recipes/build/recipes-v2.json b/data/recipes/build/recipes-v2.json index 7a9e30ba7..d65eed44e 100644 --- a/data/recipes/build/recipes-v2.json +++ b/data/recipes/build/recipes-v2.json @@ -1,7 +1,7 @@ { "schema": "https://fridgeluck.app/schemas/recipe-bundle-v2.schema.json", "bundle_version": 2, - "generated_at": "2026-10-15T19:05:00Z", + "generated_at": "2026-10-15T16:46:35Z", "cuisines": [ "american", "asian", diff --git a/data/recipes/tools/compile_bundle.py b/data/recipes/tools/compile_bundle.py index f2ddb664d..c5abca081 100644 --- a/data/recipes/tools/compile_bundle.py +++ b/data/recipes/tools/compile_bundle.py @@ -28,7 +28,7 @@ OUT = REPO / "data/recipes/build/recipes-v2.json" # Pinned so repeat runs are byte identical; bump deliberately when recompiling. -GENERATED_AT = "2026-10-15T19:05:00Z" +GENERATED_AT = "2026-10-15T16:46:35Z" # First corpus id maps to rcp-000167: rcp-000001..rcp-000166 are reserved for # migrated legacy rows per the bundle-v2 contract. From 49fe34b753f746b2e104b70b6f846df702105043 Mon Sep 17 00:00:00 2001 From: Obvious Date: Thu, 15 Oct 2026 22:05:11 +0000 Subject: [PATCH 4/7] feat(evaluation): add catalog reach report with exact-rule replay and pantry simulation Replays the hydration-time identity bridge rules exactly (legacy-id path, FDC exact-name and alias path) against the shipped bundle, USDA sqlite, and legacy data.json, then measures fully resolvable recipes per rights class and simulates 200 seeded pantries. Baseline at the branch point: 112/329 keys, 70/763 fully resolvable (9.2%). Co-authored-by: obvious-autobuild[bot] <262744130+obvious-autobuild[bot]@users.noreply.github.com> --- evaluation/catalog-reach/reach-after.json | 203 +++++++++++ evaluation/catalog-reach/reach-after.md | 53 +++ evaluation/catalog-reach/reach-before.json | 203 +++++++++++ evaluation/catalog-reach/reach-before.md | 53 +++ evaluation/catalog-reach/reach_report.py | 384 +++++++++++++++++++++ 5 files changed, 896 insertions(+) create mode 100644 evaluation/catalog-reach/reach-after.json create mode 100644 evaluation/catalog-reach/reach-after.md create mode 100644 evaluation/catalog-reach/reach-before.json create mode 100644 evaluation/catalog-reach/reach-before.md create mode 100644 evaluation/catalog-reach/reach_report.py diff --git a/evaluation/catalog-reach/reach-after.json b/evaluation/catalog-reach/reach-after.json new file mode 100644 index 000000000..35341ee47 --- /dev/null +++ b/evaluation/catalog-reach/reach-after.json @@ -0,0 +1,203 @@ +{ + "bundle_version": 2, + "generated_at": "2026-10-15T16:46:35Z", + "vocabulary_keys": 329, + "resolvable_keys": 283, + "resolvable_by_legacy_id": 0, + "resolvable_by_fdc_id": 283, + "unresolvable_keys": 46, + "recipes_total": 763, + "recipes_with_no_required_lines": 0, + "fully_resolvable_recipes": 655, + "fully_resolvable_share": 0.8585, + "fully_resolvable_by_cuisine": { + "american": 150, + "asian": 149, + "indian": 40, + "italian": 102, + "mediterranean": 116, + "mexican": 98 + }, + "recipes_by_cuisine": { + "american": 161, + "asian": 191, + "indian": 76, + "italian": 105, + "mediterranean": 132, + "mexican": 98 + }, + "original_rights_recipes": 461, + "fully_resolvable_original_rights_recipes": 373, + "fully_resolvable_original_rights_share": 0.8091, + "blocked_by_unresolved_key_recipes": 108, + "blocked_by_unresolved_key_original_rights_recipes": 88, + "top_unresolved_keys_blocking_recipes": [ + { + "key": "garam_masala", + "recipes_blocked": 26, + "fdc_id": null + }, + { + "key": "scotch_bonnet", + "recipes_blocked": 15, + "fdc_id": null + }, + { + "key": "gochujang", + "recipes_blocked": 9, + "fdc_id": null + }, + { + "key": "thai_chilies", + "recipes_blocked": 8, + "fdc_id": null + }, + { + "key": "mirin", + "recipes_blocked": 5, + "fdc_id": null + }, + { + "key": "harissa", + "recipes_blocked": 4, + "fdc_id": null + }, + { + "key": "halloumi", + "recipes_blocked": 4, + "fdc_id": null + }, + { + "key": "black_vinegar", + "recipes_blocked": 4, + "fdc_id": null + }, + { + "key": "stock", + "recipes_blocked": 4, + "fdc_id": null + }, + { + "key": "sichuan_peppercorns", + "recipes_blocked": 3, + "fdc_id": null + }, + { + "key": "jerk_seasoning", + "recipes_blocked": 2, + "fdc_id": null + }, + { + "key": "pomegranate_molasses", + "recipes_blocked": 2, + "fdc_id": null + }, + { + "key": "galangal", + "recipes_blocked": 2, + "fdc_id": null + }, + { + "key": "star_anise", + "recipes_blocked": 2, + "fdc_id": null + }, + { + "key": "beef_meatballs", + "recipes_blocked": 2, + "fdc_id": null + }, + { + "key": "zaatar", + "recipes_blocked": 2, + "fdc_id": null + }, + { + "key": "flattened_rice", + "recipes_blocked": 1, + "fdc_id": null + }, + { + "key": "artichoke_hearts", + "recipes_blocked": 1, + "fdc_id": null + }, + { + "key": "farro", + "recipes_blocked": 1, + "fdc_id": null + }, + { + "key": "ras_el_hanout", + "recipes_blocked": 1, + "fdc_id": null + }, + { + "key": "preserved_lemon", + "recipes_blocked": 1, + "fdc_id": null + }, + { + "key": "nduja", + "recipes_blocked": 1, + "fdc_id": null + }, + { + "key": "beef_vegetable_stock", + "recipes_blocked": 1, + "fdc_id": null + }, + { + "key": "sweet_potato_noodles", + "recipes_blocked": 1, + "fdc_id": null + }, + { + "key": "doenjang", + "recipes_blocked": 1, + "fdc_id": null + }, + { + "key": "gochugaru", + "recipes_blocked": 1, + "fdc_id": null + }, + { + "key": "potato_starch", + "recipes_blocked": 1, + "fdc_id": null + }, + { + "key": "black_bean_paste", + "recipes_blocked": 1, + "fdc_id": null + }, + { + "key": "umeboshi", + "recipes_blocked": 1, + "fdc_id": null + }, + { + "key": "dashi", + "recipes_blocked": 1, + "fdc_id": null + } + ], + "pantry_replay": { + "pantries": 200, + "size_range": [ + 12, + 25 + ], + "seed": 42, + "pool_size": 1000, + "exact_missing_0_median": 0.0, + "exact_missing_0_p10": 0, + "exact_missing_0_p90": 1, + "at_most_2_missing_median": 72.0, + "at_most_2_missing_p10": 67, + "at_most_2_missing_p90": 91, + "original_rights_exact_missing_0_median": 0.0, + "original_rights_at_most_2_missing_median": 46.5 + } +} diff --git a/evaluation/catalog-reach/reach-after.md b/evaluation/catalog-reach/reach-after.md new file mode 100644 index 000000000..b5eb2c95c --- /dev/null +++ b/evaluation/catalog-reach/reach-after.md @@ -0,0 +1,53 @@ +# Catalog reach report + +- Vocabulary keys: **329**, resolvable **283** (legacy_id 0, fdc_id 283), unresolvable 46 +- Recipes: **763**, fully resolvable **655** (85.9%) +- Original-rights recipes: 461, fully resolvable **373** (80.9%) +- Recipes blocked by at least one unresolved required key: 108 +- Pantry replay (200 pantries of 12-25 ingredients, seed 42, pool 1000): exact median **0.0** (p10 0, p90 1), at-most-2-missing median **72.0** (p10 67, p90 91) + +## Fully resolvable by cuisine + +| cuisine | fully resolvable | total | +|---|---|---| +| american | 150 | 161 | +| asian | 149 | 191 | +| indian | 40 | 76 | +| italian | 102 | 105 | +| mediterranean | 116 | 132 | +| mexican | 98 | 98 | + +## Top unresolved keys blocking recipes (30 shown) + +| key | recipes blocked | fdc_id | +|---|---|---| +| `garam_masala` | 26 | None | +| `scotch_bonnet` | 15 | None | +| `gochujang` | 9 | None | +| `thai_chilies` | 8 | None | +| `mirin` | 5 | None | +| `harissa` | 4 | None | +| `halloumi` | 4 | None | +| `black_vinegar` | 4 | None | +| `stock` | 4 | None | +| `sichuan_peppercorns` | 3 | None | +| `jerk_seasoning` | 2 | None | +| `pomegranate_molasses` | 2 | None | +| `galangal` | 2 | None | +| `star_anise` | 2 | None | +| `beef_meatballs` | 2 | None | +| `zaatar` | 2 | None | +| `flattened_rice` | 1 | None | +| `artichoke_hearts` | 1 | None | +| `farro` | 1 | None | +| `ras_el_hanout` | 1 | None | +| `preserved_lemon` | 1 | None | +| `nduja` | 1 | None | +| `beef_vegetable_stock` | 1 | None | +| `sweet_potato_noodles` | 1 | None | +| `doenjang` | 1 | None | +| `gochugaru` | 1 | None | +| `potato_starch` | 1 | None | +| `black_bean_paste` | 1 | None | +| `umeboshi` | 1 | None | +| `dashi` | 1 | None | diff --git a/evaluation/catalog-reach/reach-before.json b/evaluation/catalog-reach/reach-before.json new file mode 100644 index 000000000..b343335ec --- /dev/null +++ b/evaluation/catalog-reach/reach-before.json @@ -0,0 +1,203 @@ +{ + "bundle_version": 2, + "generated_at": "2026-10-15T12:45:00Z", + "vocabulary_keys": 329, + "resolvable_keys": 112, + "resolvable_by_legacy_id": 0, + "resolvable_by_fdc_id": 112, + "unresolvable_keys": 217, + "recipes_total": 763, + "recipes_with_no_required_lines": 0, + "fully_resolvable_recipes": 70, + "fully_resolvable_share": 0.0917, + "fully_resolvable_by_cuisine": { + "american": 10, + "asian": 27, + "indian": 3, + "italian": 5, + "mediterranean": 17, + "mexican": 8 + }, + "recipes_by_cuisine": { + "american": 161, + "asian": 191, + "indian": 76, + "italian": 105, + "mediterranean": 132, + "mexican": 98 + }, + "original_rights_recipes": 461, + "fully_resolvable_original_rights_recipes": 33, + "fully_resolvable_original_rights_share": 0.0716, + "blocked_by_unresolved_key_recipes": 693, + "blocked_by_unresolved_key_original_rights_recipes": 428, + "top_unresolved_keys_blocking_recipes": [ + { + "key": "egg", + "recipes_blocked": 125, + "fdc_id": 171287 + }, + { + "key": "canned_tomatoes", + "recipes_blocked": 103, + "fdc_id": 2709719 + }, + { + "key": "white_rice", + "recipes_blocked": 60, + "fdc_id": 2708422 + }, + { + "key": "chickpeas", + "recipes_blocked": 53, + "fdc_id": 173756 + }, + { + "key": "bread", + "recipes_blocked": 46, + "fdc_id": 2707598 + }, + { + "key": "chicken_stock", + "recipes_blocked": 43, + "fdc_id": null + }, + { + "key": "milk", + "recipes_blocked": 41, + "fdc_id": 171265 + }, + { + "key": "chicken_thigh", + "recipes_blocked": 41, + "fdc_id": 2706037 + }, + { + "key": "pasta_dried", + "recipes_blocked": 37, + "fdc_id": 2708357 + }, + { + "key": "parmesan", + "recipes_blocked": 31, + "fdc_id": 2705730 + }, + { + "key": "cheddar", + "recipes_blocked": 30, + "fdc_id": 2705709 + }, + { + "key": "white_beans", + "recipes_blocked": 29, + "fdc_id": 2707353 + }, + { + "key": "tofu", + "recipes_blocked": 29, + "fdc_id": 174291 + }, + { + "key": "ground_turmeric", + "recipes_blocked": 28, + "fdc_id": null + }, + { + "key": "parsley", + "recipes_blocked": 27, + "fdc_id": 2709796 + }, + { + "key": "chipotle", + "recipes_blocked": 27, + "fdc_id": 2705619 + }, + { + "key": "garam_masala", + "recipes_blocked": 26, + "fdc_id": null + }, + { + "key": "cheese", + "recipes_blocked": 26, + "fdc_id": 2705704 + }, + { + "key": "corn_tortillas", + "recipes_blocked": 25, + "fdc_id": 2707823 + }, + { + "key": "basil", + "recipes_blocked": 25, + "fdc_id": 2709780 + }, + { + "key": "vegetable_stock", + "recipes_blocked": 23, + "fdc_id": null + }, + { + "key": "avocado", + "recipes_blocked": 23, + "fdc_id": 171705 + }, + { + "key": "salmon", + "recipes_blocked": 21, + "fdc_id": 175167 + }, + { + "key": "pasta", + "recipes_blocked": 19, + "fdc_id": 2708357 + }, + { + "key": "tortillas", + "recipes_blocked": 19, + "fdc_id": 2707822 + }, + { + "key": "fish_sauce", + "recipes_blocked": 19, + "fdc_id": 174531 + }, + { + "key": "feta", + "recipes_blocked": 18, + "fdc_id": 2705714 + }, + { + "key": "yogurt", + "recipes_blocked": 18, + "fdc_id": 2705414 + }, + { + "key": "shrimp", + "recipes_blocked": 17, + "fdc_id": 174210 + }, + { + "key": "ground_ginger", + "recipes_blocked": 16, + "fdc_id": null + } + ], + "pantry_replay": { + "pantries": 200, + "size_range": [ + 12, + 25 + ], + "seed": 42, + "pool_size": 850, + "exact_missing_0_median": 0.0, + "exact_missing_0_p10": 0, + "exact_missing_0_p90": 1, + "at_most_2_missing_median": 68.0, + "at_most_2_missing_p10": 66, + "at_most_2_missing_p90": 85, + "original_rights_exact_missing_0_median": 0.0, + "original_rights_at_most_2_missing_median": 43.0 + } +} diff --git a/evaluation/catalog-reach/reach-before.md b/evaluation/catalog-reach/reach-before.md new file mode 100644 index 000000000..41783eb15 --- /dev/null +++ b/evaluation/catalog-reach/reach-before.md @@ -0,0 +1,53 @@ +# Catalog reach report + +- Vocabulary keys: **329**, resolvable **112** (legacy_id 0, fdc_id 112), unresolvable 217 +- Recipes: **763**, fully resolvable **70** (9.2%) +- Original-rights recipes: 461, fully resolvable **33** (7.2%) +- Recipes blocked by at least one unresolved required key: 693 +- Pantry replay (200 pantries of 12-25 ingredients, seed 42, pool 850): exact median **0.0** (p10 0, p90 1), at-most-2-missing median **68.0** (p10 66, p90 85) + +## Fully resolvable by cuisine + +| cuisine | fully resolvable | total | +|---|---|---| +| american | 10 | 161 | +| asian | 27 | 191 | +| indian | 3 | 76 | +| italian | 5 | 105 | +| mediterranean | 17 | 132 | +| mexican | 8 | 98 | + +## Top unresolved keys blocking recipes (30 shown) + +| key | recipes blocked | fdc_id | +|---|---|---| +| `egg` | 125 | 171287 | +| `canned_tomatoes` | 103 | 2709719 | +| `white_rice` | 60 | 2708422 | +| `chickpeas` | 53 | 173756 | +| `bread` | 46 | 2707598 | +| `chicken_stock` | 43 | None | +| `milk` | 41 | 171265 | +| `chicken_thigh` | 41 | 2706037 | +| `pasta_dried` | 37 | 2708357 | +| `parmesan` | 31 | 2705730 | +| `cheddar` | 30 | 2705709 | +| `white_beans` | 29 | 2707353 | +| `tofu` | 29 | 174291 | +| `ground_turmeric` | 28 | None | +| `parsley` | 27 | 2709796 | +| `chipotle` | 27 | 2705619 | +| `garam_masala` | 26 | None | +| `cheese` | 26 | 2705704 | +| `corn_tortillas` | 25 | 2707823 | +| `basil` | 25 | 2709780 | +| `vegetable_stock` | 23 | None | +| `avocado` | 23 | 171705 | +| `salmon` | 21 | 175167 | +| `pasta` | 19 | 2708357 | +| `tortillas` | 19 | 2707822 | +| `fish_sauce` | 19 | 174531 | +| `feta` | 18 | 2705714 | +| `yogurt` | 18 | 2705414 | +| `shrimp` | 17 | 174210 | +| `ground_ginger` | 16 | None | diff --git a/evaluation/catalog-reach/reach_report.py b/evaluation/catalog-reach/reach_report.py new file mode 100644 index 000000000..b5c090fdb --- /dev/null +++ b/evaluation/catalog-reach/reach_report.py @@ -0,0 +1,384 @@ +#!/usr/bin/env python3 +"""Catalog reach report: how much of the shipped recipe catalog a real kitchen can cook. + +Replays, in Python, the exact identity rules the iOS hydration-time bridge applies +(`RecipeCatalogIngredientBridge.rebuild`): + + 1. `legacy_id`, when the vocabulary row carries one and the app ingredient exists. + 2. Otherwise the key's `fdc_id` against the shipped USDA catalog row for that id: + the source row's exact name and its exact (lowercased) aliases, matched against + the app ingredient space. No similarity, no guessing: a miss leaves the key + unresolved, and every required line on an unresolved key counts as "not in your + kitchen" for every user. + +The app ingredient space is what first-launch hydration builds +(`BundledDataLoader.loadInto` → `loadUSDACatalogIngredientsIfAvailable`): the legacy +`data.json` ingredients (fixed integer ids, no aliases) plus every USDA catalog row +(id = fdc_id, aliases lowercased). Pantry replay draws uniformly from those rows — +the ingredient ids the scan and manual-add flows can actually produce. + +Outputs a JSON report (and a markdown summary) with: + - resolvable keys (total, by legacy_id, by fdc_id) + - fully resolvable recipes overall, by cuisine, and among original-rights recipes + - the unresolved keys that block the most recipes (top N) + - a pantry replay: 200 pantries of 12-25 ingredients (fixed seed), counting recipes + with 0 missing required lines (exact) and at most 2 (near-match tier), with medians. + +Usage: + python3 reach_report.py --repo-root /path/to/FridgeLuck --out reach.json [--md reach.md] +""" + +from __future__ import annotations + +import argparse +import json +import random +import sqlite3 +import statistics +from collections import Counter, defaultdict +from pathlib import Path +from typing import Any + +PANTRY_REPLAY_PANTRIES = 200 +PANTRY_REPLAY_MIN_SIZE = 12 +PANTRY_REPLAY_MAX_SIZE = 25 +PANTRY_REPLAY_SEED = 42 +BLOCKING_KEY_LIMIT = 30 +NEAR_MATCH_MAX_MISSING = 2 + + +def load_vocabulary(bundle: dict[str, Any]) -> list[dict[str, Any]]: + return bundle["ingredients"] + + +def load_recipes(bundle: dict[str, Any]) -> list[dict[str, Any]]: + return bundle["recipes"] + + +def load_usda_catalog(path: Path) -> tuple[dict[int, str], dict[int, list[str]]]: + """Shipped USDA source rows: fdc_id -> exact name, fdc_id -> lowercased aliases.""" + conn = sqlite3.connect(f"file:{path}?mode=ro", uri=True) + try: + names: dict[int, str] = {} + for fdc_id, name in conn.execute("SELECT fdc_id, display_name FROM ingredient_catalog"): + names[int(fdc_id)] = name + aliases: dict[int, list[str]] = defaultdict(list) + for ingredient_id, alias in conn.execute( + "SELECT ingredient_id, alias FROM ingredient_aliases WHERE alias <> ''" + ): + aliases[int(ingredient_id)].append(alias.lower()) + return names, dict(aliases) + finally: + conn.close() + + +def load_legacy_map(path: Path) -> tuple[dict[int, int], dict[int, list[int]]]: + """Legacy app ingredients from data.json: id -> name, id -> [] (data.json carries + no aliases; the alias table is USDA-hydrated only).""" + data = json.loads(path.read_text()) + ids: dict[int, int] = {} + names: dict[int, str] = {} + for id_string, raw in data["ingredients"].items(): + # IngredientArray: [name, calories, protein, carbs, fat, ...] + ingredient_id = int(id_string) + ids[ingredient_id] = ingredient_id + names[ingredient_id] = raw[0] if isinstance(raw, list) else raw["name"] + return ids, names + + +def build_app_ingredient_space( + legacy_names: dict[int, str], usda_names: dict[int, str], usda_aliases: dict[int, list[str]] +) -> tuple[dict[str, int], dict[str, set[int]]]: + """App `ingredients` (unique by name, first write wins: legacy before USDA) and + app `ingredient_aliases` (lowercased, USDA rows only).""" + ids_by_name: dict[str, int] = {} + for ingredient_id, name in sorted(legacy_names.items()): + ids_by_name.setdefault(name, ingredient_id) + for fdc_id, name in sorted(usda_names.items()): + ids_by_name.setdefault(name, fdc_id) + ids_by_alias: dict[str, set[int]] = defaultdict(set) + for fdc_id, alias_list in usda_aliases.items(): + if fdc_id not in usda_names: + continue + for alias in alias_list: + ids_by_alias[alias].add(fdc_id) + return ids_by_name, dict(ids_by_alias) + + +def build_resolver( + vocabulary: list[dict[str, Any]], + legacy_names: dict[int, str], + usda_names: dict[int, str], + usda_aliases: dict[int, list[str]], + ids_by_name: dict[str, int], + ids_by_alias: dict[str, set[int]], +) -> tuple[dict[str, set[int]], dict[str, str]]: + """Exact bridge replay per key: resolved app ids and the rule that resolved it.""" + app_ids = set(legacy_names) | set(usda_names) + resolved: dict[str, set[int]] = {} + resolved_by: dict[str, str] = {} + for row in vocabulary: + key = row["key"] + legacy_id = row.get("legacy_id") + fdc_id = row.get("fdc_id") + ids: set[int] = set() + by = "" + if legacy_id is not None and int(legacy_id) in app_ids: + ids.add(int(legacy_id)) + by = "legacy_id" + elif fdc_id is not None: + fdc_id = int(fdc_id) + source_name = usda_names.get(fdc_id) + if source_name is not None and source_name in ids_by_name: + ids.add(ids_by_name[source_name]) + for alias in usda_aliases.get(fdc_id, []): + ids |= ids_by_alias.get(alias, set()) + if ids: + by = "fdc_id" + if ids: + resolved[key] = ids + resolved_by[key] = by + return resolved, resolved_by + + +def required_lines(recipe: dict[str, Any]) -> list[dict[str, Any]]: + """Required lines that can block a match: assumed staples never do.""" + return [ + line + for line in recipe["ingredients"] + if line.get("required", True) and not line.get("assumed_staple", False) + ] + + +def unresolved_key_blocks(vocabulary, recipes, resolved) -> Counter: + """For each unresolved key, how many recipes carry it on a required line.""" + blocks: Counter = Counter() + for recipe in recipes: + for line in required_lines(recipe): + if line["key"] not in resolved: + blocks[line["key"]] += 1 + return blocks + + +def pantry_replay( + recipes: list[dict[str, Any]], + resolved: dict[str, set[int]], + pantry_pool: list[int], + rights_by_catalog_id: dict[str, str], +) -> dict[str, Any]: + """200 pantries of 12-25 items, fixed seed. Counts recipes reachable with 0 and + at most 2 missing required lines per pantry, with medians across pantries.""" + rng = random.Random(PANTRY_REPLAY_SEED) + per_recipe_lines = [] + for recipe in recipes: + lines = [ + resolved.get(line["key"], set()) # unresolved key -> never in the pantry + for line in required_lines(recipe) + ] + per_recipe_lines.append((recipe["catalog_id"], lines)) + + exact_counts: list[int] = [] + near_counts: list[int] = [] + original_exact_counts: list[int] = [] + original_near_counts: list[int] = [] + for _ in range(PANTRY_REPLAY_PANTRIES): + pantry = set(rng.sample(pantry_pool, rng.randint(PANTRY_REPLAY_MIN_SIZE, PANTRY_REPLAY_MAX_SIZE))) + exact = 0 + near = 0 + original_exact = 0 + original_near = 0 + for catalog_id, lines in per_recipe_lines: + if not lines: + continue # no required non-staple lines: the engine never surfaces it + missing = sum(1 for ids in lines if not ids & pantry) + if missing > NEAR_MATCH_MAX_MISSING: + continue + near += 1 + if missing == 0: + exact += 1 + if rights_by_catalog_id.get(catalog_id) == "original": + original_near += 1 + if missing == 0: + original_exact += 1 + exact_counts.append(exact) + near_counts.append(near) + original_exact_counts.append(original_exact) + original_near_counts.append(original_near) + + return { + "pantries": PANTRY_REPLAY_PANTRIES, + "size_range": [PANTRY_REPLAY_MIN_SIZE, PANTRY_REPLAY_MAX_SIZE], + "seed": PANTRY_REPLAY_SEED, + "pool_size": len(pantry_pool), + "exact_missing_0_median": statistics.median(exact_counts), + "exact_missing_0_p10": sorted(exact_counts)[PANTRY_REPLAY_PANTRIES // 10], + "exact_missing_0_p90": sorted(exact_counts)[PANTRY_REPLAY_PANTRIES * 9 // 10], + "at_most_2_missing_median": statistics.median(near_counts), + "at_most_2_missing_p10": sorted(near_counts)[PANTRY_REPLAY_PANTRIES // 10], + "at_most_2_missing_p90": sorted(near_counts)[PANTRY_REPLAY_PANTRIES * 9 // 10], + "original_rights_exact_missing_0_median": statistics.median(original_exact_counts), + "original_rights_at_most_2_missing_median": statistics.median(original_near_counts), + } + + +def build_report(repo_root: Path) -> dict[str, Any]: + bundle_path = repo_root / "apps/ios/Resources/RecipeCatalog/recipes-v2.json" + usda_path = repo_root / "apps/ios/Resources/usda_ingredient_catalog.sqlite" + data_json_path = repo_root / "apps/ios/Resources/data.json" + + bundle = json.loads(bundle_path.read_text()) + vocabulary = load_vocabulary(bundle) + recipes = load_recipes(bundle) + + usda_names, usda_aliases = load_usda_catalog(usda_path) + legacy_ids, legacy_names = load_legacy_map(data_json_path) + ids_by_name, ids_by_alias = build_app_ingredient_space(legacy_names, usda_names, usda_aliases) + + resolved, resolved_by = build_resolver( + vocabulary, legacy_ids, usda_names, usda_aliases, ids_by_name, ids_by_alias + ) + + rights = {recipe["catalog_id"]: recipe.get("rights", {}).get("status", "") for recipe in recipes} + + keys_total = len(vocabulary) + resolvable = len(resolved) + resolvable_by_legacy = sum(1 for by in resolved_by.values() if by == "legacy_id") + resolvable_by_fdc = sum(1 for by in resolved_by.values() if by == "fdc_id") + + unreachable_no_required = 0 + fully_resolvable_by_cuisine: Counter = Counter() + total_by_cuisine: Counter = Counter() + fully_resolvable = 0 + fully_resolvable_original = 0 + original_total = sum(1 for status in rights.values() if status == "original") + blocked_recipes = 0 + blocked_original = 0 + for recipe in recipes: + cuisine = recipe.get("cuisine", "") + total_by_cuisine[cuisine] += 1 + lines = required_lines(recipe) + ok = bool(lines) and all(line["key"] in resolved for line in lines) + if not lines: + unreachable_no_required += 1 + if ok: + fully_resolvable += 1 + fully_resolvable_by_cuisine[cuisine] += 1 + if rights.get(recipe["catalog_id"]) == "original": + fully_resolvable_original += 1 + elif lines: + blocked_recipes += 1 + if rights.get(recipe["catalog_id"]) == "original": + blocked_original += 1 + + blocks = unresolved_key_blocks(vocabulary, recipes, resolved) + top_blocks = [ + { + "key": key, + "recipes_blocked": count, + "fdc_id": next( + (row.get("fdc_id") for row in vocabulary if row["key"] == key), None + ), + } + for key, count in blocks.most_common(BLOCKING_KEY_LIMIT) + ] + + pantry_pool = sorted(set(legacy_ids) | set(usda_names)) + replay = pantry_replay(recipes, resolved, pantry_pool, rights) + + return { + "bundle_version": bundle.get("bundle_version"), + "generated_at": bundle.get("generated_at"), + "vocabulary_keys": keys_total, + "resolvable_keys": resolvable, + "resolvable_by_legacy_id": resolvable_by_legacy, + "resolvable_by_fdc_id": resolvable_by_fdc, + "unresolvable_keys": keys_total - resolvable, + "recipes_total": len(recipes), + "recipes_with_no_required_lines": unreachable_no_required, + "fully_resolvable_recipes": fully_resolvable, + "fully_resolvable_share": round(fully_resolvable / len(recipes), 4), + "fully_resolvable_by_cuisine": { + cuisine: fully_resolvable_by_cuisine.get(cuisine, 0) + for cuisine in sorted(total_by_cuisine) + }, + "recipes_by_cuisine": dict(sorted(total_by_cuisine.items())), + "original_rights_recipes": original_total, + "fully_resolvable_original_rights_recipes": fully_resolvable_original, + "fully_resolvable_original_rights_share": round( + fully_resolvable_original / original_total, 4 + ) + if original_total + else 0, + "blocked_by_unresolved_key_recipes": blocked_recipes, + "blocked_by_unresolved_key_original_rights_recipes": blocked_original, + "top_unresolved_keys_blocking_recipes": top_blocks, + "pantry_replay": replay, + } + + +def render_markdown(report: dict[str, Any]) -> str: + replay = report["pantry_replay"] + lines = [ + "# Catalog reach report", + "", + f"- Vocabulary keys: **{report['vocabulary_keys']}**, resolvable " + f"**{report['resolvable_keys']}** " + f"(legacy_id {report['resolvable_by_legacy_id']}, fdc_id {report['resolvable_by_fdc_id']}), " + f"unresolvable {report['unresolvable_keys']}", + f"- Recipes: **{report['recipes_total']}**, fully resolvable " + f"**{report['fully_resolvable_recipes']}** ({report['fully_resolvable_share']:.1%})", + f"- Original-rights recipes: {report['original_rights_recipes']}, fully resolvable " + f"**{report['fully_resolvable_original_rights_recipes']}** " + f"({report['fully_resolvable_original_rights_share']:.1%})", + f"- Recipes blocked by at least one unresolved required key: " + f"{report['blocked_by_unresolved_key_recipes']}", + f"- Pantry replay ({replay['pantries']} pantries of {replay['size_range'][0]}-" + f"{replay['size_range'][1]} ingredients, seed {replay['seed']}, pool " + f"{replay['pool_size']}): exact median **{replay['exact_missing_0_median']}** " + f"(p10 {replay['exact_missing_0_p10']}, p90 {replay['exact_missing_0_p90']}), " + f"at-most-2-missing median **{replay['at_most_2_missing_median']}** " + f"(p10 {replay['at_most_2_missing_p10']}, p90 {replay['at_most_2_missing_p90']})", + "", + "## Fully resolvable by cuisine", + "", + "| cuisine | fully resolvable | total |", + "|---|---|---|", + ] + for cuisine in sorted(report["recipes_by_cuisine"]): + lines.append( + f"| {cuisine} | {report['fully_resolvable_by_cuisine'][cuisine]} " + f"| {report['recipes_by_cuisine'][cuisine]} |" + ) + lines += [ + "", + f"## Top unresolved keys blocking recipes ({BLOCKING_KEY_LIMIT} shown)", + "", + "| key | recipes blocked | fdc_id |", + "|---|---|---|", + ] + for entry in report["top_unresolved_keys_blocking_recipes"]: + lines.append(f"| `{entry['key']}` | {entry['recipes_blocked']} | {entry['fdc_id']} |") + return "\n".join(lines) + "\n" + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--repo-root", type=Path, default=Path(__file__).resolve().parents[2]) + parser.add_argument("--out", type=Path, required=True, help="JSON report output path") + parser.add_argument("--md", type=Path, help="Optional markdown summary output path") + args = parser.parse_args() + + report = build_report(args.repo_root) + args.out.parent.mkdir(parents=True, exist_ok=True) + args.out.write_text(json.dumps(report, indent=2) + "\n") + if args.md: + args.md.write_text(render_markdown(report)) + print( + f"resolvable keys {report['resolvable_keys']}/{report['vocabulary_keys']}, " + f"fully resolvable recipes {report['fully_resolvable_recipes']}/{report['recipes_total']} " + f"({report['fully_resolvable_share']:.1%})" + ) + + +if __name__ == "__main__": + main() From aa3b5c0d00ef11a1924b0f46c3dbfb0a3a14fee3 Mon Sep 17 00:00:00 2001 From: Obvious Date: Thu, 15 Oct 2026 22:05:11 +0000 Subject: [PATCH 5/7] feat(data): add 150 missing FDC catalog rows and rebuild the USDA catalog Adds the FDC rows the bundle-v2 vocabulary references but the canonical catalog lacked: 116 distinct ids against the pre-merge bundle plus 34 more after merging PR #168's resolved vocabulary (950 records total). Every row comes from the public FDC bulk downloads (Foundation / SR Legacy / FNDDS, CC0): exact description as display name, per-100 g macros from the row's food_nutrient entries, vocab-category-driven category labels, USDA provenance in source_meta. Survey (FNDDS) rows use legacy nutrient ids (208/203/...), so the extractor falls back to them. Macro freeze verified: zero existing rows changed. Shipped sqlite rebuilt; static Swift regenerated from the committed compact JSON (fixes pre-existing drift: shipped file predated the compact JSON's matchedCount 15 -> 49 update). Co-authored-by: obvious-autobuild[bot] <262744130+obvious-autobuild[bot]@users.noreply.github.com> --- .../USDAIngredientNutritionStaticData.swift | 1021 ++-- .../Resources/usda_ingredient_catalog.sqlite | Bin 1830912 -> 2011136 bytes .../catalog/usda_curated_ingredients.json | 4234 ++++++++++++++++- scripts/data/import_missing_fdc_rows.py | 369 ++ 4 files changed, 4871 insertions(+), 753 deletions(-) create mode 100644 scripts/data/import_missing_fdc_rows.py diff --git a/apps/ios/Platform/Persistence/Static/USDAIngredientNutritionStaticData.swift b/apps/ios/Platform/Persistence/Static/USDAIngredientNutritionStaticData.swift index db1c1f003..a8a4bec74 100644 --- a/apps/ios/Platform/Persistence/Static/USDAIngredientNutritionStaticData.swift +++ b/apps/ios/Platform/Persistence/Static/USDAIngredientNutritionStaticData.swift @@ -27,10 +27,10 @@ struct USDAIngredientNutritionRecord: Identifiable, Sendable { } enum USDAIngredientNutritionStaticData { - static let source = "USDA FoodData Central API (usda-fdc client)" - static let generatedAtUTC = "2026-02-10T05:33:27Z" + static let source = "USDA FoodData Central API (catalog bootstrap + targeted fallback)" + static let generatedAtUTC = "2026-02-11T05:07:06Z" static let ingredientCount = 50 - static let matchedCount = 15 + static let matchedCount = 49 static let records: [USDAIngredientNutritionRecord] = [ USDAIngredientNutritionRecord( @@ -38,19 +38,19 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "1", ingredientName: "egg", queryUsed: "egg", - matchedFdcId: 323604, - matchedDescription: "Egg, whole, raw, frozen, pasteurized", - matchedDataType: "Foundation", + matchedFdcId: 170893, + matchedDescription: "Egg, whole, raw, frozen, salted, pasteurized", + matchedDataType: "SR Legacy", matchedFoodCategory: "Dairy and Egg Products", - matchScore: 0.287, - calories: 150, - proteinG: 12.3, - carbsG: 0.91, - fatG: 10.3, + matchScore: 0.7152, + calories: 138, + proteinG: 10.97, + carbsG: 0.83, + fatG: 10.07, fiberG: 0, - sugarG: 0, - sodiumG: 121, - source: "USDA FoodData Central API (usda-fdc client)", + sugarG: 0.07, + sodiumG: 3.663, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -58,39 +58,39 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "2", ingredientName: "rice", queryUsed: "rice", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 168878, + matchedDescription: "Rice, white, long-grain, regular, enriched, cooked", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Cereal Grains and Pasta", + matchScore: -0.2703, calories: 130, - proteinG: 2.7, - carbsG: 28, - fatG: 0.3, + proteinG: 2.69, + carbsG: 28.17, + fatG: 0.28, fiberG: 0.4, - sugarG: 0, + sugarG: 0.05, sodiumG: 0.001, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 3, ingredientKey: "3", ingredientName: "soy sauce", queryUsed: "soy sauce", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, - calories: 53, - proteinG: 8.1, - carbsG: 4.9, + matchedFdcId: 170949, + matchedDescription: "Babyfood, fruit, applesauce and cherries, strained", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Baby Foods", + matchScore: 4.2657, + calories: 51, + proteinG: 0, + carbsG: 14.1, fatG: 0, - fiberG: 0, - sugarG: 0.4, - sodiumG: 5.493, - source: "Local bundled data fallback", + fiberG: 1.1, + sugarG: 10.81, + sodiumG: 0.001, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -98,20 +98,19 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "4", ingredientName: "chicken breast", queryUsed: "chicken breast", - matchedFdcId: 331960, - matchedDescription: - "Chicken, broiler or fryers, breast, skinless, boneless, meat only, cooked, braised", - matchedDataType: "Foundation", + matchedFdcId: 171140, + matchedDescription: "Chicken, broiler or fryers, breast, skinless, boneless, meat only, cooked, braised", + matchedDataType: "SR Legacy", matchedFoodCategory: "Poultry Products", - matchScore: 0.0523, - calories: 166, - proteinG: 32.1, + matchScore: -0.0215, + calories: 157, + proteinG: 32.06, carbsG: 0, fatG: 3.24, fiberG: 0, sugarG: 0, - sodiumG: 47, - source: "USDA FoodData Central API (usda-fdc client)", + sodiumG: 0.047, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -119,19 +118,19 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "5", ingredientName: "onion", queryUsed: "onion", - matchedFdcId: 790577, - matchedDescription: "Onions, red, raw", - matchedDataType: "Foundation", + matchedFdcId: 170000, + matchedDescription: "Onions, raw", + matchedDataType: "SR Legacy", matchedFoodCategory: "Vegetables and Vegetable Products", - matchScore: 0.3816, - calories: 44, - proteinG: 0.94, - carbsG: 9.93, + matchScore: -0.0957, + calories: 40, + proteinG: 1.1, + carbsG: 9.34, fatG: 0.1, - fiberG: 2.2, - sugarG: 0, - sodiumG: 1, - source: "USDA FoodData Central API (usda-fdc client)", + fiberG: 1.7, + sugarG: 4.24, + sodiumG: 0.004, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -139,19 +138,19 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "6", ingredientName: "garlic", queryUsed: "garlic", - matchedFdcId: 1_104_647, + matchedFdcId: 169230, matchedDescription: "Garlic, raw", - matchedDataType: "Foundation", + matchedDataType: "SR Legacy", matchedFoodCategory: "Vegetables and Vegetable Products", - matchScore: 0.3221, - calories: 143, - proteinG: 6.62, - carbsG: 28.2, - fatG: 0.38, - fiberG: 2.7, - sugarG: 0, - sodiumG: 0, - source: "USDA FoodData Central API (usda-fdc client)", + matchScore: -0.0925, + calories: 149, + proteinG: 6.36, + carbsG: 33.06, + fatG: 0.5, + fiberG: 2.1, + sugarG: 1, + sodiumG: 0.017, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -159,119 +158,119 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "7", ingredientName: "tomato", queryUsed: "tomato", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 170457, + matchedDescription: "Tomatoes, red, ripe, raw, year round average", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Vegetables and Vegetable Products", + matchScore: -0.0774, calories: 18, - proteinG: 0.9, - carbsG: 3.9, + proteinG: 0.88, + carbsG: 3.89, fatG: 0.2, fiberG: 1.2, - sugarG: 2.6, + sugarG: 2.63, sodiumG: 0.005, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 8, ingredientKey: "8", ingredientName: "bell pepper", queryUsed: "bell pepper", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, - calories: 31, - proteinG: 1, - carbsG: 6, + matchedFdcId: 170108, + matchedDescription: "Peppers, sweet, red, raw", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Vegetables and Vegetable Products", + matchScore: 1.1488, + calories: 26, + proteinG: 0.99, + carbsG: 6.03, fatG: 0.3, fiberG: 2.1, sugarG: 4.2, sodiumG: 0.004, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 9, ingredientKey: "9", ingredientName: "pasta", - queryUsed: "pasta cooked", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + queryUsed: "pasta", + matchedFdcId: 169728, + matchedDescription: "Pasta, fresh-refrigerated, plain, cooked", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Cereal Grains and Pasta", + matchScore: 0.7274, calories: 131, - proteinG: 5, - carbsG: 25, - fatG: 1.1, - fiberG: 1.8, - sugarG: 0.6, - sodiumG: 0.001, - source: "Local bundled data fallback", - error: "HTTP Error 404: Not Found" + proteinG: 5.15, + carbsG: 24.93, + fatG: 1.05, + fiberG: 0, + sugarG: 0, + sodiumG: 0.006, + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 10, ingredientKey: "10", ingredientName: "potato", queryUsed: "potato", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 170026, + matchedDescription: "Potatoes, flesh and skin, raw", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Vegetables and Vegetable Products", + matchScore: -0.0376, calories: 77, - proteinG: 2, - carbsG: 17, - fatG: 0.1, - fiberG: 2.2, - sugarG: 0.8, + proteinG: 2.05, + carbsG: 17.49, + fatG: 0.09, + fiberG: 2.1, + sugarG: 0.82, sodiumG: 0.006, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 11, ingredientKey: "11", ingredientName: "carrot", queryUsed: "carrot", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 170393, + matchedDescription: "Carrots, raw", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Vegetables and Vegetable Products", + matchScore: -0.0279, calories: 41, - proteinG: 0.9, - carbsG: 9.6, - fatG: 0.2, + proteinG: 0.93, + carbsG: 9.58, + fatG: 0.24, fiberG: 2.8, - sugarG: 4.7, + sugarG: 4.74, sodiumG: 0.069, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 12, ingredientKey: "12", ingredientName: "cheese", queryUsed: "cheese", - matchedFdcId: 167705, - matchedDescription: "Cheese, parmesan, low sodium", + matchedFdcId: 170843, + matchedDescription: "Cheese, fontina", matchedDataType: "SR Legacy", matchedFoodCategory: "Dairy and Egg Products", - matchScore: 1.4648, - calories: 451, - proteinG: 41.6, - carbsG: 3.7, - fatG: 29.99, + matchScore: 0.2381, + calories: 389, + proteinG: 25.6, + carbsG: 1.55, + fatG: 31.14, fiberG: 0, - sugarG: 0.85, - sodiumG: 63, - source: "USDA FoodData Central API (usda-fdc client)", + sugarG: 1.55, + sodiumG: 0.8, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -279,59 +278,59 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "13", ingredientName: "milk", queryUsed: "milk", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 170872, + matchedDescription: "Milk, lowfat, fluid, 1% milkfat, with added vitamin A and vitamin D", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Dairy and Egg Products", + matchScore: -0.0592, calories: 42, - proteinG: 3.4, - carbsG: 5, - fatG: 1, + proteinG: 3.37, + carbsG: 4.99, + fatG: 0.97, fiberG: 0, - sugarG: 5, + sugarG: 5.2, sodiumG: 0.044, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 14, ingredientKey: "14", ingredientName: "butter", queryUsed: "butter", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, - calories: 717, + matchedFdcId: 169052, + matchedDescription: "Margarine-like, butter-margarine blend, 80% fat, stick, without salt", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Fats and Oils", + matchScore: 0.4079, + calories: 718, proteinG: 0.9, - carbsG: 0.1, - fatG: 81, + carbsG: 0.6, + fatG: 80.7, fiberG: 0, - sugarG: 0.1, - sodiumG: 0.011, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + sugarG: 0, + sodiumG: 0.028, + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 15, ingredientKey: "15", ingredientName: "bread", queryUsed: "bread", - matchedFdcId: 167532, - matchedDescription: "Bread, white wheat", + matchedFdcId: 167943, + matchedDescription: "Bread, potato", matchedDataType: "SR Legacy", matchedFoodCategory: "Baked Products", - matchScore: 0.8559, - calories: 238, - proteinG: 10.66, - carbsG: 43.91, - fatG: 2.15, - fiberG: 9.2, - sugarG: 5, - sodiumG: 478, - source: "USDA FoodData Central API (usda-fdc client)", + matchScore: 0.2205, + calories: 266, + proteinG: 12.5, + carbsG: 47.07, + fatG: 3.13, + fiberG: 6.3, + sugarG: 9.38, + sodiumG: 0.375, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -339,20 +338,20 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "16", ingredientName: "olive oil", queryUsed: "olive oil", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 167737, + matchedDescription: "Oil, corn, peanut, and olive", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Fats and Oils", + matchScore: -0.2, calories: 884, proteinG: 0, carbsG: 0, fatG: 100, fiberG: 0, sugarG: 0, - sodiumG: 0.002, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + sodiumG: 0, + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 17, @@ -362,16 +361,16 @@ enum USDAIngredientNutritionStaticData { matchedFdcId: 167746, matchedDescription: "Lemons, raw, without peel", matchedDataType: "SR Legacy", - matchedFoodCategory: "Fruits and Fruit Juices", - matchScore: 0.0021, + matchedFoodCategory: "", + matchScore: -0.0979, calories: 29, proteinG: 1.1, carbsG: 9.32, fatG: 0.3, fiberG: 2.8, sugarG: 2.5, - sodiumG: 2, - source: "USDA FoodData Central API (usda-fdc client)", + sodiumG: 0.002, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -379,59 +378,59 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "18", ingredientName: "mushroom", queryUsed: "mushroom", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 169251, + matchedDescription: "Mushrooms, white, raw", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Vegetables and Vegetable Products", + matchScore: -0.0447, calories: 22, - proteinG: 3.1, - carbsG: 3.3, - fatG: 0.3, + proteinG: 3.09, + carbsG: 3.26, + fatG: 0.34, fiberG: 1, - sugarG: 2, + sugarG: 1.98, sodiumG: 0.005, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 19, ingredientKey: "19", ingredientName: "spinach", queryUsed: "spinach", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 168462, + matchedDescription: "Spinach, raw", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Vegetables and Vegetable Products", + matchScore: -0.0679, calories: 23, - proteinG: 2.9, - carbsG: 3.6, - fatG: 0.4, + proteinG: 2.86, + carbsG: 3.63, + fatG: 0.39, fiberG: 2.2, - sugarG: 0.4, + sugarG: 0.42, sodiumG: 0.079, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 20, ingredientKey: "20", ingredientName: "banana", queryUsed: "banana", - matchedFdcId: 1_105_314, - matchedDescription: "Bananas, ripe and slightly ripe, raw", - matchedDataType: "Foundation", + matchedFdcId: 167764, + matchedDescription: "Fruit salad, (pineapple and papaya and banana and guava), tropical, canned, heavy syrup, solids and liquids", + matchedDataType: "SR Legacy", matchedFoodCategory: "Fruits and Fruit Juices", - matchScore: 0.4934, - calories: 97, - proteinG: 0.74, - carbsG: 23, - fatG: 0.29, - fiberG: 1.7, + matchScore: 0.8477, + calories: 86, + proteinG: 0.41, + carbsG: 22.36, + fatG: 0.1, + fiberG: 1.3, sugarG: 0, - sodiumG: 0, - source: "USDA FoodData Central API (usda-fdc client)", + sodiumG: 0.002, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -439,19 +438,19 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "21", ingredientName: "green onion", queryUsed: "green onion", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 170005, + matchedDescription: "Onions, spring or scallions (includes tops and bulb), raw", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Vegetables and Vegetable Products", + matchScore: 0.6818, calories: 32, - proteinG: 1.8, - carbsG: 7.3, - fatG: 0.2, + proteinG: 1.83, + carbsG: 7.34, + fatG: 0.19, fiberG: 2.6, - sugarG: 2.3, + sugarG: 2.33, sodiumG: 0.016, - source: "Local bundled data fallback", + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -459,11 +458,11 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "22", ingredientName: "sesame oil", queryUsed: "sesame oil", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 171016, + matchedDescription: "Oil, sesame, salad or cooking", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Fats and Oils", + matchScore: -0.2, calories: 884, proteinG: 0, carbsG: 0, @@ -471,7 +470,7 @@ enum USDAIngredientNutritionStaticData { fiberG: 0, sugarG: 0, sodiumG: 0, - source: "Local bundled data fallback", + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -479,19 +478,19 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "23", ingredientName: "tofu", queryUsed: "tofu", - matchedFdcId: 172461, - matchedDescription: "MORI-NU, Tofu, silken, firm", + matchedFdcId: 167722, + matchedDescription: "Tofu yogurt", matchedDataType: "SR Legacy", matchedFoodCategory: "Legumes and Legume Products", - matchScore: 1.336, - calories: 62, - proteinG: 6.9, - carbsG: 2.4, - fatG: 2.7, - fiberG: 0.1, - sugarG: 1.27, - sodiumG: 36, - source: "USDA FoodData Central API (usda-fdc client)", + matchScore: 2.5429, + calories: 94, + proteinG: 3.5, + carbsG: 15.96, + fatG: 1.8, + fiberG: 0.2, + sugarG: 1.24, + sodiumG: 0.035, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -499,19 +498,19 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "24", ingredientName: "broccoli", queryUsed: "broccoli", - matchedFdcId: 168510, - matchedDescription: "Broccoli, cooked, boiled, drained, with salt", + matchedFdcId: 170379, + matchedDescription: "Broccoli, raw", matchedDataType: "SR Legacy", matchedFoodCategory: "Vegetables and Vegetable Products", - matchScore: 0.2708, - calories: 35, - proteinG: 2.38, - carbsG: 7.18, - fatG: 0.41, - fiberG: 3.3, - sugarG: 1.39, - sodiumG: 262, - source: "USDA FoodData Central API (usda-fdc client)", + matchScore: -0.0115, + calories: 34, + proteinG: 2.82, + carbsG: 6.64, + fatG: 0.37, + fiberG: 2.6, + sugarG: 1.7, + sodiumG: 0.033, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -519,20 +518,20 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "25", ingredientName: "cucumber", queryUsed: "cucumber", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 168409, + matchedDescription: "Cucumber, with peel, raw", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Vegetables and Vegetable Products", + matchScore: -0.0317, calories: 15, - proteinG: 0.7, - carbsG: 3.6, - fatG: 0.1, + proteinG: 0.65, + carbsG: 3.63, + fatG: 0.11, fiberG: 0.5, - sugarG: 1.7, + sugarG: 1.67, sodiumG: 0.002, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 26, @@ -559,19 +558,19 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "27", ingredientName: "black beans", queryUsed: "black beans", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 168404, + matchedDescription: "Cowpeas (blackeyes), immature seeds, frozen, cooked, boiled, drained, without salt", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Vegetables and Vegetable Products", + matchScore: 2.6086, calories: 132, - proteinG: 8.9, - carbsG: 23.7, - fatG: 0.5, - fiberG: 8.7, - sugarG: 0.3, - sodiumG: 0.001, - source: "Local bundled data fallback", + proteinG: 8.49, + carbsG: 23.76, + fatG: 0.66, + fiberG: 6.4, + sugarG: 4.46, + sodiumG: 0.005, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -579,20 +578,20 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "28", ingredientName: "tortilla", queryUsed: "tortilla", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, - calories: 306, - proteinG: 8.1, - carbsG: 50.5, - fatG: 7.9, - fiberG: 3.5, - sugarG: 3, - sodiumG: 0.618, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + matchedFdcId: 167535, + matchedDescription: "Tortillas, ready-to-bake or -fry, flour, shelf stable", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Baked Products", + matchScore: 0.0642, + calories: 297, + proteinG: 8.01, + carbsG: 49.27, + fatG: 7.58, + fiberG: 2.4, + sugarG: 2.66, + sodiumG: 0.742, + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 29, @@ -602,16 +601,16 @@ enum USDAIngredientNutritionStaticData { matchedFdcId: 168155, matchedDescription: "Limes, raw", matchedDataType: "SR Legacy", - matchedFoodCategory: "Fruits and Fruit Juices", - matchScore: 0.0038, + matchedFoodCategory: "", + matchScore: -0.1, calories: 30, proteinG: 0.7, - carbsG: 10.54, + carbsG: 10.5, fatG: 0.2, fiberG: 2.8, sugarG: 1.69, - sodiumG: 2, - source: "USDA FoodData Central API (usda-fdc client)", + sodiumG: 0.002, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -622,57 +621,57 @@ enum USDAIngredientNutritionStaticData { matchedFdcId: 169231, matchedDescription: "Ginger root, raw", matchedDataType: "SR Legacy", - matchedFoodCategory: "Vegetables and Vegetable Products", - matchScore: 0.0627, + matchedFoodCategory: "", + matchScore: -0.039, calories: 80, proteinG: 1.82, - carbsG: 17.77, + carbsG: 17.8, fatG: 0.75, fiberG: 2, sugarG: 1.7, - sodiumG: 13, - source: "USDA FoodData Central API (usda-fdc client)", + sodiumG: 0.013, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( ingredientId: 31, ingredientKey: "31", ingredientName: "oats", - queryUsed: "rolled oats", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + queryUsed: "oats", + matchedFdcId: 169705, + matchedDescription: "Oats (Includes foods for USDA's Food Distribution Program)", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Cereal Grains and Pasta", + matchScore: 1.601, calories: 389, - proteinG: 16.9, - carbsG: 66.3, + proteinG: 16.89, + carbsG: 66.27, fatG: 6.9, fiberG: 10.6, sugarG: 0, sodiumG: 0.002, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 32, ingredientKey: "32", ingredientName: "yogurt", queryUsed: "yogurt", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 170894, + matchedDescription: "Yogurt, Greek, plain, nonfat (Includes foods for USDA's Food Distribution Program)", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Dairy and Egg Products", + matchScore: -0.0714, calories: 59, - proteinG: 10, + proteinG: 10.19, carbsG: 3.6, - fatG: 0.4, + fatG: 0.39, fiberG: 0, - sugarG: 3.2, + sugarG: 3.24, sodiumG: 0.036, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 33, @@ -682,16 +681,16 @@ enum USDAIngredientNutritionStaticData { matchedFdcId: 169640, matchedDescription: "Honey", matchedDataType: "SR Legacy", - matchedFoodCategory: "Sweets", - matchScore: 0, + matchedFoodCategory: "", + matchScore: -0.1, calories: 304, proteinG: 0.3, carbsG: 82.4, fatG: 0, fiberG: 0.2, - sugarG: 82.12, - sodiumG: 4, - source: "USDA FoodData Central API (usda-fdc client)", + sugarG: 82.1, + sodiumG: 0.004, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -699,99 +698,99 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "34", ingredientName: "corn", queryUsed: "corn", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 168538, + matchedDescription: "Corn, sweet, white, raw", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Vegetables and Vegetable Products", + matchScore: -0.058, calories: 86, - proteinG: 3.3, - carbsG: 19, - fatG: 1.2, + proteinG: 3.22, + carbsG: 19.02, + fatG: 1.18, fiberG: 2.7, - sugarG: 3.2, + sugarG: 3.22, sodiumG: 0.015, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 35, ingredientKey: "35", ingredientName: "chickpea", - queryUsed: "chickpeas canned", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, - calories: 164, - proteinG: 8.9, - carbsG: 27.4, - fatG: 2.6, - fiberG: 7.6, - sugarG: 4.8, - sodiumG: 0.007, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + queryUsed: "chickpea", + matchedFdcId: 168916, + matchedDescription: "Pasta, whole grain, 51% whole wheat, remaining unenriched semolina, cooked", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Cereal Grains and Pasta", + matchScore: 4.341, + calories: 159, + proteinG: 5.82, + carbsG: 31.51, + fatG: 1.5, + fiberG: 4.6, + sugarG: 0.85, + sodiumG: 0.006, + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 36, ingredientKey: "36", ingredientName: "salmon", queryUsed: "salmon", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, - calories: 208, - proteinG: 20.4, + matchedFdcId: 167647, + matchedDescription: "Fish, salmon, king, with skin, kippered, (Alaska Native)", + matchedDataType: "SR Legacy", + matchedFoodCategory: "American Indian/Alaska Native Foods", + matchScore: 0.9682, + calories: 209, + proteinG: 23.19, carbsG: 0, - fatG: 13.4, + fatG: 12.95, fiberG: 0, sugarG: 0, - sodiumG: 0.059, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + sodiumG: 0.87, + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 37, ingredientKey: "37", ingredientName: "sweet potato", queryUsed: "sweet potato", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, - calories: 86, - proteinG: 1.6, - carbsG: 20.1, - fatG: 0.1, - fiberG: 3, - sugarG: 4.2, + matchedFdcId: 168483, + matchedDescription: "Sweet potato, cooked, baked in skin, flesh, without salt", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Vegetables and Vegetable Products", + matchScore: 0.1168, + calories: 90, + proteinG: 2.01, + carbsG: 20.71, + fatG: 0.15, + fiberG: 3.3, + sugarG: 6.48, sodiumG: 0.036, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 38, ingredientKey: "38", ingredientName: "ground beef", queryUsed: "ground beef", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, - calories: 254, - proteinG: 17.2, + matchedFdcId: 168651, + matchedDescription: "Beef, ground, 70% lean meat / 30% fat, patty, cooked, broiled", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Beef Products", + matchScore: 1.0884, + calories: 277, + proteinG: 25.38, carbsG: 0, - fatG: 20, + fatG: 18.66, fiberG: 0, sugarG: 0, - sodiumG: 0.066, - source: "Local bundled data fallback", + sodiumG: 0.081, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -799,79 +798,79 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "39", ingredientName: "lettuce", queryUsed: "lettuce", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 169249, + matchedDescription: "Lettuce, green leaf, raw", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Vegetables and Vegetable Products", + matchScore: -0.0111, calories: 15, - proteinG: 1.4, - carbsG: 2.9, - fatG: 0.2, + proteinG: 1.36, + carbsG: 2.87, + fatG: 0.15, fiberG: 1.3, - sugarG: 0.8, + sugarG: 0.78, sodiumG: 0.028, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 40, ingredientKey: "40", ingredientName: "apple", queryUsed: "apple", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 169127, + matchedDescription: "Pineapple, canned, light syrup pack, solids and liquids", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Fruits and Fruit Juices", + matchScore: 0.0654, calories: 52, - proteinG: 0.3, - carbsG: 13.8, - fatG: 0.2, - fiberG: 2.4, - sugarG: 10.4, + proteinG: 0.36, + carbsG: 13.45, + fatG: 0.12, + fiberG: 0.8, + sugarG: 12.65, sodiumG: 0.001, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 41, ingredientKey: "41", ingredientName: "peanut butter", queryUsed: "peanut butter", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, - calories: 588, - proteinG: 25.1, - carbsG: 20, - fatG: 50.4, - fiberG: 6, - sugarG: 9.2, - sodiumG: 0.459, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + matchedFdcId: 169869, + matchedDescription: "Peanut butter, reduced sodium", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Legumes and Legume Products", + matchScore: 1.6977, + calories: 590, + proteinG: 24, + carbsG: 21.83, + fatG: 49.9, + fiberG: 6.6, + sugarG: 9.29, + sodiumG: 0.203, + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 42, ingredientKey: "42", ingredientName: "frozen peas", queryUsed: "frozen peas", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, - calories: 81, - proteinG: 5.4, - carbsG: 14.5, - fatG: 0.4, - fiberG: 5.1, - sugarG: 5.7, - sodiumG: 0.005, - source: "Local bundled data fallback", + matchedFdcId: 170017, + matchedDescription: "Peas, green, frozen, cooked, boiled, drained, without salt", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Vegetables and Vegetable Products", + matchScore: -0.096, + calories: 78, + proteinG: 5.15, + carbsG: 14.26, + fatG: 0.27, + fiberG: 4.5, + sugarG: 4.4, + sodiumG: 0.072, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -879,79 +878,79 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "43", ingredientName: "canned tuna", queryUsed: "canned tuna", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, - calories: 132, - proteinG: 29, + matchedFdcId: 167614, + matchedDescription: "Fish, salmon, king, chinook, smoked and canned (Alaska Native)", + matchedDataType: "SR Legacy", + matchedFoodCategory: "American Indian/Alaska Native Foods", + matchScore: 3.7905, + calories: 150, + proteinG: 23.2, carbsG: 0, - fatG: 1, + fatG: 5.9, fiberG: 0, sugarG: 0, - sodiumG: 0.338, - source: "Local bundled data fallback", - error: "HTTP Error 404: Not Found" + sodiumG: 0, + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 44, ingredientKey: "44", ingredientName: "celery", queryUsed: "celery", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, - calories: 16, - proteinG: 0.7, - carbsG: 3, - fatG: 0.2, + matchedFdcId: 169988, + matchedDescription: "Celery, raw", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Vegetables and Vegetable Products", + matchScore: 0.325, + calories: 14, + proteinG: 0.69, + carbsG: 2.97, + fatG: 0.17, fiberG: 1.6, - sugarG: 1.3, + sugarG: 1.34, sodiumG: 0.08, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 45, ingredientKey: "45", ingredientName: "zucchini", queryUsed: "zucchini", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 169291, + matchedDescription: "Squash, summer, zucchini, includes skin, raw", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Vegetables and Vegetable Products", + matchScore: -0.0685, calories: 17, - proteinG: 1.2, - carbsG: 3.1, - fatG: 0.3, + proteinG: 1.21, + carbsG: 3.11, + fatG: 0.32, fiberG: 1, sugarG: 2.5, sodiumG: 0.008, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), USDAIngredientNutritionRecord( ingredientId: 46, ingredientKey: "46", ingredientName: "red pepper flakes", queryUsed: "red pepper flakes", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 170932, + matchedDescription: "Spices, pepper, red or cayenne", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Spices and Herbs", + matchScore: 1.5031, calories: 318, - proteinG: 12, - carbsG: 56.6, - fatG: 17.3, - fiberG: 34.8, - sugarG: 10.3, + proteinG: 12.01, + carbsG: 56.63, + fatG: 17.27, + fiberG: 27.2, + sugarG: 10.34, sodiumG: 0.03, - source: "Local bundled data fallback", + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -962,16 +961,16 @@ enum USDAIngredientNutritionStaticData { matchedFdcId: 170923, matchedDescription: "Spices, cumin seed", matchedDataType: "SR Legacy", - matchedFoodCategory: "Spices and Herbs", - matchScore: 0.0028, + matchedFoodCategory: "", + matchScore: -0.1, calories: 375, - proteinG: 17.81, - carbsG: 44.24, - fatG: 22.27, + proteinG: 17.8, + carbsG: 44.2, + fatG: 22.3, fiberG: 10.5, sugarG: 2.25, - sodiumG: 168, - source: "USDA FoodData Central API (usda-fdc client)", + sodiumG: 0.168, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -982,16 +981,16 @@ enum USDAIngredientNutritionStaticData { matchedFdcId: 169997, matchedDescription: "Coriander (cilantro) leaves, raw", matchedDataType: "SR Legacy", - matchedFoodCategory: "Vegetables and Vegetable Products", - matchScore: 1.2922, + matchedFoodCategory: "", + matchScore: -0.0578, calories: 23, proteinG: 2.13, carbsG: 3.67, fatG: 0.52, fiberG: 2.8, sugarG: 0.87, - sodiumG: 46, - source: "USDA FoodData Central API (usda-fdc client)", + sodiumG: 0.046, + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -999,19 +998,19 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "49", ingredientName: "coconut milk", queryUsed: "coconut milk", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, + matchedFdcId: 170172, + matchedDescription: "Nuts, coconut milk, raw (liquid expressed from grated meat and water)", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Nut and Seed Products", + matchScore: 1.6327, calories: 230, - proteinG: 2.3, - carbsG: 6, - fatG: 23.8, + proteinG: 2.29, + carbsG: 5.54, + fatG: 23.84, fiberG: 2.2, - sugarG: 3.3, + sugarG: 3.34, sodiumG: 0.015, - source: "Local bundled data fallback", + source: "USDA FoodData Central API (catalog bootstrap)", error: nil ), USDAIngredientNutritionRecord( @@ -1019,20 +1018,20 @@ enum USDAIngredientNutritionStaticData { ingredientKey: "50", ingredientName: "sour cream", queryUsed: "sour cream", - matchedFdcId: nil, - matchedDescription: nil, - matchedDataType: nil, - matchedFoodCategory: nil, - matchScore: nil, - calories: 198, + matchedFdcId: 170869, + matchedDescription: "Sour cream, imitation, cultured", + matchedDataType: "SR Legacy", + matchedFoodCategory: "Dairy and Egg Products", + matchScore: 0.2566, + calories: 208, proteinG: 2.4, - carbsG: 4.6, - fatG: 19.4, + carbsG: 6.63, + fatG: 19.52, fiberG: 0, - sugarG: 3.5, - sodiumG: 0.053, - source: "Local bundled data fallback", - error: "USDA match below quality threshold" + sugarG: 6.63, + sodiumG: 0.102, + source: "USDA FoodData Central API (catalog bootstrap)", + error: nil ), ] } diff --git a/apps/ios/Resources/usda_ingredient_catalog.sqlite b/apps/ios/Resources/usda_ingredient_catalog.sqlite index 4f1cab9c13e866098d7b9038bad70b546142268d..17f7ffc1a74994ccbd625af958598200fad2152e 100644 GIT binary patch delta 213374 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 +~Xu76p- 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 J4QnE8{|C~@a_s;B diff --git a/scripts/data/catalog/usda_curated_ingredients.json b/scripts/data/catalog/usda_curated_ingredients.json index 7dfe03983..478e321a1 100644 --- a/scripts/data/catalog/usda_curated_ingredients.json +++ b/scripts/data/catalog/usda_curated_ingredients.json @@ -1,6 +1,31 @@ { "generated_at_utc": "2026-02-12T02:08:28Z", "records": [ + { + "alt_names": [], + "category_label": "grain_legume", + "description": "Snacks, tortilla chips, plain, white corn, salted is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Snacks, tortilla chips, plain, white corn, salted", + "fdc_id": 167558, + "macros": { + "calories": 472.0, + "carbs_g": 67.78, + "fat_g": 20.68, + "fiber_g": 5.4, + "protein_g": 7.1, + "sodium_g": 0.328, + "sugar_g": 0.78 + }, + "source_description": "Snacks, tortilla chips, plain, white corn, salted", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Snacks", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, { "alt_names": [ "sweet potato fries", @@ -32,6 +57,31 @@ "sprite_group": "vegetable", "sprite_key": "sweet potato" }, + { + "alt_names": [], + "category_label": "grain_legume", + "description": "Cornmeal, blue (Navajo) is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Cornmeal, blue (Navajo)", + "fdc_id": 167628, + "macros": { + "calories": 398.0, + "carbs_g": 76.93, + "fat_g": 5.44, + "fiber_g": 8.7, + "protein_g": 10.4, + "sodium_g": 0.007, + "sugar_g": 1.81 + }, + "source_description": "Cornmeal, blue (Navajo)", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "American Indian/Alaska Native Foods", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, { "alt_names": [ "frozen whipped topping", @@ -2045,6 +2095,56 @@ "sprite_group": "protein", "sprite_key": "" }, + { + "alt_names": [], + "category_label": "herb_spice", + "description": "Cinnamon buns, frosted (includes honey buns) is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Cinnamon buns, frosted (includes honey buns)", + "fdc_id": 167940, + "macros": { + "calories": 452.0, + "carbs_g": 48.6, + "fat_g": 26.61, + "fiber_g": 1.2, + "protein_g": 4.45, + "sodium_g": 0.305, + "sugar_g": 25.7 + }, + "source_description": "Cinnamon buns, frosted (includes honey buns)", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Baked Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Focaccia, Italian flatbread, plain is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Focaccia, Italian flatbread, plain", + "fdc_id": 167945, + "macros": { + "calories": 249.0, + "carbs_g": 35.82, + "fat_g": 7.89, + "fiber_g": 1.8, + "protein_g": 8.77, + "sodium_g": 0.561, + "sugar_g": 1.75 + }, + "source_description": "Focaccia, Italian flatbread, plain", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Baked Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, { "alt_names": [ "peppercorn dressing", @@ -6943,6 +7043,31 @@ "sprite_group": "protein", "sprite_key": "" }, + { + "alt_names": [], + "category_label": "other", + "description": "Molasses is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Molasses", + "fdc_id": 168820, + "macros": { + "calories": 290.0, + "carbs_g": 74.73, + "fat_g": 0.1, + "fiber_g": 0.0, + "protein_g": 0.0, + "sodium_g": 0.037, + "sugar_g": 74.72 + }, + "source_description": "Molasses", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Sweets", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, { "alt_names": [ "yellow self-rising cornmeal", @@ -7408,6 +7533,31 @@ "sprite_group": "grain_legume", "sprite_key": "grain" }, + { + "alt_names": [], + "category_label": "grain_legume", + "description": "Wheat flour, whole-grain (Includes foods for USDA's Food Distribution Program) is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Wheat flour, whole-grain (Includes foods for USDA's Food Distribution Program)", + "fdc_id": 168893, + "macros": { + "calories": 340.0, + "carbs_g": 71.97, + "fat_g": 2.5, + "fiber_g": 10.7, + "protein_g": 13.21, + "sodium_g": 0.002, + "sugar_g": 0.41 + }, + "source_description": "Wheat flour, whole-grain (Includes foods for USDA's Food Distribution Program)", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Cereal Grains and Pasta", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, { "alt_names": [ "bread flour enriched", @@ -11191,6 +11341,31 @@ "sprite_group": "vegetable", "sprite_key": "squash" }, + { + "alt_names": [], + "category_label": "other", + "description": "Squash, winter, butternut, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Squash, winter, butternut, raw", + "fdc_id": 169295, + "macros": { + "calories": 45.0, + "carbs_g": 11.69, + "fat_g": 0.1, + "fiber_g": 2.0, + "protein_g": 1.0, + "sodium_g": 0.004, + "sugar_g": 2.2 + }, + "source_description": "Squash, winter, butternut, raw", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Vegetables and Vegetable Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, { "alt_names": [ "succotash", @@ -12305,6 +12480,31 @@ "sprite_group": "protein", "sprite_key": "" }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Syrups, maple is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Syrups, maple", + "fdc_id": 169661, + "macros": { + "calories": 260.0, + "carbs_g": 67.04, + "fat_g": 0.06, + "fiber_g": 0.0, + "protein_g": 0.04, + "sodium_g": 0.012, + "sugar_g": 60.46 + }, + "source_description": "Syrups, maple", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Sweets", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, { "alt_names": [ "white masa flour", @@ -19032,6 +19232,31 @@ "sprite_group": "vegetable", "sprite_key": "tomato" }, + { + "alt_names": [], + "category_label": "other", + "description": "Tomato products, canned, paste, without salt added (Includes foods for USDA's Food Distribution Program) is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Tomato products, canned, paste, without salt added (Includes foods for USDA's Food Distribution Program)", + "fdc_id": 170459, + "macros": { + "calories": 82.0, + "carbs_g": 18.91, + "fat_g": 0.47, + "fiber_g": 4.1, + "protein_g": 4.32, + "sodium_g": 0.059, + "sugar_g": 12.18 + }, + "source_description": "Tomato products, canned, paste, without salt added (Includes foods for USDA's Food Distribution Program)", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Vegetables and Vegetable Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, { "alt_names": [ "tomato powder", @@ -19435,6 +19660,31 @@ "sprite_group": "vegetable", "sprite_key": "seaweed" }, + { + "alt_names": [], + "category_label": "other", + "description": "Peppers, hot chili, green, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Peppers, hot chili, green, raw", + "fdc_id": 170497, + "macros": { + "calories": 40.0, + "carbs_g": 9.46, + "fat_g": 0.2, + "fiber_g": 1.5, + "protein_g": 2.0, + "sodium_g": 0.007, + "sugar_g": 5.1 + }, + "source_description": "Peppers, hot chili, green, raw", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Vegetables and Vegetable Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, { "alt_names": [ "shallots", @@ -20551,6 +20801,31 @@ "sprite_group": "nut_seed", "sprite_key": "seed" }, + { + "alt_names": [], + "category_label": "other", + "description": "Jams and preserves, apricot is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Jams and preserves, apricot", + "fdc_id": 170645, + "macros": { + "calories": 242.0, + "carbs_g": 64.4, + "fat_g": 0.2, + "fiber_g": 0.3, + "protein_g": 0.7, + "sodium_g": 0.04, + "sugar_g": 43.4 + }, + "source_description": "Jams and preserves, apricot", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Sweets", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, { "alt_names": [ "dry amaranth grain", @@ -21171,6 +21446,31 @@ "sprite_group": "dairy_egg", "sprite_key": "" }, + { + "alt_names": [], + "category_label": "dairy_egg", + "description": "Cream, fluid, heavy whipping is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Cream, fluid, heavy whipping", + "fdc_id": 170859, + "macros": { + "calories": 340.0, + "carbs_g": 2.84, + "fat_g": 36.08, + "fiber_g": 0.0, + "protein_g": 2.84, + "sodium_g": 0.027, + "sugar_g": 2.92 + }, + "source_description": "Cream, fluid, heavy whipping", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Dairy and Egg Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, { "alt_names": [ "powdered dessert topping", @@ -24364,6 +24664,106 @@ "sprite_group": "condiment", "sprite_key": "soup" }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Soup, SWANSON, vegetable broth is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Soup, SWANSON, vegetable broth", + "fdc_id": 171180, + "macros": { + "calories": 6.0, + "carbs_g": 1.02, + "fat_g": 0.07, + "fiber_g": 0.0, + "protein_g": 0.23, + "sodium_g": 0.303, + "sugar_g": 0.57 + }, + "source_description": "Soup, SWANSON, vegetable broth", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Soups, Sauces, and Gravies", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Sauce, hot chile, sriracha is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Sauce, hot chile, sriracha", + "fdc_id": 171186, + "macros": { + "calories": 93.0, + "carbs_g": 19.16, + "fat_g": 0.93, + "fiber_g": 2.2, + "protein_g": 1.93, + "sodium_g": 2.124, + "sugar_g": 15.11 + }, + "source_description": "Sauce, hot chile, sriracha", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Soups, Sauces, and Gravies", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "dairy_egg", + "description": "Milk, whole, 3.25% milkfat, with added vitamin D is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Milk, whole, 3.25% milkfat, with added vitamin D", + "fdc_id": 171265, + "macros": { + "calories": 61.0, + "carbs_g": 4.8, + "fat_g": 3.25, + "fiber_g": 0.0, + "protein_g": 3.15, + "sodium_g": 0.043, + "sugar_g": 5.05 + }, + "source_description": "Milk, whole, 3.25% milkfat, with added vitamin D", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Dairy and Egg Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Egg, whole, raw, fresh is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Egg, whole, raw, fresh", + "fdc_id": 171287, + "macros": { + "calories": 143.0, + "carbs_g": 0.72, + "fat_g": 9.51, + "fiber_g": 0.0, + "protein_g": 12.56, + "sodium_g": 0.142, + "sugar_g": 0.37 + }, + "source_description": "Egg, whole, raw, fresh", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Dairy and Egg Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, { "alt_names": [ "strawberry kefir", @@ -24396,310 +24796,262 @@ "sprite_key": "" }, { - "alt_names": [ - "olive oil", - "cooking olive oil", - "salad olive oil", - "pure olive oil", - "olive oil general" - ], - "category_label": "oil_fat", - "description": "Olive oil is a staple culinary oil used for sauteing, roasting, and dressings. This USDA row reflects oil values per 100 g.", - "display_name": "Olive Oil", - "fdc_id": 171413, + "alt_names": [], + "category_label": "other", + "description": "Spices, allspice, ground is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Spices, allspice, ground", + "fdc_id": 171315, "macros": { - "calories": 884.0, - "carbs_g": 0.0, - "fat_g": 100.0, - "fiber_g": 0.0, - "protein_g": 0.0, - "sodium_g": 0.002, + "calories": 263.0, + "carbs_g": 72.12, + "fat_g": 8.69, + "fiber_g": 21.6, + "protein_g": 6.09, + "sodium_g": 0.077, "sugar_g": 0.0 }, - "source_description": "Oil, olive, salad or cooking", + "source_description": "Spices, allspice, ground", "source_meta": { "data_type": "SR Legacy", - "food_category": "Fats and Oils", - "verification_source": "USDA FoodData Central API", - "verified_at_utc": "2026-02-11T22:06:02Z" + "food_category": "Spices and Herbs", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" }, - "sprite_group": "oil_fat", + "sprite_group": "other", "sprite_key": "" }, { - "alt_names": [ - "canned light tuna", - "light tuna in water", - "water-packed tuna", - "tuna canned in water", - "drained canned tuna", - "salt-free canned tuna" - ], - "category_label": "protein", - "description": "Water-packed canned light tuna is a staple protein for salads, sandwiches, and casseroles. This USDA row reflects drained solids without salt added, per 100 g.", - "display_name": "Canned Light Tuna (Water-Packed)", - "fdc_id": 171986, + "alt_names": [], + "category_label": "herb_spice", + "description": "Spices, chili powder is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Spices, chili powder", + "fdc_id": 171319, "macros": { - "calories": 116.0, - "carbs_g": 0.0, - "fat_g": 0.82, - "fiber_g": 0.0, - "protein_g": 25.51, - "sodium_g": 0.05, - "sugar_g": 0.0 + "calories": 282.0, + "carbs_g": 49.7, + "fat_g": 14.28, + "fiber_g": 34.8, + "protein_g": 13.46, + "sodium_g": 2.867, + "sugar_g": 7.19 }, - "source_description": "Fish, tuna, light, canned in water, without salt, drained solids", + "source_description": "Spices, chili powder", "source_meta": { "data_type": "SR Legacy", - "food_category": "Finfish and Shellfish Products", - "verification_source": "USDA FoodData Central API", - "verified_at_utc": "2026-02-11T22:06:02Z" + "food_category": "Spices and Herbs", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" }, - "sprite_group": "protein", + "sprite_group": "other", "sprite_key": "" }, { - "alt_names": [ - "chicken tenders", - "fast food chicken tenders", - "fried chicken tenders", - "breaded chicken tenders", - "chicken strips" - ], - "category_label": "protein", - "description": "Chicken tenders here represent a prepared fast-food style item, useful for mixed dish estimates and convenience-food tracking. This USDA row reflects cooked product values per 100 g.", - "display_name": "Chicken Tenders (Fast Food)", - "fdc_id": 173321, + "alt_names": [], + "category_label": "other", + "description": "Spices, nutmeg, ground is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Spices, nutmeg, ground", + "fdc_id": 171326, "macros": { - "calories": 271.0, - "carbs_g": 17.25, - "fat_g": 13.95, - "fiber_g": 1.2, - "protein_g": 19.22, - "sodium_g": 0.769, - "sugar_g": 0.4 + "calories": 525.0, + "carbs_g": 49.29, + "fat_g": 36.31, + "fiber_g": 20.8, + "protein_g": 5.84, + "sodium_g": 0.016, + "sugar_g": 2.99 }, - "source_description": "Fast foods, chicken tenders", + "source_description": "Spices, nutmeg, ground", "source_meta": { "data_type": "SR Legacy", - "food_category": "Fast Foods", - "verification_source": "USDA FoodData Central API", - "verified_at_utc": "2026-02-11T22:06:02Z" + "food_category": "Spices and Herbs", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" }, - "sprite_group": "protein", + "sprite_group": "other", "sprite_key": "" }, { - "alt_names": [ - "light sour cream", - "reduced-fat sour cream", - "low-fat sour cream", - "sour cream", - "cultured cream light" - ], - "category_label": "dairy_egg", - "description": "Light sour cream is a cultured dairy ingredient used for toppings, sauces, dips, and baking. This USDA row reflects product values per 100 g.", - "display_name": "Sour Cream (Light)", - "fdc_id": 173443, - "macros": { - "calories": 136.0, - "carbs_g": 7.1, - "fat_g": 10.6, - "fiber_g": 0.0, - "protein_g": 3.5, - "sodium_g": 0.083, - "sugar_g": 0.22 + "alt_names": [], + "category_label": "herb_spice", + "description": "Spices, oregano, dried is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Spices, oregano, dried", + "fdc_id": 171328, + "macros": { + "calories": 265.0, + "carbs_g": 68.92, + "fat_g": 4.28, + "fiber_g": 42.5, + "protein_g": 9.0, + "sodium_g": 0.025, + "sugar_g": 4.09 }, - "source_description": "Sour cream, light", + "source_description": "Spices, oregano, dried", "source_meta": { "data_type": "SR Legacy", - "food_category": "Dairy and Egg Products", - "verification_source": "USDA FoodData Central API", - "verified_at_utc": "2026-02-11T22:06:02Z" + "food_category": "Spices and Herbs", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" }, - "sprite_group": "dairy_egg", - "sprite_key": "sour cream" + "sprite_group": "other", + "sprite_key": "" }, { - "alt_names": [ - "black beans cooked", - "cooked black beans no salt", - "unsalted black beans", - "boiled black beans", - "prepared black beans" - ], - "category_label": "grain_legume", - "description": "Cooked black beans without salt are a staple legume used in bowls, soups, tacos, and salads. This USDA row reflects cooked bean values per 100 g.", - "display_name": "Black Beans (Cooked, No Salt)", - "fdc_id": 173735, - "macros": { - "calories": 132.0, - "carbs_g": 23.71, - "fat_g": 0.54, - "fiber_g": 8.7, - "protein_g": 8.86, - "sodium_g": 0.001, - "sugar_g": 0.32 + "alt_names": [], + "category_label": "herb_spice", + "description": "Spices, paprika is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Spices, paprika", + "fdc_id": 171329, + "macros": { + "calories": 282.0, + "carbs_g": 53.99, + "fat_g": 12.89, + "fiber_g": 34.9, + "protein_g": 14.14, + "sodium_g": 0.068, + "sugar_g": 10.34 }, - "source_description": "Beans, black, mature seeds, cooked, boiled, without salt", + "source_description": "Spices, paprika", "source_meta": { "data_type": "SR Legacy", - "food_category": "Legumes and Legume Products", - "verification_source": "USDA FoodData Central API", - "verified_at_utc": "2026-02-11T22:06:02Z" + "food_category": "Spices and Herbs", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" }, - "sprite_group": "grain_legume", + "sprite_group": "other", "sprite_key": "" }, { "alt_names": [ - "tamari", - "soy sauce", - "gluten-free soy sauce", - "tamari soy sauce", - "fermented soy seasoning" + "olive oil", + "cooking olive oil", + "salad olive oil", + "pure olive oil", + "olive oil general" ], - "category_label": "condiment", - "description": "Tamari-style soy sauce is a fermented savory condiment used in marinades, stir-fries, and dipping sauces. This USDA row reflects sauce values per 100 g.", - "display_name": "Soy Sauce (Tamari)", - "fdc_id": 174278, + "category_label": "oil_fat", + "description": "Olive oil is a staple culinary oil used for sauteing, roasting, and dressings. This USDA row reflects oil values per 100 g.", + "display_name": "Olive Oil", + "fdc_id": 171413, "macros": { - "calories": 60.0, - "carbs_g": 5.57, - "fat_g": 0.1, - "fiber_g": 0.8, - "protein_g": 10.51, - "sodium_g": 5.586, - "sugar_g": 1.7 + "calories": 884.0, + "carbs_g": 0.0, + "fat_g": 100.0, + "fiber_g": 0.0, + "protein_g": 0.0, + "sodium_g": 0.002, + "sugar_g": 0.0 }, - "source_description": "Soy sauce made from soy (tamari)", + "source_description": "Oil, olive, salad or cooking", "source_meta": { "data_type": "SR Legacy", - "food_category": "Legumes and Legume Products", + "food_category": "Fats and Oils", "verification_source": "USDA FoodData Central API", "verified_at_utc": "2026-02-11T22:06:02Z" }, - "sprite_group": "condiment", - "sprite_key": "soy sauce" + "sprite_group": "oil_fat", + "sprite_key": "" }, { - "alt_names": [ - "red bell pepper", - "bell pepper red", - "raw red bell pepper", - "sweet red pepper", - "capsicum red" - ], - "category_label": "vegetable", - "description": "Raw red bell pepper is a sweet crunchy vegetable used in salads, stir-fries, and roasting. This USDA row reflects raw pepper values per 100 g.", - "display_name": "Bell Pepper (Red, Raw)", - "fdc_id": 2258590, + "alt_names": [], + "category_label": "protein", + "description": "Turkey, whole, meat and skin, cooked, roasted is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Turkey, whole, meat and skin, cooked, roasted", + "fdc_id": 171479, "macros": { - "calories": 0.0, - "carbs_g": 6.6532, - "fat_g": 0.1256, - "fiber_g": 1.158, - "protein_g": 0.8956, - "sodium_g": 0.0, + "calories": 189.0, + "carbs_g": 0.06, + "fat_g": 7.39, + "fiber_g": 0.0, + "protein_g": 28.55, + "sodium_g": 0.103, "sugar_g": 0.0 }, - "source_description": "Peppers, bell, red, raw", + "source_description": "Turkey, whole, meat and skin, cooked, roasted", "source_meta": { - "data_type": "Foundation", - "food_category": "Vegetables and Vegetable Products", - "verification_source": "USDA FoodData Central API", - "verified_at_utc": "2026-02-11T22:06:02Z" + "data_type": "SR Legacy", + "food_category": "Poultry Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" }, - "sprite_group": "vegetable", - "sprite_key": "bell pepper" + "sprite_group": "other", + "sprite_key": "" }, { - "alt_names": [ - "heavy cream", - "heavy whipping cream", - "double cream", - "thick cream", - "cream heavy" - ], - "category_label": "dairy_egg", - "description": "Heavy cream is a high-fat dairy ingredient used for sauces, soups, desserts, and whipping. This USDA row reflects cream values per 100 g.", - "display_name": "Heavy Cream", - "fdc_id": 2346386, + "alt_names": [], + "category_label": "fruit", + "description": "Avocados, raw, all commercial varieties is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Avocados, raw, all commercial varieties", + "fdc_id": 171705, "macros": { - "calories": 0.0, - "carbs_g": 3.7995, - "fat_g": 35.56, - "fiber_g": 0.0, - "protein_g": 2.018, - "sodium_g": 0.0206, - "sugar_g": 0.0 + "calories": 160.0, + "carbs_g": 8.53, + "fat_g": 14.66, + "fiber_g": 6.7, + "protein_g": 2.0, + "sodium_g": 0.007, + "sugar_g": 0.66 }, - "source_description": "Cream, heavy", + "source_description": "Avocados, raw, all commercial varieties", "source_meta": { - "data_type": "Foundation", - "food_category": "Dairy and Egg Products", - "verification_source": "USDA FoodData Central API", - "verified_at_utc": "2026-02-11T22:06:02Z" + "data_type": "SR Legacy", + "food_category": "Fruits and Fruit Juices", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" }, - "sprite_group": "dairy_egg", - "sprite_key": "cream" + "sprite_group": "other", + "sprite_key": "" }, { - "alt_names": [ - "dry chickpeas", - "garbanzo beans dry", - "bengal gram", - "dried chickpeas", - "uncooked chickpeas" - ], - "category_label": "grain_legume", - "description": "Dry chickpeas (garbanzo beans) are pantry legumes used for curries, stews, hummus, and salads after cooking. This USDA row reflects dry legume values per 100 g.", - "display_name": "Chickpeas (Dry)", - "fdc_id": 2644282, + "alt_names": [], + "category_label": "protein", + "description": "Crustaceans, crab, blue, canned is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Crustaceans, crab, blue, canned", + "fdc_id": 171966, "macros": { - "calories": 0.0, - "carbs_g": 60.358, - "fat_g": 6.274, + "calories": 83.0, + "carbs_g": 0.0, + "fat_g": 0.74, "fiber_g": 0.0, - "protein_g": 21.275, - "sodium_g": 0.0088, + "protein_g": 17.88, + "sodium_g": 0.563, "sugar_g": 0.0 }, - "source_description": "Chickpeas, (garbanzo beans, bengal gram), dry", + "source_description": "Crustaceans, crab, blue, canned", "source_meta": { - "data_type": "Foundation", - "food_category": "Legumes and Legume Products", - "verification_source": "USDA FoodData Central API", - "verified_at_utc": "2026-02-11T22:06:02Z" + "data_type": "SR Legacy", + "food_category": "Finfish and Shellfish Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" }, - "sprite_group": "grain_legume", + "sprite_group": "other", "sprite_key": "" }, { "alt_names": [ - "raw boneless skinless chicken thigh", - "chicken thigh raw", - "skinless chicken thigh", - "boneless chicken thigh", - "chicken thigh fillet raw" + "canned light tuna", + "light tuna in water", + "water-packed tuna", + "tuna canned in water", + "drained canned tuna", + "salt-free canned tuna" ], "category_label": "protein", - "description": "Boneless skinless chicken thigh is a versatile poultry cut for braising, grilling, and roasting. This USDA row reflects raw thigh values per 100 g.", - "display_name": "Chicken Thigh (Boneless, Skinless, Raw)", - "fdc_id": 2646171, + "description": "Water-packed canned light tuna is a staple protein for salads, sandwiches, and casseroles. This USDA row reflects drained solids without salt added, per 100 g.", + "display_name": "Canned Light Tuna (Water-Packed)", + "fdc_id": 171986, "macros": { - "calories": 0.0, + "calories": 116.0, "carbs_g": 0.0, - "fat_g": 7.916, + "fat_g": 0.82, "fiber_g": 0.0, - "protein_g": 18.6125, - "sodium_g": 0.0623, + "protein_g": 25.51, + "sodium_g": 0.05, "sugar_g": 0.0 }, - "source_description": "Chicken, thigh, boneless, skinless, raw", + "source_description": "Fish, tuna, light, canned in water, without salt, drained solids", "source_meta": { - "data_type": "Foundation", - "food_category": "Poultry Products", + "data_type": "SR Legacy", + "food_category": "Finfish and Shellfish Products", "verification_source": "USDA FoodData Central API", "verified_at_utc": "2026-02-11T22:06:02Z" }, @@ -24707,35 +25059,3433 @@ "sprite_key": "" }, { - "alt_names": [ - "atlantic salmon raw", - "farmed salmon", - "raw salmon fillet", - "fresh salmon", - "salmon fish" + "alt_names": [], + "category_label": "other", + "description": "Millet flour is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Millet flour", + "fdc_id": 172023, + "macros": { + "calories": 382.0, + "carbs_g": 75.12, + "fat_g": 4.25, + "fiber_g": 3.5, + "protein_g": 10.75, + "sodium_g": 0.004, + "sugar_g": 1.66 + }, + "source_description": "Millet flour", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Cereal Grains and Pasta", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Spices, turmeric, ground is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Spices, turmeric, ground", + "fdc_id": 172231, + "macros": { + "calories": 312.0, + "carbs_g": 67.14, + "fat_g": 3.25, + "fiber_g": 22.7, + "protein_g": 9.68, + "sodium_g": 0.027, + "sugar_g": 3.21 + }, + "source_description": "Spices, turmeric, ground", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Spices and Herbs", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Vinegar, distilled is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Vinegar, distilled", + "fdc_id": 172237, + "macros": { + "calories": 18.0, + "carbs_g": 0.04, + "fat_g": 0.0, + "fiber_g": 0.0, + "protein_g": 0.0, + "sodium_g": 0.002, + "sugar_g": 0.04 + }, + "source_description": "Vinegar, distilled", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Spices and Herbs", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "herb_spice", + "description": "Capers, canned is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Capers, canned", + "fdc_id": 172238, + "macros": { + "calories": 23.0, + "carbs_g": 4.89, + "fat_g": 0.86, + "fiber_g": 3.2, + "protein_g": 2.36, + "sodium_g": 2.348, + "sugar_g": 0.41 + }, + "source_description": "Capers, canned", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Spices and Herbs", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "herb_spice", + "description": "Vinegar, red wine is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Vinegar, red wine", + "fdc_id": 172240, + "macros": { + "calories": 19.0, + "carbs_g": 0.27, + "fat_g": 0.0, + "fiber_g": 0.0, + "protein_g": 0.04, + "sodium_g": 0.008, + "sugar_g": 0.0 + }, + "source_description": "Vinegar, red wine", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Spices and Herbs", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Lentils, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Lentils, raw", + "fdc_id": 172420, + "macros": { + "calories": 352.0, + "carbs_g": 63.35, + "fat_g": 1.06, + "fiber_g": 10.7, + "protein_g": 24.63, + "sodium_g": 0.006, + "sugar_g": 2.03 + }, + "source_description": "Lentils, raw", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Legumes and Legume Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Leavening agents, baking powder, double-acting, sodium aluminum sulfate is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Leavening agents, baking powder, double-acting, sodium aluminum sulfate", + "fdc_id": 172803, + "macros": { + "calories": 53.0, + "carbs_g": 27.7, + "fat_g": 0.0, + "fiber_g": 0.2, + "protein_g": 0.0, + "sodium_g": 10.6, + "sugar_g": 0.0 + }, + "source_description": "Leavening agents, baking powder, double-acting, sodium aluminum sulfate", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Baked Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Soup, stock, beef, home-prepared is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Soup, stock, beef, home-prepared", + "fdc_id": 172883, + "macros": { + "calories": 13.0, + "carbs_g": 1.2, + "fat_g": 0.09, + "fiber_g": 0.0, + "protein_g": 1.97, + "sodium_g": 0.198, + "sugar_g": 0.54 + }, + "source_description": "Soup, stock, beef, home-prepared", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Soups, Sauces, and Gravies", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Soup, stock, chicken, home-prepared is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Soup, stock, chicken, home-prepared", + "fdc_id": 172884, + "macros": { + "calories": 36.0, + "carbs_g": 3.53, + "fat_g": 1.2, + "fiber_g": 0.0, + "protein_g": 2.52, + "sodium_g": 0.143, + "sugar_g": 1.58 + }, + "source_description": "Soup, stock, chicken, home-prepared", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Soups, Sauces, and Gravies", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [ + "chicken tenders", + "fast food chicken tenders", + "fried chicken tenders", + "breaded chicken tenders", + "chicken strips" ], "category_label": "protein", - "description": "Raw farmed Atlantic salmon is a fatty fish protein used for roasting, grilling, pan-searing, and curing. This USDA row reflects raw fish values per 100 g.", - "display_name": "Salmon (Atlantic, Farmed, Raw)", - "fdc_id": 2684441, + "description": "Chicken tenders here represent a prepared fast-food style item, useful for mixed dish estimates and convenience-food tracking. This USDA row reflects cooked product values per 100 g.", + "display_name": "Chicken Tenders (Fast Food)", + "fdc_id": 173321, "macros": { - "calories": 0.0, + "calories": 271.0, + "carbs_g": 17.25, + "fat_g": 13.95, + "fiber_g": 1.2, + "protein_g": 19.22, + "sodium_g": 0.769, + "sugar_g": 0.4 + }, + "source_description": "Fast foods, chicken tenders", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Fast Foods", + "verification_source": "USDA FoodData Central API", + "verified_at_utc": "2026-02-11T22:06:02Z" + }, + "sprite_group": "protein", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Butter oil, anhydrous is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Butter oil, anhydrous", + "fdc_id": 173412, + "macros": { + "calories": 876.0, "carbs_g": 0.0, - "fat_g": 13.11, + "fat_g": 99.48, "fiber_g": 0.0, - "protein_g": 20.3188, - "sodium_g": 0.0495, + "protein_g": 0.28, + "sodium_g": 0.002, "sugar_g": 0.0 }, - "source_description": "Fish, salmon, Atlantic, farm raised, raw", + "source_description": "Butter oil, anhydrous", "source_meta": { - "data_type": "Foundation", - "food_category": "Finfish and Shellfish Products", + "data_type": "SR Legacy", + "food_category": "Dairy and Egg Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [ + "light sour cream", + "reduced-fat sour cream", + "low-fat sour cream", + "sour cream", + "cultured cream light" + ], + "category_label": "dairy_egg", + "description": "Light sour cream is a cultured dairy ingredient used for toppings, sauces, dips, and baking. This USDA row reflects product values per 100 g.", + "display_name": "Sour Cream (Light)", + "fdc_id": 173443, + "macros": { + "calories": 136.0, + "carbs_g": 7.1, + "fat_g": 10.6, + "fiber_g": 0.0, + "protein_g": 3.5, + "sodium_g": 0.083, + "sugar_g": 0.22 + }, + "source_description": "Sour cream, light", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Dairy and Egg Products", "verification_source": "USDA FoodData Central API", "verified_at_utc": "2026-02-11T22:06:02Z" }, - "sprite_group": "protein", - "sprite_key": "salmon" + "sprite_group": "dairy_egg", + "sprite_key": "sour cream" + }, + { + "alt_names": [], + "category_label": "herb_spice", + "description": "Salt, table is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Salt, table", + "fdc_id": 173468, + "macros": { + "calories": 0.0, + "carbs_g": 0.0, + "fat_g": 0.0, + "fiber_g": 0.0, + "protein_g": 0.0, + "sodium_g": 38.758, + "sugar_g": 0.0 + }, + "source_description": "Salt, table", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Spices and Herbs", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Vinegar, cider is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Vinegar, cider", + "fdc_id": 173469, + "macros": { + "calories": 21.0, + "carbs_g": 0.93, + "fat_g": 0.0, + "fiber_g": 0.0, + "protein_g": 0.0, + "sodium_g": 0.005, + "sugar_g": 0.4 + }, + "source_description": "Vinegar, cider", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Spices and Herbs", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "herb_spice", + "description": "Rosemary, fresh is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Rosemary, fresh", + "fdc_id": 173473, + "macros": { + "calories": 131.0, + "carbs_g": 20.7, + "fat_g": 5.86, + "fiber_g": 14.1, + "protein_g": 3.31, + "sodium_g": 0.026, + "sugar_g": 0.0 + }, + "source_description": "Rosemary, fresh", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Spices and Herbs", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "herb_spice", + "description": "Peppermint, fresh is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Peppermint, fresh", + "fdc_id": 173474, + "macros": { + "calories": 70.0, + "carbs_g": 14.89, + "fat_g": 0.94, + "fiber_g": 8.0, + "protein_g": 3.75, + "sodium_g": 0.031, + "sugar_g": 0.0 + }, + "source_description": "Peppermint, fresh", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Spices and Herbs", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [ + "black beans cooked", + "cooked black beans no salt", + "unsalted black beans", + "boiled black beans", + "prepared black beans" + ], + "category_label": "grain_legume", + "description": "Cooked black beans without salt are a staple legume used in bowls, soups, tacos, and salads. This USDA row reflects cooked bean values per 100 g.", + "display_name": "Black Beans (Cooked, No Salt)", + "fdc_id": 173735, + "macros": { + "calories": 132.0, + "carbs_g": 23.71, + "fat_g": 0.54, + "fiber_g": 8.7, + "protein_g": 8.86, + "sodium_g": 0.001, + "sugar_g": 0.32 + }, + "source_description": "Beans, black, mature seeds, cooked, boiled, without salt", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Legumes and Legume Products", + "verification_source": "USDA FoodData Central API", + "verified_at_utc": "2026-02-11T22:06:02Z" + }, + "sprite_group": "grain_legume", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Beans, cranberry (roman), mature seeds, cooked, boiled, without salt is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Beans, cranberry (roman), mature seeds, cooked, boiled, without salt", + "fdc_id": 173736, + "macros": { + "calories": 136.0, + "carbs_g": 24.46, + "fat_g": 0.46, + "fiber_g": 8.6, + "protein_g": 9.34, + "sodium_g": 0.001, + "sugar_g": 0.0 + }, + "source_description": "Beans, cranberry (roman), mature seeds, cooked, boiled, without salt", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Legumes and Legume Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Chickpeas (garbanzo beans, bengal gram), mature seeds, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Chickpeas (garbanzo beans, bengal gram), mature seeds, raw", + "fdc_id": 173756, + "macros": { + "calories": 378.0, + "carbs_g": 62.95, + "fat_g": 6.04, + "fiber_g": 12.2, + "protein_g": 20.47, + "sodium_g": 0.024, + "sugar_g": 10.7 + }, + "source_description": "Chickpeas (garbanzo beans, bengal gram), mature seeds, raw", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Legumes and Legume Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Fish, anchovy, european, canned in oil, drained solids is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Fish, anchovy, european, canned in oil, drained solids", + "fdc_id": 174183, + "macros": { + "calories": 210.0, + "carbs_g": 0.0, + "fat_g": 9.71, + "fiber_g": 0.0, + "protein_g": 28.89, + "sodium_g": 3.668, + "sugar_g": 0.0 + }, + "source_description": "Fish, anchovy, european, canned in oil, drained solids", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Finfish and Shellfish Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Fish, cod, Atlantic, dried and salted is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Fish, cod, Atlantic, dried and salted", + "fdc_id": 174190, + "macros": { + "calories": 290.0, + "carbs_g": 0.0, + "fat_g": 2.37, + "fiber_g": 0.0, + "protein_g": 62.82, + "sodium_g": 7.027, + "sugar_g": 0.0 + }, + "source_description": "Fish, cod, Atlantic, dried and salted", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Finfish and Shellfish Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Crustaceans, shrimp, mixed species, raw (may contain additives to retain moisture) is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Crustaceans, shrimp, mixed species, raw (may contain additives to retain moisture)", + "fdc_id": 174210, + "macros": { + "calories": 71.0, + "carbs_g": 0.91, + "fat_g": 1.01, + "fiber_g": 0.0, + "protein_g": 13.61, + "sodium_g": 0.566, + "sugar_g": 0.0 + }, + "source_description": "Crustaceans, shrimp, mixed species, raw (may contain additives to retain moisture)", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Finfish and Shellfish Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Mollusks, squid, mixed species, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Mollusks, squid, mixed species, raw", + "fdc_id": 174223, + "macros": { + "calories": 92.0, + "carbs_g": 3.08, + "fat_g": 1.38, + "fiber_g": 0.0, + "protein_g": 15.58, + "sodium_g": 0.044, + "sugar_g": 0.0 + }, + "source_description": "Mollusks, squid, mixed species, raw", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Finfish and Shellfish Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Noodles, chinese, cellophane or long rice (mung beans), dehydrated is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Noodles, chinese, cellophane or long rice (mung beans), dehydrated", + "fdc_id": 174258, + "macros": { + "calories": 351.0, + "carbs_g": 86.09, + "fat_g": 0.06, + "fiber_g": 0.5, + "protein_g": 0.16, + "sodium_g": 0.01, + "sugar_g": 0.0 + }, + "source_description": "Noodles, chinese, cellophane or long rice (mung beans), dehydrated", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Legumes and Legume Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [ + "tamari", + "soy sauce", + "gluten-free soy sauce", + "tamari soy sauce", + "fermented soy seasoning" + ], + "category_label": "condiment", + "description": "Tamari-style soy sauce is a fermented savory condiment used in marinades, stir-fries, and dipping sauces. This USDA row reflects sauce values per 100 g.", + "display_name": "Soy Sauce (Tamari)", + "fdc_id": 174278, + "macros": { + "calories": 60.0, + "carbs_g": 5.57, + "fat_g": 0.1, + "fiber_g": 0.8, + "protein_g": 10.51, + "sodium_g": 5.586, + "sugar_g": 1.7 + }, + "source_description": "Soy sauce made from soy (tamari)", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Legumes and Legume Products", + "verification_source": "USDA FoodData Central API", + "verified_at_utc": "2026-02-11T22:06:02Z" + }, + "sprite_group": "condiment", + "sprite_key": "soy sauce" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Lentils, pink or red, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Lentils, pink or red, raw", + "fdc_id": 174284, + "macros": { + "calories": 358.0, + "carbs_g": 63.1, + "fat_g": 2.17, + "fiber_g": 10.8, + "protein_g": 23.91, + "sodium_g": 0.007, + "sugar_g": 0.0 + }, + "source_description": "Lentils, pink or red, raw", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Legumes and Legume Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "vegetable", + "description": "Chickpea flour (besan) is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Chickpea flour (besan)", + "fdc_id": 174288, + "macros": { + "calories": 387.0, + "carbs_g": 57.82, + "fat_g": 6.69, + "fiber_g": 10.8, + "protein_g": 22.39, + "sodium_g": 0.064, + "sugar_g": 10.85 + }, + "source_description": "Chickpea flour (besan)", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Legumes and Legume Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "vegetable", + "description": "Tofu, hard, prepared with nigari is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Tofu, hard, prepared with nigari", + "fdc_id": 174291, + "macros": { + "calories": 145.0, + "carbs_g": 4.39, + "fat_g": 9.99, + "fiber_g": 0.6, + "protein_g": 12.68, + "sodium_g": 0.002, + "sugar_g": 0.0 + }, + "source_description": "Tofu, hard, prepared with nigari", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Legumes and Legume Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Lamb, New Zealand, imported, fore-shank, separable lean only, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Lamb, New Zealand, imported, fore-shank, separable lean only, raw", + "fdc_id": 174340, + "macros": { + "calories": 122.0, + "carbs_g": 0.0, + "fat_g": 3.77, + "fiber_g": 0.0, + "protein_g": 22.05, + "sodium_g": 0.082, + "sugar_g": 0.0 + }, + "source_description": "Lamb, New Zealand, imported, fore-shank, separable lean only, raw", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Lamb, Veal, and Game Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Sauce, fish, ready-to-serve is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Sauce, fish, ready-to-serve", + "fdc_id": 174531, + "macros": { + "calories": 35.0, + "carbs_g": 3.64, + "fat_g": 0.01, + "fiber_g": 0.0, + "protein_g": 5.06, + "sodium_g": 7.851, + "sugar_g": 3.64 + }, + "source_description": "Sauce, fish, ready-to-serve", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Soups, Sauces, and Gravies", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Sausage, smoked link sausage, pork and beef is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Sausage, smoked link sausage, pork and beef", + "fdc_id": 174585, + "macros": { + "calories": 320.0, + "carbs_g": 2.42, + "fat_g": 28.73, + "fiber_g": 0.0, + "protein_g": 12.0, + "sodium_g": 0.911, + "sugar_g": 0.0 + }, + "source_description": "Sausage, smoked link sausage, pork and beef", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Sausages and Luncheon Meats", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Beverages, carbonated, cola, regular is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Beverages, carbonated, cola, regular", + "fdc_id": 174852, + "macros": { + "calories": 42.0, + "carbs_g": 10.36, + "fat_g": 0.25, + "fiber_g": 0.0, + "protein_g": 0.0, + "sodium_g": 0.003, + "sugar_g": 9.94 + }, + "source_description": "Beverages, carbonated, cola, regular", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Beverages", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Bread, pita, white, enriched is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Bread, pita, white, enriched", + "fdc_id": 174915, + "macros": { + "calories": 275.0, + "carbs_g": 55.7, + "fat_g": 1.2, + "fiber_g": 2.2, + "protein_g": 9.1, + "sodium_g": 0.536, + "sugar_g": 1.3 + }, + "source_description": "Bread, pita, white, enriched", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Baked Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "vegetable", + "description": "Bread, crumbs, dry, grated, plain is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Bread, crumbs, dry, grated, plain", + "fdc_id": 174928, + "macros": { + "calories": 395.0, + "carbs_g": 71.98, + "fat_g": 5.3, + "fiber_g": 4.5, + "protein_g": 13.35, + "sodium_g": 0.732, + "sugar_g": 6.2 + }, + "source_description": "Bread, crumbs, dry, grated, plain", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Baked Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Fish, sardine, Atlantic, canned in oil, drained solids with bone is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Fish, sardine, Atlantic, canned in oil, drained solids with bone", + "fdc_id": 175139, + "macros": { + "calories": 208.0, + "carbs_g": 0.0, + "fat_g": 11.45, + "fiber_g": 0.0, + "protein_g": 24.62, + "sodium_g": 0.307, + "sugar_g": 0.0 + }, + "source_description": "Fish, sardine, Atlantic, canned in oil, drained solids with bone", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Finfish and Shellfish Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Fish, sea bass, mixed species, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Fish, sea bass, mixed species, raw", + "fdc_id": 175142, + "macros": { + "calories": 97.0, + "carbs_g": 0.0, + "fat_g": 2.0, + "fiber_g": 0.0, + "protein_g": 18.43, + "sodium_g": 0.068, + "sugar_g": 0.0 + }, + "source_description": "Fish, sea bass, mixed species, raw", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Finfish and Shellfish Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Fish, sucker, white, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Fish, sucker, white, raw", + "fdc_id": 175150, + "macros": { + "calories": 92.0, + "carbs_g": 0.0, + "fat_g": 2.32, + "fiber_g": 0.0, + "protein_g": 16.76, + "sodium_g": 0.04, + "sugar_g": 0.0 + }, + "source_description": "Fish, sucker, white, raw", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Finfish and Shellfish Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Fish, salmon, Atlantic, farmed, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Fish, salmon, Atlantic, farmed, raw", + "fdc_id": 175167, + "macros": { + "calories": 208.0, + "carbs_g": 0.0, + "fat_g": 13.42, + "fiber_g": 0.0, + "protein_g": 20.42, + "sodium_g": 0.059, + "sugar_g": 0.0 + }, + "source_description": "Fish, salmon, Atlantic, farmed, raw", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Finfish and Shellfish Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Game meat, goat, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (SR Legacy).", + "display_name": "Game meat, goat, raw", + "fdc_id": 175303, + "macros": { + "calories": 109.0, + "carbs_g": 0.0, + "fat_g": 2.31, + "fiber_g": 0.0, + "protein_g": 20.6, + "sodium_g": 0.082, + "sugar_g": 0.0 + }, + "source_description": "Game meat, goat, raw", + "source_meta": { + "data_type": "SR Legacy", + "food_category": "Lamb, Veal, and Game Products", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [ + "red bell pepper", + "bell pepper red", + "raw red bell pepper", + "sweet red pepper", + "capsicum red" + ], + "category_label": "vegetable", + "description": "Raw red bell pepper is a sweet crunchy vegetable used in salads, stir-fries, and roasting. This USDA row reflects raw pepper values per 100 g.", + "display_name": "Bell Pepper (Red, Raw)", + "fdc_id": 2258590, + "macros": { + "calories": 0.0, + "carbs_g": 6.6532, + "fat_g": 0.1256, + "fiber_g": 1.158, + "protein_g": 0.8956, + "sodium_g": 0.0, + "sugar_g": 0.0 + }, + "source_description": "Peppers, bell, red, raw", + "source_meta": { + "data_type": "Foundation", + "food_category": "Vegetables and Vegetable Products", + "verification_source": "USDA FoodData Central API", + "verified_at_utc": "2026-02-11T22:06:02Z" + }, + "sprite_group": "vegetable", + "sprite_key": "bell pepper" + }, + { + "alt_names": [ + "heavy cream", + "heavy whipping cream", + "double cream", + "thick cream", + "cream heavy" + ], + "category_label": "dairy_egg", + "description": "Heavy cream is a high-fat dairy ingredient used for sauces, soups, desserts, and whipping. This USDA row reflects cream values per 100 g.", + "display_name": "Heavy Cream", + "fdc_id": 2346386, + "macros": { + "calories": 0.0, + "carbs_g": 3.7995, + "fat_g": 35.56, + "fiber_g": 0.0, + "protein_g": 2.018, + "sodium_g": 0.0206, + "sugar_g": 0.0 + }, + "source_description": "Cream, heavy", + "source_meta": { + "data_type": "Foundation", + "food_category": "Dairy and Egg Products", + "verification_source": "USDA FoodData Central API", + "verified_at_utc": "2026-02-11T22:06:02Z" + }, + "sprite_group": "dairy_egg", + "sprite_key": "cream" + }, + { + "alt_names": [ + "dry chickpeas", + "garbanzo beans dry", + "bengal gram", + "dried chickpeas", + "uncooked chickpeas" + ], + "category_label": "grain_legume", + "description": "Dry chickpeas (garbanzo beans) are pantry legumes used for curries, stews, hummus, and salads after cooking. This USDA row reflects dry legume values per 100 g.", + "display_name": "Chickpeas (Dry)", + "fdc_id": 2644282, + "macros": { + "calories": 0.0, + "carbs_g": 60.358, + "fat_g": 6.274, + "fiber_g": 0.0, + "protein_g": 21.275, + "sodium_g": 0.0088, + "sugar_g": 0.0 + }, + "source_description": "Chickpeas, (garbanzo beans, bengal gram), dry", + "source_meta": { + "data_type": "Foundation", + "food_category": "Legumes and Legume Products", + "verification_source": "USDA FoodData Central API", + "verified_at_utc": "2026-02-11T22:06:02Z" + }, + "sprite_group": "grain_legume", + "sprite_key": "" + }, + { + "alt_names": [ + "raw boneless skinless chicken thigh", + "chicken thigh raw", + "skinless chicken thigh", + "boneless chicken thigh", + "chicken thigh fillet raw" + ], + "category_label": "protein", + "description": "Boneless skinless chicken thigh is a versatile poultry cut for braising, grilling, and roasting. This USDA row reflects raw thigh values per 100 g.", + "display_name": "Chicken Thigh (Boneless, Skinless, Raw)", + "fdc_id": 2646171, + "macros": { + "calories": 0.0, + "carbs_g": 0.0, + "fat_g": 7.916, + "fiber_g": 0.0, + "protein_g": 18.6125, + "sodium_g": 0.0623, + "sugar_g": 0.0 + }, + "source_description": "Chicken, thigh, boneless, skinless, raw", + "source_meta": { + "data_type": "Foundation", + "food_category": "Poultry Products", + "verification_source": "USDA FoodData Central API", + "verified_at_utc": "2026-02-11T22:06:02Z" + }, + "sprite_group": "protein", + "sprite_key": "" + }, + { + "alt_names": [ + "atlantic salmon raw", + "farmed salmon", + "raw salmon fillet", + "fresh salmon", + "salmon fish" + ], + "category_label": "protein", + "description": "Raw farmed Atlantic salmon is a fatty fish protein used for roasting, grilling, pan-searing, and curing. This USDA row reflects raw fish values per 100 g.", + "display_name": "Salmon (Atlantic, Farmed, Raw)", + "fdc_id": 2684441, + "macros": { + "calories": 0.0, + "carbs_g": 0.0, + "fat_g": 13.11, + "fiber_g": 0.0, + "protein_g": 20.3188, + "sodium_g": 0.0495, + "sugar_g": 0.0 + }, + "source_description": "Fish, salmon, Atlantic, farm raised, raw", + "source_meta": { + "data_type": "Foundation", + "food_category": "Finfish and Shellfish Products", + "verification_source": "USDA FoodData Central API", + "verified_at_utc": "2026-02-11T22:06:02Z" + }, + "sprite_group": "protein", + "sprite_key": "salmon" + }, + { + "alt_names": [], + "category_label": "vegetable", + "description": "Soy milk, unsweetened is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Soy milk, unsweetened", + "fdc_id": 2705405, + "macros": { + "calories": 38.0, + "carbs_g": 1.29, + "fat_g": 2.12, + "fiber_g": 0.0, + "protein_g": 3.55, + "sodium_g": 0.034, + "sugar_g": 0.56 + }, + "source_description": "Soy milk, unsweetened", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Plant-based milk", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "grain_legume", + "description": "Rice milk is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Rice milk", + "fdc_id": 2705411, + "macros": { + "calories": 47.0, + "carbs_g": 9.17, + "fat_g": 0.97, + "fiber_g": 0.3, + "protein_g": 0.28, + "sodium_g": 0.039, + "sugar_g": 5.28 + }, + "source_description": "Rice milk", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Plant-based milk", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Coconut milk is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Coconut milk", + "fdc_id": 2705413, + "macros": { + "calories": 31.0, + "carbs_g": 2.92, + "fat_g": 2.08, + "fiber_g": 0.0, + "protein_g": 0.21, + "sodium_g": 0.019, + "sugar_g": 2.5 + }, + "source_description": "Coconut milk", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Plant-based milk", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "dairy_egg", + "description": "Yogurt, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Yogurt, NFS", + "fdc_id": 2705414, + "macros": { + "calories": 94.0, + "carbs_g": 10.22, + "fat_g": 2.87, + "fiber_g": 0.1, + "protein_g": 6.67, + "sodium_g": 0.049, + "sugar_g": 8.05 + }, + "source_description": "Yogurt, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Yogurt, regular", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "herb_spice", + "description": "Cocoa powder, not reconstituted is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Cocoa powder, not reconstituted", + "fdc_id": 2705587, + "macros": { + "calories": 228.0, + "carbs_g": 57.9, + "fat_g": 13.7, + "fiber_g": 37.0, + "protein_g": 19.6, + "sodium_g": 0.021, + "sugar_g": 1.75 + }, + "source_description": "Cocoa powder, not reconstituted", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Not included in a food category", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "dairy_egg", + "description": "Cream, light is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Cream, light", + "fdc_id": 2705593, + "macros": { + "calories": 195.0, + "carbs_g": 3.66, + "fat_g": 19.1, + "fiber_g": 0.0, + "protein_g": 2.96, + "sodium_g": 0.072, + "sugar_g": 3.67 + }, + "source_description": "Cream, light", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Cream and cream substitutes", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Chipotle dip, regular is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Chipotle dip, regular", + "fdc_id": 2705619, + "macros": { + "calories": 426.0, + "carbs_g": 3.15, + "fat_g": 45.08, + "fiber_g": 0.0, + "protein_g": 1.99, + "sodium_g": 0.708, + "sugar_g": 2.04 + }, + "source_description": "Chipotle dip, regular", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Dips, gravies, other sauces", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Ice cream, vanilla is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Ice cream, vanilla", + "fdc_id": 2705630, + "macros": { + "calories": 207.0, + "carbs_g": 23.6, + "fat_g": 11.0, + "fiber_g": 0.7, + "protein_g": 3.5, + "sodium_g": 0.08, + "sugar_g": 21.22 + }, + "source_description": "Ice cream, vanilla", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Ice cream and frozen dairy desserts", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "dairy_egg", + "description": "Cheese, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Cheese, NFS", + "fdc_id": 2705704, + "macros": { + "calories": 381.0, + "carbs_g": 4.33, + "fat_g": 31.26, + "fiber_g": 0.0, + "protein_g": 20.7, + "sodium_g": 0.964, + "sugar_g": 2.08 + }, + "source_description": "Cheese, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Cheese", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "dairy_egg", + "description": "Cheese, Cheddar is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Cheese, Cheddar", + "fdc_id": 2705709, + "macros": { + "calories": 409.0, + "carbs_g": 2.44, + "fat_g": 34.0, + "fiber_g": 0.0, + "protein_g": 23.3, + "sodium_g": 0.654, + "sugar_g": 0.33 + }, + "source_description": "Cheese, Cheddar", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Cheese", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "dairy_egg", + "description": "Cheese, Feta is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Cheese, Feta", + "fdc_id": 2705714, + "macros": { + "calories": 273.0, + "carbs_g": 5.58, + "fat_g": 19.08, + "fiber_g": 0.0, + "protein_g": 19.71, + "sodium_g": 1.034, + "sugar_g": 1.63 + }, + "source_description": "Cheese, Feta", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Cheese", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "dairy_egg", + "description": "Cheese, Mozzarella, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Cheese, Mozzarella, NFS", + "fdc_id": 2705722, + "macros": { + "calories": 296.0, + "carbs_g": 4.44, + "fat_g": 20.4, + "fiber_g": 0.0, + "protein_g": 23.7, + "sodium_g": 0.699, + "sugar_g": 1.81 + }, + "source_description": "Cheese, Mozzarella, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Cheese", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "dairy_egg", + "description": "Cheese, Parmesan, hard (Survey (FNDDS)) is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Cheese, Parmesan, hard (Survey (FNDDS))", + "fdc_id": 2705730, + "macros": { + "calories": 412.0, + "carbs_g": 8.36, + "fat_g": 28.75, + "fiber_g": 0.0, + "protein_g": 29.87, + "sodium_g": 1.398, + "sugar_g": 0.36 + }, + "source_description": "Cheese, Parmesan, hard", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Cheese", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "dairy_egg", + "description": "Cheese, paneer is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Cheese, paneer", + "fdc_id": 2705740, + "macros": { + "calories": 299.0, + "carbs_g": 22.46, + "fat_g": 15.52, + "fiber_g": 0.0, + "protein_g": 15.86, + "sodium_g": 0.185, + "sugar_g": 23.33 + }, + "source_description": "Cheese, paneer", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Cheese", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Queso Fresco is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Queso Fresco", + "fdc_id": 2705745, + "macros": { + "calories": 298.0, + "carbs_g": 2.96, + "fat_g": 23.36, + "fiber_g": 0.0, + "protein_g": 18.88, + "sodium_g": 0.626, + "sugar_g": 2.32 + }, + "source_description": "Queso Fresco", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Cheese", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Cheese, cottage, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Cheese, cottage, NFS", + "fdc_id": 2705747, + "macros": { + "calories": 82.0, + "carbs_g": 4.31, + "fat_g": 2.3, + "fiber_g": 0.0, + "protein_g": 11.0, + "sodium_g": 0.321, + "sugar_g": 4.1 + }, + "source_description": "Cheese, cottage, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Cottage/ricotta cheese", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Beef, steak, chuck is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Beef, steak, chuck", + "fdc_id": 2705825, + "macros": { + "calories": 225.0, + "carbs_g": 0.21, + "fat_g": 13.43, + "fiber_g": 0.0, + "protein_g": 25.97, + "sodium_g": 0.38, + "sugar_g": 0.0 + }, + "source_description": "Beef, steak, chuck", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Beef, excludes ground", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Beef, steak, flank is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Beef, steak, flank", + "fdc_id": 2705827, + "macros": { + "calories": 243.0, + "carbs_g": 0.0, + "fat_g": 14.09, + "fiber_g": 0.0, + "protein_g": 29.13, + "sodium_g": 0.37, + "sugar_g": 0.0 + }, + "source_description": "Beef, steak, flank", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Beef, excludes ground", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Pork, ground is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Pork, ground", + "fdc_id": 2705863, + "macros": { + "calories": 299.0, + "carbs_g": 0.0, + "fat_g": 21.22, + "fiber_g": 0.0, + "protein_g": 26.92, + "sodium_g": 0.395, + "sugar_g": 0.0 + }, + "source_description": "Pork, ground", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Pork", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Pork, chop, stuffed is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Pork, chop, stuffed", + "fdc_id": 2705872, + "macros": { + "calories": 190.0, + "carbs_g": 7.82, + "fat_g": 9.04, + "fiber_g": 1.0, + "protein_g": 18.37, + "sodium_g": 0.414, + "sugar_g": 0.0 + }, + "source_description": "Pork, chop, stuffed", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Meat mixed dishes", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Lamb, chop is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Lamb, chop", + "fdc_id": 2705906, + "macros": { + "calories": 264.0, + "carbs_g": 0.0, + "fat_g": 16.27, + "fiber_g": 0.0, + "protein_g": 27.36, + "sodium_g": 0.387, + "sugar_g": 0.0 + }, + "source_description": "Lamb, chop", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Lamb, goat, game", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Chicken drumstick, stewed, skin eaten is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Chicken drumstick, stewed, skin eaten", + "fdc_id": 2706014, + "macros": { + "calories": 186.0, + "carbs_g": 0.0, + "fat_g": 10.64, + "fiber_g": 0.0, + "protein_g": 22.54, + "sodium_g": 0.417, + "sugar_g": 0.0 + }, + "source_description": "Chicken drumstick, stewed, skin eaten", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Chicken, whole pieces", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Chicken thigh, stewed, skin eaten is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Chicken thigh, stewed, skin eaten", + "fdc_id": 2706037, + "macros": { + "calories": 227.0, + "carbs_g": 0.0, + "fat_g": 15.31, + "fiber_g": 0.0, + "protein_g": 22.39, + "sodium_g": 0.383, + "sugar_g": 0.0 + }, + "source_description": "Chicken thigh, stewed, skin eaten", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Chicken, whole pieces", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Chorizo is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Chorizo", + "fdc_id": 2706179, + "macros": { + "calories": 341.0, + "carbs_g": 2.63, + "fat_g": 28.1, + "fiber_g": 0.0, + "protein_g": 19.3, + "sodium_g": 0.983, + "sugar_g": 0.0 + }, + "source_description": "Chorizo", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Sausages", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Italian sausage is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Italian sausage", + "fdc_id": 2706189, + "macros": { + "calories": 317.0, + "carbs_g": 2.15, + "fat_g": 26.2, + "fiber_g": 0.0, + "protein_g": 18.2, + "sodium_g": 0.766, + "sugar_g": 1.46 + }, + "source_description": "Italian sausage", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Sausages", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Sausage, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Sausage, NFS", + "fdc_id": 2706190, + "macros": { + "calories": 325.0, + "carbs_g": 1.42, + "fat_g": 27.25, + "fiber_g": 0.0, + "protein_g": 18.53, + "sodium_g": 0.814, + "sugar_g": 1.09 + }, + "source_description": "Sausage, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Sausages", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Fish, catfish, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Fish, catfish, NFS", + "fdc_id": 2706234, + "macros": { + "calories": 255.0, + "carbs_g": 11.72, + "fat_g": 16.68, + "fiber_g": 0.5, + "protein_g": 13.49, + "sodium_g": 0.418, + "sugar_g": 0.2 + }, + "source_description": "Fish, catfish, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Fish", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Fish, cod, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Fish, cod, NFS", + "fdc_id": 2706240, + "macros": { + "calories": 217.0, + "carbs_g": 11.72, + "fat_g": 12.48, + "fiber_g": 0.5, + "protein_g": 13.52, + "sodium_g": 0.426, + "sugar_g": 0.2 + }, + "source_description": "Fish, cod, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Fish", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Fish, haddock, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Fish, haddock, NFS", + "fdc_id": 2706254, + "macros": { + "calories": 217.0, + "carbs_g": 11.72, + "fat_g": 12.51, + "fiber_g": 0.5, + "protein_g": 14.31, + "sodium_g": 0.395, + "sugar_g": 0.2 + }, + "source_description": "Fish, haddock, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Fish", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Fish, tuna, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Fish, tuna, raw", + "fdc_id": 2706308, + "macros": { + "calories": 109.0, + "carbs_g": 0.0, + "fat_g": 0.49, + "fiber_g": 0.0, + "protein_g": 24.4, + "sodium_g": 0.045, + "sugar_g": 0.0 + }, + "source_description": "Fish, tuna, raw", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Fish", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Fish, tilapia, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Fish, tilapia, NFS", + "fdc_id": 2706318, + "macros": { + "calories": 160.0, + "carbs_g": 0.01, + "fat_g": 6.65, + "fiber_g": 0.0, + "protein_g": 24.95, + "sodium_g": 0.28, + "sugar_g": 0.01 + }, + "source_description": "Fish, tilapia, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Fish", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Orange chicken is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Orange chicken", + "fdc_id": 2706443, + "macros": { + "calories": 262.0, + "carbs_g": 22.46, + "fat_g": 12.68, + "fiber_g": 0.8, + "protein_g": 14.46, + "sodium_g": 0.553, + "sugar_g": 13.6 + }, + "source_description": "Orange chicken", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Stir-fry and soy-based sauce mixtures", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Soup, broth is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Soup, broth", + "fdc_id": 2707132, + "macros": { + "calories": 6.0, + "carbs_g": 0.24, + "fat_g": 0.22, + "fiber_g": 0.0, + "protein_g": 0.89, + "sodium_g": 0.372, + "sugar_g": 0.22 + }, + "source_description": "Soup, broth", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Soups, broth-based", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Oyster sauce is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Oyster sauce", + "fdc_id": 2707150, + "macros": { + "calories": 51.0, + "carbs_g": 10.92, + "fat_g": 0.25, + "fiber_g": 0.3, + "protein_g": 1.35, + "sodium_g": 2.733, + "sugar_g": 0.0 + }, + "source_description": "Oyster sauce", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Soy-based condiments", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "White beans, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "White beans, NFS", + "fdc_id": 2707353, + "macros": { + "calories": 188.0, + "carbs_g": 23.32, + "fat_g": 6.83, + "fiber_g": 5.9, + "protein_g": 9.04, + "sodium_g": 0.221, + "sugar_g": 0.32 + }, + "source_description": "White beans, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Beans, peas, legumes", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Kidney beans, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Kidney beans, NFS", + "fdc_id": 2707379, + "macros": { + "calories": 177.0, + "carbs_g": 21.19, + "fat_g": 6.97, + "fiber_g": 6.9, + "protein_g": 8.06, + "sodium_g": 0.218, + "sugar_g": 0.3 + }, + "source_description": "Kidney beans, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Beans, peas, legumes", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Hummus, plain is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Hummus, plain", + "fdc_id": 2707402, + "macros": { + "calories": 243.0, + "carbs_g": 14.9, + "fat_g": 17.1, + "fiber_g": 5.4, + "protein_g": 7.35, + "sodium_g": 0.438, + "sugar_g": 0.34 + }, + "source_description": "Hummus, plain", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Dips, gravies, other sauces", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Blackeyed peas, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Blackeyed peas, NFS", + "fdc_id": 2707412, + "macros": { + "calories": 166.0, + "carbs_g": 19.29, + "fat_g": 7.0, + "fiber_g": 6.0, + "protein_g": 7.18, + "sodium_g": 0.22, + "sugar_g": 3.07 + }, + "source_description": "Blackeyed peas, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Beans, peas, legumes", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Lentils, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Lentils, NFS", + "fdc_id": 2707423, + "macros": { + "calories": 166.0, + "carbs_g": 18.71, + "fat_g": 6.86, + "fiber_g": 7.3, + "protein_g": 8.38, + "sodium_g": 0.218, + "sugar_g": 1.67 + }, + "source_description": "Lentils, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Beans, peas, legumes", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Miso is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Miso", + "fdc_id": 2707439, + "macros": { + "calories": 198.0, + "carbs_g": 25.37, + "fat_g": 6.01, + "fiber_g": 5.4, + "protein_g": 12.79, + "sodium_g": 3.728, + "sugar_g": 6.2 + }, + "source_description": "Miso", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Soy-based condiments", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Hoisin sauce is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Hoisin sauce", + "fdc_id": 2707441, + "macros": { + "calories": 220.0, + "carbs_g": 44.08, + "fat_g": 3.39, + "fiber_g": 2.8, + "protein_g": 3.31, + "sodium_g": 1.615, + "sugar_g": 27.26 + }, + "source_description": "Hoisin sauce", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Soy-based condiments", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "protein", + "description": "Bacon bits is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Bacon bits", + "fdc_id": 2707466, + "macros": { + "calories": 476.0, + "carbs_g": 28.6, + "fat_g": 25.9, + "fiber_g": 10.2, + "protein_g": 32.0, + "sodium_g": 1.77, + "sugar_g": 0.0 + }, + "source_description": "Bacon bits", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Bacon", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "grain_legume", + "description": "Bread, white is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Bread, white", + "fdc_id": 2707598, + "macros": { + "calories": 267.0, + "carbs_g": 49.2, + "fat_g": 3.59, + "fiber_g": 2.3, + "protein_g": 9.43, + "sodium_g": 0.45, + "sugar_g": 5.34 + }, + "source_description": "Bread, white", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Yeast breads", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Bread, French or Vienna is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Bread, French or Vienna", + "fdc_id": 2707610, + "macros": { + "calories": 272.0, + "carbs_g": 51.88, + "fat_g": 2.42, + "fiber_g": 2.2, + "protein_g": 10.75, + "sodium_g": 0.602, + "sugar_g": 4.62 + }, + "source_description": "Bread, French or Vienna", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Yeast breads", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "grain_legume", + "description": "Bread, pita is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Bread, pita", + "fdc_id": 2707616, + "macros": { + "calories": 275.0, + "carbs_g": 55.7, + "fat_g": 1.2, + "fiber_g": 2.2, + "protein_g": 9.1, + "sodium_g": 0.536, + "sugar_g": 1.3 + }, + "source_description": "Bread, pita", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Yeast breads", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "grain_legume", + "description": "Roll, white, hamburger bun is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Roll, white, hamburger bun", + "fdc_id": 2707657, + "macros": { + "calories": 267.0, + "carbs_g": 49.2, + "fat_g": 3.59, + "fiber_g": 2.3, + "protein_g": 9.43, + "sodium_g": 0.45, + "sugar_g": 5.34 + }, + "source_description": "Roll, white, hamburger bun", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Rolls and buns", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "grain_legume", + "description": "Tortilla, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Tortilla, NFS", + "fdc_id": 2707822, + "macros": { + "calories": 262.0, + "carbs_g": 47.01, + "fat_g": 5.42, + "fiber_g": 4.9, + "protein_g": 6.95, + "sodium_g": 0.372, + "sugar_g": 2.3 + }, + "source_description": "Tortilla, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Tortillas", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "grain_legume", + "description": "Tortilla, corn is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Tortilla, corn", + "fdc_id": 2707823, + "macros": { + "calories": 218.0, + "carbs_g": 44.64, + "fat_g": 2.85, + "fiber_g": 6.3, + "protein_g": 5.7, + "sodium_g": 0.045, + "sugar_g": 0.88 + }, + "source_description": "Tortilla, corn", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Tortillas", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Tortilla, flour is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Tortilla, flour", + "fdc_id": 2707824, + "macros": { + "calories": 306.0, + "carbs_g": 49.38, + "fat_g": 7.99, + "fiber_g": 3.5, + "protein_g": 8.2, + "sodium_g": 0.7, + "sugar_g": 3.71 + }, + "source_description": "Tortilla, flour", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Tortillas", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Taco shell, corn is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Taco shell, corn", + "fdc_id": 2707826, + "macros": { + "calories": 476.0, + "carbs_g": 63.49, + "fat_g": 21.79, + "fiber_g": 6.7, + "protein_g": 6.41, + "sodium_g": 0.324, + "sugar_g": 1.5 + }, + "source_description": "Taco shell, corn", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Tortillas", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "grain_legume", + "description": "Pastry, puff is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Pastry, puff", + "fdc_id": 2708053, + "macros": { + "calories": 558.0, + "carbs_g": 45.7, + "fat_g": 38.5, + "fiber_g": 1.5, + "protein_g": 7.4, + "sodium_g": 0.253, + "sugar_g": 0.75 + }, + "source_description": "Pastry, puff", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Doughnuts, sweet rolls, pastries", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Rice paper is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Rice paper", + "fdc_id": 2708166, + "macros": { + "calories": 323.0, + "carbs_g": 72.26, + "fat_g": 1.11, + "fiber_g": 0.5, + "protein_g": 5.91, + "sodium_g": 0.314, + "sugar_g": 0.27 + }, + "source_description": "Rice paper", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Crackers, excludes saltines", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Cake made with glutinous rice is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Cake made with glutinous rice", + "fdc_id": 2708345, + "macros": { + "calories": 279.0, + "carbs_g": 53.57, + "fat_g": 6.51, + "fiber_g": 0.7, + "protein_g": 2.49, + "sodium_g": 0.036, + "sugar_g": 31.12 + }, + "source_description": "Cake made with glutinous rice", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Rice mixed dishes", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Noodles, cooked is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Noodles, cooked", + "fdc_id": 2708352, + "macros": { + "calories": 137.0, + "carbs_g": 25.01, + "fat_g": 2.06, + "fiber_g": 1.2, + "protein_g": 4.51, + "sodium_g": 0.236, + "sugar_g": 0.4 + }, + "source_description": "Noodles, cooked", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Pasta, noodles, cooked grains", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "grain_legume", + "description": "Rice noodles, cooked (Survey (FNDDS)) is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Rice noodles, cooked (Survey (FNDDS))", + "fdc_id": 2708356, + "macros": { + "calories": 107.0, + "carbs_g": 23.87, + "fat_g": 0.2, + "fiber_g": 1.0, + "protein_g": 1.78, + "sodium_g": 0.25, + "sugar_g": 0.03 + }, + "source_description": "Rice noodles, cooked", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Pasta, noodles, cooked grains", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Pasta, cooked is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Pasta, cooked", + "fdc_id": 2708357, + "macros": { + "calories": 157.0, + "carbs_g": 30.68, + "fat_g": 0.92, + "fiber_g": 1.8, + "protein_g": 5.76, + "sodium_g": 0.232, + "sugar_g": 0.56 + }, + "source_description": "Pasta, cooked", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Pasta, noodles, cooked grains", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Rice, white, cooked, glutinous is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Rice, white, cooked, glutinous", + "fdc_id": 2708422, + "macros": { + "calories": 96.0, + "carbs_g": 20.97, + "fat_g": 0.19, + "fiber_g": 1.0, + "protein_g": 2.01, + "sodium_g": 0.227, + "sugar_g": 0.05 + }, + "source_description": "Rice, white, cooked, glutinous", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Rice", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "grain_legume", + "description": "Gnocchi, cheese is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Gnocchi, cheese", + "fdc_id": 2708721, + "macros": { + "calories": 178.0, + "carbs_g": 9.38, + "fat_g": 11.96, + "fiber_g": 0.2, + "protein_g": 8.51, + "sodium_g": 0.263, + "sugar_g": 0.14 + }, + "source_description": "Gnocchi, cheese", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Pasta mixed dishes, excludes macaroni and cheese", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Lemon juice, 100%, NS as to form is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Lemon juice, 100%, NS as to form", + "fdc_id": 2709180, + "macros": { + "calories": 22.0, + "carbs_g": 6.9, + "fat_g": 0.24, + "fiber_g": 0.3, + "protein_g": 0.35, + "sodium_g": 0.001, + "sugar_g": 2.52 + }, + "source_description": "Lemon juice, 100%, NS as to form", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Mustard and other condiments", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Orange juice, 100%, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Orange juice, 100%, NFS", + "fdc_id": 2709186, + "macros": { + "calories": 47.0, + "carbs_g": 10.17, + "fat_g": 0.34, + "fiber_g": 0.3, + "protein_g": 0.77, + "sodium_g": 0.002, + "sugar_g": 8.18 + }, + "source_description": "Orange juice, 100%, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Citrus juice", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "fruit", + "description": "Mango, raw (Survey (FNDDS)) is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Mango, raw (Survey (FNDDS))", + "fdc_id": 2709242, + "macros": { + "calories": 60.0, + "carbs_g": 14.98, + "fat_g": 0.38, + "fiber_g": 1.6, + "protein_g": 0.82, + "sodium_g": 0.001, + "sugar_g": 13.66 + }, + "source_description": "Mango, raw", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Mango and papaya", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "fruit", + "description": "Pineapple, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Pineapple, raw", + "fdc_id": 2709260, + "macros": { + "calories": 60.0, + "carbs_g": 14.09, + "fat_g": 0.21, + "fiber_g": 0.9, + "protein_g": 0.46, + "sodium_g": 0.0, + "sugar_g": 11.42 + }, + "source_description": "Pineapple, raw", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Pineapple", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "fruit", + "description": "Blueberries, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Blueberries, raw", + "fdc_id": 2709275, + "macros": { + "calories": 64.0, + "carbs_g": 14.57, + "fat_g": 0.31, + "fiber_g": 2.4, + "protein_g": 0.7, + "sodium_g": 0.0, + "sugar_g": 9.36 + }, + "source_description": "Blueberries, raw", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Blueberries and other berries", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Cranberry sauce is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Cranberry sauce", + "fdc_id": 2709280, + "macros": { + "calories": 159.0, + "carbs_g": 40.4, + "fat_g": 0.15, + "fiber_g": 1.1, + "protein_g": 0.9, + "sodium_g": 0.005, + "sugar_g": 31.75 + }, + "source_description": "Cranberry sauce", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Blueberries and other berries", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Apple cider is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Apple cider", + "fdc_id": 2709319, + "macros": { + "calories": 46.0, + "carbs_g": 11.3, + "fat_g": 0.13, + "fiber_g": 0.2, + "protein_g": 0.1, + "sodium_g": 0.004, + "sugar_g": 9.62 + }, + "source_description": "Apple cider", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Apple juice", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Potato, french fries, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Potato, french fries, NFS", + "fdc_id": 2709456, + "macros": { + "calories": 225.0, + "carbs_g": 23.23, + "fat_g": 14.07, + "fiber_g": 1.8, + "protein_g": 2.5, + "sodium_g": 0.295, + "sugar_g": 0.34 + }, + "source_description": "Potato, french fries, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "French fries and other fried white potatoes", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Plantain, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Plantain, raw", + "fdc_id": 2709560, + "macros": { + "calories": 122.0, + "carbs_g": 31.89, + "fat_g": 0.35, + "fiber_g": 1.7, + "protein_g": 1.3, + "sodium_g": 0.004, + "sugar_g": 17.51 + }, + "source_description": "Plantain, raw", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Other starchy vegetables", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Sweet potato, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Sweet potato, NFS", + "fdc_id": 2709697, + "macros": { + "calories": 115.0, + "carbs_g": 17.14, + "fat_g": 4.53, + "fiber_g": 3.0, + "protein_g": 1.58, + "sodium_g": 0.161, + "sugar_g": 6.0 + }, + "source_description": "Sweet potato, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Other red and orange vegetables", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Tomatoes, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Tomatoes, raw", + "fdc_id": 2709719, + "macros": { + "calories": 20.0, + "carbs_g": 4.04, + "fat_g": 0.31, + "fiber_g": 1.2, + "protein_g": 0.82, + "sodium_g": 0.004, + "sugar_g": 2.63 + }, + "source_description": "Tomatoes, raw", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Tomatoes", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "vegetable", + "description": "Bean sprouts, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Bean sprouts, raw", + "fdc_id": 2709768, + "macros": { + "calories": 30.0, + "carbs_g": 5.94, + "fat_g": 0.18, + "fiber_g": 1.8, + "protein_g": 3.04, + "sodium_g": 0.006, + "sugar_g": 4.13 + }, + "source_description": "Bean sprouts, raw", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Other vegetables and combinations", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:03:54Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Cabbage, red, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Cabbage, red, raw", + "fdc_id": 2709775, + "macros": { + "calories": 34.0, + "carbs_g": 6.79, + "fat_g": 0.21, + "fiber_g": 2.1, + "protein_g": 1.24, + "sodium_g": 0.012, + "sugar_g": 3.83 + }, + "source_description": "Cabbage, red, raw", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Cabbage", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Cauliflower, raw (Survey (FNDDS)) is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Cauliflower, raw (Survey (FNDDS))", + "fdc_id": 2709777, + "macros": { + "calories": 25.0, + "carbs_g": 4.97, + "fat_g": 0.28, + "fiber_g": 2.0, + "protein_g": 1.92, + "sodium_g": 0.03, + "sugar_g": 1.91 + }, + "source_description": "Cauliflower, raw", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Other vegetables and combinations", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "herb_spice", + "description": "Basil, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Basil, raw", + "fdc_id": 2709780, + "macros": { + "calories": 23.0, + "carbs_g": 2.65, + "fat_g": 0.64, + "fiber_g": 1.6, + "protein_g": 3.15, + "sodium_g": 0.004, + "sugar_g": 0.3 + }, + "source_description": "Basil, raw", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Not included in a food category", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "herb_spice", + "description": "Chives, raw (Survey (FNDDS)) is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Chives, raw (Survey (FNDDS))", + "fdc_id": 2709781, + "macros": { + "calories": 30.0, + "carbs_g": 4.35, + "fat_g": 0.73, + "fiber_g": 2.5, + "protein_g": 3.27, + "sodium_g": 0.003, + "sugar_g": 1.85 + }, + "source_description": "Chives, raw", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Not included in a food category", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "herb_spice", + "description": "Parsley, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Parsley, raw", + "fdc_id": 2709796, + "macros": { + "calories": 36.0, + "carbs_g": 6.33, + "fat_g": 0.79, + "fiber_g": 3.3, + "protein_g": 2.97, + "sodium_g": 0.056, + "sugar_g": 0.85 + }, + "source_description": "Parsley, raw", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Not included in a food category", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Seaweed, raw is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Seaweed, raw", + "fdc_id": 2709805, + "macros": { + "calories": 41.0, + "carbs_g": 7.94, + "fat_g": 0.49, + "fiber_g": 0.7, + "protein_g": 3.51, + "sodium_g": 0.384, + "sugar_g": 0.58 + }, + "source_description": "Seaweed, raw", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Other vegetables and combinations", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "vegetable", + "description": "Hominy, cooked is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Hominy, cooked", + "fdc_id": 2709933, + "macros": { + "calories": 88.0, + "carbs_g": 13.8, + "fat_g": 2.91, + "fiber_g": 2.4, + "protein_g": 1.45, + "sodium_g": 0.501, + "sugar_g": 1.47 + }, + "source_description": "Hominy, cooked", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Grits and other cooked cereals", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Leeks is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Leeks", + "fdc_id": 2709935, + "macros": { + "calories": 88.0, + "carbs_g": 14.74, + "fat_g": 3.05, + "fiber_g": 1.9, + "protein_g": 1.57, + "sodium_g": 0.151, + "sugar_g": 4.07 + }, + "source_description": "Leeks", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Onions", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Yeast is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Yeast", + "fdc_id": 2710005, + "macros": { + "calories": 325.0, + "carbs_g": 41.22, + "fat_g": 7.61, + "fiber_g": 26.9, + "protein_g": 40.44, + "sodium_g": 0.051, + "sugar_g": 0.0 + }, + "source_description": "Yeast", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Not included in a food category", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Kimchi is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Kimchi", + "fdc_id": 2710077, + "macros": { + "calories": 15.0, + "carbs_g": 2.4, + "fat_g": 0.5, + "fiber_g": 1.6, + "protein_g": 1.1, + "sodium_g": 0.498, + "sugar_g": 1.06 + }, + "source_description": "Kimchi", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Olives, pickles, pickled vegetables", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "vegetable", + "description": "Pickles, dill is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Pickles, dill", + "fdc_id": 2710078, + "macros": { + "calories": 14.0, + "carbs_g": 1.99, + "fat_g": 0.43, + "fiber_g": 1.0, + "protein_g": 0.48, + "sodium_g": 0.808, + "sugar_g": 1.28 + }, + "source_description": "Pickles, dill", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Olives, pickles, pickled vegetables", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Mustard is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Mustard", + "fdc_id": 2710085, + "macros": { + "calories": 69.0, + "carbs_g": 5.3, + "fat_g": 3.38, + "fiber_g": 4.3, + "protein_g": 4.25, + "sodium_g": 1.1, + "sugar_g": 1.42 + }, + "source_description": "Mustard", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Mustard and other condiments", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "dairy_egg", + "description": "Butter, NFS is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Butter, NFS", + "fdc_id": 2710154, + "macros": { + "calories": 743.0, + "carbs_g": 0.06, + "fat_g": 82.2, + "fiber_g": 0.0, + "protein_g": 0.85, + "sodium_g": 0.524, + "sugar_g": 0.58 + }, + "source_description": "Butter, NFS", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Butter and animal fats", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Coconut oil is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Coconut oil", + "fdc_id": 2710182, + "macros": { + "calories": 895.0, + "carbs_g": 0.84, + "fat_g": 99.1, + "fiber_g": 0.0, + "protein_g": 0.0, + "sodium_g": 0.0, + "sugar_g": 0.0 + }, + "source_description": "Coconut oil", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Salad dressings and vegetable oils", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Sugar, brown is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Sugar, brown", + "fdc_id": 2710260, + "macros": { + "calories": 380.0, + "carbs_g": 98.09, + "fat_g": 0.0, + "fiber_g": 0.0, + "protein_g": 0.12, + "sodium_g": 0.028, + "sugar_g": 97.02 + }, + "source_description": "Sugar, brown", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Sugars and honey", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Honey is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Honey", + "fdc_id": 2710281, + "macros": { + "calories": 304.0, + "carbs_g": 82.4, + "fat_g": 0.0, + "fiber_g": 0.2, + "protein_g": 0.3, + "sodium_g": 0.004, + "sugar_g": 82.12 + }, + "source_description": "Honey", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Sugars and honey", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Coffee, brewed is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Coffee, brewed", + "fdc_id": 2710375, + "macros": { + "calories": 1.0, + "carbs_g": 0.0, + "fat_g": 0.02, + "fiber_g": 0.0, + "protein_g": 0.12, + "sodium_g": 0.002, + "sugar_g": 0.0 + }, + "source_description": "Coffee, brewed", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Coffee", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "condiment", + "description": "Tea, hot, leaf, black is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Tea, hot, leaf, black", + "fdc_id": 2710488, + "macros": { + "calories": 1.0, + "carbs_g": 0.3, + "fat_g": 0.0, + "fiber_g": 0.0, + "protein_g": 0.0, + "sodium_g": 0.003, + "sugar_g": 0.0 + }, + "source_description": "Tea, hot, leaf, black", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Tea", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Wine, red is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Wine, red", + "fdc_id": 2710688, + "macros": { + "calories": 85.0, + "carbs_g": 2.61, + "fat_g": 0.0, + "fiber_g": 0.0, + "protein_g": 0.07, + "sodium_g": 0.004, + "sugar_g": 0.62 + }, + "source_description": "Wine, red", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Wine", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "other", + "description": "Rum is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Rum", + "fdc_id": 2710703, + "macros": { + "calories": 231.0, + "carbs_g": 0.0, + "fat_g": 0.0, + "fiber_g": 0.0, + "protein_g": 0.0, + "sodium_g": 0.001, + "sugar_g": 0.0 + }, + "source_description": "Rum", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Liquor and cocktails", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" + }, + { + "alt_names": [], + "category_label": "grain_legume", + "description": "Rice, brown, cooked, as ingredient is a USDA-listed ingredient; nutrition is per 100 g as reported by FoodData Central (Survey (FNDDS)).", + "display_name": "Rice, brown, cooked, as ingredient", + "fdc_id": 2710789, + "macros": { + "calories": 124.0, + "carbs_g": 25.89, + "fat_g": 1.12, + "fiber_g": 1.0, + "protein_g": 2.45, + "sodium_g": 0.003, + "sugar_g": 0.22 + }, + "source_description": "Rice, brown, cooked, as ingredient", + "source_meta": { + "data_type": "Survey (FNDDS)", + "food_category": "Not included in a food category", + "verification_source": "USDA FoodData Central bulk download (CC0)", + "verified_at_utc": "2026-10-15T22:01:13Z" + }, + "sprite_group": "other", + "sprite_key": "" }, { "alt_names": [ diff --git a/scripts/data/import_missing_fdc_rows.py b/scripts/data/import_missing_fdc_rows.py new file mode 100644 index 000000000..c0c4c4a1b --- /dev/null +++ b/scripts/data/import_missing_fdc_rows.py @@ -0,0 +1,369 @@ +#!/usr/bin/env python3 +"""Add USDA FoodData Central rows the recipe catalog needs but the app catalog lacks. + +The bundle-v2 vocabulary carries an `fdc_id` on most ingredient keys. When that id is +missing from the shipped `usda_ingredient_catalog.sqlite`, the hydration-time identity +bridge cannot resolve the key, and every recipe line on it counts as "not in your +kitchen". This tool closes that gap from cited data only: + + 1. Read the shipped bundle vocabulary and the canonical catalog + (`catalog/usda_curated_ingredients.json`); list the `fdc_id`s the vocabulary + references that the canonical catalog does not carry. + 2. For each missing id, take the exact food row from the public FDC bulk CSV + downloads (Foundation / SR Legacy / Survey (FNDDS), CC0, no API key): the + description becomes the display name, and the per-100 g macros come from the + row's food_nutrient entries (Energy, Protein, Carbohydrate, Total lipid, Fiber, + Total sugars, Sodium). + 3. Merge the new records into the canonical catalog (sorted by fdc_id, the schema's + own validation applies), leaving every existing row byte-identical (macro freeze). + +A vocabulary key with no `fdc_id` resolves only through a legacy id or a cited +same-food FDC row of its own; this tool never invents one. Keys it cannot cover are +left unresolved and are listed in the reach report. + +Usage: + python3 scripts/data/import_missing_fdc_rows.py \ + --fdc-csv-root /tmp/fdc/ext \ + --repo-root /path/to/FridgeLuck +""" + +from __future__ import annotations + +import argparse +import csv +import json +import sys +from collections import defaultdict +from datetime import datetime, timezone +from pathlib import Path + +# Per-100 g nutrient ids in FDC bulk downloads. Survey (FNDDS) rows use the +# legacy nutrient_nbr ids (208/203/...) in food_nutrient.csv; Foundation and +# SR Legacy use the FDC master ids (1008/1003/...). Prefer the FDC id, fall +# back to the legacy one. +NUTRIENT_ENERGY_KCAL = [1008, 208] +NUTRIENT_PROTEIN = [1003, 203] +NUTRIENT_CARBES = [1005, 205] +NUTRIENT_FAT = [1004, 204] +NUTRIENT_FIBER = [1079, 291] +NUTRIENT_SODIUM = [1093, 307] +NUTRIENT_SUGARS = [2000, 1063, 269] # prefer "Total Sugars" style ids, first hit wins + +SMALL_WORDS = {"and", "or", "of", "in", "with", "without", "to", "for", "on", "a", "an", "the"} +UPPER_TOKENS = {"nfs", "ns", "na", "wt", "iqf", "usda", "php", "bpa"} + + +def title_case(description: str) -> str: + """Humanize an FDC description. Uppercase descriptions become title case with + small words lowercase; mixed-case descriptions pass through unchanged.""" + text = " ".join(description.split()) + if not text or not text.isupper(): + return text + + def fix_word(word: str) -> str: + lowered = word.lower() + if lowered in UPPER_TOKENS: + return lowered.upper() + if lowered in SMALL_WORDS: + return lowered + return lowered[:1].upper() + lowered[1:] + + words = [fix_word(w) for w in text.lower().split(" ")] + # The first word always capitalizes. + if words: + words[0] = words[0][:1].upper() + words[0][1:] + return " ".join(words) + + +def load_vocabulary(bundle_path: Path) -> list[dict]: + bundle = json.loads(bundle_path.read_text()) + return bundle["ingredients"] + + +def load_canonical(canonical_path: Path) -> dict: + return json.loads(canonical_path.read_text()) + + +def missing_fdc_ids(vocabulary: list[dict], canonical: dict) -> dict[int, list[str]]: + """fdc_id -> vocabulary keys that reference it, for ids the canonical lacks.""" + have = {row["fdc_id"] for row in canonical["records"]} + wanted: dict[int, list[str]] = defaultdict(list) + for row in vocabulary: + fdc_id = row.get("fdc_id") + if fdc_id is not None and int(fdc_id) not in have: + wanted[int(fdc_id)].append(row["key"]) + return dict(wanted) + + +def read_food_rows(csv_root: Path) -> dict[int, dict]: + """fdc_id -> {description, data_type, category} across the three public datasets.""" + datasets = [ + ("FoodData_Central_foundation_food_csv", "Foundation"), + ("FoodData_Central_sr_legacy_food_csv", "SR Legacy"), + ("FoodData_Central_survey_food_csv", "Survey (FNDDS)"), + ] + foods: dict[int, dict] = {} + for prefix, data_type in datasets: + dataset_dir = next(csv_root.glob(f"{prefix}_*/{prefix}_*"), None) + if dataset_dir is None: + continue + category_names = read_category_names(dataset_dir) + with (dataset_dir / "food.csv").open(newline="", encoding="utf-8") as handle: + for row in csv.DictReader(handle): + fdc_id = int(row["fdc_id"]) + category = category_names.get( + row.get("food_category_id", ""), f"{data_type} foods" + ) + foods[fdc_id] = { + "description": row["description"], + "data_type": data_type, + "food_category": category, + } + return foods + + +def read_category_names(dataset_dir: Path) -> dict[str, str]: + names: dict[str, str] = {} + category_csv = dataset_dir / "food_category.csv" + if category_csv.exists(): + with category_csv.open(newline="", encoding="utf-8") as handle: + for row in csv.DictReader(handle): + names[row["id"]] = row.get("description", "") + wweia_csv = dataset_dir / "wweia_food_category.csv" + if wweia_csv.exists(): + with wweia_csv.open(newline="", encoding="utf-8") as handle: + for row in csv.DictReader(handle): + code = row.get("wweia_food_category", row.get("code", "")) + names[code] = row.get("wweia_food_category_description", row.get("description", "")) + return names + + +def read_macros(csv_root: Path, fdc_ids: set[int]) -> dict[int, dict[str, float]]: + """fdc_id -> per-100 g macros from food_nutrient.csv across the datasets.""" + amounts: dict[int, dict[int, float]] = defaultdict(dict) + for prefix in [ + "FoodData_Central_foundation_food_csv", + "FoodData_Central_sr_legacy_food_csv", + "FoodData_Central_survey_food_csv", + ]: + dataset_dir = next(csv_root.glob(f"{prefix}_*/{prefix}_*"), None) + if dataset_dir is None: + continue + nutrient_csv = dataset_dir / "food_nutrient.csv" + if not nutrient_csv.exists(): + continue + with nutrient_csv.open(newline="", encoding="utf-8") as handle: + for row in csv.DictReader(handle): + fdc_id = int(row["fdc_id"]) + if fdc_id not in fdc_ids: + continue + nutrient_id = int(row["nutrient_id"]) + amounts[fdc_id][nutrient_id] = float(row["amount"]) + + macros_by_id: dict[int, dict[str, float]] = {} + + def first_amount(per_nutrient: dict[int, float], ids: list[int]) -> float: + for nutrient_id in ids: + if nutrient_id in per_nutrient: + return per_nutrient[nutrient_id] + return 0.0 + + for fdc_id, per_nutrient in amounts.items(): + macros_by_id[fdc_id] = { + "calories": round(first_amount(per_nutrient, NUTRIENT_ENERGY_KCAL), 4), + "protein_g": round(first_amount(per_nutrient, NUTRIENT_PROTEIN), 4), + "carbs_g": round(first_amount(per_nutrient, NUTRIENT_CARBES), 4), + "fat_g": round(first_amount(per_nutrient, NUTRIENT_FAT), 4), + "fiber_g": round(first_amount(per_nutrient, NUTRIENT_FIBER), 4), + "sugar_g": round(first_amount(per_nutrient, NUTRIENT_SUGARS), 4), + "sodium_g": round(first_amount(per_nutrient, NUTRIENT_SODIUM) / 1000.0, 4), + } + return macros_by_id + + +VOCAB_CATEGORY_TO_LABEL = { + "meat": "protein", + "fish": "protein", + "shellfish": "protein", + "spice": "herb_spice", + "grain": "grain_legume", + "dairy_egg": "dairy_egg", + "vegetable": "vegetable", + "fruit": "fruit", + "condiment": "condiment", + "other": "other", +} + +FDC_CATEGORY_TO_LABEL = { + "Dairy and Egg Products": "dairy_egg", + "Fats and Oils": "oil_fat", + "Poultry Products": "protein", + "Sausages and Luncheon Meats": "protein", + "Pork Products": "protein", + "Beef Products": "protein", + "Finfish and Shellfish Products": "protein", + "Lamb, Veal, and Game Products": "protein", + "Vegetables and Vegetable Products": "vegetable", + "Fruits and Fruit Juices": "fruit", + "Legumes and Legume Products": "grain_legume", + "Nut and Seed Products": "nut_seed", + "Spices and Herbs": "herb_spice", + "Soups, Sauces, and Gravies": "condiment", + "Grains and Pasta": "grain_legume", + "Breakfast Cereals": "grain_legume", + "Baked Products": "sweetener_baking", + "Sweets": "sweetener_baking", + "Sweeteners": "sweetener_baking", +} + + +def choose_category( + vocab_categories: list[str], fdc_category: str | None +) -> str: + for category in vocab_categories: + label = VOCAB_CATEGORY_TO_LABEL.get(category) + if label: + return label + if fdc_category and fdc_category in FDC_CATEGORY_TO_LABEL: + return FDC_CATEGORY_TO_LABEL[fdc_category] + return "other" + + +def unique_display_name( + display_name: str, fdc_id: int, taken: set[str], data_type: str +) -> str: + """Keep canonical display names unique; `taken` holds canonical keys and is updated.""" + from usda_core.utils import canonical # noqa: PLC0415 — local import keeps the CLI lean + + key = canonical(display_name) + if key not in taken: + taken.add(key) + return display_name + suffixed = f"{display_name} ({data_type})" + suffixed_key = canonical(suffixed) + if suffixed_key not in taken: + taken.add(suffixed_key) + return suffixed + fallback = f"{display_name} (fdc {fdc_id})" + taken.add(canonical(fallback)) + return fallback + + +def canonical_display_key(value: str) -> str: + from usda_core.utils import canonical # noqa: PLC0415 + + return canonical(value) + + +def build_new_records( + wanted: dict[int, list[str]], + vocab_categories: dict[str, str], + foods: dict[int, dict], + macros_by_id: dict[int, dict[str, float]], + taken_names: set[str], +) -> tuple[list[dict], list[dict]]: + verified = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + new_records: list[dict] = [] + not_found: list[dict] = [] + for fdc_id in sorted(wanted): + keys = wanted[fdc_id] + categories = [vocab_categories.get(key, "other") for key in keys] + food = foods.get(fdc_id) + macros = macros_by_id.get(fdc_id) + if food is None or macros is None: + not_found.append({"fdc_id": fdc_id, "keys": keys}) + continue + display_name = unique_display_name( + title_case(food["description"]), fdc_id, taken_names, food["data_type"] + ) + taken_names.add(display_name) + category = choose_category(categories, food["food_category"]) + new_records.append( + { + "fdc_id": fdc_id, + "display_name": display_name, + "alt_names": [], + "category_label": category, + "sprite_group": "other", + "sprite_key": "", + "description": ( + f"{display_name} is a USDA-listed ingredient; nutrition is per 100 g " + f"as reported by FoodData Central ({food['data_type']})." + ), + "source_description": food["description"], + "source_meta": { + "data_type": food["data_type"], + "food_category": food["food_category"], + "verified_at_utc": verified, + "verification_source": "USDA FoodData Central bulk download (CC0)", + }, + "macros": macros, + } + ) + return new_records, not_found + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--repo-root", type=Path, default=Path(__file__).resolve().parents[2]) + parser.add_argument( + "--fdc-csv-root", type=Path, required=True, + help="Directory holding the extracted FDC bulk CSV downloads", + ) + parser.add_argument( + "--apply", action="store_true", + help="Write the merged canonical JSON; without this flag the run is a dry report", + ) + args = parser.parse_args() + + sys.path.insert(0, str(args.repo_root / "scripts" / "data")) + + bundle_path = args.repo_root / "apps/ios/Resources/RecipeCatalog/recipes-v2.json" + canonical_path = args.repo_root / "scripts/data/catalog/usda_curated_ingredients.json" + + vocabulary = load_vocabulary(bundle_path) + canonical = load_canonical(canonical_path) + vocab_categories = {row["key"]: row.get("category", "other") for row in vocabulary} + + wanted = missing_fdc_ids(vocabulary, canonical) + print(f"missing fdc ids referenced by the vocabulary: {len(wanted)}") + + foods = read_food_rows(args.fdc_csv_root) + print(f"food rows loaded from bulk downloads: {len(foods)}") + + macros_by_id = read_macros(args.fdc_csv_root, set(wanted)) + print(f"missing ids with nutrition rows: {len(macros_by_id)}") + + existing_names = { + canonical_display_key(row["display_name"]) for row in canonical["records"] + } + new_records, not_found = build_new_records( + wanted, vocab_categories, foods, macros_by_id, existing_names + ) + print(f"new canonical records: {new_records and len(new_records)}") + for entry in not_found: + print( + f" NOT FOUND in bulk downloads: fdc_id={entry['fdc_id']} keys={entry['keys']}" + ) + + if not args.apply: + print("dry run; pass --apply to merge into the canonical JSON") + return 0 + + from usda_core.io import load_canonical as load_canonical_catalog # noqa: PLC0415 + from usda_core.io import save_canonical as save_canonical_catalog # noqa: PLC0415 + from usda_core.schema import CuratedIngredientRow # noqa: PLC0415 + from usda_core.validate import validate_catalog # noqa: PLC0415 + + merged = load_canonical_catalog(canonical_path) + for record in new_records: + merged.records.append(CuratedIngredientRow.model_validate(record)) + merged.records.sort(key=lambda row: row.fdc_id) + validate_catalog(merged) + save_canonical_catalog(canonical_path, merged) + print(f"canonical catalog now carries {len(merged.records)} records") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From a254845c7510a8512580f1c17cc0662a3f0459ca Mon Sep 17 00:00:00 2001 From: Obvious Date: Fri, 16 Oct 2026 01:30:53 +0000 Subject: [PATCH 6/7] fix(tools): fail the kcal-drift validator closed when an exemption omits the kcal fields An exemption entry missing old_kcal or new_kcal previously passed silently: abs(entry.get(field, nan) - value) is always False for NaN, so the must-reproduce-both-values contract held only when the fields existed. Report the missing field explicitly instead. The new regression test fails before this fix (planted field-less exemption produced zero errors) and passes after; full data/recipes/tools suite is 18 passed with the one pre-existing environmental byte-identity failure unchanged. Co-authored-by: Sam Gu --- data/recipes/tools/tests/test_kcal_drift.py | 11 +++++++++++ data/recipes/tools/validate_bundle.py | 7 ++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/data/recipes/tools/tests/test_kcal_drift.py b/data/recipes/tools/tests/test_kcal_drift.py index 00544ba8c..88625ad1c 100644 --- a/data/recipes/tools/tests/test_kcal_drift.py +++ b/data/recipes/tools/tests/test_kcal_drift.py @@ -66,6 +66,17 @@ def test_drift_requires_matching_exemption_with_cause(): assert any("vocabulary change" in e for e in check_kcal_drift(new, prev, blank)) +def test_fieldless_exemption_fails_closed(): + new, prev = doc(recipe("rcp-1", 180.0)), doc(recipe("rcp-1", 100.0)) + # an exemption that omits the kcal fields must not pass silently + # (NaN-based comparisons are always False, so a bare entry used to slip through) + blank_kcal = {"entries": [{"catalog_id": "rcp-1", + "vocabulary_change": "gochujang resolved to per-100g rows"}]} + errs = check_kcal_drift(new, prev, blank_kcal) + assert any("rcp-1" in e and "missing old_kcal" in e for e in errs) + assert any("missing new_kcal" in e for e in errs) + + # ---- 3. zero-kcal and new-recipe edges --------------------------------------- def test_zero_kcal_and_new_recipe_edges(): diff --git a/data/recipes/tools/validate_bundle.py b/data/recipes/tools/validate_bundle.py index 540a4089c..3818b2816 100644 --- a/data/recipes/tools/validate_bundle.py +++ b/data/recipes/tools/validate_bundle.py @@ -106,7 +106,12 @@ def check_kcal_drift(new: dict, prev: dict | None, changes: dict | None) -> list f"{CHANGES_FILE.name}") continue for field, value in (("old_kcal", old_n["kcal"]), ("new_kcal", n["kcal"])): - if abs(entry.get(field, float("nan")) - value) > KCAL_MATCH_TOLERANCE: + if field not in entry: + errors.append( + f"{rid}: exemption missing {field}; it must reproduce both " + "kcal values of the move it exempts") + continue + if abs(entry[field] - value) > KCAL_MATCH_TOLERANCE: errors.append( f"{rid}: exemption {field} is {entry.get(field)!r} but the " f"bundle value is {value!r}; stale exemption") From 6b8a3489327f37633b3d5068426f1ed8f35abbe3 Mon Sep 17 00:00:00 2001 From: Obvious Date: Thu, 15 Oct 2026 20:54:17 +0000 Subject: [PATCH 7/7] fix(ios): cookedEvent helper returns the store record type The iOS-only helper above the Linux-mirrored slice was declared -> TasteEvent while constructing a TasteEventRecord, so the macOS test build failed with seven type-mismatch errors the mirror cannot see (the slice region regenerates its own helper from the committed preamble). Match the preamble's return type. Co-authored-by: Sam Gu --- apps/ios/Tests/TasteStore/TasteEventStoreTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ios/Tests/TasteStore/TasteEventStoreTests.swift b/apps/ios/Tests/TasteStore/TasteEventStoreTests.swift index d8b790531..488967ae9 100644 --- a/apps/ios/Tests/TasteStore/TasteEventStoreTests.swift +++ b/apps/ios/Tests/TasteStore/TasteEventStoreTests.swift @@ -46,7 +46,7 @@ final class TasteEventStoreTests: XCTestCase { at: Date = Date(timeIntervalSince1970: 1_000_000), recipeId: String = "1", rating: Int? = 2 - ) -> TasteEvent { + ) -> TasteEventRecord { TasteEventRecord( id: id, at: at,