Vai al contenuto

Utilizzare le API alimentari per accedere ai database mondiali dei prodotti alimentari

PHP · API · Alimentazione · Open Data

Le API alimentari permettono di accedere a enormi database di prodotti e valori nutrizionali senza dover costruire e mantenere i dati in proprio. In questa guida vediamo come interrogare tre delle principali API disponibili — Open Food Facts, Nutritionix e USDA FoodData Central — utilizzando PHP con cURL.

Tutti gli esempi sono testati e pronti all'uso. Per le API che richiedono autenticazione viene indicato dove ottenere le credenziali gratuitamente.

Cosa imparerai: come interrogare tre API alimentari differenti, gestire autenticazione e errori, implementare una cache locale e scegliere quella giusta per il tuo progetto.
1

Open Food Facts — il database open source

Open Food Facts — oltre 3 milioni di prodotti · nessuna autenticazione · piano gratuito illimitato

Open Food Facts è un database open source con oltre 3 milioni di prodotti alimentari. Non richiede autenticazione per le letture, ha un endpoint semplicissimo basato su barcode EAN, ed è la stessa fonte su cui si è basata l'app Yuka.

Endpoint principale

Per cercare un prodotto tramite barcode EAN:

GET https://world.openfoodfacts.org/api/v2/product/{barcode}.jsonENDPOINT
💡 Nessuna API key necessaria. Basta rispettare un User-Agent personalizzato nelle richieste, con il nome della tua app e una email di contatto.

Esempio PHP — ricerca per barcode

<?php

function getProductByBarcode(string $barcode): ?array {

    $url = 'https://world.openfoodfacts.org/api/v2/product/' . $barcode . '.json';

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 10,
        CURLOPT_USERAGENT      => 'MiaApp/1.0 (mio@email.com)',
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpCode !== 200 || !$response) return null;

    $data = json_decode($response, true);
    if (($data['status'] ?? 0) !== 1) return null;

    $p = $data['product'];
    return [
        'nome'        => $p['product_name']                        ?? 'N/A',
        'marca'       => $p['brands']                              ?? 'N/A',
        'calorie'     => $p['nutriments']['energy-kcal_100g']      ?? null,
        'proteine'    => $p['nutriments']['proteins_100g']         ?? null,
        'grassi'      => $p['nutriments']['fat_100g']             ?? null,
        'carboidrati' => $p['nutriments']['carbohydrates_100g']   ?? null,
        'nutriscore'  => $p['nutriscore_grade']                   ?? null,
    ];
}

// Utilizzo — barcode Nutella
$prodotto = getProductByBarcode('3017620422003');
print_r($prodotto);
PHP

Ricerca per nome (testo libero)

function searchProducts(string $query, int $page = 1): array {

    $url = 'https://world.openfoodfacts.org/cgi/search.pl?' . http_build_query([
        'search_terms'  => $query,
        'search_simple' => 1,
        'action'        => 'process',
        'json'          => 1,
        'page'          => $page,
        'page_size'     => 20,
    ]);

    // ... stessa logica cURL della funzione precedente
    // $data['products'] contiene l'array dei risultati
}
PHP
2

Nutritionix — query in linguaggio naturale

Nutritionix — 800K+ voci · linguaggio naturale · 500 richieste/giorno gratis

Nutritionix offre dati nutrizionali dettagliati e supporta query in linguaggio naturale, ad esempio "200g di pasta al pomodoro" oppure "una tazza di latte intero". Richiede registrazione per ottenere una API Key gratuita.

Registrazione e credenziali

Registrati su developer.nutritionix.com per ottenere due credenziali da usare nell'header HTTP di ogni richiesta:

  • app_id — l'ID della tua applicazione
  • app_key — la chiave segreta
⚠️ Attenzione: le credenziali vanno inserite nell'header HTTP, mai nel codice JavaScript front-end. Tienile in un file .env o in una costante PHP lato server.

Esempio PHP — query nutrizionale

<?php

define('NUTRITIONIX_APP_ID',  'il_tuo_app_id');
define('NUTRITIONIX_APP_KEY', 'la_tua_app_key');

function getNutritionInfo(string $query): ?array {

    $url  = 'https://trackapi.nutritionix.com/v2/natural/nutrients';
    $body = json_encode(['query' => $query]);

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => $body,
        CURLOPT_HTTPHEADER     => [
            'Content-Type: application/json',
            'x-app-id: '  . NUTRITIONIX_APP_ID,
            'x-app-key: ' . NUTRITIONIX_APP_KEY,
        ],
    ]);

    $response = curl_exec($ch);
    curl_close($ch);

    $data = json_decode($response, true);
    if (empty($data['foods'])) return null;

    $food = $data['foods'][0];
    return [
        'nome'        => $food['food_name'],
        'calorie'     => $food['nf_calories'],
        'proteine'    => $food['nf_protein'],
        'grassi'      => $food['nf_total_fat'],
        'carboidrati' => $food['nf_total_carbohydrate'],
        'fibra'       => $food['nf_dietary_fiber'],
        'sodio_mg'    => $food['nf_sodium'],
    ];
}

// Interrogazione in linguaggio naturale
$info = getNutritionInfo('200g di salmone alla griglia');
print_r($info);
PHP
3

USDA FoodData Central — dati scientifici ufficiali

USDA FoodData Central — ~600K voci validate · fonte scientifica · praticamente illimitato

USDA FoodData Central è il database ufficiale del Dipartimento dell'Agricoltura degli Stati Uniti. Completamente gratuito, con dati scientificamente validati — la scelta ideale per applicazioni che richiedono alta precisione nutrizionale o contesto medico/sportivo.

Ottenere la API Key

Registrati su fdc.nal.usda.gov/api-guide.html. La API key viene inviata per email immediatamente ed è gratuita senza limiti pratici per uso personale.

Esempio PHP — ricerca alimento

<?php

define('USDA_API_KEY', 'la_tua_api_key');

function searchUSDAFoods(string $query, int $pageSize = 5): array {

    $url = 'https://api.nal.usda.gov/fdc/v1/foods/search?' . http_build_query([
        'query'    => $query,
        'pageSize' => $pageSize,
        'api_key'  => USDA_API_KEY,
    ]);

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 10,
    ]);

    $response = curl_exec($ch);
    curl_close($ch);

    $data    = json_decode($response, true);
    $results = [];

    foreach ($data['foods'] ?? [] as $food) {
        $nutrients = [];
        foreach ($food['foodNutrients'] ?? [] as $n) {
            $nutrients[$n['nutrientName']] = $n['value'];
        }
        $results[] = [
            'fdcId'    => $food['fdcId'],
            'nome'     => $food['description'],
            'calorie'  => $nutrients['Energy']               ?? null,
            'proteine' => $nutrients['Protein']              ?? null,
            'grassi'   => $nutrients['Total lipid (fat)']    ?? null,
        ];
    }

    return $results;
}

$alimenti = searchUSDAFoods('avocado');
foreach ($alimenti as $a) {
    echo $a['nome'] . ' — ' . $a['calorie'] . ' kcal' . PHP_EOL;
}
PHP
4

Confronto tra le tre API

API Dati prodotti Linguaggio nat. Autenticazione Piano free
Open Food Facts 3M+ prodotti No Non richiesta Illimitato
Nutritionix 800K+ voci App ID + Key 500 req/giorno
USDA FoodData ~600K voci No API Key Praticamente illimitato
5

Gestione errori e best practice

Funzione helper riutilizzabile

Per evitare di ripetere la logica cURL in ogni funzione, conviene creare un helper centralizzato:

function httpGet(string $url, array $headers = []): ?array {

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 10,
        CURLOPT_USERAGENT      => 'MiaApp/1.0',
        CURLOPT_HTTPHEADER     => $headers,
    ]);

    $response = curl_exec($ch);
    $error    = curl_error($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($error) {
        error_log('cURL error: ' . $error);
        return null;
    }

    if ($httpCode !== 200) {
        error_log('HTTP ' . $httpCode . ' for: ' . $url);
        return null;
    }

    return json_decode($response, true);
}
PHP — helper

Cache dei risultati

I dati alimentari cambiano raramente. Una cache locale riduce i tempi di risposta e il consumo delle quote API:

function getProductCached(string $barcode): ?array {

    $cacheFile = sys_get_temp_dir() . '/food_' . $barcode . '.json';

    // Usa cache se fresca (24 ore)
    if (file_exists($cacheFile) && time() - filemtime($cacheFile) < 86400) {
        return json_decode(file_get_contents($cacheFile), true);
    }

    $data = getProductByBarcode($barcode);

    if ($data) {
        file_put_contents($cacheFile, json_encode($data));
    }

    return $data;
}
PHP — cache su file

Consigli pratici

  • Imposta sempre CURLOPT_TIMEOUT per evitare richieste bloccanti
  • Usa un User-Agent con il nome della tua app e una email di contatto
  • Salva le API key in variabili d'ambiente o in un file .env, mai in chiaro nel codice
  • Per alto traffico, considera un database locale sincronizzato con il dump di Open Food Facts
  • Testa sempre i casi in cui i valori nutrizionali sono null o assenti
  • Logga gli errori con error_log(), non con echo in produzione

Conclusioni

Le tre API analizzate coprono scenari molto diversi. Open Food Facts è la scelta ideale per applicazioni che leggono barcode di prodotti confezionati, specialmente in Europa. Nutritionix eccelle nelle query in linguaggio naturale e nei pasti preparati. USDA FoodData Central è la fonte più autorevole per dati scientifici e applicazioni in ambito medico o sportivo.

Con i pochi esempi PHP mostrati in questa guida hai tutto il necessario per iniziare a integrare dati alimentari nella tua applicazione — scegli l'API più adatta al tuo caso d'uso e parti.

🚀 Prossimi step: combina più API in una classe PHP unificata, aggiungi un layer di caching su Redis o Memcached, oppure valuta di importare il dump mensile di Open Food Facts direttamente nel tuo database MySQL per zero dipendenze esterne.
Vuoi maggiori informazioni? Chatta con noi
x-lab soft
Rispondiamo entro un giorno lavorativo