image-cache — give it a prompt, get an image GET /healthz GET /v1/image?prompt=&judge=1&generate=1&model= image bytes + X-Cache-Status/Layer/Image-Id/Prompt-Key/Latency-Ms/Cost-USD GET /v1/image.json?prompt=… {cacheStatus, layer, imageId, promptKey, url, prompt, latencyMs, costUsd} both also take detail= (generation only) and exclude= (never serve these) GET /v1/image-set.json?prompt=&count=N N distinct pictures of one subject {images, missing, costUsd} POST /v1/resolve {slots:[{id,prompt}], detail, exclude, generate, maxGenerate} many slots, all distinct POST /v1/photos {runId, slots:[{id,caption}], generationCap, style, exclude} 202 at once: one link per slot GET /v1/photos//.jpg 302 to the picture | 202 pending | 404 failed (public) GET /v1/photos//.json?wait= {id, state, layer, imageId, url} (public) GET /v1/photos//status {complete, createdAt, slots} (public) GET /v1/images/.jpg stored image (immutable, JPEG) POST /v1/illustrations {runId, style, slots:[{id,subject,mood}], generationCap} 202 at once: one link per slot GET /v1/illustrations//.png 302 to the transparent PNG | 202 pending | 404 failed (public) GET /v1/illustrations//.json?wait= {id, state, layer, imageId, url, mood} (public) GET /v1/illustrations//status {complete, createdAt, slots} (public) GET /v1/illustration-images/