Smaller endpoints that don’t belong to one resource.
GET /api/health
GETNo session required
Checks connectivity to the configured storage backend — the same probe used in the Docker and Kubernetes health checks.
Response: 200 { "status": "ok" }, or 503 { "status": "error", "message": string }.
GET /api/files/*key
GETAny session
Serves a raw file straight from the storage backend — this is what backs
recipe hero photos and step photos. Not scoped to a recipe ID; key is
the full storage path, for example recipes/<id>/image.jpg or
recipes/<id>/steps/<stepId>.jpg.
Response: the file’s bytes, with Content-Type inferred from the
path and Cache-Control: public, max-age=31536000, immutable (safe
since every photo is versioned by a ?v= query param that changes on
update). 404 if the key doesn’t exist in storage.