API reference · v1
SeeFood REST API
One endpoint that answers one question. Every API scan is recorded in your workspace's scan history with channel api.
Authentication
Create a key under API keys in the app and send it as a bearer token. Keys start with sf_live_, are shown once, and are stored only as a hash. Revoke a key at any time.
Authorization: Bearer sf_live_…Classify an image
POST /api/v1/classify
Send multipart/form-data with an image field: JPEG, PNG or WebP, up to 5 MB.
curl https://seefoodsystems.com/api/v1/classify \
-H "Authorization: Bearer $SEEFOOD_API_KEY" \
-F image=@lunch.jpg// Node.js 18+
const form = new FormData();
form.append("image", new Blob([await fs.readFile("lunch.jpg")]), "lunch.jpg");
const res = await fetch("https://seefoodsystems.com/api/v1/classify", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.SEEFOOD_API_KEY}` },
body: form,
});
const scan = await res.json();
console.log(scan.is_hot_dog ? "Hot Dog" : "Not Hot Dog");# Python
import os, requests
res = requests.post(
"https://seefoodsystems.com/api/v1/classify",
headers={"Authorization": f"Bearer {os.environ['SEEFOOD_API_KEY']}"},
files={"image": open("lunch.jpg", "rb")},
)
print(res.json()["verdict"])Response
{
"id": "69413952-892a-4761-b412-66933a69a0db",
"verdict": "not_hot_dog",
"is_hot_dog": false,
"confidence": 0.99,
"label": "golden retriever dog sitting on grass",
"reasoning": "The image shows a dog, not a sausage in a bun.",
"model": "claude-haiku-5-5",
"latency_ms": 1730,
"hot_dog_score": null,
"improvements": [],
"created_at": "2026-10-17T14:04:14.360Z"
}| id | string (uuid) | Scan ID, also shown in your workspace audit log |
| verdict | "hot_dog" | "not_hot_dog" | The definitive answer |
| is_hot_dog | boolean | Convenience flag, same as verdict === "hot_dog" |
| confidence | number 0–1 | Model certainty in the verdict |
| label | string | Short description of what the image shows |
| reasoning | string | One-sentence explanation |
| model | string | Model that produced the verdict |
| latency_ms | integer | Inference time |
| hot_dog_score | integer 0–100 | null | Quality rating, hot dogs only |
| improvements | string[] | What would raise the score (empty for non hot dogs) |
| created_at | string (ISO 8601) | When the scan was recorded |
Errors
Errors return JSON shaped as { "error": { "code", "message" } }.
| Status | Code | Meaning |
|---|---|---|
| 400 | missing_image / invalid_body | No `image` field, or the body isn't multipart/form-data |
| 401 | invalid_api_key | Missing, malformed or revoked API key |
| 413 | image_too_large | Image is larger than 5 MB |
| 415 | unsupported_type | File isn't a JPEG, PNG or WebP image |
| 429 | rate_limited | More than 20 scans per minute for this workspace |
| 502 | classifier_unavailable | The vision model failed; safe to retry |
Limits
- 20 scans per minute per workspace, shared between the web app and the API.
- Images up to 5 MB. Larger photos should be downscaled client-side; 1280 px on the long side is plenty.
- 10 active API keys per workspace.