# IP Adapter Face ID API

> Génère des images correspondant à un visage à partir d’une photo ou d’une archive zip de photos, sur des bases SD 1.5 ou SDXL

Personnalise la génération à partir d'un visage fourni via `face_image_url`, ou d'une archive zip de plusieurs visages via `face_images_data_url`, dont les embeddings sont moyennés. `model_type` sélectionne des variantes SD 1.5 et SDXL, et les points de contrôle de base peuvent être modifiés avec des paramètres de dépôt. `width` et `height` vont de 512 à 1024, et `num_inference_steps` va jusqu'à 200.

- Model id: `ip-adapter-face-id`
- Made by: Tencent
- Category: Image Editing
- Output: image
- Estimated price per run: $0.015 / image (cheapest run $0.06 (60 API credits))
- Run: `POST https://api.doitong.ru/v1/run/ip-adapter-face-id`
- Quote: `POST https://api.doitong.ru/v1/quote/ip-adapter-face-id`
- Docs page: https://doitong.com/fr/developers/models/ip-adapter-face-id

## Pricing

Price: **$0.015 / image**. Estimated from the typical cost of one run, per output (`num_samples`). The quote is exactly what the run charges.

The full example input below costs $0.06 = 60 API credits (4 images × 15 API credits).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.ru/v1/quote/ip-adapter-face-id` with the same JSON body returns the exact price for that input; the quote is exactly what a run charges. Invalid input is never charged and failed or canceled requests are refunded automatically.

## Input parameters

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `model_type` |  | enum (string) | no | `1_5-v1` | `1_5-v1`, `1_5-v1-plus`, `1_5-v2-plus`, `SDXL-v1`, `SDXL-v2-plus`, `1_5-auraface-v1` | Sélection du modèle, avec 1_5 comme valeur par défaut et choix recommandé pour la plupart des usages. |
| `prompt` |  | string | yes |  |  | Décrivez l’image que vous souhaitez générer avec le plus de détails possible pour obtenir les meilleurs résultats. |
| `face_image_url` |  | string (image URL) \| null | no |  |  | Image de référence pour la correspondance faciale, redimensionnée et rognée à 640x640 lorsque ses dimensions diffèrent de cette taille. |
| `face_images_data_url` |  | string \| null | no |  |  | URL de l’archive zip d’images de visage, utilisée pour créer un identifiant facial plus précis en moyennant les embeddings des images archivées. |
| `negative_prompt` |  | string | no | `blurry, low resolution, bad, ugly, low quality, pixelated, interpolated, compression artifacts, noisey, grainy` |  | Prompt négatif indiquant les détails d’image indésirables. Il peut exclure les couleurs, les objets, le décor ou des caractéristiques et qualités plus fines, comme une moustache, du flou ou une faible résolution. |
| `seed` |  | integer \| null | no |  |  | Graine permettant de reproduire des images dans Stable Diffusion. Une image peut être reproduite exactement à chaque exécution en conservant la version du modèle, le prompt et la graine inchangés. |
| `guidance_scale` |  | number | no | `7.5` | 0 – 16 | Force d'adhérence au prompt pour la sélection d'image, exprimée comme CFG (Classifier Free Guidance). |
| `num_inference_steps` |  | integer | no | `50` | 1 – 200 | Nombre d’étapes d’inférence pour la génération d’image, avec une meilleure qualité aux valeurs élevées au prix d’un temps de génération plus long. |
| `num_samples` |  | integer | no | `4` | 1 – 4 | Nombre d’échantillons pour l’identifiant facial, par défaut 4. Augmenter ce nombre améliore la qualité de l’image, mais allonge la durée de génération. |
| `width` |  | integer | no | `512` | 512 – 1,024 | Largeur de l’image obtenue. |
| `height` |  | integer | no | `512` | 512 – 1,024 | Hauteur de l’image obtenue. |
| `face_id_det_size` |  | integer | no | `640` | 64 – 640 | Définit la taille du modèle de détection faciale ; réduisez-la si le modèle ne trouve pas de visage dans votre image. Une valeur plus élevée offre une détection plus précise, mais ralentit le traitement et augmente le risque de ne pas détecter le visage. |
| `base_1_5_model_repo` |  | string | no | `SG161222/Realistic_Vision_V4.0_noVAE` |  | URL du modèle de base 1.5 ; valeur par défaut : `SG161222/Realistic_Vision_V4.0_noVAE`. |
| `base_sdxl_model_repo` |  | string | no | `SG161222/RealVisXL_V3.0` |  | URL du modèle de base SDXL ; valeur par défaut : `SG161222/RealVisXL_V3.0`. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Le filtrage peut être assoupli en définissant false, si l'appelant est autorisé. |

File parameters (`face_image_url`) take a public `https://` URL, a `data:` URI up to 10 MB, or the `file_url` of an upload from `POST /files`.

## Example input

Required parameters only:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
}
```

A fuller example:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
}
```

## Run it

Set `DOITONG_API_KEY` to a key from https://doitong.com/developers/dashboard#keys. `?wait=20` returns the finished request in the same call when it is ready within 20 seconds; otherwise poll `GET /requests/{id}` (it also accepts `?wait=`), or pass `webhook_url`.

### curl

```bash
# Run the model; wait up to 20 s for the finished result in the same call
curl -X POST "https://api.doitong.ru/v1/run/ip-adapter-face-id?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
  }'

# Still "queued" or "running"? Poll with the id from the response:
curl "https://api.doitong.ru/v1/requests/REQUEST_ID?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```

### JavaScript

```javascript
const API = "https://api.doitong.ru/v1";
const headers = {
  "Authorization": "Bearer " + process.env.DOITONG_API_KEY,
  "Content-Type": "application/json",
};

// Run the model; wait up to 20 s for the finished result in the same call
let res = await fetch(API + "/run/ip-adapter-face-id?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
  }),
});
let request = await res.json();
if (!res.ok) throw new Error(request.error.code + ": " + request.error.message);

// Not finished yet: long-poll until it is
while (request.status === "queued" || request.status === "running") {
  res = await fetch(API + "/requests/" + request.id + "?wait=20", { headers });
  request = await res.json();
}
if (request.status !== "succeeded") throw new Error(JSON.stringify(request.error));
console.log(request.outputs.map((o) => o.url), request.cost.credits + " API credits ($" + request.cost.usd + ")");
```

### Python

```python
import os
import requests

API = "https://api.doitong.ru/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/ip-adapter-face-id", params={"wait": 20}, json=payload, headers=headers)
request = r.json()
if not r.ok:
    raise RuntimeError(request["error"]["code"] + ": " + request["error"]["message"])

# Not finished yet: long-poll until it is
while request["status"] in ("queued", "running"):
    request = requests.get(API + "/requests/" + request["id"], params={"wait": 20}, headers=headers).json()
if request["status"] != "succeeded":
    raise RuntimeError(request["error"])
print([o["url"] for o in request["outputs"]], request["cost"]["credits"], "API credits", "$" + request["cost"]["usd"])
```

### MCP

The MCP server at `https://api.doitong.ru/v1/mcp` exposes the tools `search_models`, `get_model`, `quote`, `run`, `get_request`, `cancel_request`, `list_requests`, `create_upload` and `get_account`. A `run` call for this model:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "run",
    "arguments": {
      "model_id": "ip-adapter-face-id",
      "input": {
        "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
      },
      "wait_seconds": 20
    }
  }
}
```

## Response

Every call returns a request object. `status` is one of `queued`, `running`, `succeeded`, `failed`, `canceled`. `outputs` lists the generated files with URLs on our storage (kept forever, or 7 days with `?storage=temporary`; `storage` says which); `output` is the model's own result object with the same URLs.

```json
{
  "id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
  "object": "request",
  "model": "ip-adapter-face-id",
  "status": "succeeded",
  "created_at": "2026-10-20T12:00:00Z",
  "started_at": "2026-10-20T12:00:02Z",
  "completed_at": "2026-10-20T12:00:09Z",
  "queue_position": null,
  "cost": {
    "credits": 60,
    "usd": "0.06",
    "charged": 60,
    "refunded": 0
  },
  "input": {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
  },
  "output": {
    "image": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
      "content_type": "image/jpeg",
      "file_name": "0-output.jpeg",
      "file_size": 1843200,
      "width": 1024,
      "height": 768
    },
    "seed": 42
  },
  "outputs": [
    {
      "type": "image",
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
      "content_type": "image/jpeg",
      "file_size": 1843200,
      "width": 1024,
      "height": 768,
      "stored": true
    }
  ],
  "error": null,
  "metrics": {
    "inference_seconds": 6.8
  },
  "urls": {
    "self": "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `image` | object {url, content_type, file_name, file_size, width, height} | Informations de fichier pour l’image générée. |
| `seed` | integer | Seed de génération d'images, y compris la valeur choisie aléatoirement si l'entrée n'en fournissait pas ; sinon, il reprend la valeur fournie. |

## Related models

- [FLUX.1 Kontext \[pro\]](https://doitong.com/developers/models/flux-pro/kontext.md) (`flux-pro/kontext`): $0.04 / image
- [GPT Image 2.5 Edit](https://doitong.com/developers/models/openai/gpt-image-2.5/flare/edit.md) (`openai/gpt-image-2.5/flare/edit`): from $0.12 / image
- [Nano Banana 2 Edit](https://doitong.com/developers/models/nano-banana-2/edit.md) (`nano-banana-2/edit`): from $0.06 / image
- [Nano Banana Pro Edit](https://doitong.com/developers/models/nano-banana-pro/edit.md) (`nano-banana-pro/edit`): from $0.15 / image
- [Qwen Image 3 Edit](https://doitong.com/developers/models/alibaba/qwen-image-3/edit.md) (`alibaba/qwen-image-3/edit`): from $0.04 / image
- [Seedream 5.0 Pro Edit](https://doitong.com/developers/models/bytedance/seedream/v5/pro/edit.md) (`bytedance/seedream/v5/pro/edit`): from $0.0675 / run of output image
- [Hunyuan Image · v3 · Instruct · Edit](https://doitong.com/developers/models/hunyuan-image/v3/instruct/edit.md) (`hunyuan-image/v3/instruct/edit`): $0.174 / image
- [Hunyuan World](https://doitong.com/developers/models/hunyuan_world.md) (`hunyuan_world`): $0.15 / image

## Links

- HTML page: https://doitong.com/developers/models/ip-adapter-face-id
- All models and guides for AI agents: https://doitong.com/developers/llms.txt
- OpenAPI 3.1 with this model's typed request body: https://doitong.com/developers/openapi.json?model=ip-adapter-face-id
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.ru/v1/models/ip-adapter-face-id
