Nutrola's Nutrition Data API: Hoe Ontwikkelaars Toegang Krijgen tot Onze Voedseldatabase
Een ontwikkelaarsgids voor Nutrola's Nutrition Data API. Leer hoe je toegang krijgt tot onze geverifieerde voedseldatabase met meer dan 3 miljoen entries, verken endpoints, authenticatie en praktische gebruiksvoorbeelden.
Ben je bezig met het bouwen van een gezondheids-, fitness- of voedselgerelateerde app? Een van de grootste uitdagingen waar je mee te maken krijgt, is het verkrijgen van voedingsdata. Je hebt nauwkeurige calorie- en macro-informatie nodig voor duizenden voedingsmiddelen, je moet internationale producten dekken en je moet ervoor zorgen dat de informatie actueel blijft naarmate fabrikanten hun producten herformuleren.
De meeste ontwikkelaars beginnen met het ophalen van gegevens uit open overheid databases zoals USDA FoodData Central. Dit biedt een basis, maar dekt geen merkproducten uit 47 landen, restaurantmaaltijden of de duizenden regionale voedingsmiddelen die echte gebruikers dagelijks consumeren. Het zelf invullen van deze hiaten betekent jaren van datacuratie.
Nutrola's Nutrition Data API biedt ontwikkelaars toegang tot dezelfde geverifieerde voedseldatabase die onze app aandrijft — meer dan 3 miljoen entries, inclusief rauwe ingrediënten, merkproducten, restaurantmaaltijden en samengestelde recepten. Elke entry is geverifieerd via ons meerlagige kwaliteitscontroleproces, hetzelfde systeem dat door meer dan 2 miljoen gebruikers wordt vertrouwd.
Deze gids behandelt alles wat je moet weten om aan de slag te gaan met onze API: architectuur, authenticatie, endpoints, limieten en praktische codevoorbeelden.
API Overzicht
De Nutrola Nutrition Data API is een RESTful JSON API. Je doet HTTP-verzoeken en ontvangt JSON-antwoorden. Er zijn geen SDK's vereist, hoewel we clientbibliotheken voor Python, JavaScript en Swift aanbieden voor het gemak.
Basis URL
https://api.nutrola.com/v1
Alle endpoints worden via HTTPS aangeboden. Gewone HTTP-verzoeken worden afgewezen.
Belangrijkste Functionaliteiten
| Functionaliteit | Beschrijving |
|---|---|
| Voedselzoekfunctie | Volledige tekstzoekfunctie over 3M+ voedselentries met filtering op categorie, merk en land |
| Barcode Zoekfunctie | Verkrijg voedingsdata op basis van UPC, EAN of andere barcodeformaten |
| Voedingsdetails | Compleet voedingsprofiel voor elk voedingsmiddel (70+ voedingsstoffen, inclusief micros) |
| Portiegroottes | Standaard en alternatieve portiegroottes met gramconversies |
| Receptanalyse | Dien een lijst met ingrediënten in en ontvang gecombineerde voedingsdata |
| Voedselcategorieën | Blader door de hiërarchische voedselcategorieën |
| Merkenregister | Zoek en blader door merkvoedselfabrikanten |
| Autocomplete | Snelle suggesties voor voedselzoekinterfaces |
Antwoordformaat
Alle antwoorden volgen een consistente structuur:
{
"status": "success",
"data": { },
"meta": {
"request_id": "req_abc123",
"rate_limit_remaining": 245,
"rate_limit_reset": "2026-03-10T15:00:00Z"
}
}
Foutantwoorden bevatten een machine-leesbare foutcode en een begrijpelijke boodschap:
{
"status": "error",
"error": {
"code": "FOOD_NOT_FOUND",
"message": "Geen voedselentry gevonden die overeenkomt met de opgegeven ID.",
"request_id": "req_xyz789"
}
}
Authenticatie
Alle API-verzoeken vereisen een API-sleutel die in de Authorization header wordt doorgegeven.
Een API-sleutel Verkrijgen
- Maak een ontwikkelaarsaccount aan op developer.nutrola.com
- Navigeer naar de sectie API-sleutels in je dashboard
- Genereer een nieuwe sleutel en specificeer de benodigde scopes
- Bewaar de sleutel veilig — deze wordt slechts één keer weergegeven
Gebruik van je API-sleutel
Voeg de sleutel toe aan elke verzoekheader:
Authorization: Bearer YOUR_API_KEY
Voorbeeld met curl:
curl -H "Authorization: Bearer ntr_live_abc123def456" \
https://api.nutrola.com/v1/foods/search?q=chicken+breast
API-sleutel Scopes
| Scope | Toegangsniveau |
|---|---|
foods:read |
Zoek en haal voedseldata op (meest gebruikelijk) |
barcodes:read |
Barcodezoekfunctie |
recipes:analyze |
Receptvoedingsanalyse |
brands:read |
Toegang tot merkenregister |
categories:read |
Voedselcategorieën |
Sleutels kunnen worden gespecificeerd voor specifieke functionaliteiten. Een sleutel met alleen foods:read kan geen barcodezoekopdrachten uitvoeren. Dit volgt het principe van minimale privileges — vraag alleen de scopes aan die je applicatie nodig heeft.
Kernendpoints
Voedselzoekfunctie
Zoek in de database op naam, trefwoord of zin.
GET /v1/foods/search
Parameters:
| Parameter | Type | Vereist | Beschrijving |
|---|---|---|---|
q |
string | Ja | Zoekopdracht (bijv. "gegrilde kipfilet") |
category |
string | Nee | Filter op voedselcategorie (bijv. "zuivel", "groenten") |
brand |
string | Nee | Filter op merknaam |
country |
string | Nee | ISO 3166-1 alpha-2 landcode (bijv. "US", "DE", "JP") |
verified_only |
boolean | Nee | Alleen entries met geverifieerde brondata retourneren (standaard: true) |
page |
integer | Nee | Pagina nummer voor paginering (standaard: 1) |
per_page |
integer | Nee | Resultaten per pagina, max 50 (standaard: 20) |
Voorbeeldverzoek:
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.nutrola.com/v1/foods/search?q=greek+yogurt&country=US&per_page=5"
Voorbeeldantwoord:
{
"status": "success",
"data": {
"results": [
{
"id": "food_8f2k9d",
"name": "Griekse Yoghurt, Naturel, Vetvrij",
"brand": null,
"category": "zuivel",
"country": "US",
"verified": true,
"source": "USDA",
"nutrition_per_100g": {
"calories": 59,
"protein": 10.2,
"carbohydrates": 3.6,
"fat": 0.4,
"fiber": 0,
"sugar": 3.2,
"sodium": 36
},
"default_serving": {
"description": "1 container (170g)",
"grams": 170
}
}
],
"total_results": 342,
"page": 1,
"per_page": 5
}
}
Verkrijg Voedselgegevens
Haal het volledige voedingsprofiel op voor een specifiek voedingsmiddel.
GET /v1/foods/{food_id}
Voorbeeldverzoek:
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.nutrola.com/v1/foods/food_8f2k9d"
Het detailantwoord bevat de volledige voedingssamenstelling — meer dan 70 voedingsstoffen, inclusief alle vitamines, mineralen, aminozuren en vetzuurprofielen. Het bevat ook alle beschikbare portiegroottes en hun gram-equivalenten.
Deelantwoord (Belangrijke Voedingsstoffen):
{
"status": "success",
"data": {
"id": "food_8f2k9d",
"name": "Griekse Yoghurt, Naturel, Vetvrij",
"nutrition_per_100g": {
"calories": 59,
"protein": 10.2,
"carbohydrates": 3.6,
"fat": 0.4,
"fiber": 0,
"sugar": 3.2,
"saturated_fat": 0.1,
"monounsaturated_fat": 0.1,
"polyunsaturated_fat": 0,
"cholesterol": 5,
"sodium": 36,
"potassium": 141,
"calcium": 110,
"iron": 0.1,
"vitamin_a": 4,
"vitamin_c": 0,
"vitamin_d": 0
},
"serving_sizes": [
{ "description": "1 container (170g)", "grams": 170 },
{ "description": "1 cup (245g)", "grams": 245 },
{ "description": "1 tbsp (15g)", "grams": 15 },
{ "description": "100g", "grams": 100 }
],
"allergens": ["melk"],
"source": "USDA",
"source_id": "170903",
"last_verified": "2026-02-15",
"confidence_score": 0.98
}
}
Barcode Zoekfunctie
Zoek een voedselproduct op basis van zijn barcode.
GET /v1/barcodes/{barcode}
Ondersteunde Formaten: UPC-A, UPC-E, EAN-13, EAN-8
Voorbeeldverzoek:
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.nutrola.com/v1/barcodes/0049000006346"
Het antwoord retourneert hetzelfde voedsel detailobject als de /foods/{food_id} endpoint, met extra barcode-specifieke velden zoals barcode_format en regional_variants (een array van voedsel-ID's voor hetzelfde product in verschillende landen, die mogelijk verschillende formuleringen hebben).
Receptanalyse
Dien een lijst met ingrediënten in en ontvang de gecombineerde voedingssamenstelling.
POST /v1/recipes/analyze
Verzoeklichaam:
{
"name": "Overnight Oats",
"servings": 2,
"ingredients": [
{ "food_id": "food_3k8m2n", "grams": 160 },
{ "food_id": "food_9p4q7r", "grams": 400 },
{ "food_id": "food_1a5b8c", "grams": 60 },
{ "food_id": "food_6d2e9f", "grams": 2, "description": "snufje zout" }
]
}
Je kunt ook ingrediënten als tekst indienen voor automatische parsing:
{
"name": "Overnight Oats",
"servings": 2,
"ingredients_text": "160g havermout, 400ml volle melk, 60g pindakaas, snufje zout"
}
Antwoord:
{
"status": "success",
"data": {
"name": "Overnight Oats",
"servings": 2,
"nutrition_per_serving": {
"calories": 425,
"protein": 18.5,
"carbohydrates": 42.3,
"fat": 21.2,
"fiber": 5.8
},
"nutrition_total": {
"calories": 850,
"protein": 37.0,
"carbohydrates": 84.6,
"fat": 42.4,
"fiber": 11.6
},
"ingredients_matched": [
{ "input": "160g havermout", "matched_food": "food_3k8m2n", "confidence": 0.97 },
{ "input": "400ml volle melk", "matched_food": "food_9p4q7r", "confidence": 0.99 },
{ "input": "60g pindakaas", "matched_food": "food_1a5b8c", "confidence": 0.96 },
{ "input": "snufje zout", "matched_food": "food_6d2e9f", "confidence": 0.88 }
]
}
}
Autocomplete
Snelle type-ahead suggesties voor het bouwen van zoekinterfaces.
GET /v1/foods/autocomplete?q={query}
Parameters:
| Parameter | Type | Vereist | Beschrijving |
|---|---|---|---|
q |
string | Ja | Deeltijd zoekopdracht (minimaal 2 tekens) |
limit |
integer | Nee | Maximaal aantal resultaten, 1-10 (standaard: 5) |
country |
string | Nee | Prioriteer resultaten uit dit land |
De responsetijden zijn geoptimaliseerd voor interactief gebruik — meestal onder de 50 ms. De autocomplete endpoint retourneert vereenvoudigde voedselobjecten (ID, naam, merk en categorie) voor snelle weergave.
Rate Limieten en Prijzen
Gratis Pakket
Het gratis pakket is ontworpen voor ontwikkeling, testen en kleinschalige applicaties:
| Limiet | Waarde |
|---|---|
| Verzoeken per dag | 500 |
| Verzoeken per minuut | 30 |
| Voedselzoekresultaten per verzoek | 20 |
| Receptanalyse per dag | 10 |
| Barcodezoekopdrachten per dag | 100 |
Groei Pakket
Voor productieapplicaties met gematigd verkeer:
| Limiet | Waarde |
|---|---|
| Verzoeken per dag | 25.000 |
| Verzoeken per minuut | 300 |
| Voedselzoekresultaten per verzoek | 50 |
| Receptanalyse per dag | 500 |
| Barcodezoekopdrachten per dag | 5.000 |
| Prijs | $49/maand |
Enterprise Pakket
Voor applicaties met veel verkeer, white-label oplossingen en aangepaste vereisten:
| Kenmerk | Details |
|---|---|
| Verzoeken per dag | Aangepast (meestal 100K+) |
| Rate limieten | Aangepast |
| Toegewijde ondersteuning | Inbegrepen |
| SLA | 99,9% uptime garantie |
| Aangepaste gegevensexports | Beschikbaar |
| Webhookmeldingen | Beschikbaar voor gegevensupdates |
| Prijs | Neem contact op met verkoop |
Informatie over rate limieten is opgenomen in elk API-antwoorden via het meta object en in HTTP-responsheaders (X-RateLimit-Remaining, X-RateLimit-Reset).
Praktische Gebruikscases
Fitness- en Workout Apps
Als je een fitnessapp bouwt en voedingsregistratie wilt toevoegen zonder een voedseldatabase vanaf nul op te bouwen, is Nutrola's API de snelste weg. Gebruik de voedselzoek- en barcode endpoints zodat gebruikers maaltijden kunnen registreren, en de receptanalyse endpoint voor aangepaste maaltijdinvoer.
Maaltijdplanningsplatforms
Maaltijdplanningsapps hebben nauwkeurige voedingsdata nodig om plannen te genereren die specifieke macrodoelen bereiken. De gedetailleerde voedingsafbraak van de API (70+ voedingsstoffen) maakt precieze optimalisatie van maaltijdplannen mogelijk, niet alleen calorieën en macro's, maar ook micronutriënten, allergenen en compatibiliteit met dieetbeperkingen.
Gezondheidszorg en Telehealth
Gezondheidsplatforms die de voeding van patiënten monitoren, kunnen integreren met de API om nauwkeurige voedselregistratie binnen hun bestaande interfaces te bieden. De geverifieerde gegevensbronnen (USDA, EFSA, fabrikant-direct) voldoen aan de nauwkeurigheidsnormen die vereist zijn voor klinische voedingsmonitoring.
Restaurant- en Voedselservice
Restaurantbestelsystemen kunnen de API gebruiken om voedingsinformatie voor menu-items weer te geven. De receptanalyse endpoint is hier bijzonder nuttig — dien de ingrediënten van een gerecht in en ontvang de complete voedingsafbraak zonder handmatig elke item te berekenen.
Onderzoek en Academici
Voedingsonderzoekers kunnen de API gebruiken om voedselcodering in dieetstudies te standaardiseren. De consistente, geverifieerde gegevens verminderen de meetfouten die studies teisteren die afhankelijk zijn van door deelnemers gerapporteerde voedingsdata.
Code Voorbeelden
Python: Zoek een Voedsel en Verkrijg Voedingsdetails
import requests
API_KEY = "ntr_live_your_key_here"
BASE_URL = "https://api.nutrola.com/v1"
headers = {
"Authorization": f"Bearer {API_KEY}"
}
# Zoek een voedsel
search_response = requests.get(
f"{BASE_URL}/foods/search",
headers=headers,
params={"q": "gegrilde kipfilet", "per_page": 3}
)
results = search_response.json()["data"]["results"]
for food in results:
print(f"{food['name']} - {food['nutrition_per_100g']['calories']} cal/100g")
# Verkrijg volledige details voor het eerste resultaat
food_id = results[0]["id"]
detail_response = requests.get(
f"{BASE_URL}/foods/{food_id}",
headers=headers
)
food_detail = detail_response.json()["data"]
nutrition = food_detail["nutrition_per_100g"]
print(f"\n{food_detail['name']}")
print(f"Calorieën: {nutrition['calories']}")
print(f"Eiwit: {nutrition['protein']}g")
print(f"Koolhydraten: {nutrition['carbohydrates']}g")
print(f"Vet: {nutrition['fat']}g")
print(f"Portiegroottes: {food_detail['serving_sizes']}")
JavaScript: Barcode Scanning Integratie
const API_KEY = "ntr_live_your_key_here";
const BASE_URL = "https://api.nutrola.com/v1";
async function lookupBarcode(barcode) {
const response = await fetch(
`${BASE_URL}/barcodes/${barcode}`,
{
headers: {
"Authorization": `Bearer ${API_KEY}`
}
}
);
if (!response.ok) {
if (response.status === 404) {
console.log("Product niet gevonden in database");
return null;
}
throw new Error(`API fout: ${response.status}`);
}
const data = await response.json();
return data.data;
}
// Voorbeeldgebruik
const product = await lookupBarcode("0049000006346");
if (product) {
const serving = product.default_serving;
const factor = serving.grams / 100;
console.log(`${product.name} (${product.brand})`);
console.log(`Per ${serving.description}:`);
console.log(` Calorieën: ${Math.round(product.nutrition_per_100g.calories * factor)}`);
console.log(` Eiwit: ${(product.nutrition_per_100g.protein * factor).toFixed(1)}g`);
console.log(` Koolhydraten: ${(product.nutrition_per_100g.carbohydrates * factor).toFixed(1)}g`);
console.log(` Vet: ${(product.nutrition_per_100g.fat * factor).toFixed(1)}g`);
}
Swift: Een Autocomplete Zoekveld Bouwen
import Foundation
class Nutrola API {
private let apiKey: String
private let baseURL = "https://api.nutrola.com/v1"
init(apiKey: String) {
self.apiKey = apiKey
}
func autocomplete(query: String, limit: Int = 5) async throws -> [FoodSuggestion] {
guard query.count >= 2 else { return [] }
var components = URLComponents(string: "\(baseURL)/foods/autocomplete")!
components.queryItems = [
URLQueryItem(name: "q", value: query),
URLQueryItem(name: "limit", value: String(limit))
]
var request = URLRequest(url: components.url!)
request.setValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization")
let (data, _) = try await URLSession.shared.data(for: request)
let response = try JSONDecoder().decode(AutocompleteResponse.self, from: data)
return response.data.suggestions
}
}
struct FoodSuggestion: Codable {
let id: String
let name: String
let brand: String?
let category: String
}
struct AutocompleteResponse: Codable {
let status: String
let data: AutocompleteData
}
struct AutocompleteData: Codable {
let suggestions: [FoodSuggestion]
}
Foutafhandelings Best Practices
De API maakt gebruik van standaard HTTP-statuscodes:
| Statuscode | Betekenis | Veelvoorkomende Oorzaak |
|---|---|---|
| 200 | Succes | Verzoek is normaal uitgevoerd |
| 400 | Ongeldig Verzoek | Ontbrekende vereiste parameter of ongeldige waarde |
| 401 | Niet Geautoriseerd | Ongeldige of ontbrekende API-sleutel |
| 403 | Verboden | API-sleutel mist vereiste scope |
| 404 | Niet Gevonden | Voedsel-ID of barcode niet in database |
| 429 | Rate Beperkt | Te veel verzoeken; controleer rate limit headers |
| 500 | Serverfout | Interne fout; probeer opnieuw met exponentiële backoff |
Wanneer je een 429-respons ontvangt, vertelt de Retry-After header je hoeveel seconden je moet wachten voordat je het opnieuw probeert. Het implementeren van exponentiële backoff voor 429 en 500-responsen wordt sterk aanbevolen voor productieapplicaties.
Gegevensversheid en Updates
Nutrola's database wordt continu bijgewerkt. Geverifieerde productentries worden vernieuwd wanneer fabrikanten wijzigingen rapporteren, meestal binnen 48 uur. Overheidsdatabase-entries worden elk kwartaal gesynchroniseerd wanneer nieuwe releases worden gepubliceerd.
Als je applicatie API-antwoorden cachet (wat we aanbevelen voor prestaties), adviseren we een cache TTL van 24 uur voor voedsel detailantwoorden en 1 uur voor zoekresultaten. Het last_verified veld in voedsel detailantwoorden vertelt je wanneer de entry voor het laatst als nauwkeurig bevestigd is.
Voor enterprise klanten bieden we webhookmeldingen aan wanneer voedselentries worden bijgewerkt, zodat je applicatie proactief gecachte gegevens kan ongeldig maken in plaats van te wachten tot de cache TTL is verlopen.
Aan de Slag
- Meld je aan op developer.nutrola.com — het duurt minder dan een minuut
- Genereer een API-sleutel met de benodigde scopes
- Doe je eerste verzoek met behulp van de bovenstaande curl-voorbeelden
- Verken de interactieve documentatie op developer.nutrola.com/docs waar je endpoints direct in je browser kunt testen
- Sluit je aan bij de ontwikkelaarsgemeenschap op onze Discord-server voor ondersteuning, functieaanvragen en om te zien wat andere ontwikkelaars bouwen
Als je vragen hebt, problemen tegenkomt of wilt praten over een enterprise-integratie, neem dan contact op met ons ontwikkelaarsrelatieteam via api@nutrola.com.
Veelgestelde Vragen
Is de Nutrola API gratis te gebruiken?
Ja, er is een gratis pakket dat 500 verzoeken per dag omvat. Dit is geschikt voor ontwikkeling, testen en kleinschalige applicaties. Voor productieapplicaties met hoger verkeer begint het Groei pakket bij $49 per maand met 25.000 dagelijkse verzoeken. Enterprise plannen met aangepaste limieten zijn beschikbaar voor toepassingen met veel verkeer.
Welke gegevensformaten ondersteunt de API?
De API gebruikt uitsluitend JSON voor zowel verzoeken als antwoorden. Alle endpoints accepteren standaard queryparameters voor GET-verzoeken en JSON-verzoeklichamen voor POST-verzoeken. De responscodering is UTF-8, wat correct omgaat met voedselnamen in alle ondersteunde talen.
Hoe nauwkeurig zijn de voedingsgegevens die door de API worden geleverd?
Elke entry in de Nutrola database ondergaat een meerlagig verificatieproces, inclusief validatie van overheidsbronnen, kruisverwijzing van fabrikantgegevens, AI-gestuurde statistische controle en menselijke expertbeoordeling. Onze nauwkeurigheidsnorm is 97,4% vergeleken met laboratoriumanalyse, in vergelijking met een industriegemiddelde van 70-85% voor crowdsourced databases. Elke voedselentry bevat een confidence_score veld dat ons niveau van zekerheid aangeeft.
Kan ik de API gebruiken om een commercieel product te bouwen?
Ja. De API is ontworpen voor commercieel gebruik. Het gratis pakket kan worden gebruikt voor commerciële producten binnen de rate limits. Groei- en Enterprise plannen omvatten commerciële gebruiksrechten zonder beperkingen op het type applicatie. Bekijk de gebruiksvoorwaarden op developer.nutrola.com voor volledige details.
Ondersteunt de API voedingsmiddelen van buiten de Verenigde Staten?
Ja. De database dekt merkproducten uit 47 landen en generieke voedingsmiddelen uit meer dan 120 keukens. Gebruik de country parameter op zoekendpoints om resultaten uit een specifieke markt te prioriteren. Barcodezoekopdrachten matchen automatisch het product met de juiste regionale formulering.
Hoe ga ik om met voedingsmiddelen die niet in de database staan?
Als een barcodezoekopdracht een 404 retourneert, kun je terugvallen op een tekstzoekopdracht met de productnaam. Als geen van beide benaderingen het voedsel vindt, kun je het indienen voor toevoeging via het ontwikkelaarsportaal. Voedingsmiddelen die door API-partners zijn ingediend, krijgen prioriteit voor verificatie en worden meestal binnen 72 uur toegevoegd. Enterprise klanten kunnen batch toevoegingen aanvragen voor grote productcatalogi.
Zijn er SDK's of clientbibliotheken beschikbaar?
We bieden officiële clientbibliotheken voor Python (via pip: pip install nutrola), JavaScript/TypeScript (via npm: npm install @nutrola/api) en Swift (via Swift Package Manager). Deze bibliotheken behandelen authenticatie, rate limiting, herhalingen en respons parsing. Gemeenschaps-onderhouden bibliotheken zijn beschikbaar voor Go, Ruby en PHP.
Klaar om je voedingstracking te transformeren?
Sluit je aan bij duizenden die hun gezondheidsreis hebben getransformeerd met Nutrola!