JSON-API v1
Madvurderinger til din app
Alt, hvad webstedet viser, findes også som JSON. Forespørgsler kræver serverens API-nøgle – send den som en X-API-Key-header (eller Authorization: Bearer <nøgle>). Svarene caches aldrig af mellemled (Cache-Control: no-store) og tillader CORS fra alle oprindelser.
Endpoints
| Endpoint | Hvad det gør |
|---|---|
GET /api/v1 | Oversigtsdokument: aktive datakilder, endpoints, sprog og klassifikatorens version. |
GET /api/v1/search?q=… | Søgning på navn eller kategori (først Dabas, derefter Open Food Facts). Hvis q er en stregkode, slås produktet op direkte og sendes med i svaret. |
GET /api/v1/product/{gtin} | Produktet med ingrediensliste, næringsdeklaration, den samlede vurdering healthy og vurderingerne for FODMAP, keto, GI og forarbejdning. Accepterer EAN-8, UPC-A, EAN-13 og GTIN-14 (foranstillede nuller normaliseres). |
Eksempler
# produkt via stregkode
curl -H "X-API-Key: $API_KEY" "https://maxing.fitness/api/v1/product/3017624010701"
# fritekstsøgning, tekster på dansk
curl -G -H "X-API-Key: $API_KEY" --data-urlencode "q=havregryn" \
"https://maxing.fitness/api/v1/search?lang=da"Sprog
Resuméer og begrundelser er som standard på engelsk. Tilføj lang med en af disse koder for at få dem på et andet EU-sprog: bg, es, cs, da, de, et, el, en, fr, ga, hr, it, lv, lt, hu, mt, nl, pl, pt, ro, sk, sl, fi, sv. Vurderinger, point, regel-id'er og missing-nøgler er de samme på alle sprog.
Svarformat
{
"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": { … } }
}Vurderinger
Hver vurdering har en rating, der er green, yellow, red eller unknown, et resumé på én linje (summary), letlæselige begrundelser (reasons) og matches, der peger på de ingredienser (som indeks i ingredients), der udløste den. missing angiver data, der ville forbedre vurderingen. healthy er det samlede svar: grøn for varer med Nøglehullet, ellers Nutri-Score (fra Open Food Facts eller anslået med 2023-algoritmen – i så fald indeholder score pointene), ét trin ned for ultraforarbejdede fødevarer. Reglerne er beskrevet i README; ændringer, der påvirker klienter, øger meta.classifierVersion (sendes også som headeren X-Classifier-Version).
Fejl
{ "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)Stregkoder fra mobilen
Apps kan scanne med et hvilket som helst stregkodebibliotek og kalde GET /api/v1/product/{gtin} med cifrene, som de er: EAN-8, UPC-A (12 cifre), EAN-13 og GTIN-14 med foranstillede nuller normaliseres alle til det samme produkt. UPC-E skal først udvides til UPC-A. Webstedets egen scanner gør præcis det samme i browseren.
Cache og grænser for antal kald
Produkter gemmes i 30 dage pr. GTIN og hentes derefter igen fra kildedatabaserne; er databaserne nede, leveres den gemte kopi. Open Food Facts tillader ca. 15 produktopslag og ca. 10 søgninger pr. minut pr. IP-adresse, så mange ugemte opslag i træk kan give 503 rate_limited – overhold Retry-After. Data: Open Food Facts (ODbL) og Dabas.