Open Food Facts Products Scraper
Pricing
Pay per event
Open Food Facts Products Scraper
Export curated Open Food Facts product data — barcode, name, brand, quantity, category/label/country tags, nutriscore, ecoscore, NOVA group and ingredients — filtered by brand, category, country or search term, as clean JSON, CSV or Excel.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
🎯 What this scrapes
This Actor searches Open Food Facts — the crowdsourced, keyless product database covering 3M+ barcoded products — and exports a curated slice: barcode, product name, brand, quantity, category/label/country tags, nutriscore, ecoscore, NOVA processing group and ingredients. Filter by brand, category, country or free-text search term, and stop after however many products you need.
🔥 What we handle for you
- 🛡️ Browser fingerprint rotation —
curl-cffiimpersonates real Chrome / Firefox / Safari TLS handshakes on every request, even though Open Food Facts is a friendly public API. - 🔁 Retries with exponential backoff — Open Food Facts intermittently serves a transient 503 under valid queries; we retry up to 5 times (2s → 30s cap) before ever giving up.
- 🎯 A curated field list, not the full ~140 KB product document — we request only the fields your dataset needs, keeping runs fast and cheap.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, stable product codes, JSON / CSV / Excel export straight from the Apify Console.
- 💰 Pay-Per-Event pricing — you only pay for results that hit your dataset. No data, no charge.
💡 Use cases
- CPG / retail intelligence — pull a competitor brand's full catalog with nutrition, eco and processing scores in one export.
- Nutrition & health research — build a scored dataset (nutriscore, ecoscore, NOVA) for a category or country without hand-rolling Open Food Facts' pagination.
- Ingredient audits — export ingredients_text alongside category and label tags to screen a brand's lineup for a claim (organic, allergen, etc.).
- Retail catalog enrichment — attach barcode, quantity and image_url to an existing SKU list by matching on
code.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
brandsTag | string | no | 'nutella' | Filter to products whose brand facet matches this tag, e.g. nutella, coca-cola. Leave blank… |
categoriesTag | string | no | '—' | Filter to a category facet tag, e.g. en:sodas. Leave blank to skip this filter. |
countriesTag | string | no | '—' | Filter to a country facet tag, e.g. en:france. Leave blank to skip this filter. |
searchTerms | string | no | '—' | Free-text search across product name and brand. Leave blank to skip this filter. |
maxResults | integer | no | 100 | Stop after this many products. Each product is one billed result row. |
proxyConfiguration | object | no | {'useApifyProxy': False} | Open Food Facts is a public, keyless API and does not fingerprint clients — a proxy is optional. Leave this off unless… |
Example input
{"brandsTag": "nutella","maxResults": 3,"proxyConfiguration": {"useApifyProxy": false}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
code | string | Barcode / product code. |
product_name | string | Product display name. |
brands | string | Comma-separated brand names as OFF stores them. |
quantity | string | Free-text pack size, e.g. '1 kg'. |
categories_tags | array | OFF category taxonomy tags. |
labels_tags | array | OFF label taxonomy tags (organic, fair-trade, etc.). |
countries_tags | array | Countries the product is sold in. |
nutriscore_grade | string | a-e or unknown/not-applicable. |
ecoscore_grade | string | a-e or unknown/not-applicable. |
nova_group | integer | 1-4 processing-level classification. |
ingredients_text | string | Raw ingredients list as published. |
packaging_tags | array | Packaging material/type tags. |
stores | string | Comma-separated store names where reported sold. |
image_url | string | Front product image URL. |
product_url | string | Built as https://world.openfoodfacts.org/product/. |
scraped_at | string | ISO 8601 UTC at row creation. |
Example output
{"code": "3017620422003","product_name": "Nutella","brands": "Nutella, Ferrero, Yum yum","quantity": null,"categories_tags": ["en:breakfasts","en:spreads","en:sweet-spreads"],"labels_tags": [],"countries_tags": ["en:france"],"nutriscore_grade": "e","ecoscore_grade": "unknown","nova_group": 4,"ingredients_text": "Sucre, huile de palme, NOISETTES 13%, cacao maigre 7,4%, LAIT \u00e9cr\u00e9m\u00e9 en poudre 6,6%, LACTOSERUM en poudre, \u00e9mulsifiants: l\u00e9cithines [SOJA), vanilline. Sans gluten.","packaging_tags": [],"stores": null,"image_url": "https://images.openfoodfacts.org/images/products/301/762/042/2003/front_en.879.400.jpg","product_url": "https://world.openfoodfacts.org/product/3017620422003","scraped_at": "2026-08-20T12:00:00+00:00"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.20 | One-off warm-up charge per run |
result | $0.002 | Per dataset item |
Example: 1 000 results at the rates above ≈ $2.20. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
- Open Food Facts is a crowdsourced database — coverage and field completeness vary by product and region; a product missing from Open Food Facts simply won't appear.
- The Actor requires at least one filter (brand, category, country or search term) — an unfiltered full-database pull is out of scope.
- Nutrient-value-by-100g numeric breakdowns and single-barcode lookup are not included in v1.
❓ FAQ
Do I need to filter by something?
Yes — set at least one of Brand tag, Category tag, Country tag or Search terms. Open Food Facts holds 3M+ products; an unfiltered pull isn't supported.
Why don't I see every field for every product?
Open Food Facts is community-maintained — not every product has a filled-in nutriscore, ecoscore, or ingredients list. Missing fields come back as null, never a crash.
Is this legal?
We only fetch data Open Food Facts already publishes through its own public search API. Respect Open Food Facts' own terms before reusing the data commercially.
How do I export to Sheets?
After the run finishes, click Storage → Dataset → Export and pick CSV — Google Sheets imports it directly.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.