Create images
FLUX.1 [schnell] turns a prompt into images, PhotoMaker V2 makes portraits from face photos: both are run by Infomaniak in Switzerland, with the same key and prepaid credit as chat, and billed per second of generation.
SoonOpening soon: what follows describes the service as it will work.
From a prompt
POST /images/generations turns a prompt into images, with the same key and the same prepaid credit as chat. The body follows OpenAI's: model, prompt, n (1 to 5) and size. Images come back as JPEG, base64-encoded in data[].b64_json; Evanesca hosts and keeps none of them, so response_format: "url" returns a data URL rather than a link. OpenAI's official SDKs work unchanged (client.images.generate) — every parameter.
curl https://evanesca.app/api/v1/images/generations \
-H "Authorization: Bearer $EVANESCA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "flux-schnell",
"prompt": "A lighthouse at dusk, watercolour",
"size": "1024x1024"
}'import base64, os
from openai import OpenAI
client = OpenAI(base_url="https://evanesca.app/api/v1", api_key=os.environ["EVANESCA_API_KEY"])
result = client.images.generate(
model="flux-schnell",
prompt="A lighthouse at dusk, watercolour",
size="1792x1024",
)
with open("image.jpg", "wb") as f:
f.write(base64.b64decode(result.data[0].b64_json))import { writeFile } from "node:fs/promises";
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://evanesca.app/api/v1", apiKey: process.env.EVANESCA_API_KEY });
const result = await client.images.generate({
model: "flux-schnell",
prompt: "A lighthouse at dusk, watercolour",
size: "1792x1024",
});
await writeFile("image.jpg", Buffer.from(result.data[0].b64_json, "base64"));package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
body := strings.NewReader(`{"model": "flux-schnell", "prompt": "A lighthouse at dusk, watercolour", "size": "1024x1024"}`)
req, err := http.NewRequest("POST", "https://evanesca.app/api/v1/images/generations", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("EVANESCA_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}{
"created": 1791763200,
"model": "flux-schnell",
"data": [{ "b64_json": "/9j/4AAQSkZJRgABAQ…" }],
"usage": { "generation_seconds": 2, "images": 1 }
}Portraits from photos
POST /images/edits serves PhotoMaker V2: send 1 to 4 face photos (JPEG or PNG) as image[] in multipart — or as base64 data URLs in a JSON images array — with a prompt that holds the trigger word img right after the subject: “a woman img as an astronaut”. A face photo is personal data: send only photos you are allowed to use.
curl https://evanesca.app/api/v1/images/edits \
-H "Authorization: Bearer $EVANESCA_API_KEY" \
-F model=photomaker-v2 \
-F "prompt=a woman img as an astronaut" \
-F "image[]=@face-1.jpg" \
-F "image[]=@face-2.jpg"import os
import requests
res = requests.post(
"https://evanesca.app/api/v1/images/edits",
headers={"Authorization": f"Bearer {os.environ['EVANESCA_API_KEY']}"},
data={"model": "photomaker-v2", "prompt": "a woman img as an astronaut"},
files=[
("image[]", open("face-1.jpg", "rb")),
("image[]", open("face-2.jpg", "rb")),
],
)
print(res.status_code, res.json()["usage"])import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("model", "photomaker-v2");
form.append("prompt", "a woman img as an astronaut");
for (const name of ["face-1.jpg", "face-2.jpg"]) {
form.append("image[]", new Blob([await readFile(name)], { type: "image/jpeg" }), name);
}
const res = await fetch("https://evanesca.app/api/v1/images/edits", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.EVANESCA_API_KEY}` },
body: form,
});
console.log(res.status, (await res.json()).usage);The terms forbid an image of a real person without their consent, and any sexual or intimate image of a real person, even with their consent (every parameter).
The models
| ID | Endpoint | Input | Sizes | Images per call | Price per second |
|---|---|---|---|---|---|
flux-schnell | POST/images/generations | A prompt, 400 characters at most | 1024x1024, 1792x1024, 1024x1792 | 1 to 5 | €0.0092 |
photomaker-v2 | POST/images/edits | 1 to 4 face photos (JPEG or PNG) and a prompt with img, 350 characters at most | 1024x1024, 1792x1024, 1024x1792 | 1 to 5 | €0.0092 |
FLUX.1 [schnell] by Black Forest Labs (Germany), under Apache-2.0; PhotoMaker V2 by TencentARC, under Apache-2.0 (SDXL base: CreativeML OpenRAIL++-M). Both are run by Infomaniak in Switzerland — outside the EU, under an EU adequacy decision. Prices VAT included.
What it costs
An image is paid per second of generation, not per image: Infomaniak bills generation time, so Evanesca measures the call to Infomaniak and rounds it up to the next second, one second at least. The response's usage.generation_seconds is exactly what is billed, at €0.0092 a second. As a guide: about 2 seconds for a 1024x1024 FLUX.1 [schnell] image, so about €0.02; about 5 seconds for a PhotoMaker V2 portrait, so about €0.05. Only a successful generation is billed: a request refused before the call — a size not in the list, a missing trigger word — costs nothing, and neither does a refusal by Infomaniak.
It is the same prepaid credit as chat and embeddings (billing).
Limits and refusals
An image request that breaks a limit is refused with 400 invalid_request before any call, and its param field says which: a prompt longer than the model accepts, n outside 1 to 5, a size not in the list, a prompt without img for PhotoMaker V2, no photo or more than 4, a file that is neither JPEG nor PNG, or a multipart body sent to /images/generations. A model sent to the wrong image endpoint gets 404 model_not_found.
What leaves Evanesca
The prompt — and, for PhotoMaker V2, the face photos — goes to Infomaniak, in Switzerland; the images come back in the response and Evanesca keeps none of them. Infomaniak states that queries are “neither recorded nor used to train models” (Infomaniak AI Tools, read on 13 Oct 2026): its commitment, not Evanesca's. The returned images carry IPTC metadata marking them as AI-generated (AI Act, art. 50(2)): it is metadata, not a watermark, so a screenshot or a re-encode can remove it. In the chat, these models power image generation.