# Open Food Facts Scraper — Nutrition, Barcode & Labels (`logiover/open-food-facts-scraper`) Actor

Scrape Open Food Facts by category, brand, or barcode. Extract nutrition facts, Nutri-Score, NOVA group, ingredients, labels, and allergens for diet analysis, food research, and product databases. No API key, no login.

- **URL**: https://apify.com/logiover/open-food-facts-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** E-commerce, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Open Food Facts Scraper — Nutrition, Barcode & Food Labels Data

Extract food product data, nutrition facts, Nutri-Score grades, NOVA processing groups, ingredient lists, and allergen labels from the Open Food Facts database — the world's largest open food product database with over 3 million products.

### What does Open Food Facts Scraper do?

This actor connects to the Open Food Facts public API (`world.openfoodfacts.org`) — a keyless, open-access food database — and retrieves detailed nutrition and product data at scale. The actor supports three modes: **search** (filter by category, brand, and country across thousands of products with automatic pagination), **product** (look up specific products by EAN or UPC barcode), and **category** (browse all products in a food category).

The search mode queries the `/api/v2/search` endpoint with category, brand, and country filters, paginating in batches of 100 until your `maxResults` limit is reached. The category mode uses the dedicated `/category/<slug>.json` endpoint for efficient category browsing. The product mode fetches individual products via `/api/v2/product/<barcode>.json`.

Each product record includes 17 fields: barcode, product name, brand, category, quantity, Nutri-Score grade (A–E), NOVA group (1–4 processing level), six key nutriments per 100g (energy, fat, sugars, salt, proteins), full ingredients text, quality labels, country availability, product image URL, and a direct link to the Open Food Facts product page. No API key, no login, no scraping of HTML — pure official JSON API.

### Who is it for?

- **Nutritionists and dietitians** building diet comparison tools or client food tracking systems.
- **Food tech startups** developing apps that need a free, maintained nutrition database.
- **Data scientists and researchers** analyzing food composition, ultra-processing levels, or Nutri-Score distribution across countries.
- **E-commerce and retail teams** enriching product catalogs with nutrition facts, images, and ingredient data.
- **Journalists and public health advocates** studying food labeling, additive use, and ultra-processed food patterns.

### Use cases

- Bulk-download nutrition data for a food category (e.g. all "yogurts" or "breakfast cereals") for a research dataset.
- Look up products by barcode list to build a nutrition enrichment pipeline for a grocery delivery app.
- Compare Nutri-Score distribution across brands or countries to surface health patterns.
- Build a filtered product database of organic, vegan, or gluten-free certified products using label tags.
- Monitor changes in ingredient lists or nutritional values over time for a specific category.

### Why use Open Food Facts Scraper?

- **Keyless and loginless**: uses the official Open Food Facts public API — zero credentials required, runs forever without token expiry.
- **17 output fields per product**: barcode, name, brand, category, quantity, Nutri-Score, NOVA group, 5 nutriments, ingredients, labels, countries, image URL, product URL.
- **Bulk pagination to thousands of results**: automatic multi-page crawl — a single run can extract 10,000+ products.
- **Three flexible modes**: search by category/brand/country, product lookup by barcode list, or category browse.
- **Export to CSV, JSON, Excel, or Google Sheets**: Apify dataset supports all formats instantly.
- **Pay-per-result pricing**: costs pennies for hundreds of records, scales linearly.

### What data can you extract?

The actor extracts the following fields per product:

| Field | Type | Description |
|---|---|---|
| `code` | string | EAN/UPC barcode |
| `product_name` | string | Full product name |
| `brands` | string | Brand name(s) |
| `categories` | string | Product category tags |
| `quantity` | string | Package size (e.g. "500 g") |
| `nutriscore_grade` | string | Nutri-Score grade: a, b, c, d, e |
| `nova_group` | number | NOVA processing group 1–4 |
| `energy_kcal_100g` | number | Energy in kcal per 100g |
| `fat_100g` | number | Fat in grams per 100g |
| `sugars_100g` | number | Sugars in grams per 100g |
| `salt_100g` | number | Salt in grams per 100g |
| `proteins_100g` | number | Proteins in grams per 100g |
| `ingredients_text` | string | Full ingredient list |
| `labels` | string | Quality/certification labels (organic, fair-trade, etc.) |
| `countries` | string | Countries where the product is sold |
| `image_url` | string | Front image URL |
| `url` | string | Direct Open Food Facts product page URL |

**Example JSON output:**

```json
{
  "code": "3017620422003",
  "product_name": "Nutella",
  "brands": "Ferrero",
  "categories": "Spreads, Sweet spreads, Chocolate spreads",
  "quantity": "400 g",
  "nutriscore_grade": "e",
  "nova_group": 4,
  "energy_kcal_100g": 539,
  "fat_100g": 30.9,
  "sugars_100g": 56.3,
  "salt_100g": 0.107,
  "proteins_100g": 6.3,
  "ingredients_text": "Sugar, palm oil, hazelnuts (13%), skimmed milk powder (8.7%), fat-reduced cocoa (7.4%), lecithins (soy), vanillin",
  "labels": "no-gluten, rainforest-alliance",
  "countries": "france, germany, united-kingdom, united-states",
  "image_url": "https://images.openfoodfacts.org/images/products/301/762/042/2003/front_en.497.400.jpg",
  "url": "https://world.openfoodfacts.org/product/3017620422003"
}
````

### How to use

#### Option A — Search by category, brand, or country

The most common and powerful mode. Filter the Open Food Facts database by one or more criteria and paginate automatically to thousands of products.

**Step-by-step:**

1. Set `mode` to `search`.
2. Provide one or more category slugs (e.g. `breakfast-cereals`, `yogurts`, `cheeses`).
3. Optionally add brand filters (e.g. `Nestlé`, `Kellogg's`) or country filters (e.g. `france`, `united-states`).
4. Set `maxResults` to control how many products to collect per category.

```json
{
  "mode": "search",
  "categories": ["breakfast-cereals", "muesli"],
  "brands": ["Kellogg's"],
  "countries": ["united-states"],
  "maxResults": 1000
}
```

#### Option B — Lookup by barcode list

Pass a list of EAN or UPC barcodes to fetch exact product data for each.

**Step-by-step:**

1. Set `mode` to `product`.
2. Provide a list of barcodes in the `barcodes` field.

```json
{
  "mode": "product",
  "barcodes": ["3017620422003", "5449000000996", "7613036020328"]
}
```

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | Scraping mode: `search`, `product`, or `category` |
| `categories` | array | `["breakfast-cereals"]` | Category slugs to search or browse |
| `brands` | array | `[]` | Brand name filters (search mode only) |
| `countries` | array | `[]` | Country filters in English slug form (search mode only) |
| `barcodes` | array | `[]` | EAN/UPC barcodes to look up (product mode only) |
| `maxResults` | integer | `500` | Maximum products per category/search. 0 = unlimited |
| `proxyConfiguration` | object | Apify proxy | Proxy settings — datacenter proxy is sufficient |

**Full input JSON:**

```json
{
  "mode": "search",
  "categories": ["breakfast-cereals"],
  "brands": [],
  "countries": [],
  "barcodes": [],
  "maxResults": 500,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### Output example

```json
{
  "code": "3168930010265",
  "product_name": "cruesly mélange de noix",
  "brands": "Quaker",
  "categories": "Mueslis, Cereal clusters with nuts",
  "quantity": "450 g",
  "nutriscore_grade": "b",
  "nova_group": 4,
  "energy_kcal_100g": 462,
  "fat_100g": 19,
  "sugars_100g": 12,
  "salt_100g": 0,
  "proteins_100g": 8.5,
  "ingredients_text": "_avoine_ complète (32%), _blé_ complet (18%), sirop de glucose, huile de tournesol, sucre...",
  "labels": "no-artificial-flavors, no-preservatives, no-colorings, no-palm-oil, nutriscore",
  "countries": "belgium, france, germany, italy, netherlands, spain, united-kingdom",
  "image_url": "https://images.openfoodfacts.org/images/products/316/893/001/0265/front_en.297.400.jpg",
  "url": "https://world.openfoodfacts.org/product/3168930010265"
}
```

### Tips for best results

- **Use category slugs, not display names**: the API expects slugs like `breakfast-cereals` not "Breakfast Cereals". Check [Open Food Facts categories](https://world.openfoodfacts.org/categories) for valid slugs.
- **Start with a smaller `maxResults`** (e.g. 100–200) to preview data quality before running a full scrape.
- **Combine filters for precision**: use both `categories` and `countries` to get products available in a specific market.
- **NOVA group 4 = ultra-processed**: filter results for `nova_group === 4` to build ultra-processed food datasets.
- **Nutri-Score is not always available**: some products have empty `nutriscore_grade` — filter these out if comparing grades.
- **Ingredients text may be in local language**: the database is multilingual. Use `countries` filter to bias toward products with English ingredients.
- **Barcode mode is fastest**: if you have a list of barcodes, `product` mode fetches each directly without pagination overhead.
- **Category browsing vs. search**: `category` mode uses the `/category/<slug>.json` endpoint which is slightly faster but returns fewer fields than `search`.
- **No rate limits**: Open Food Facts is a public nonprofit — the API is open and generous, but use reasonable concurrency (actor defaults to 3 concurrent requests).
- **Data freshness**: Open Food Facts is community-updated. New products or nutritional corrections appear daily. Re-run regularly for up-to-date datasets.

### Integrations

- **Google Sheets**: use Apify's built-in Google Sheets integration to push results directly to a spreadsheet for team sharing.
- **Slack**: configure a webhook to notify your Slack channel when a scrape run completes with a product count summary.
- **Zapier / Make (Integromat)**: trigger downstream workflows when new nutrition data is available — e.g. auto-update a recipe database or e-commerce catalog.
- **Webhooks**: set an Apify webhook on run completion to POST results to your own endpoint.
- **Scheduler**: run daily or weekly via Apify Scheduler to keep your food database current as products are added to Open Food Facts.

### API usage

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/logiover~open-food-facts-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"search","categories":["breakfast-cereals"],"maxResults":200}'
```

#### Node.js (Apify client)

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

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('logiover/open-food-facts-scraper').call({
  mode: 'search',
  categories: ['breakfast-cereals', 'yogurts'],
  maxResults: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].product_name, items[0].nutriscore_grade);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("logiover/open-food-facts-scraper").call(run_input={
    "mode": "search",
    "categories": ["breakfast-cereals"],
    "maxResults": 500,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["product_name"], item["nutriscore_grade"], item["nova_group"])
```

### Use with AI agents (MCP)

Open Food Facts Scraper is compatible with the Apify MCP (Model Context Protocol) server, making it callable from Claude, GPT, and other AI agents. You can give your AI agent a prompt like: *"Use the Open Food Facts Scraper to get all breakfast cereals in the United States with maxResults 300, then find which brands have the most Nutri-Score A products."* The agent will call the actor, receive the dataset, and perform the analysis — no manual steps required.

### FAQ

#### Does this actor require an API key?

No. Open Food Facts is a free, open-access nonprofit database. This actor uses the public API at `world.openfoodfacts.org` with no authentication required.

#### How many products can one run return?

A single run can return tens of thousands of products. The `search` mode paginates automatically — for popular categories like "yogurts" or "beverages" there are 50,000+ products in the database. Set `maxResults` to control volume.

#### What category slugs should I use?

Use slugs from the [Open Food Facts categories page](https://world.openfoodfacts.org/categories). Examples: `breakfast-cereals`, `cheeses`, `yogurts`, `chocolates`, `biscuits`, `soft-drinks`, `dairy-products`, `plant-based-foods`, `organic-foods`.

#### Why do some products return null for nutrition fields?

Open Food Facts is community-contributed. Many products are missing nutrition data because no contributor has added it. The actor returns `null` for missing nutriments — filter these out with `energy_kcal_100g !== null` in your downstream pipeline.

#### What is Nutri-Score?

Nutri-Score is a 5-letter color-coded nutritional rating system (A = healthiest, E = least healthy) used in Europe. It is calculated from a product's nutriments. Not all products have it — it depends on whether the product country mandates it.

#### What is NOVA group?

NOVA is a food classification system based on the extent of food processing: 1 (unprocessed), 2 (processed culinary ingredients), 3 (processed foods), 4 (ultra-processed). A `nova_group` of 4 means ultra-processed.

#### Can I export results to Excel or CSV?

Yes. Any Apify dataset can be downloaded as CSV, Excel, JSON, XML, or JSONL directly from the Apify Console or via the API. You can also connect Google Sheets directly.

#### How fast does it run?

With default concurrency of 3 requests and 100 products per page, the actor collects roughly 200–300 products per minute. A 1,000-product run takes about 4–5 minutes including build time.

#### Is it legal to scrape Open Food Facts?

Open Food Facts data is published under the Open Database License (ODbL) and is explicitly provided for open reuse. This actor uses the official JSON API — there is no HTML scraping, no bypassing of access controls. Commercial and research use is permitted under ODbL attribution requirements.

#### How often is the database updated?

Open Food Facts is updated continuously by its global community. New products and corrections are added daily. For production use cases, schedule this actor to run weekly or monthly to keep your local database fresh.

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

In `product` mode, if a barcode returns no product, the actor logs a warning and skips it. Your dataset will contain only the barcodes that existed in the database.

#### Are there any related scrapers I should know about?

- **[logiover/amazon-search-scraper](https://apify.com/logiover/amazon-search-scraper)** — product listings with prices for cross-reference with food products.
- **[logiover/amazon-reviews-scraper](https://apify.com/logiover/amazon-reviews-scraper)** — consumer sentiment on food products sold on Amazon.
- **[logiover/b2b-lead-scraper](https://apify.com/logiover/b2b-lead-scraper)** — find food industry companies (importers, distributors) for B2B outreach.

### Is it legal?

Open Food Facts (`openfoodfacts.org`) is a nonprofit collaborative project that explicitly publishes its data under the Open Database License (ODbL 1.0). This license permits free use, redistribution, and creation of derivative works, including commercial applications, provided you attribute the source and share any changes to the database itself under the same license.

This actor uses only the official public JSON API — it does not bypass any authentication, CAPTCHA, or access control. It is equivalent to any other programmatic consumer of the Open Food Facts API. Users are responsible for complying with ODbL attribution requirements in their own products or publications.

# Actor input Schema

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

Scraping mode: 'search' (main — search/filter products by category/brand/country), 'product' (fetch by barcode list), 'category' (browse a category JSON endpoint).

## `categories` (type: `array`):

Category slugs to search/browse (e.g. 'breakfast-cereals', 'cheeses', 'yogurts'). Used in 'search' and 'category' modes.

## `brands` (type: `array`):

Filter by brand names (e.g. 'Kellogg's', 'Nestlé'). Used in 'search' mode. Leave empty for all brands.

## `countries` (type: `array`):

Filter by country. Used in 'search' mode. Leave empty for all countries.

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

List of EAN/UPC barcodes to fetch (used in 'product' mode). Example: \['3017620422003', '5449000000996'].

## `sortBy` (type: `string`):

Sort order for 'search' mode results.

## `maxResults` (type: `integer`):

Maximum number of products to scrape per category/search. Set to 0 for unlimited.

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

Proxy settings (AUTO recommended). Open Food Facts is a public API; the actor also falls back to a direct connection on the final retry.

## Actor input object example

```json
{
  "mode": "search",
  "categories": [
    "breakfast-cereals",
    "cheeses",
    "yogurts",
    "chocolates",
    "beverages"
  ],
  "brands": [],
  "countries": [],
  "barcodes": [],
  "sortBy": "popularity_key",
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All records extracted by this run. Open the Dataset tab to browse, filter, and export as CSV, JSON, or Excel.

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/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 = { "proxyConfiguration": { "useApifyProxy": True } }

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

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

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

```

## CLI example

```bash
echo '{
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call logiover/open-food-facts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=logiover/open-food-facts-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Open Food Facts Scraper — Nutrition, Barcode & Labels",
        "description": "Scrape Open Food Facts by category, brand, or barcode. Extract nutrition facts, Nutri-Score, NOVA group, ingredients, labels, and allergens for diet analysis, food research, and product databases. No API key, no login.",
        "version": "1.0",
        "x-build-id": "SoGegUvdt0zr1BX2R"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~open-food-facts-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-open-food-facts-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/logiover~open-food-facts-scraper/runs": {
            "post": {
                "operationId": "runs-sync-logiover-open-food-facts-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/logiover~open-food-facts-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-open-food-facts-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "product",
                            "category"
                        ],
                        "type": "string",
                        "description": "Scraping mode: 'search' (main — search/filter products by category/brand/country), 'product' (fetch by barcode list), 'category' (browse a category JSON endpoint).",
                        "default": "search"
                    },
                    "categories": {
                        "title": "Categories",
                        "type": "array",
                        "description": "Category slugs to search/browse (e.g. 'breakfast-cereals', 'cheeses', 'yogurts'). Used in 'search' and 'category' modes.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "breakfast-cereals",
                            "cheeses",
                            "yogurts",
                            "chocolates",
                            "beverages"
                        ]
                    },
                    "brands": {
                        "title": "Brands",
                        "type": "array",
                        "description": "Filter by brand names (e.g. 'Kellogg's', 'Nestlé'). Used in 'search' mode. Leave empty for all brands.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "countries": {
                        "title": "Countries",
                        "type": "array",
                        "description": "Filter by country. Used in 'search' mode. Leave empty for all countries.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "united-states",
                                "united-kingdom",
                                "france",
                                "germany",
                                "spain",
                                "italy",
                                "netherlands",
                                "belgium",
                                "switzerland",
                                "austria",
                                "portugal",
                                "ireland",
                                "poland",
                                "sweden",
                                "norway",
                                "denmark",
                                "finland",
                                "greece",
                                "canada",
                                "mexico",
                                "brazil",
                                "argentina",
                                "chile",
                                "colombia",
                                "australia",
                                "new-zealand",
                                "japan",
                                "china",
                                "south-korea",
                                "india",
                                "russia",
                                "turkey",
                                "morocco",
                                "tunisia",
                                "algeria",
                                "egypt",
                                "south-africa",
                                "thailand",
                                "vietnam",
                                "indonesia",
                                "malaysia",
                                "singapore",
                                "united-arab-emirates",
                                "saudi-arabia",
                                "israel",
                                "romania",
                                "hungary",
                                "czech-republic",
                                "ukraine",
                                "croatia"
                            ],
                            "enumTitles": [
                                "United States",
                                "United Kingdom",
                                "France",
                                "Germany",
                                "Spain",
                                "Italy",
                                "Netherlands",
                                "Belgium",
                                "Switzerland",
                                "Austria",
                                "Portugal",
                                "Ireland",
                                "Poland",
                                "Sweden",
                                "Norway",
                                "Denmark",
                                "Finland",
                                "Greece",
                                "Canada",
                                "Mexico",
                                "Brazil",
                                "Argentina",
                                "Chile",
                                "Colombia",
                                "Australia",
                                "New Zealand",
                                "Japan",
                                "China",
                                "South Korea",
                                "India",
                                "Russia",
                                "Turkey",
                                "Morocco",
                                "Tunisia",
                                "Algeria",
                                "Egypt",
                                "South Africa",
                                "Thailand",
                                "Vietnam",
                                "Indonesia",
                                "Malaysia",
                                "Singapore",
                                "United Arab Emirates",
                                "Saudi Arabia",
                                "Israel",
                                "Romania",
                                "Hungary",
                                "Czech Republic",
                                "Ukraine",
                                "Croatia"
                            ]
                        },
                        "default": []
                    },
                    "barcodes": {
                        "title": "Barcodes",
                        "type": "array",
                        "description": "List of EAN/UPC barcodes to fetch (used in 'product' mode). Example: ['3017620422003', '5449000000996'].",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "sortBy": {
                        "title": "Sort By",
                        "enum": [
                            "popularity_key",
                            "product_name",
                            "created_t",
                            "last_modified_t",
                            "nutriscore_score",
                            "nova_score",
                            "unique_scans_n"
                        ],
                        "type": "string",
                        "description": "Sort order for 'search' mode results.",
                        "default": "popularity_key"
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of products to scrape per category/search. Set to 0 for unlimited.",
                        "default": 500
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings (AUTO recommended). Open Food Facts is a public API; the actor also falls back to a direct connection on the final retry."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
