Vier Dinge, die aus einem Foto werden können
Die Vision-Endpunkte machen aus einem Foto strukturierte Lebensmitteldaten. Es gibt vier Modi, jeder mit eigenem Endpunkt und eigenem Preis in KI-Credits (jeder Plan — auch Free — kommt mit einem monatlichen Kontingent):
| Endpunkt | Was er macht | Credits |
|---|---|---|
POST /v1/vision/barcode | Barcode aus einem Foto dekodieren, passendes Produkt zurückgeben | 0 (zählt zu deinem Tageskontingent) |
POST /v1/vision/product | Produkt anhand eines Fotos der Packungsvorderseite erkennen | 3 |
POST /v1/vision/label | Nährwertetikett auslesen: Tabelle, Zutaten, Allergene | 4 |
POST /v1/vision/meal | Gerichte auf einem Teller samt geschätzter Portionen erkennen | 5 |
Das Dekodieren von Barcodes ist reines Computer Vision — ohne KI-Modell. Deshalb kostet es keine Credits und wird stattdessen wie eine normale Datenanfrage abgerechnet.
Alle vier kannst du im Browser mit deinem eigenen Schlüssel und deinen Fotos im Foto-Playground ausprobieren.
Aufbau der Anfrage
Alle vier nehmen dieselbe Multipart-Anfrage an — ein image-Feld:
curl -X POST "https://foodbase.dev/v1/vision/product" \
-H "X-API-Key: food_your_key_here" \
-F "[email protected]"
Oder aus JavaScript:
async function vision(endpoint, file) {
const form = new FormData();
form.append("image", file);
const res = await fetch(`https://foodbase.dev/v1/vision/${endpoint}`, {
method: "POST",
headers: { "X-API-Key": API_KEY },
body: form,
});
if (!res.ok) throw new Error(`Vision error: ${res.status}`);
return res.json();
}
Fotos werden serverseitig normalisiert (verkleinert, EXIF-Daten entfernt), bevor sie überhaupt ein KI-Modell erreichen, und Bilder werden nie gespeichert — das Foto wird analysiert und verworfen.
Produkterkennung
/vision/product extrahiert, was das Modell sehen kann, gleicht es mit dem Katalog aus 6,1 Mio. Produkten ab und liefert nach Score sortierte Treffer:
{
"request_id": "…",
"cached": false,
"extracted": {
"name": "Масло Краве",
"brand": "…",
"quantity": "250 g",
"lang": "bg",
"confidence": 0.95
},
"matches": [
{ "score": 0.98, "product": { "id": "…", "name_default": "…", "nutrition_summary": { } } }
]
}
Auch nicht-lateinische Verpackungen werden gelesen — kyrillische Etiketten führen zu den richtigen Katalogeinträgen. Nimm matches[0] als Antwort, wenn sein Score hoch ist, und zeig eine kurze Auswahlliste, wenn mehrere Treffer nah beieinander liegen.
Etiketten auslesen
/vision/label liest per OCR eine Nährwerttabelle in dieselben Feldnamen aus, die auch der Rest der API verwendet — dazu den Zutatentext und erkannte Allergene:
{
"extracted": {
"energy_kcal": 539,
"fat_g": 30.9,
"saturated_fat_g": 10.6,
"carbs_g": 57.5,
"sugars_g": 56.3,
"proteins_g": 6.3,
"salt_g": 0.11,
"ingredients_text": "Sugar, palm oil, hazelnuts 13%…",
"allergens": ["milk", "nuts"],
"product_name": "Nutella",
"confidence": 0.97
},
"product": { "id": "…" }
}
Felder, die nicht auf dem Etikett stehen, kommen als null zurück — das Modell erfindet nie Zahlen. Wenn das Etikett einen Barcode enthält oder das Produkt erkannt wird, verweist product auf den Katalogeintrag.
Mahlzeitenanalyse
/vision/meal erkennt die Gerichte auf einem Teller, schätzt die Portionen und ordnet jedem Gericht ein generisches Lebensmittel zu, sodass du Kalorienschätzungen bekommst:
{
"items": [
{
"dish": "grilled chicken breast",
"portion_g_est": 150,
"confidence": 0.9,
"match": {
"name_default": "Chicken breast, grilled",
"per_100g": { "energy_kcal": 165, "proteins_g": 31, "carbs_g": 0, "fat_g": 3.6 },
"estimated_kcal": 248
}
}
],
"estimated_total_kcal": 612,
"disclaimer": "Dish identification and portion sizes are AI estimates from a photo…"
}
Portionen aus einem einzigen Foto sind Schätzungen — die Antwort sagt das im disclaimer, und deine Oberfläche sollte das auch tun, idealerweise mit einer schnellen Möglichkeit für Nutzer, die Grammzahl anzupassen.
Credits, Caching und Fehler
- Jede KI-Antwort enthält die Header
X-Credits-Limit,X-Credits-RemainingundX-Credits-Reset— zeig sie in deiner App an, damit Nutzer nie überrascht werden. - Identische Bilder werden serverseitig gecacht, wiederholte Anfragen kommen also sofort zurück — zum selben Credit-Preis. Bau deine App so, dass sie Ergebnisse clientseitig cacht, statt dasselbe Foto erneut zu senden.
- Schlägt eine Anfrage fehl, zahlst du nichts: Ungültige oder zu große Bilder, Provider-Fehler und nicht gefundene Barcodes werden automatisch erstattet.
- Rechne mit
402(keine Credits mehr),429(Vision-Rate-Limit pro Sekunde — jeder Plan hat eines) und413(Bild zu groß) und fang sie ab.
Wo du anfängst
Spiel im Playground mit deinen eigenen Fotos und lies dann die vollständigen Request-/Response-Verträge in der Doku. Die 20 monatlichen Credits des Free-Plans reichen, um alle vier Modi einmal auszuprobieren.
Weitere Beiträge
Bau es mit FoodBase
6,1 Mio. Produkte, über 40 Nährstoffe und KI-Lebensmittelanalyse — kostenlos starten, ohne Kreditkarte.