Create portraits
POST/images/edits
Makes portraits with PhotoMaker V2 from 1 to 4 face photos and a prompt that holds the trigger word img right after the subject. Same key and credit as chat; billed per second of generation.
SoonOpening soon: what follows describes the service as it will work.
https://evanesca.app/api/v1/images/editsOpens at launchBearer $EVANESCA_API_KEYAuthorizationstringrequiredBearer followed by your key, which starts with sk-eva-.
Content-TypestringrequiredMultipart, as OpenAI's contract has it — or JSON, with the photos as data URLs.
Request body
multipart/form-datamodelstringrequiredPhotoMaker V2, by TencentARC.
promptstringrequired350 characters at most, with the trigger word img right after the subject: “a woman img as an astronaut”.
image[]filerequired1 to 4 face photos, JPEG or PNG, one field per photo.
imagesarray of stringsIn a JSON body, instead of image[]: the photos as base64 data URLs.
nintegerHow many images to make.
sizestringThe size of each image, in pixels.
Where it runs, what it costs
Evanesca · on the record
- Runs in
- Infomaniak · Switzerland
photomaker-v2
- Infomaniak · Switzerland
- Operator keeps
Infomaniak states that queries are “neither recorded nor used to train models” (Infomaniak AI Tools).
- Costs
- €0.0092 per second of generation, VAT included, rounded up to the next second, one second at least; usage.generation_seconds is what is billed. About 5 seconds, so about €0.05, for a typical PhotoMaker V2 portrait. A refused request costs nothing.
- Response headers
x-evanesca-operator: infomaniakx-evanesca-location: switzerland
What leaves Evanesca
The prompt and the face photos go to Infomaniak, in Switzerland — outside the EU, under an EU adequacy decision; the images come back in the response and Evanesca keeps none of them. The images carry IPTC metadata marking them as AI-generated (AI Act, art. 50(2)) — metadata, not a watermark, so a screenshot or a re-encode can remove it (Images).
A face photo is personal data: send only photos you are allowed to use. 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.
Errors
| Status | type | Meaning |
|---|---|---|
| 400 | invalid_ | A prompt without img or over 350 characters, no photo or more than 4, a file that is neither JPEG nor PNG, n or size out of bounds — the param field says which (limits). |
| 401 | invalid_ | No key, a malformed key, or a revoked one. |
| 402 | insufficient_ | Your credit is at zero or below. Add credit to continue. |
| 404 | model_ | Unknown ID, a model Evanesca does not serve, or flux-schnell, which is served by /images/generations. |
| 502 | upstream_ | The operator could not be reached, sent an unreadable answer, or turned down Evanesca's own account. Your key is not the problem: retry. |
Other operator errors reach you with its status and body, and Retry-After when it sends one (errors).
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);{
"created": 1791763200,
"model": "photomaker-v2",
"data": [{ "b64_json": "/9j/4AAQSkZJRgABAQ…" }],
"usage": { "generation_seconds": 5, "images": 1 }
}{
"error": {
"message": "\"photomaker-v2\" needs the trigger word \"img\" right after the subject in the prompt, e.g. \"a woman img as an astronaut\". Nothing was charged.",
"type": "invalid_request",
"param": "prompt"
}
}