# GTIN/Barcode Product Lookup — Nutri-Score & NOVA API (`accountable_eel/gtin-barcode-lookup`) Actor

Look up any product barcode (GTIN/EAN/UPC) against Open Food Facts' free, official database. Get product name, brand, category, quantity, Nutri-Score, NOVA group, Eco-Score, and package image. Pay only for barcodes that resolve to a real product.

- **URL**: https://apify.com/accountable\_eel/gtin-barcode-lookup.md
- **Developed by:** [Adrian Voss](https://apify.com/accountable_eel) (community)
- **Categories:** E-commerce, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 1,000 successful lookups

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## GTIN/Barcode Product Lookup

Look up any product barcode (GTIN/EAN/UPC) against the free, crowdsourced
[Open Food Facts](https://world.openfoodfacts.org) database — product name, brand,
category, quantity, Nutri-Score, NOVA processing group, Eco-Score, and package image.
No API key, no scraping — this calls the official public API directly.

### Features

- **Barcode → product record.** Name, brand, categories, quantity/pack size, and a
  package image URL for any recognized GTIN/EAN/UPC.
- **Nutrition & health scoring.** Nutri-Score grade, NOVA group (processing level), and
  Eco-Score in one call.
- **Bulk-friendly.** Feed in a list of barcodes with adjustable `maxConcurrency`.
- **Pay only for hits.** Barcodes that don't resolve to a real product cost nothing —
  see [Pricing](#pricing).

### How to use GTIN/Barcode Product Lookup — Nutri-Score & NOVA API

1. **In the Apify Console.** Open the actor page and click **Start** — the `items` field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
2. **Via the API.** Call it directly with a POST request — no Console needed once you have an API token:
   ```bash
   curl "https://api.apify.com/v2/acts/accountable_eel~gtin-barcode-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
     -X POST \
     -H "Content-Type: application/json" \
     -d '{"items":["3017620422003"]}'
   ```
3. **On a schedule.** Save this actor as an Apify **Task** with the input you want, then add a **Schedule** (hourly, daily, weekly) so it runs on its own — no server of your own required.

### Input

```json
{
  "items": ["3017620422003", "0737628064502"],
  "maxConcurrency": 5,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

`items` is the only required field — a list of GTIN/EAN/UPC barcodes (separators like
spaces and dashes are stripped automatically). One dataset row is returned per barcode;
rows with `"found": false` are never charged. `maxConcurrency` (default 5) controls how
many lookups run in parallel — this target has no anti-bot defense, so it's safe to
raise, but staying conservative avoids unnecessary load. `proxyConfiguration` lets you
route through Apify Proxy if needed, though the public API works fine without one.

### Output

```json
{
  "query": "3017620422003",
  "found": true,
  "data": {
    "barcode": "3017620422003",
    "productName": "Nutella",
    "brands": "Ferrero",
    "categories": "Breakfasts,Spreads,Sweet spreads,Hazelnut spreads,Chocolate spreads",
    "quantity": "400 g",
    "nutriscoreGrade": "e",
    "novaGroup": 4,
    "ecoscoreGrade": "d",
    "imageUrl": "https://images.openfoodfacts.org/images/products/301/762/042/2003/front_en.jpg"
  },
  "scrapedAt": "2026-08-20T12:00:00.000Z"
}
```

A barcode that doesn't match any product in the database still gets a dataset row
(`"found": false`, no `data` field), so you always get one row per input barcode — but
you're never charged for it.

### Use cases

- **Retail catalog enrichment** — attach product names, brands, and images to barcodes
  scraped or exported from POS or inventory data.
- **Nutrition & ingredient screening** — pull Nutri-Score and NOVA group in bulk for a
  private-label or comparison app.
- **Price-comparison feeds** — resolve a list of GTINs into human-readable product
  listings before matching them against price data.
- **Data quality checks** — verify that barcodes in your product feed actually resolve
  to a real, recognized product.

### Pricing

$4 per 1,000 results, plus a $0.005 start fee. Misses (`found:false`) are never charged.

### Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

```bash
curl "https://api.apify.com/v2/acts/accountable_eel~gtin-barcode-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"items":["3017620422003"]}'
```

**n8n.** Add an HTTP Request node: Method `POST`, URL `https://api.apify.com/v2/acts/accountable_eel~gtin-barcode-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>`, Body Content Type `JSON`, JSON Body `{"items":["3017620422003"]}` (swap in an expression from an earlier node for a real value).

**Clay.** Add an "HTTP API" column: Method `POST`, URL `https://api.apify.com/v2/acts/accountable_eel~gtin-barcode-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>`, Body `{"items":["{{value}}"]}`, mapping the row's value into the `items` array.

**MCP.** In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "GTIN/Barcode Product Lookup | Apify" — the agent will find and run this actor.

### FAQ

**Do I need an Open Food Facts API key?**
No. The product API is free and public — this actor calls it directly, with no
credentials required on your end.

**What barcode formats are supported?**
Any GTIN/EAN/UPC that Open Food Facts recognizes. Spaces and dashes in the input are
stripped automatically before the lookup, so `0737628064502` and `073-762-806450-2`
both work.

**What happens if a barcode isn't in the database?**
You still get a dataset row (`"found": false`), so your output always has one row per
input barcode — but you're never charged for it.

**Does this only cover food products?**
Open Food Facts also covers many cosmetics and pet-food barcodes, but its core and
deepest coverage is food products — coverage for other categories can be spottier.

**Can I run this against a large list of barcodes?**
Yes — `maxConcurrency` controls how many lookups run in parallel (default 5, up to 20).

**Does this work outside a specific country?**
Yes — Open Food Facts is a global, crowdsourced database, though completeness varies
by product and region.

# Actor input Schema

## `items` (type: `array`):

One item per line — see the item shape and examples below. Only the items we actually find are charged — never per run, and never for a miss.

## `maxConcurrency` (type: `integer`):

Parallel requests. Keep conservative — this target has no browser fallback, so getting blocked costs more than slow-and-steady.

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

Apify Proxy config. Residential recommended for anti-bot-sensitive targets.

## Actor input object example

```json
{
  "items": [
    "3017620422003"
  ],
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "items": [
        "3017620422003"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("accountable_eel/gtin-barcode-lookup").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 = { "items": ["3017620422003"] }

# Run the Actor and wait for it to finish
run = client.actor("accountable_eel/gtin-barcode-lookup").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 '{
  "items": [
    "3017620422003"
  ]
}' |
apify call accountable_eel/gtin-barcode-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,accountable_eel/gtin-barcode-lookup"
        }
    }
}

```

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/IlytdbD5ouxsRWiJb/builds/hOlWAgDUL1ciD577h/openapi.json
