Open Food Facts Product Scraper (Nutri-Score, Ingredients)
Pricing
from $6.80 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 hours ago
Last modified
Categories
Share
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
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
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
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
maxProducts | integer | no | 10 | Maximum products to collect. In barcode mode, only the first maxProducts barcodes are fetched. |
searchQuery | string | no | (empty) | Search food products by keyword, for example nutella, oat milk, chocolate. Leave empty when looking up by barcode. |
barcodes | string[] | 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.
| Field | Type | Description |
|---|---|---|
barcode | string | Product barcode (EAN/UPC), the unique product code. |
productName | string | Product name. |
genericName | string | Generic / descriptive product name. |
brands | string | Brand name(s) as listed on the product. |
brandOwner | string | Brand owner / parent company, or null. |
categories | string | Free-text category list. |
categoriesTags | string[] | Cleaned category taxonomy tags. |
quantity | string | Net quantity as labeled, or null. |
servingSize | string | Serving size text, or null. |
servingQuantity | number | Serving quantity in grams, or null. |
ingredients | string | Full ingredient list text. |
ingredientsCount | integer | Number of ingredients parsed by Open Food Facts. |
nutriscore | string | Nutri-Score grade a to e, or null. |
nutriscoreScore | integer | Numeric Nutri-Score points. |
nova | integer | NOVA food processing group 1 to 4. |
ecoscore | string | Eco-Score grade, or unknown. |
nutrition | object | Structured nutrition per 100g: basis, energyKcal, energyKj, fat, saturatedFat, carbohydrates, sugars, fiber, proteins, salt, sodium. null if no nutrition data. |
nutrientLevels | object | Open Food Facts fat/salt/saturated-fat/sugars level flags (low/moderate/high), or null. |
allergens | string[] | Declared allergens. |
traces | string[] | Possible trace allergens. |
labels | string[] | Product labels and certifications (for example no gluten, organic). |
additives | string[] | Additive E-number codes. |
additivesCount | integer | Number of additives. |
vegan | boolean | true/false from ingredient analysis, or null if unknown. |
vegetarian | boolean | true/false from ingredient analysis, or null if unknown. |
palmOil | boolean | true if palm oil, false if palm-oil-free, null if unknown. |
foodGroups | string | Food group, or null. |
packaging | string | Packaging description, or null. |
stores | string | Stores where sold, or null. |
origins | string | Declared ingredient origins, or null. |
manufacturingPlaces | string | Manufacturing / processing places, or null. |
countries | string | Countries where the product is sold. |
countriesTags | string[] | Country taxonomy tags. |
image | string | Front product image URL. |
imageIngredients | string | Ingredients photo URL, or null. |
imageNutrition | string | Nutrition facts photo URL, or null. |
imagePackaging | string | Packaging photo URL, or null. |
url | string | Open Food Facts product page URL. |
source | string | Always Open Food Facts. |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
error | string | Present only on a failed run or invalid input; a single item with a populated error field is written instead. |
notFound | boolean | Present 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:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "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 (
resultevent). 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
errorfield and does not charge for it. Empty runs cost nothing. - Spend cap respected. Set
maxTotalChargeUsdon 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.
Related scrapers
- openFDA Food Recall & Enforcement Scraper: FDA food recalls and enforcement reports.
- EU RASFF Food Alerts Scraper: EU rapid alerts for food and feed.
- openFDA Drug Labels Scraper: FDA structured drug product labeling.
- Amazon Product Scraper: Amazon product listings and details.
- Open Library Scraper: book records from Open Library.
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.
