Nutrolas Näringsdata-API: Så får utvecklare tillgång till vår livsmedelsdatabas
En utvecklarguide till Nutrolas Näringsdata-API. Lär dig hur du får tillgång till vår verifierade livsmedelsdatabas med över 3 miljoner poster, utforska endpoints, autentisering och verkliga användningsfall.
Bygger du en app inom hälsa, fitness eller mat? En av de största utmaningarna du kommer att möta är att hantera näringsdata. Du behöver exakt information om kalorier och makronäringsämnen för tusentals livsmedel, och den måste täcka internationella produkter samt vara aktuell i takt med att tillverkare ändrar sina recept.
De flesta utvecklare börjar med att hämta data från öppna statliga databaser som USDA FoodData Central. Det ger en grund, men täcker inte varumärkesprodukter från 47 länder, restaurangmåltider eller tusentals regionala livsmedel som verkliga användare konsumerar varje dag. Att fylla dessa luckor själv innebär år av datakurering.
Nutrolas Näringsdata-API ger utvecklare tillgång till samma verifierade livsmedelsdatabas som driver vår app — över 3 miljoner poster, som omfattar råvaror, varumärkesprodukter, restaurangmåltider och sammansatta recept. Varje post är verifierad genom vår flerlagers kvalitetskontroll, samma system som över 2 miljoner användare litar på.
Denna guide täcker allt du behöver veta för att börja bygga med vårt API: arkitektur, autentisering, endpoints, hastighetsbegränsningar och verkliga kodexempel.
API Översikt
Nutrolas Näringsdata-API är ett RESTful JSON API. Du gör HTTP-förfrågningar och får JSON-svar. Inga SDK:er krävs, men vi tillhandahåller klientbibliotek för Python, JavaScript och Swift för bekvämlighet.
Bas-URL
https://api.nutrola.com/v1
Alla endpoints serveras över HTTPS. Vanliga HTTP-förfrågningar avvisas.
Nyckelfunktioner
| Funktion | Beskrivning |
|---|---|
| Livsmedelssökning | Fulltextsökning över 3M+ livsmedelsposter med filtrering efter kategori, märke och land |
| Streckkodssökning | Få näringsdata via UPC, EAN eller andra streckkodformat |
| Näringsdetaljer | Fullständig näringsprofil för vilket livsmedel som helst (70+ näringsämnen inklusive mikronäringsämnen) |
| Portionsstorlekar | Standard och alternativa portionsstorlekar med gramkonverteringar |
| Receptanalys | Skicka en lista med ingredienser och få kombinerad näringsdata |
| Livsmedelskategorier | Bläddra i den hierarkiska livsmedelskategoritaxonomin |
| Varumärkesförteckning | Sök och bläddra bland livsmedelsproducenter |
| Autocomplete | Snabba förslag för livsmedelssökningsgränssnitt |
Svarsformat
Alla svar följer en konsekvent struktur:
{
"status": "success",
"data": { },
"meta": {
"request_id": "req_abc123",
"rate_limit_remaining": 245,
"rate_limit_reset": "2026-03-10T15:00:00Z"
}
}
Felmeddelanden inkluderar en maskinläsbar felkod och ett mänskligt läsbart meddelande:
{
"status": "error",
"error": {
"code": "FOOD_NOT_FOUND",
"message": "Ingen livsmedelspost matchar det angivna ID:t.",
"request_id": "req_xyz789"
}
}
Autentisering
Alla API-förfrågningar kräver en API-nyckel som skickas i Authorization-huvudet.
Så här får du en API-nyckel
- Skapa ett utvecklarkonto på developer.nutrola.com
- Navigera till sektionen för API-nycklar i din instrumentpanel
- Generera en ny nyckel och specificera de behörigheter du behöver
- Spara nyckeln på ett säkert ställe — den visas endast en gång
Använda din API-nyckel
Inkludera nyckeln i varje begäran:
Authorization: Bearer DIN_API_NYCKEL
Exempel med curl:
curl -H "Authorization: Bearer ntr_live_abc123def456" \
https://api.nutrola.com/v1/foods/search?q=chicken+breast
API-nyckelbehörigheter
| Behörighet | Åtkomstnivå |
|---|---|
foods:read |
Sök och hämta livsmedelsdata (vanligast) |
barcodes:read |
Streckkodssökning |
recipes:analyze |
Receptanalys av näring |
brands:read |
Åtkomst till varumärkesförteckning |
categories:read |
Livsmedelskategoritaxonomi |
Nycklar kan begränsas till specifika funktioner. En nyckel med endast foods:read kan inte få åtkomst till streckodssökningar. Detta följer principen om minimiåtkomst — begär endast de behörigheter din applikation behöver.
Kärnendpoints
Livsmedelssökning
Sök i databasen efter namn, nyckelord eller fras.
GET /v1/foods/search
Parametrar:
| Parameter | Typ | Obligatorisk | Beskrivning |
|---|---|---|---|
q |
string | Ja | Sökfråga (t.ex. "grillad kycklingbröst") |
category |
string | Nej | Filtrera efter livsmedelskategori (t.ex. "mejeriprodukter", "grönsaker") |
brand |
string | Nej | Filtrera efter varumärkesnamn |
country |
string | Nej | ISO 3166-1 alpha-2 landskod (t.ex. "SE", "DE", "JP") |
verified_only |
boolean | Nej | Endast returnera poster med verifierad källdata (standard: true) |
page |
integer | Nej | Sidnummer för paginering (standard: 1) |
per_page |
integer | Nej | Resultat per sida, max 50 (standard: 20) |
Exempel på begäran:
curl -H "Authorization: Bearer DIN_API_NYCKEL" \
"https://api.nutrola.com/v1/foods/search?q=greek+yogurt&country=SE&per_page=5"
Exempel på svar:
{
"status": "success",
"data": {
"results": [
{
"id": "food_8f2k9d",
"name": "Grekisk Yoghurt, Naturell, Lågfet",
"brand": null,
"category": "mejeriprodukter",
"country": "SE",
"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 behållare (170g)",
"grams": 170
}
}
],
"total_results": 342,
"page": 1,
"per_page": 5
}
}
Hämta livsmedelsdetaljer
Hämta den fullständiga näringsprofilen för ett specifikt livsmedel.
GET /v1/foods/{food_id}
Exempel på begäran:
curl -H "Authorization: Bearer DIN_API_NYCKEL" \
"https://api.nutrola.com/v1/foods/food_8f2k9d"
Detaljsvaret inkluderar den fullständiga näringsnedbrytningen — över 70 näringsämnen inklusive alla vitaminer, mineraler, aminosyror och fettsyraprofiler. Det inkluderar också alla tillgängliga portionsstorlekar och deras gramekvivalenter.
Delvis svar (Nyckelnäringsämnen):
{
"status": "success",
"data": {
"id": "food_8f2k9d",
"name": "Grekisk Yoghurt, Naturell, Lågfet",
"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 behållare (170g)", "grams": 170 },
{ "description": "1 kopp (245g)", "grams": 245 },
{ "description": "1 msk (15g)", "grams": 15 },
{ "description": "100g", "grams": 100 }
],
"allergens": ["mjölk"],
"source": "USDA",
"source_id": "170903",
"last_verified": "2026-02-15",
"confidence_score": 0.98
}
}
Streckodssökning
Sök efter en livsmedelsprodukt via dess streckkod.
GET /v1/barcodes/{barcode}
Stödda format: UPC-A, UPC-E, EAN-13, EAN-8
Exempel på begäran:
curl -H "Authorization: Bearer DIN_API_NYCKEL" \
"https://api.nutrola.com/v1/barcodes/0049000006346"
Svaret returnerar samma livsmedelsdetaljobjekt som /foods/{food_id}-endpointen, med ytterligare streckkodsspecifika fält som barcode_format och regional_variants (en array av livsmedels-ID:n för samma produkt i olika länder, som kan ha olika formuleringar).
Receptanalys
Skicka en lista med ingredienser och få den kombinerade näringsnedbrytningen.
POST /v1/recipes/analyze
Begärningskropp:
{
"name": "Övernattningsgröt",
"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": "nypa salt" }
]
}
Du kan också skicka ingredienser som text för automatisk analys:
{
"name": "Övernattningsgröt",
"servings": 2,
"ingredients_text": "160g havregryn, 400ml helmjölk, 60g jordnötssmör, nypa salt"
}
Svar:
{
"status": "success",
"data": {
"name": "Övernattningsgröt",
"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 helmjölk", "matched_food": "food_9p4q7r", "confidence": 0.99 },
{ "input": "60g jordnötssmör", "matched_food": "food_1a5b8c", "confidence": 0.96 },
{ "input": "nypa salt", "matched_food": "food_6d2e9f", "confidence": 0.88 }
]
}
}
Autocomplete
Snabba förslag för att bygga sökgränssnitt.
GET /v1/foods/autocomplete?q={query}
Parametrar:
| Parameter | Typ | Obligatorisk | Beskrivning |
|---|---|---|---|
q |
string | Ja | Delvis sökfråga (minst 2 tecken) |
limit |
integer | Nej | Max resultat, 1-10 (standard: 5) |
country |
string | Nej | Prioritera resultat från detta land |
Svarstider är optimerade för interaktiv användning — vanligtvis under 50 ms. Autocomplete-endpointen returnerar förenklade livsmedelsobjekt (ID, namn, märke och kategori endast) för snabb rendering.
Hastighetsbegränsningar och prissättning
Gratis nivå
Den gratis nivån är utformad för utveckling, testning och småskaliga applikationer:
| Begränsning | Värde |
|---|---|
| Förfrågningar per dag | 500 |
| Förfrågningar per minut | 30 |
| Livsmedelssökresultat per förfrågan | 20 |
| Receptanalys per dag | 10 |
| Streckodssökningar per dag | 100 |
Tillväxtnivå
För produktionsapplikationer med måttlig trafik:
| Begränsning | Värde |
|---|---|
| Förfrågningar per dag | 25,000 |
| Förfrågningar per minut | 300 |
| Livsmedelssökresultat per förfrågan | 50 |
| Receptanalys per dag | 500 |
| Streckodssökningar per dag | 5,000 |
| Pris | $49/månad |
Företagsnivå
För applikationer med hög trafik, white-label-lösningar och anpassade krav:
| Funktion | Detaljer |
|---|---|
| Förfrågningar per dag | Anpassat (vanligtvis 100K+) |
| Hastighetsbegränsningar | Anpassade |
| Dedikerad support | Inkluderad |
| SLA | 99.9% drifttidsgaranti |
| Anpassade dataexporter | Tillgängliga |
| Webhook-notifikationer | Tillgängliga för datauppdateringar |
| Pris | Kontakta försäljning |
Information om hastighetsbegränsningar ingår i varje API-svar via meta-objektet och i HTTP-svarshuvuden (X-RateLimit-Remaining, X-RateLimit-Reset).
Verkliga användningsfall
Fitness- och träningsappar
Om du bygger en fitnessapp och vill lägga till näringsspårning utan att bygga en livsmedelsdatabas från grunden, är Nutrolas API den snabbaste vägen. Använd livsmedelssökningen och streckkodsextensions för att låta användare logga måltider, och receptanalysendpunkten för anpassade måltidsinlägg.
Måltidsplaneringsplattformar
Måltidsplaneringsappar behöver exakt näringsdata för att generera planer som uppfyller specifika makromål. API:ets detaljerade näringsnedbrytning (70+ näringsämnen) möjliggör exakt optimering av måltidsplaner, inte bara kalorier och makron utan även mikronäringsämnen, allergener och kompatibilitet med kostrestriktioner.
Vård och telehälsa
Vårdsplattformar som övervakar patienternas näring kan integrera med API:et för att ge exakt livsmedelsloggning inom sina befintliga gränssnitt. De verifierade datakällorna (USDA, EFSA, tillverkardirekt) uppfyller de noggrannhetsstandarder som krävs för klinisk näringsövervakning.
Restaurang- och livsmedelsservice
Restaurangbeställningsplattformar kan använda API:et för att visa näringsinformation för menyobjekt. Receptanalysendpunkten är särskilt användbar här — skicka in ingredienserna för en rätt och få den kompletta näringsnedbrytningen utan att manuellt beräkna varje post.
Forskning och akademi
Näringsforskare kan använda API:et för att standardisera livsmedelskodning i koststudier. De konsekventa, verifierade uppgifterna minskar mätfel som plågar studier som förlitar sig på deltagarrapporterad näringsdata.
Kodexempel
Python: Sök efter ett livsmedel och få nä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 efter ett livsmedel
search_response = requests.get(
f"{BASE_URL}/foods/search",
headers=headers,
params={"q": "grillad kycklingbröst", "per_page": 3}
)
results = search_response.json()["data"]["results"]
for food in results:
print(f"{food['name']} - {food['nutrition_per_100g']['calories']} cal/100g")
# Hämta fullständiga detaljer för det första 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"Kolhydrater: {nutrition['carbohydrates']}g")
print(f"Fett: {nutrition['fat']}g")
print(f"Portionsstorlekar: {food_detail['serving_sizes']}")
JavaScript: Integrering av streckkodsskanning
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("Produkten hittades inte i databasen");
return null;
}
throw new Error(`API-fel: ${response.status}`);
}
const data = await response.json();
return data.data;
}
// Exempel på användning
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(` Kolhydrater: ${(product.nutrition_per_100g.carbohydrates * factor).toFixed(1)}g`);
console.log(` Fett: ${(product.nutrition_per_100g.fat * factor).toFixed(1)}g`);
}
Swift: Bygga ett Autocomplete-sökfält
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]
}
Bästa praxis för felhantering
API:et använder standard HTTP-statuskoder:
| Statuskod | Betydelse | Vanlig orsak |
|---|---|---|
| 200 | Framgång | Begäran genomfördes normalt |
| 400 | Felaktig begäran | Saknad obligatorisk parameter eller ogiltigt värde |
| 401 | Obefogad | Ogiltig eller saknad API-nyckel |
| 403 | Förbjuden | API-nyckeln saknar nödvändig behörighet |
| 404 | Ej hittad | Livsmedels-ID eller streckkod finns inte i databasen |
| 429 | Hastighetsbegränsad | För många förfrågningar; kontrollera hastighetsbegränsningshuvuden |
| 500 | Serverfel | Intern fel; försök igen med exponentiell backoff |
När du får ett 429-svar, talar Retry-After-huvudet om hur många sekunder du ska vänta innan du försöker igen. Det rekommenderas starkt att implementera exponentiell backoff för 429- och 500-svar i produktionsapplikationer.
Datakvalitet och uppdateringar
Nutrolas databas uppdateras kontinuerligt. Poster för varumärkesprodukter uppdateras när tillverkare rapporterar ändringar, vanligtvis inom 48 timmar. Poster från statliga databaser synkroniseras kvartalsvis när nya versioner publiceras.
Om din applikation cachar API-svar (vilket vi rekommenderar för prestanda), föreslår vi en cache TTL på 24 timmar för livsmedelsdetaljsvar och 1 timme för sökresultat. Fältet last_verified i livsmedelsdetaljsvar berättar när posten senast bekräftades som korrekt.
För företagskunder erbjuder vi webhook-notifikationer när livsmedelsposter uppdateras, så att din applikation kan ogiltigförklara cachad data proaktivt istället för att vänta på att cache TTL ska löpa ut.
Komma igång
- Registrera dig på developer.nutrola.com — det tar mindre än en minut
- Generera en API-nyckel med de behörigheter du behöver
- Gör din första begäran med hjälp av curl-exemplen ovan
- Utforska de interaktiva dokumenten på developer.nutrola.com/docs där du kan testa endpoints direkt i din webbläsare
- Gå med i utvecklarsamhället på vår Discord-server för support, funktionsförfrågningar och för att se vad andra utvecklare bygger
Om du har frågor, stöter på problem eller vill diskutera en företagsintegration, kontakta vårt utvecklarrelations-team på api@nutrola.com.
FAQ
Är Nutrola API gratis att använda?
Ja, det finns en gratis nivå som inkluderar 500 förfrågningar per dag. Detta är lämpligt för utveckling, testning och småskaliga applikationer. För produktionsapplikationer med högre trafik börjar tillväxtnivån på $49 per månad med 25 000 dagliga förfrågningar. Företagsplaner med anpassade begränsningar finns tillgängliga för användningsfall med hög trafik.
Vilka dataformat stöder API:et?
API:et använder uteslutande JSON för både begärningar och svar. Alla endpoints accepterar standardfrågeparametrar för GET-förfrågningar och JSON-begärningskroppar för POST-förfrågningar. Svarskodningen är UTF-8, vilket hanterar livsmedelsnamn på alla stödda språk korrekt.
Hur noggrant är näringsdata som tillhandahålls av API:et?
Varje post i Nutrolas databas går igenom en flerlagers verifieringsprocess som inkluderar validering av statliga källor, korsreferens av tillverkarens data, AI-drivna statistiska kontroller och granskning av mänskliga experter. Vår noggrannhetsstandard är 97,4% jämfört med laboratorieanalys, jämfört med en branschgenomsnitt på 70-85% för crowdsourcade databaser. Varje livsmedelspost inkluderar ett fält för confidence_score som anger vår säkerhetsnivå.
Kan jag använda API:et för att bygga en kommersiell produkt?
Ja. API:et är utformat för kommersiellt bruk. Den gratis nivån kan användas för kommersiella produkter inom dess hastighetsbegränsningar. Tillväxt- och företagsplaner inkluderar kommersiella användningsrättigheter utan begränsningar på typ av applikation. Granska användarvillkoren på developer.nutrola.com för fullständiga detaljer.
Stöder API:et livsmedel från länder utanför USA?
Ja. Databasen täcker varumärkesprodukter från 47 länder och generiska livsmedel från över 120 kök. Använd country-parametern på sökendpoints för att prioritera resultat från en specifik marknad. Streckodssökningar matchar automatiskt produkten till rätt regional formulering.
Hur hanterar jag livsmedel som inte finns i databasen?
Om en streckodssökning returnerar en 404 kan du falla tillbaka på en textsökning med produktnamnet. Om ingen av dessa metoder hittar livsmedlet kan du skicka in det för tillägg via utvecklarportalen. Livsmedel som skickas in av API-partner prioriteras för verifiering och läggs vanligtvis till inom 72 timmar. Företagskunder kan begära batchtillägg för stora produktkataloger.
Finns det SDK:er eller klientbibliotek tillgängliga?
Vi tillhandahåller officiella klientbibliotek för Python (via pip: pip install nutrola), JavaScript/TypeScript (via npm: npm install @nutrola/api) och Swift (via Swift Package Manager). Dessa bibliotek hanterar autentisering, hastighetsbegränsningar, omförsök och svarsanalyser. Gemenskapsunderhållna bibliotek finns tillgängliga för Go, Ruby och PHP.
Redo att förvandla din näringsspårning?
Gå med tusentals som har förvandlat sin hälsoresa med Nutrola!