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.
Open Food Facts — il database open source
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
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
Nutritionix — query in linguaggio naturale
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 applicazioneapp_key— la chiave segreta
.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
USDA FoodData Central — dati scientifici ufficiali
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
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 | Sì | App ID + Key | 500 req/giorno |
| USDA FoodData | ~600K voci | No | API Key | Praticamente illimitato |
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_TIMEOUTper evitare richieste bloccanti - Usa un
User-Agentcon 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
nullo assenti - Logga gli errori con
error_log(), non conechoin 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.