Nutrolas Ernæringsdata API: Hvordan utviklere kan få tilgang til vår matdatabase
En utviklerguide til Nutrolas Ernæringsdata API. Lær hvordan du får tilgang til vår verifiserte matdatabase med over 3 millioner oppføringer, utforsk endepunkter, autentisering og virkelige bruksområder.
Skal du bygge en helse-, trenings- eller matrelatert app? En av de største utfordringene du vil møte, er ernæringsdata. Du trenger nøyaktig kalori- og makroinformasjon for tusenvis av matvarer, du må dekke internasjonale produkter, og du må sørge for at informasjonen er oppdatert ettersom produsentene reformulerer produktene sine.
De fleste utviklere begynner med å hente data fra åpne offentlige databaser som USDA FoodData Central. Dette gir et grunnlag, men dekker ikke merkede produkter fra 47 land, restaurantmåltider eller de tusenvis av regionale matvarene som virkelige brukere spiser hver dag. Å fylle disse hullene selv betyr mange år med datakurering.
Nutrolas Ernæringsdata API gir utviklere tilgang til den samme verifiserte matdatabasen som driver appen vår — over 3 millioner oppføringer, som dekker rå ingredienser, merkede produkter, restaurantmåltider og sammensatte oppskrifter. Hver oppføring er verifisert gjennom vår flerlagede kvalitetskontrollprosess, det samme systemet som over 2 millioner brukere stoler på.
Denne guiden dekker alt du trenger å vite for å begynne å bygge med vårt API: arkitektur, autentisering, endepunkter, hastighetsbegrensninger og virkelige kodeeksempler.
API Oversikt
Nutrolas Ernæringsdata API er et RESTful JSON API. Du sender HTTP-forespørsel, og får JSON-respons. Ingen SDK-er er nødvendig, men vi tilbyr klientbiblioteker for Python, JavaScript og Swift for enkelhets skyld.
Grunnleggende URL
https://api.nutrola.com/v1
Alle endepunkter serveres over HTTPS. Vanlige HTTP-forespørsel blir avvist.
Nøkkelfunksjoner
| Funksjon | Beskrivelse |
|---|---|
| Mat Søk | Fulltekst søk på 3M+ matoppføringer med filtrering etter kategori, merke og land |
| Strekkodeoppslag | Få ernæringsdata ved hjelp av UPC, EAN eller andre strekkodeformater |
| Ernæringsdetaljer | Fullstendig ernæringsprofil for enhver matvare (70+ næringsstoffer inkludert mikronæringsstoffer) |
| Serveringsstørrelser | Standard og alternative serveringsstørrelser med gramkonverteringer |
| Oppskrift Analyse | Send en liste med ingredienser og få kombinert ernæringsdata |
| Matkategorier | Bla gjennom den hierarkiske matkategoritaxonomien |
| Merke Katalog | Søk og bla gjennom merkede matprodusenter |
| Autocomplete | Rask forslag for søkefelt for mat |
Responsformat
Alle svar følger en konsekvent struktur:
{
"status": "success",
"data": { },
"meta": {
"request_id": "req_abc123",
"rate_limit_remaining": 245,
"rate_limit_reset": "2026-03-10T15:00:00Z"
}
}
Feilrespons inkluderer en maskinlesbar feilkode og en menneskelig lesbar melding:
{
"status": "error",
"error": {
"code": "FOOD_NOT_FOUND",
"message": "Ingen matoppføring samsvarer med den oppgitte ID-en.",
"request_id": "req_xyz789"
}
}
Autentisering
Alle API-forespørsel krever en API-nøkkel som sendes i Authorization-headeren.
Få en API-nøkkel
- Opprett en utviklerkonto på developer.nutrola.com
- Naviger til API-nøkkel-seksjonen i dashbordet ditt
- Generer en ny nøkkel og spesifiser de nødvendige omfangene
- Oppbevar nøkkelen sikkert — den vises kun én gang
Bruke API-nøkkelen din
Inkluder nøkkelen i hver forespørsel-header:
Authorization: Bearer DIN_API_NØKKEL
Eksempel med curl:
curl -H "Authorization: Bearer ntr_live_abc123def456" \
https://api.nutrola.com/v1/foods/search?q=chicken+breast
API-nøkkel Omfang
| Omfang | Tilgangsnivå |
|---|---|
foods:read |
Søk og hent matdata (mest vanlig) |
barcodes:read |
Strekkodeoppslag |
recipes:analyze |
Oppskrift ernæringsanalyse |
brands:read |
Tilgang til merke katalog |
categories:read |
Matkategori taksonomi |
Nøkler kan begrenses til spesifikke funksjoner. En nøkkel med kun foods:read kan ikke få tilgang til strekkodeoppslag. Dette følger prinsippet om minst privilegium — be om bare de omfangene applikasjonen din trenger.
Kjerne Endepunkter
Mat Søk
Søk i databasen etter navn, nøkkelord eller fraser.
GET /v1/foods/search
Parametere:
| Parameter | Type | Påkrevd | Beskrivelse |
|---|---|---|---|
q |
string | Ja | Søkeforespørsel (f.eks. "grillet kyllingbryst") |
category |
string | Nei | Filtrer etter matkategori (f.eks. "melk", "grønnsaker") |
brand |
string | Nei | Filtrer etter merkenavn |
country |
string | Nei | ISO 3166-1 alpha-2 landskode (f.eks. "NO", "DE", "JP") |
verified_only |
boolean | Nei | Returner kun oppføringer med verifisert kilde (standard: true) |
page |
integer | Nei | Sidenummer for paginering (standard: 1) |
per_page |
integer | Nei | Resultater per side, maks 50 (standard: 20) |
Eksempel Forespørsel:
curl -H "Authorization: Bearer DIN_API_NØKKEL" \
"https://api.nutrola.com/v1/foods/search?q=greek+yogurt&country=US&per_page=5"
Eksempel Respons:
{
"status": "success",
"data": {
"results": [
{
"id": "food_8f2k9d",
"name": "Gresk Yoghurt, Naturell, Fettfri",
"brand": null,
"category": "melk",
"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 Matdetaljer
Hent den komplette ernæringsprofilen for en spesifikk matvare.
GET /v1/foods/{food_id}
Eksempel Forespørsel:
curl -H "Authorization: Bearer DIN_API_NØKKEL" \
"https://api.nutrola.com/v1/foods/food_8f2k9d"
Detaljresponsen inkluderer full næringsoppdeling — over 70 næringsstoffer inkludert alle vitaminer, mineraler, aminosyrer og fettsyreprofiler. Den inkluderer også alle tilgjengelige serveringsstørrelser og deres gramekvivalenter.
Delvis Respons (Nøkkelnæringsstoffer):
{
"status": "success",
"data": {
"id": "food_8f2k9d",
"name": "Gresk Yoghurt, Naturell, Fettfri",
"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 kopp (245g)", "grams": 245 },
{ "description": "1 ss (15g)", "grams": 15 },
{ "description": "100g", "grams": 100 }
],
"allergens": ["melk"],
"source": "USDA",
"source_id": "170903",
"last_verified": "2026-02-15",
"confidence_score": 0.98
}
}
Strekkodeoppslag
Søk etter et matprodukt ved hjelp av strekkoden.
GET /v1/barcodes/{barcode}
Støttede Formater: UPC-A, UPC-E, EAN-13, EAN-8
Eksempel Forespørsel:
curl -H "Authorization: Bearer DIN_API_NØKKEL" \
"https://api.nutrola.com/v1/barcodes/0049000006346"
Responsen returnerer det samme matdetaljobjektet som /foods/{food_id}-endepunktet, med tillegg av strekkode-spesifikke felt som barcode_format og regional_variants (et array av mat-ID-er for det samme produktet i forskjellige land, som kan ha forskjellige formuleringer).
Oppskrift Analyse
Send en liste med ingredienser og motta den kombinerte ernæringsoppdelingen.
POST /v1/recipes/analyze
Forespørsel Kropp:
{
"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": "klype salt" }
]
}
Du kan også sende ingredienser som tekst for automatisk parsing:
{
"name": "Overnight Oats",
"servings": 2,
"ingredients_text": "160g havregryn, 400ml helmelk, 60g peanøttsmør, klype salt"
}
Respons:
{
"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 helmelk", "matched_food": "food_9p4q7r", "confidence": 0.99 },
{ "input": "60g peanøttsmør", "matched_food": "food_1a5b8c", "confidence": 0.96 },
{ "input": "klype salt", "matched_food": "food_6d2e9f", "confidence": 0.88 }
]
}
}
Autocomplete
Rask type-ahead forslag for å bygge søkegrensesnitt.
GET /v1/foods/autocomplete?q={query}
Parametere:
| Parameter | Type | Påkrevd | Beskrivelse |
|---|---|---|---|
q |
string | Ja | Delvis søkeforespørsel (minimum 2 tegn) |
limit |
integer | Nei | Maks resultater, 1-10 (standard: 5) |
country |
string | Nei | Prioriter resultater fra dette landet |
Responsstidene er optimalisert for interaktiv bruk — vanligvis under 50 ms. Autocomplete-endepunktet returnerer forenklede matobjekter (ID, navn, merke og kategori) for rask rendering.
Hastighetsbegrensninger og Priser
Gratis Nivå
Det gratis nivået er designet for utvikling, testing og småskala applikasjoner:
| Grense | Verdi |
|---|---|
| Forespørsel per dag | 500 |
| Forespørsel per minutt | 30 |
| Mat søkresultater per forespørsel | 20 |
| Oppskrift analyse per dag | 10 |
| Strekkodeoppslag per dag | 100 |
Vekst Nivå
For produksjonsapplikasjoner med moderat trafikk:
| Grense | Verdi |
|---|---|
| Forespørsel per dag | 25,000 |
| Forespørsel per minutt | 300 |
| Mat søkresultater per forespørsel | 50 |
| Oppskrift analyse per dag | 500 |
| Strekkodeoppslag per dag | 5,000 |
| Pris | $49/måned |
Bedriftsnivå
For applikasjoner med høy trafikk, hvitmerkeløsninger og tilpassede krav:
| Funksjon | Detaljer |
|---|---|
| Forespørsel per dag | Tilpasset (vanligvis 100K+) |
| Hastighetsbegrensninger | Tilpasset |
| Dedikert støtte | Inkludert |
| SLA | 99.9% oppetid garanti |
| Tilpassede dataeksporter | Tilgjengelig |
| Webhook-varsler | Tilgjengelig for dataoppdateringer |
| Pris | Kontakt salg |
Informasjon om hastighetsbegrensninger er inkludert i hver API-respons via meta-objektet og i HTTP-responsoverskrifter (X-RateLimit-Remaining, X-RateLimit-Reset).
Virkelige Bruksområder
Fitness- og Treningsapper
Hvis du bygger en treningsapp og ønsker å legge til ernæringssporing uten å bygge en matdatabase fra bunnen av, er Nutrolas API den raskeste veien. Bruk mat søk- og strekkodeendepunktene for å la brukerne logge måltider, og oppskrift analyse-endepunktet for tilpassede måltidsoppføringer.
Måltidsplanleggingsplattformer
Måltidsplanleggingsapper trenger nøyaktige ernæringsdata for å generere planer som treffer spesifikke makromål. API-ens detaljerte næringsoppdeling (70+ næringsstoffer) muliggjør presis optimalisering av måltidsplaner, ikke bare kalorier og makroer, men også mikronæringsstoffer, allergener og kompatibilitet med kostholdsrestriksjoner.
Helsevesen og Telehelse
Helseplattformer som overvåker pasienternæring kan integrere med API-en for å gi nøyaktig matlogging innenfor sine eksisterende grensesnitt. De verifiserte datakildene (USDA, EFSA, produsentdirekte) møter nøyaktighetsstandardene som kreves for klinisk ernæringsovervåking.
Restaurant- og Matservice
Restaurantbestillingsplattformer kan bruke API-en for å vise ernæringsinformasjon for menyartikler. Oppskrift analyse-endepunktet er spesielt nyttig her — send inn ingrediensene til en rett og få den komplette ernæringsoppdelingen uten å måtte beregne hver enkelt vare manuelt.
Forskning og Akademia
Ernæringsforskere kan bruke API-en for å standardisere matkoding i kostholdsstudier. De konsistente, verifiserte dataene reduserer målefeil som plager studier som er avhengige av deltakerrapporterte ernæringsdata.
Kodeeksempler
Python: Søk etter en Matvare og Hent 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øk etter en matvare
search_response = requests.get(
f"{BASE_URL}/foods/search",
headers=headers,
params={"q": "grillet kyllingbryst", "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 fullstendige detaljer for det første resultatet
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"Karbohydrater: {nutrition['carbohydrates']}g")
print(f"Fett: {nutrition['fat']}g")
print(f"Serveringsstørrelser: {food_detail['serving_sizes']}")
JavaScript: Integrering av Strekkodeskanning
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("Produktet ble ikke funnet i databasen");
return null;
}
throw new Error(`API-feil: ${response.status}`);
}
const data = await response.json();
return data.data;
}
// Eksempel på bruk
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(` Kalorier: ${Math.round(product.nutrition_per_100g.calories * factor)}`);
console.log(` Protein: ${(product.nutrition_per_100g.protein * factor).toFixed(1)}g`);
console.log(` Karbohydrater: ${(product.nutrition_per_100g.carbohydrates * factor).toFixed(1)}g`);
console.log(` Fett: ${(product.nutrition_per_100g.fat * factor).toFixed(1)}g`);
}
Swift: Bygge et Autocomplete Søkefelt
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]
}
Beste Praksis for Feilhåndtering
API-en bruker standard HTTP-statuskoder:
| Statuskode | Betydning | Vanlig Årsak |
|---|---|---|
| 200 | Succes | Forespørselen ble fullført normalt |
| 400 | Dårlig Forespørsel | Manglende påkrevd parameter eller ugyldig verdi |
| 401 | Uautorisert | Ugyldig eller manglende API-nøkkel |
| 403 | Forbudt | API-nøkkelen mangler nødvendig omfang |
| 404 | Ikke Funnet | Mat-ID eller strekkode ikke i databasen |
| 429 | Hastighetsbegrenset | For mange forespørsel; sjekk hastighetsbegrensningsoverskrifter |
| 500 | Serverfeil | Intern feil; prøv igjen med eksponentiell tilbakeholdelse |
Når du mottar en 429-respons, forteller Retry-After-headeren deg hvor mange sekunder du må vente før du prøver igjen. Implementering av eksponentiell tilbakeholdelse for 429 og 500-responser anbefales sterkt for produksjonsapplikasjoner.
Datakvalitet og Oppdateringer
Nutrolas database oppdateres kontinuerlig. Oppføringer av merkede produkter oppdateres når produsentene rapporterer endringer, vanligvis innen 48 timer. Oppføringer fra offentlige databaser synkroniseres kvartalsvis når nye utgivelser publiseres.
Hvis applikasjonen din cacher API-responser (noe vi anbefaler for ytelse), foreslår vi en cache TTL på 24 timer for matdetaljeresponser og 1 time for søkresultater. last_verified-feltet i matdetaljeresponser forteller deg når oppføringen sist ble bekreftet som nøyaktig.
For bedriftskunder tilbyr vi webhook-varsler når matoppføringer oppdateres, slik at applikasjonen din kan invalidere cachedata proaktivt i stedet for å vente på at cache TTL skal utløpe.
Komme i Gang
- Registrer deg på developer.nutrola.com — det tar under ett minutt
- Generer en API-nøkkel med de nødvendige omfangene
- Gjør din første forespørsel ved å bruke curl-eksemplene ovenfor
- Utforsk de interaktive dokumentene på developer.nutrola.com/docs hvor du kan teste endepunkter direkte i nettleseren din
- Bli med i utviklerfellesskapet på vår Discord-server for støtte, funksjonsforespørsel og for å se hva andre utviklere bygger
Hvis du har spørsmål, opplever problemer, eller ønsker å diskutere en bedriftsintegrasjon, kontakt vårt utviklerteam på api@nutrola.com.
FAQ
Er Nutrola API gratis å bruke?
Ja, det finnes et gratis nivå som inkluderer 500 forespørsel per dag. Dette er egnet for utvikling, testing og småskala applikasjoner. For produksjonsapplikasjoner med høyere trafikk, starter vekstnivået på $49 per måned med 25,000 daglige forespørsel. Bedriftsplaner med tilpassede grenser er tilgjengelige for høytrafikkbruk.
Hvilke dataformater støtter API-en?
API-en bruker utelukkende JSON for både forespørsel og respons. Alle endepunkter aksepterer standard spørringsparametere for GET-forespørsel og JSON forespørselkropper for POST-forespørsel. Responskoding er UTF-8, som håndterer matnavn på alle støttede språk.
Hvor nøyaktige er ernæringsdataene som tilbys av API-en?
Hver oppføring i Nutrola-databasen går gjennom en flerlagers verifikasjonsprosess som inkluderer validering fra offentlige kilder, kryssreferering av produsentdata, AI-drevet statistisk sjekking og menneskelig ekspertvurdering. Vår nøyaktighetsstandard er 97.4% sammenlignet med laboratorieanalyse, sammenlignet med en bransjegjennomsnitt på 70-85% for crowdsourcet databaser. Hver matoppføring inkluderer et confidence_score-felt som indikerer vårt sikkerhetsnivå.
Kan jeg bruke API-en til å bygge et kommersielt produkt?
Ja. API-en er designet for kommersiell bruk. Det gratis nivået kan brukes til kommersielle produkter innenfor sine hastighetsbegrensninger. Vekst- og bedriftsplaner inkluderer kommersielle bruksrettigheter uten restriksjoner på hvilken type applikasjon. Se vilkårene for bruk på developer.nutrola.com for fullstendige detaljer.
Støtter API-en matvarer fra utenfor USA?
Ja. Databasen dekker merkede produkter fra 47 land og generiske matvarer fra over 120 kjøkken. Bruk country-parameteren på søkendepunktene for å prioritere resultater fra et spesifikt marked. Strekkodeoppslag matcher automatisk produktet med riktig regional formulering.
Hvordan håndterer jeg matvarer som ikke er i databasen?
Hvis et strekkodeoppslag returnerer en 404, kan du falle tilbake på et tekstsøk ved å bruke produktnavnet. Hvis ingen av tilnærmingene finner maten, kan du sende den inn for tillegg gjennom utviklerportalen. Matvarer sendt inn av API-partnere prioriteres for verifikasjon og legges vanligvis til innen 72 timer. Bedriftskunder kan be om batch-tillegg for store produktkataloger.
Finnes det SDK-er eller klientbiblioteker tilgjengelig?
Vi tilbyr offisielle klientbiblioteker for Python (via pip: pip install nutrola), JavaScript/TypeScript (via npm: npm install @nutrola/api), og Swift (via Swift Package Manager). Disse bibliotekene håndterer autentisering, hastighetsbegrensning, gjenopprettinger og responsparsing. Fellesskapsvedlikeholdte biblioteker er tilgjengelige for Go, Ruby og PHP.
Klar til å forvandle ernæringssporingen din?
Bli en del av tusenvis som har forvandlet helsereisen sin med Nutrola!