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.

Medically reviewed by Dr. Emily Torres, Registered Dietitian Nutritionist (RDN)

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

  1. Opret en udviklerkonto på developer.nutrola.com
  2. Naviger til sektionen for API-nøgler i dit dashboard
  3. Generer en ny nøgle og angiv de nødvendige scopes
  4. 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

  1. Tilmeld digdeveloper.nutrola.com — det tager under et minut
  2. Generer en API-nøgle med de nødvendige scopes
  3. Foretag din første anmodning ved hjælp af curl-eksemplerne ovenfor
  4. Udforsk de interaktive dokumenterdeveloper.nutrola.com/docs, hvor du kan teste endpoints direkte i din browser
  5. 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!