# Open Food Facts Scraper (`kawsar/open-food-facts-scraper`) Actor

Scrape food products and nutrition data by barcode or category from Open Food Facts and export clean JSON, CSV, or Excel.

- **URL**: https://apify.com/kawsar/open-food-facts-scraper.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Open Food Facts Scraper

![Open Food Facts Scraper cover](https://images.bigibyte.com/cdn-cgi/image/width=1260,height=540,fit=cover,format=webp/apify-actors-covers/open-food-facts-scraper-cover.png)

Collect food product information from Open Food Facts using barcode lookups or category searches. Retrieve product names, brands, ingredients-related information, allergens, additives, and nutrition data. Export structured results in JSON, CSV, Excel, or other supported Apify dataset formats.

### What It Does

This actor supports individual product lookups and category-based product collection. It removes duplicate product codes within a run and stores an error row when a request fails, allowing the collection to continue.

### Available Modes

- **Product by Barcode:** Retrieve product information using one or more barcodes.
- **Search Products:** Collect products from an English category, such as `chocolates`, with optional field selection.

### Input Example

**Look up products by barcode**

```json
{
  "mode": "product",
  "barcodes": ["737628064502"],
  "maxItems": 50,
  "requestDelayMs": 500
}
```

**Search products by category**

```json
{
  "mode": "search",
  "category": "chocolates",
  "fields": "code,product_name,brands,nutriscore_grade",
  "maxItems": 20,
  "requestDelayMs": 6000
}
```

### Output Example

```json
{
  "_id": "0737628064502",
  "_keywords": ["and", "asia", "noodles"],
  "added_countries_tags": [],
  "additives_n": 1,
  "additives_original_tags": ["en:e330"],
  "additives_tags": ["en:e330"],
  "allergens": "peanuts, sesame seeds, soybeans",
  "allergens_from_ingredients": "en:sesame-seeds, en:peanuts, en:soybeans",
  "allergens_from_user": "(en) en:peanuts",
  "allergens_hierarchy": ["en:peanuts", "en:sesame-seeds"],
  "allergens_lc": "en",
  "allergens_tags": ["en:peanuts", "en:sesame-seeds"],
  "amino_acids_prev_tags": [],
  "amino_acids_tags": [],
  "brand_owner": "Simply Asia Foods, Inc.",
  "brand_owner_imported": "Simply Asia Foods, Inc.",
  "brands": "Simply Asia, Thai Kitchen",
  "brands_tags": ["Simply Asia", "Thai Kitchen"],
  "categories": "Cereals and their products, Noodles, Rice noodles",
  "categories_hierarchy": null,
  "categories_lc": "en",
  "categories_properties": null,
  "categories_properties_tags": null,
  "categories_tags": null,
  "category_properties": null,
  "checkers": null,
  "checkers_tags": null,
  "ciqual_food_name_tags": null,
  "cities_tags": null,
  "code": "0737628064502",
  "product_name": "Pad Thai Noodle Kit",
  "nutriscore_grade": null,
  "scrapedAt": "2026-10-26T00:00:00+00:00"
}
```

### Output Fields

The dataset includes product information and nutrition-related attributes, such as:

| Field | Description |
|---|---|
| `_id` | Product identifier |
| `_keywords` | Associated product keywords |
| `added_countries_tags` | Country-related tags |
| `additives_n` | Number of additives |
| `additives_original_tags` | Original additive tags |
| `additives_tags` | Normalized additive tags |
| `allergens` | Product allergen information |
| `brands` | Product brand names |
| `categories` | Product category information |
| `code` | Product barcode |
| `product_name` | Product name |
| `nutriscore_grade` | Nutri-Score grade |
| `scrapedAt` | Collection timestamp |

Additional product fields may be included in the dataset when available.

### Use Cases

- **Barcode Lookup:** Retrieve product and nutrition information for known barcodes.
- **Category Research:** Collect products from categories such as chocolates for spreadsheet analysis.
- **Product Analysis:** Organize brands, product codes, additives, allergens, and Nutri-Score information.
- **Dataset Building:** Create structured food product datasets for research and reporting.
- **Scheduled Monitoring:** Run recurring collections to review changes in product information.

### FAQ

**Can I collect a product using its barcode?**

Yes. Select Product by Barcode mode and provide one or more values in `barcodes`.

**Can I collect products from a specific category?**

Yes. Select Search Products mode and enter an English category tag, such as `chocolates`.

**Can I choose which product fields to collect?**

Yes. Search mode supports the `fields` parameter, allowing you to specify the fields you want returned.

**What happens if a barcode is not found?**

Unknown barcodes that return status `0` produce no product row, and the run can still complete successfully.

**What happens when a request fails?**

The actor stores an error row and continues instead of stopping the entire run.

**Can I export the results to Excel or CSV?**

Yes. Apify supports JSON, CSV, Excel, and other dataset export formats.

**Can I schedule recurring collections?**

Yes. Use Apify Schedules to run the actor automatically at your preferred intervals.

### Trademark Notice and Disclaimer

Open Food Facts and its related names, logos, and trademarks belong to their respective owners. This actor is an independent tool and is not affiliated with, sponsored by, or endorsed by Open Food Facts.

### Is Web Scraping Legal?

This actor collects publicly accessible food product information without bypassing login screens, paywalls, or technical security measures. How collected information can be used depends on applicable laws and the source website's policies.

- **Personal Data:** Product records may contain brand-owner or other business-related information. Handle any personal information responsibly and follow applicable privacy laws, including GDPR or CCPA where relevant.
- **Copyright and Licensing:** Open Food Facts product database information is distributed under the Open Database License (ODbL), while product images may be subject to Creative Commons Attribution-ShareAlike (CC BY-SA). Review the applicable licence terms, attribution requirements, and share-alike obligations before reusing or redistributing data or images.
- **Platform Terms and Rate Limits:** Respect the source platform's policies, licensing conditions, and reasonable request intervals.
- **Disclaimer:** This information is general guidance, not legal advice. Consult a qualified legal professional if you have questions about your intended use.

[Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

# Actor input Schema

## `mode` (type: `string`):

What to collect. Product loads one or more barcodes. Search lists products in a category.

## `barcodes` (type: `array`):

Product barcodes for product mode (tested value: 737628064502).

## `category` (type: `string`):

English category tag for search mode (for example chocolates). Sent as categories_tags_en.

## `fields` (type: `string`):

Comma-separated product fields for search mode. Leave default for a compact row.

## `maxItems` (type: `integer`):

Stop after this many successful product rows. Hard max is 1000.

## `userAgent` (type: `string`):

User-Agent header sent with each request. Put your contact if the source asks for one.

## `requestDelayMs` (type: `integer`):

Milliseconds to wait before each request. Search is limited to about 10 requests per minute.

## `timeoutSecs` (type: `integer`):

Overall run budget in seconds.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds.

## `proxyConfiguration` (type: `object`):

Optional proxy. Leave off unless you need it.

## Actor input object example

```json
{
  "mode": "product",
  "barcodes": [
    "737628064502"
  ],
  "category": "chocolates",
  "fields": "code,product_name,brands,nutriscore_grade",
  "maxItems": 100,
  "userAgent": "ActorResearch/1.0",
  "requestDelayMs": 500,
  "timeoutSecs": 300,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Dataset rows in the overview table.

## `dataset` (type: `string`):

Full dataset for this run.

## `items` (type: `string`):

Dataset items as JSON.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "barcodes": [
        "737628064502"
    ],
    "category": "chocolates"
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/open-food-facts-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "barcodes": ["737628064502"],
    "category": "chocolates",
}

# Run the Actor and wait for it to finish
run = client.actor("kawsar/open-food-facts-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "barcodes": [
    "737628064502"
  ],
  "category": "chocolates"
}' |
apify call kawsar/open-food-facts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kawsar/open-food-facts-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/dvha8Ql2OurZljfJ9/builds/GolI2p6i3ILIeMw5S/openapi.json
