JSON-API v1

Matbedömningar för din app

Allt som webbplatsen visar finns också som JSON. Anropen kräver serverns API-nyckel – skicka den som en X-API-Key-header (eller Authorization: Bearer <nyckel>). Svaren cachas aldrig av mellanled (Cache-Control: no-store) och tillåter CORS från alla ursprung.

Endpoints

EndpointVad den gör
GET /api/v1Översiktsdokument: aktiva datakällor, endpoints, språk och klassificerarens version.
GET /api/v1/search?q=…Sökning på namn eller kategori (först Dabas, sedan Open Food Facts). Om q är en streckkod slås produkten upp direkt och skickas med i svaret.
GET /api/v1/product/{gtin}Produkten med ingrediensförteckning, näringsvärde, den samlade bedömningen healthy och bedömningarna för FODMAP, keto, GI och processningsgrad. Godtar EAN-8, UPC-A, EAN-13 och GTIN-14 (inledande nollor normaliseras).

Exempel

# produkt via streckkod
curl -H "X-API-Key: $API_KEY" "https://maxing.fitness/api/v1/product/3017624010701"

# fritextsökning, texter på svenska
curl -G -H "X-API-Key: $API_KEY" --data-urlencode "q=havregryn" \
  "https://maxing.fitness/api/v1/search?lang=sv"

Språk

Sammanfattningar och motiveringar är på engelska som standard. Lägg till lang med någon av de här koderna för att få dem på ett annat EU-språk: bg, es, cs, da, de, et, el, en, fr, ga, hr, it, lv, lt, hu, mt, nl, pl, pt, ro, sk, sl, fi, sv. Betyg, poäng, regel-id:n och missing-nycklar är desamma på alla språk.

Svarsformat

{
  "ok": true,
  "data": {
    "product":  { "gtin": "3017624010701", "name": "Nutella", "brand": "Ferrero", "ingredientsText": "…",
                  "nutrition": { "basis": "100g", "carbs": 57.5, "sugars": 56.3, … },
                  "novaGroup": 4, "images": { "front": "…" }, "sources": [ { "name": "off", … } ] },
    "verdicts": {
      "healthy":   { "rating": "red",    "summary": "Nutri-Score E, ultra-processed, high in sugar and saturated fat", … },
      "fodmap":    { "rating": "yellow", "summary": "…", "reasons": ["…"], "matches": [ … ] },
      "keto":      { "rating": "red",    … },
      "glycemic":  { "rating": "yellow", … },
      "processed": { "rating": "red",    … }
    },
    "ingredients": [ { "text": "socker", "depth": 0, "section": "main" }, … ],
    "traces": ["nötter"],
    "labels": [],
    "cache": { "status": "hit", "fetchedAt": "2026-08-26T18:00:00.000Z", "partial": false }
  },
  "meta": { "classifierVersion": 2, "cache": "hit", "sources": ["off"], "attribution": { … } }
}

Bedömningar

Varje bedömning har en rating som är green, yellow, red eller unknown, en sammanfattning på en rad (summary), läsbara motiveringar (reasons) och matches som pekar ut ingredienserna (som index i ingredients) som gav utslag. missing listar uppgifter som skulle förbättra bedömningen. healthy är helhetssvaret: grönt för varor med Nyckelhålet, annars Nutri-Score (från Open Food Facts, eller uppskattat med 2023 års beräkning – då innehåller score poängen), ett steg ned för ultraprocessad mat. Reglerna beskrivs i README; förändringar som påverkar klienter höjer meta.classifierVersion (skickas även som headern X-Classifier-Version).

Fel

{ "ok": false, "error": { "code": "unauthorized", "message": "…" } }

400 invalid_gtin · 401 unauthorized · 404 product_not_found / not_found
503 api_not_configured · 503 upstream_unavailable / rate_limited (with Retry-After)

Streckkoder från mobilen

Appar kan skanna med valfritt streckkodsbibliotek och anropa GET /api/v1/product/{gtin} med siffrorna som de är: EAN-8, UPC-A (12 siffror), EAN-13 och nollutfyllda GTIN-14 normaliseras till samma produkt. UPC-E måste först räknas om till UPC-A. Webbplatsens egen skanner gör precis så i webbläsaren.

Cache och anropsgränser

Produkter sparas i 30 dagar per GTIN och hämtas sedan på nytt från databaserna; svarar de inte används den sparade kopian. Open Food Facts tillåter ungefär 15 produktuppslag och 10 sökningar per minut och IP-adress, så många osparade uppslag i följd kan ge 503 rate_limited – följ Retry-After. Data: Open Food Facts (ODbL) och Dabas.