Open Food Facts Product Scraper (Nutri-Score, Ingredients) avatar

Open Food Facts Product Scraper (Nutri-Score, Ingredients)

Pricing

from $6.80 / 1,000 results

Go to Apify Store
Open Food Facts Product Scraper (Nutri-Score, Ingredients)

Open Food Facts Product Scraper (Nutri-Score, Ingredients)

Scrape food products with brands, categories, quantity, ingredients, Nutri-Score, NOVA group, allergens, countries and images. Search by keyword or look up products by barcode. Export to JSON, CSV or Excel.

Pricing

from $6.80 / 1,000 results

Rating

0.0

(0)

Developer

Scrapers Lat

Scrapers Lat

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 hours ago

Last modified

Share

Open Food Facts Product Scraper (Nutri-Score, Ingredients)

Open Food Facts Product Scraper (Nutri-Score, Ingredients)

Here is one real result, with every field the actor returns:

{
"barcode": "3017620422003",
"productName": "Nutella",
"genericName": "Pâte à tartiner aux noisettes et au cacao",
"brands": "Nutella, Ferrero, Yum yum",
"brandOwner": null,
"categories": "Confectionary based spreads, Petit-déjeuners, Produits à tartiner, Produits à tartiner sucrés, Pâtes à tartiner",
"categoriesTags": ["breakfasts", "spreads", "sweet spreads", "confectionary based spreads", "Petit déjeuners", "Produits à tartiner", "Produits à tartiner sucrés", "Pâtes à tartiner"],
"quantity": null,
"servingSize": null,
"servingQuantity": null,
"ingredients": "Sucre, huile de palme, NOISETTES 13%, cacao maigre 7,4%, LAIT écrémé en poudre 6,6%, LACTOSERUM en poudre, émulsifiants: lécithines [SOJA), vanilline. Sans gluten.",
"ingredientsCount": 9,
"nutriscore": "e",
"nutriscoreScore": 30,
"nova": 4,
"ecoscore": "unknown",
"nutrition": {
"basis": "100g",
"energyKcal": 539,
"energyKj": 2252,
"fat": 30.9,
"saturatedFat": 10.6,
"carbohydrates": 57.5,
"sugars": 56.3,
"fiber": null,
"proteins": 6.3,
"salt": 0.107,
"sodium": 0.0428
},
"nutrientLevels": {"fat": "high", "salt": "low", "saturated-fat": "high", "sugars": "high"},
"allergens": ["milk", "nuts", "soybeans"],
"traces": [],
"labels": ["no gluten"],
"additives": ["e322", "e322i"],
"additivesCount": 2,
"vegan": false,
"vegetarian": null,
"palmOil": true,
"foodGroups": "sweets",
"packaging": "Plastic,fr:Pot en verre",
"stores": null,
"origins": null,
"manufacturingPlaces": null,
"countries": "France",
"countriesTags": ["france"],
"image": "https://images.openfoodfacts.org/images/products/301/762/042/2003/front_en.879.400.jpg",
"imageIngredients": null,
"imageNutrition": null,
"imagePackaging": null,
"url": "https://world.openfoodfacts.org/product/3017620422003",
"source": "Open Food Facts",
"observedAt": "2026-08-10T14:31:28.359Z"
}

The most complete Open Food Facts product scraper available. It returns every field the Open Food Facts database exposes for each food product, including brands, categories, full ingredient text, Nutri-Score, NOVA processing group, Eco-Score, a structured per-100g nutrition block, allergens, additives and product images, plus derived diet flags (vegan, vegetarian, palm oil) so you can filter a catalog without extra parsing. Look up products by keyword search or directly by barcode.

📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples

Apify Coverage Output Billing

Table of contents

What it does

The actor queries the public Open Food Facts database and writes one normalized record per product to the run's dataset. Pass a keyword to search food products by name, or pass one or more barcodes (EAN/UPC) to look products up directly. Taxonomy tags are cleaned into readable lists, the raw nutriment fields are folded into a single structured nutrition block on a per-100g basis, and ingredient-analysis tags are turned into simple vegan, vegetarian and palmOil flags. Empty source values are returned as null.

Coverage is worldwide and crowd-sourced, so field completeness varies by product. No account or API key is required.

Quickstart

Open the actor, paste this into the input, and press Run. It returns up to 10 products matching "nutella".

{
"maxProducts": 10,
"searchQuery": "nutella"
}

To look up exact products instead, pass barcodes (this takes priority over the search query):

{
"barcodes": ["3017620422003", "737628064502"]
}

Input reference

FieldTypeRequiredDefaultDescription
maxProductsintegerno10Maximum products to collect. In barcode mode, only the first maxProducts barcodes are fetched.
searchQuerystringno(empty)Search food products by keyword, for example nutella, oat milk, chocolate. Leave empty when looking up by barcode.
barcodesstring[]no(empty)One or more product barcodes (EAN/UPC) to look up directly, for example 3017620422003. When set, this takes priority over searchQuery.

Provide either a searchQuery or one or more barcodes. If neither is set, the run returns a single item with a populated error field.

Output reference

One dataset item per product. Types: string, integer, number, boolean, string[], object, or null when the source value is absent.

FieldTypeDescription
barcodestringProduct barcode (EAN/UPC), the unique product code.
productNamestringProduct name.
genericNamestringGeneric / descriptive product name.
brandsstringBrand name(s) as listed on the product.
brandOwnerstringBrand owner / parent company, or null.
categoriesstringFree-text category list.
categoriesTagsstring[]Cleaned category taxonomy tags.
quantitystringNet quantity as labeled, or null.
servingSizestringServing size text, or null.
servingQuantitynumberServing quantity in grams, or null.
ingredientsstringFull ingredient list text.
ingredientsCountintegerNumber of ingredients parsed by Open Food Facts.
nutriscorestringNutri-Score grade a to e, or null.
nutriscoreScoreintegerNumeric Nutri-Score points.
novaintegerNOVA food processing group 1 to 4.
ecoscorestringEco-Score grade, or unknown.
nutritionobjectStructured nutrition per 100g: basis, energyKcal, energyKj, fat, saturatedFat, carbohydrates, sugars, fiber, proteins, salt, sodium. null if no nutrition data.
nutrientLevelsobjectOpen Food Facts fat/salt/saturated-fat/sugars level flags (low/moderate/high), or null.
allergensstring[]Declared allergens.
tracesstring[]Possible trace allergens.
labelsstring[]Product labels and certifications (for example no gluten, organic).
additivesstring[]Additive E-number codes.
additivesCountintegerNumber of additives.
veganbooleantrue/false from ingredient analysis, or null if unknown.
vegetarianbooleantrue/false from ingredient analysis, or null if unknown.
palmOilbooleantrue if palm oil, false if palm-oil-free, null if unknown.
foodGroupsstringFood group, or null.
packagingstringPackaging description, or null.
storesstringStores where sold, or null.
originsstringDeclared ingredient origins, or null.
manufacturingPlacesstringManufacturing / processing places, or null.
countriesstringCountries where the product is sold.
countriesTagsstring[]Country taxonomy tags.
imagestringFront product image URL.
imageIngredientsstringIngredients photo URL, or null.
imageNutritionstringNutrition facts photo URL, or null.
imagePackagingstringPackaging photo URL, or null.
urlstringOpen Food Facts product page URL.
sourcestringAlways Open Food Facts.
observedAtstringISO 8601 timestamp of when the record was collected.
errorstringPresent only on a failed run or invalid input; a single item with a populated error field is written instead.
notFoundbooleanPresent and true when a requested barcode was not found in the database.

Example output record

See the hero record at the top of this page. It is a real Nutella product (barcode 3017620422003) pulled from a live run (input {"searchQuery":"nutella","maxProducts":10}); every value is real and unedited.

Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.

Run synchronously and get dataset items in one call:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~openfoodfacts-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"searchQuery":"oat milk","maxProducts":25}'

Look up specific barcodes:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~openfoodfacts-scraper/runs?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"barcodes":["3017620422003","737628064502"]}'

Apify CLI:

apify call scrapers_lat/openfoodfacts-scraper \
--input '{"searchQuery":"chocolate","maxProducts":10}'

Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:

# JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
# CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
# Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"

<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.

Billing and limits

  • Pay per result. You are charged per product returned (result event). See the pricing tab for the current per-result price.
  • No charge on failure. If a run errors, the actor writes a single item with a populated error field and does not charge for it. Empty runs cost nothing.
  • Spend cap respected. Set maxTotalChargeUsd on the run; once reached, the actor stops emitting and charging further billable results.
  • Free Apify plans are capped at 10 products per run. Upgrade for higher maxProducts.

FAQ and troubleshooting

A run returned 0 records. Why? The keyword matched no products, or a barcode was not in the database. Barcode lookups that miss return an item with notFound: true. Zero-result runs are not charged.

Why are some fields null? Open Food Facts is crowd-sourced, so completeness varies by product. Popular products are richly filled; niche ones may lack nutrition, packaging or origin data. Missing values are returned as null, never invented.

Search or barcode, which should I use? Use searchQuery to discover products by name. Use barcodes when you already have exact EAN/UPC codes; it is faster and precise, and takes priority over the search query.

What is Nutri-Score and NOVA? nutriscore is the A to E nutritional quality grade. nova is the 1 to 4 food processing classification (4 = ultra-processed). Both come straight from Open Food Facts.

Is this an official Open Food Facts tool? No. This actor is independent and has no affiliation with Open Food Facts. It reads only data that is publicly available. Open Food Facts data is provided under the Open Database License.

More scrapers at scrapers.lat

Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.


Independent tool, not affiliated with Open Food Facts. Accesses only publicly available data, provided under the Open Database License.