Nutrola's Nutrition Data API: Sådan får udviklere adgang til vores fødevaredatabase
En udviklerguide til Nutrola's Nutrition Data API. Lær hvordan du får adgang til vores verificerede fødevaredatabase med over 3 millioner poster, udforsk endpoints, autentificering og virkelige anvendelsestilfælde.
Er du ved at bygge en app inden for sundhed, fitness eller mad? En af de største udfordringer, du vil stå overfor, er ernæringsdata. Du har brug for præcise kalorie- og makroinformationer for tusindvis af fødevarer, du skal dække internationale produkter, og du skal sikre, at informationerne er opdaterede, efterhånden som producenterne reformulerer deres produkter.
De fleste udviklere starter med at hente data fra åbne offentlige databaser som USDA FoodData Central. Det giver dig et grundlag, men dækker ikke mærkevarer fra 47 lande, restaurantretter eller de tusindvis af regionale fødevarer, som rigtige brugere spiser hver dag. At udfylde disse huller selv kræver mange års dataindsamling.
Nutrola's Nutrition Data API giver udviklere adgang til den samme verificerede fødevaredatabase, der driver vores app — over 3 millioner poster, der dækker rå ingredienser, mærkevarer, restaurantretter og sammensatte opskrifter. Hver post er verificeret gennem vores flerlagede kvalitetskontrolproces, det samme system, som over 2 millioner brugere stoler på.
Denne guide dækker alt, hvad du behøver at vide for at komme i gang med vores API: arkitektur, autentificering, endpoints, hastighedsgrænser og virkelige kodeeksempler.
API Oversigt
Nutrola Nutrition Data API er et RESTful JSON API. Du sender HTTP-anmodninger, og du modtager JSON-svar. Ingen SDK'er er nødvendige, selvom vi tilbyder klientbiblioteker til Python, JavaScript og Swift for nemheds skyld.
Basis URL
https://api.nutrola.com/v1
Alle endpoints serveres over HTTPS. Almindelige HTTP-anmodninger afvises.
Nøglefunktioner
| Funktion | Beskrivelse |
|---|---|
| Fødevaresøgning | Fuldt tekstsøgningssystem på 3M+ fødevareposter med filtrering efter kategori, mærke og land |
| Stregkodesøgning | Få ernæringsdata ved hjælp af UPC, EAN eller andre stregkodeformater |
| Ernæringsdetaljer | Fuld ernæringsprofil for enhver fødevare (70+ næringsstoffer inklusive mikronæringsstoffer) |
| Portionsstørrelser | Standard og alternative portionsstørrelser med gram konverteringer |
| Opskriftsanalyse | Indsend en liste over ingredienser og få samlet ernæringsdata |
| Fødevarekategorier | Gennemse den hierarkiske fødevarekategori taksonomi |
| Mærkeregister | Søg og gennemse mærkevareproducenter |
| Autocomplete | Hurtige forslag til søgning af fødevarer |
Svarformat
Alle svar følger en ensartet struktur:
{
"status": "success",
"data": { },
"meta": {
"request_id": "req_abc123",
"rate_limit_remaining": 245,
"rate_limit_reset": "2026-03-10T15:00:00Z"
}
}
Fejl-svar inkluderer en maskinlæselig fejlkode og en menneskelæselig besked:
{
"status": "error",
"error": {
"code": "FOOD_NOT_FOUND",
"message": "Ingen fødevarepost matcher den angivne ID.",
"request_id": "req_xyz789"
}
}
Autentificering
Alle API-anmodninger kræver en API-nøgle, der sendes i Authorization headeren.
Få en API-nøgle
- Opret en udviklerkonto på developer.nutrola.com
- Naviger til sektionen for API-nøgler i dit dashboard
- Generer en ny nøgle og angiv de nødvendige scopes
- Opbevar nøglen sikkert — den vises kun én gang
Brug af din API-nøgle
Inkluder nøglen i hver anmodningsheader:
Authorization: Bearer YOUR_API_KEY
Eksempel med curl:
curl -H "Authorization: Bearer ntr_live_abc123def456" \
https://api.nutrola.com/v1/foods/search?q=chicken+breast
API-nøgle scopes
| Scope | Adgangsniveau |
|---|---|
foods:read |
Søg og hent fødevaredata (mest almindelig) |
barcodes:read |
Stregkodesøgning |
recipes:analyze |
Opskrifts ernæringsanalyse |
brands:read |
Adgang til mærkeregister |
categories:read |
Fødevarekategori taksonomi |
Nøgler kan begrænses til specifikke funktioner. En nøgle med kun foods:read kan ikke tilgå stregkodesøgninger. Dette følger princippet om mindst privilegium — anmod kun om de scopes, din applikation har brug for.
Kerne Endpoints
Fødevaresøgning
Søg i databasen efter navn, nøgleord eller sætning.
GET /v1/foods/search
Parametre:
| Parameter | Type | Krævet | Beskrivelse |
|---|---|---|---|
q |
string | Ja | Søgestreng (f.eks. "grillet kyllingebryst") |
category |
string | Nej | Filtrer efter fødevarekategori (f.eks. "mejeri", "grøntsager") |
brand |
string | Nej | Filtrer efter mærkenavn |
country |
string | Nej | ISO 3166-1 alpha-2 landekode (f.eks. "US", "DE", "JP") |
verified_only |
boolean | Nej | Returner kun poster med verificerede kildedata (standard: true) |
page |
integer | Nej | Side nummer for pagination (standard: 1) |
per_page |
integer | Nej | Resultater pr. side, maks 50 (standard: 20) |
Eksempel på anmodning:
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.nutrola.com/v1/foods/search?q=greek+yogurt&country=US&per_page=5"
Eksempel på svar:
{
"status": "success",
"data": {
"results": [
{
"id": "food_8f2k9d",
"name": "Græsk Yoghurt, Natur, Fedtfri",
"brand": null,
"category": "mejeri",
"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 beholder (170g)",
"grams": 170
}
}
],
"total_results": 342,
"page": 1,
"per_page": 5
}
}
Hent Fødevaredetaljer
Hent den komplette ernæringsprofil for en specifik fødevare.
GET /v1/foods/{food_id}
Eksempel på anmodning:
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.nutrola.com/v1/foods/food_8f2k9d"
Detaljesvaret inkluderer den fulde næringsopdeling — over 70 næringsstoffer inklusive alle vitaminer, mineraler, aminosyrer og fedtsyreprofiler. Det inkluderer også alle tilgængelige portionsstørrelser og deres gram ækvivalenter.
Delvist svar (Nøgle Næringsstoffer):
{
"status": "success",
"data": {
"id": "food_8f2k9d",
"name": "Græsk Yoghurt, Natur, Fedtfri",
"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 beholder (170g)", "grams": 170 },
{ "description": "1 kop (245g)", "grams": 245 },
{ "description": "1 spsk (15g)", "grams": 15 },
{ "description": "100g", "grams": 100 }
],
"allergens": ["mælk"],
"source": "USDA",
"source_id": "170903",
"last_verified": "2026-02-15",
"confidence_score": 0.98
}
}
Stregkodesøgning
Søg efter et fødevareprodukt ved hjælp af dets stregkode.
GET /v1/barcodes/{barcode}
Understøttede formater: UPC-A, UPC-E, EAN-13, EAN-8
Eksempel på anmodning:
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.nutrola.com/v1/barcodes/0049000006346"
Svaret returnerer det samme fødevaredetaljeobjekt som /foods/{food_id} endpointet, med yderligere stregkode-specifikke felter som barcode_format og regional_variants (et array af fødevare-ID'er for det samme produkt i forskellige lande, som kan have forskellige formuleringer).
Opskriftsanalyse
Indsend en liste over ingredienser og modtag den samlede ernæringsopdeling.
POST /v1/recipes/analyze
Anmodningskrop:
{
"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": "et nip salt" }
]
}
Du kan også indsende ingredienser som tekst til automatisk parsing:
{
"name": "Overnight Oats",
"servings": 2,
"ingredients_text": "160g havregryn, 400ml sødmælk, 60g peanutbutter, nip salt"
}
Svar:
{
"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 havregryn", "matched_food": "food_3k8m2n", "confidence": 0.97 },
{ "input": "400ml sødmælk", "matched_food": "food_9p4q7r", "confidence": 0.99 },
{ "input": "60g peanutbutter", "matched_food": "food_1a5b8c", "confidence": 0.96 },
{ "input": "nip salt", "matched_food": "food_6d2e9f", "confidence": 0.88 }
]
}
}
Autocomplete
Hurtige forslag til at bygge søgegrænseflader.
GET /v1/foods/autocomplete?q={query}
Parametre:
| Parameter | Type | Krævet | Beskrivelse |
|---|---|---|---|
q |
string | Ja | Delvis søgestreng (minimum 2 tegn) |
limit |
integer | Nej | Maks resultater, 1-10 (standard: 5) |
country |
string | Nej | Prioriter resultater fra dette land |
Svarstider er optimeret til interaktiv brug — typisk under 50ms. Autocomplete endpointet returnerer forenklede fødevareobjekter (ID, navn, mærke og kategori kun) for hurtig rendering.
Hastighedsgrænser og Priser
Gratis Tier
Den gratis tier er designet til udvikling, test og små applikationer:
| Grænse | Værdi |
|---|---|
| Anmodninger pr. dag | 500 |
| Anmodninger pr. minut | 30 |
| Fødevaresøgeresultater pr. anmodning | 20 |
| Opskriftsanalyse pr. dag | 10 |
| Stregkodesøgninger pr. dag | 100 |
Vækst Tier
Til produktionsapplikationer med moderat trafik:
| Grænse | Værdi |
|---|---|
| Anmodninger pr. dag | 25.000 |
| Anmodninger pr. minut | 300 |
| Fødevaresøgeresultater pr. anmodning | 50 |
| Opskriftsanalyse pr. dag | 500 |
| Stregkodesøgninger pr. dag | 5.000 |
| Pris | $49/måned |
Enterprise Tier
Til applikationer med høj trafik, white-label løsninger og tilpassede krav:
| Funktion | Detaljer |
|---|---|
| Anmodninger pr. dag | Tilpasset (typisk 100K+) |
| Hastighedsgrænser | Tilpasset |
| Dedikeret support | Inkluderet |
| SLA | 99,9% oppetidsgaranti |
| Tilpassede dataeksporter | Tilgængelige |
| Webhook-notifikationer | Tilgængelige for dataopdateringer |
| Pris | Kontakt salg |
Oplysninger om hastighedsgrænser er inkluderet i hver API-svar via meta objektet og i HTTP-svarshovederne (X-RateLimit-Remaining, X-RateLimit-Reset).
Virkelige Anvendelsestilfælde
Fitness- og Træningsapps
Hvis du bygger en fitnessapp og ønsker at tilføje ernæringssporing uden at skulle opbygge en fødevaredatabase fra bunden, er Nutrola's API den hurtigste vej. Brug fødevaresøgnings- og stregkode-endpoints til at lade brugerne logge måltider, og opskriftsanalyse-endpointet til brugerdefinerede måltidsindgange.
Måltidsplanlægningsplatforme
Måltidsplanlægningsapps har brug for præcise ernæringsdata for at generere planer, der rammer specifikke makro mål. API'ens detaljerede næringsopdeling (70+ næringsstoffer) muliggør præcis optimering af måltidsplaner, ikke kun kalorier og makroer, men også mikronæringsstoffer, allergener og kompatibilitet med diætbegrænsninger.
Sundhedspleje og Telehealth
Sundhedsplatforme, der overvåger patienternæring, kan integrere med API'et for at give præcis fødevarelogning inden for deres eksisterende grænseflader. De verificerede datakilder (USDA, EFSA, producentdirekte) opfylder de nøjagtighedsstandarder, der kræves for klinisk ernæringsovervågning.
Restaurant- og Fødevaretjenester
Restaurantbestillingsplatforme kan bruge API'et til at vise ernæringsinformation for menupunkter. Opskriftsanalyse-endpointet er særligt nyttigt her — indsend ingredienserne til en ret og få den komplette ernæringsopdeling uden manuelt at skulle beregne hver enkelt post.
Forskning og Akademia
Ernæringsforskere kan bruge API'et til at standardisere fødevarekodning i koststudier. De ensartede, verificerede data reducerer målefejl, der plager studier, der er afhængige af deltager-rapporterede ernæringsdata.
Kodeeksempler
Python: Søg efter en Fødevare og Få Ernæringsdetaljer
import requests
API_KEY = "ntr_live_your_key_here"
BASE_URL = "https://api.nutrola.com/v1"
headers = {
"Authorization": f"Bearer {API_KEY}"
}
# Søg efter en fødevare
search_response = requests.get(
f"{BASE_URL}/foods/search",
headers=headers,
params={"q": "grillet kyllingebryst", "per_page": 3}
)
results = search_response.json()["data"]["results"]
for food in results:
print(f"{food['name']} - {food['nutrition_per_100g']['calories']} cal/100g")
# Hent fulde detaljer for det første resultat
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"Kalorier: {nutrition['calories']}")
print(f"Protein: {nutrition['protein']}g")
print(f"Carbs: {nutrition['carbohydrates']}g")
print(f"Fedt: {nutrition['fat']}g")
print(f"Portionsstørrelser: {food_detail['serving_sizes']}")
JavaScript: Stregkodescanning Integration
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("Produkt ikke fundet i databasen");
return null;
}
throw new Error(`API fejl: ${response.status}`);
}
const data = await response.json();
return data.data;
}
// Eksempel på brug
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(`Pr. ${serving.description}:`);
console.log(` Kalorier: ${Math.round(product.nutrition_per_100g.calories * factor)}`);
console.log(` Protein: ${(product.nutrition_per_100g.protein * factor).toFixed(1)}g`);
console.log(` Carbs: ${(product.nutrition_per_100g.carbohydrates * factor).toFixed(1)}g`);
console.log(` Fedt: ${(product.nutrition_per_100g.fat * factor).toFixed(1)}g`);
}
Swift: Bygning af et Autocomplete Søgfelt
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]
}
Fejlhåndterings bedste praksis
API'et bruger standard HTTP-statuskoder:
| Statuskode | Betydning | Almindelig årsag |
|---|---|---|
| 200 | Succes | Anmodning gennemført normalt |
| 400 | Dårlig anmodning | Manglende nødvendig parameter eller ugyldig værdi |
| 401 | Uautoriseret | Ugyldig eller manglende API-nøgle |
| 403 | Forbudt | API-nøgle mangler nødvendig scope |
| 404 | Ikke fundet | Fødevare-ID eller stregkode ikke i databasen |
| 429 | Hastighedsbegrænset | For mange anmodninger; tjek hastighedsgrænsehoveder |
| 500 | Serverfejl | Intern fejl; prøv igen med eksponentiel tilbageholdelse |
Når du modtager et 429 svar, fortæller Retry-After headeren, hvor mange sekunder du skal vente, før du prøver igen. Implementering af eksponentiel tilbageholdelse for 429 og 500 svar anbefales kraftigt til produktionsapplikationer.
Dat friskhed og opdateringer
Nutrola's database opdateres kontinuerligt. Mærkevareposter opdateres, når producenter rapporterer ændringer, typisk inden for 48 timer. Offentlige databaseposter synkroniseres kvartalsvis, når nye udgivelser offentliggøres.
Hvis din applikation cacher API-svar (hvilket vi anbefaler for ydeevne), foreslår vi en cache TTL på 24 timer for fødevaredetaljesvar og 1 time for søgeresultater. last_verified feltet i fødevaredetaljesvar fortæller dig, hvornår posten sidst blev bekræftet som nøjagtig.
For enterprise-kunder tilbyder vi webhook-notifikationer, når fødevareposter opdateres, så din applikation kan invalidere cachede data proaktivt i stedet for at vente på, at cache TTL udløber.
Kom i gang
- Tilmeld dig på developer.nutrola.com — det tager under et minut
- Generer en API-nøgle med de nødvendige scopes
- Foretag din første anmodning ved hjælp af curl-eksemplerne ovenfor
- Udforsk de interaktive dokumenter på developer.nutrola.com/docs, hvor du kan teste endpoints direkte i din browser
- Deltag i udviklerfællesskabet på vores Discord-server for support, funktionsanmodninger og for at se, hvad andre udviklere bygger
Hvis du har spørgsmål, støder på problemer, eller ønsker at diskutere en enterprise-integration, kan du kontakte vores udviklerrelations team på api@nutrola.com.
FAQ
Er Nutrola API gratis at bruge?
Ja, der er en gratis tier, der inkluderer 500 anmodninger pr. dag. Dette er passende til udvikling, test og små applikationer. For produktionsapplikationer med højere trafik starter vækst-tieret ved $49 pr. måned med 25.000 daglige anmodninger. Enterprise-planer med tilpassede grænser er tilgængelige for højtrafik brugssager.
Hvilke dataformater understøtter API'et?
API'et bruger udelukkende JSON til både anmodninger og svar. Alle endpoints accepterer standard forespørgselsparametre til GET-anmodninger og JSON-anmodningskroppe til POST-anmodninger. Svarkodning er UTF-8, som korrekt håndterer fødevare navne på alle understøttede sprog.
Hvor nøjagtige er ernæringsdataene, der leveres af API'et?
Hver post i Nutrola-databasen gennemgår en flerlagers verificeringsproces, der inkluderer validering af offentlige kilder, krydsreferencer af producentdata, AI-drevet statistisk kontrol og menneskelig ekspertvurdering. Vores nøjagtighedsbenchmark er 97,4% i forhold til laboratorieanalyse, sammenlignet med en branchegennemsnit på 70-85% for crowdsourced databaser. Hver fødevarepost inkluderer et confidence_score felt, der angiver vores sikkerhedsniveau.
Kan jeg bruge API'et til at bygge et kommercielt produkt?
Ja. API'et er designet til kommerciel brug. Den gratis tier kan bruges til kommercielle produkter inden for dens hastighedsgrænser. Vækst- og Enterprise-planer inkluderer kommercielle brugsretter uden restriktioner på applikationstypen. Gennemgå servicevilkårene på developer.nutrola.com for fulde detaljer.
Understøtter API'et fødevarer uden for USA?
Ja. Databasen dækker mærkevarer fra 47 lande og generiske fødevarer fra over 120 køkkener. Brug country parameteren på søge-endpoints for at prioritere resultater fra et specifikt marked. Stregkodesøgninger matcher automatisk produktet til den korrekte regionale formulering.
Hvordan håndterer jeg fødevarer, der ikke er i databasen?
Hvis en stregkodesøgning returnerer en 404, kan du falde tilbage til en tekstsøgning ved hjælp af produktnavnet. Hvis ingen af tilgange finder fødevaren, kan du indsende den til tilføjelse gennem udviklerportalen. Fødevarer indsendt af API-partnere prioriteres til verificering og tilføjes typisk inden for 72 timer. Enterprise-kunder kan anmode om batch-tilføjelser til store produktkataloger.
Er der SDK'er eller klientbiblioteker tilgængelige?
Vi tilbyder officielle klientbiblioteker til Python (via pip: pip install nutrola), JavaScript/TypeScript (via npm: npm install @nutrola/api), og Swift (via Swift Package Manager). Disse biblioteker håndterer autentificering, hastighedsbegrænsning, genforsøg og svarparsing. Samfundvedligeholdte biblioteker er tilgængelige for Go, Ruby og PHP.
Klar til at forvandle din ernæringsregistrering?
Bliv en del af de tusindvis, der har forvandlet deres sundhedsrejse med Nutrola!