# Fooocus Inpainting API

> Führt Inpainting oder Outpainting mit optionaler Maske aus und bietet Modi für Detailkorrekturen oder Inhaltsänderungen

Bearbeitet ein vorhandenes Bild, indem ein maskierter Bereich neu generiert oder dessen Rand erweitert wird. Gib `inpaint_image_url` und optional `mask_image_url` an und wähle dann einen `inpaint_mode`: einfaches Inpainting/Outpainting, Detailverbesserung oder Inhaltsänderung. Außerdem werden LoRAs, bis zu vier Bild-Prompts, eine Refiner-Auswahl und 1 bis 4 Ausgaben pro Anfrage in png, jpeg oder webp unterstützt. Einstellungen für Strength und die jeweiligen Felder ermöglichen eine feinere Kontrolle darüber, wie stark sich das Bild ändert.

- Model id: `fooocus/inpaint`
- Made by: Open model
- Category: Image Editing
- Output: image
- Estimated price per run: $0.055 / image (cheapest run $0.055 (55 API credits))
- Run: `POST https://api.doitong.ru/v1/run/fooocus/inpaint`
- Quote: `POST https://api.doitong.ru/v1/quote/fooocus/inpaint`
- Docs page: https://doitong.com/de/developers/models/fooocus/inpaint

## Pricing

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

The full example input below costs $0.055 = 55 API credits (1 image × 55 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/fooocus/inpaint` 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

Send either the canonical name or the native field name (not both). Canonical names are the same across models.

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `prompt` |  | string | no | `` |  | Beschreiben Sie das gewünschte Bild möglichst detailliert, um die besten Ergebnisse zu erzielen. |
| `negative_prompt` |  | string | no | `` |  | Negativer Prompt mit auszuschließenden Bilddetails, darunter Farben, Objekte, Szenerie oder feinere Merkmale. Beispiele sind Schnurrbart, Unschärfe oder niedrige Auflösung. |
| `styles` |  | array of enum (string) | no | `["Fooocus Enhance","Fooocus Sharp","Fooocus V2"]` |  | Während der Generierung angewendeter Stil. |
| `performance` |  | enum (string) | no | `Extreme Speed` | `Speed`, `Quality`, `Extreme Speed`, `Lightning` | Leistungsoption: Speed oder Quality. |
| `guidance_scale` |  | number | no | `4` | 1 – 30 | Stärke der Prompt-Treue bei der Bildauswahl, ausgedrückt als CFG (Classifier Free Guidance). |
| `sharpness` |  | number | no | `2` | 0 – 30 | Schärfeeinstellung für die Ausgabe. Eine Erhöhung macht sowohl das Bild als auch seine Texturen schärfer. |
| `aspect_ratio` |  | string | no | `1024x1024` |  | Ausgabebildabmessungen, aus Presets ausgewählt oder als benutzerdefinierte Breite und Höhe angegeben. Beide benutzerdefinierten Abmessungen müssen durch 8 teilbar sein. |
| `num_images` | `num_outputs` | integer | no | `1` | 1 – 4 | Anzahl der pro Anfrage zu generierenden Bilder. |
| `loras` |  | array of object {path, scale} | no | `[{"path":"https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_offset_example-lora_1.0.safetensors","scale":0.1}]` |  | Für die finale Bildgenerierung zusammengeführte LoRA-Auswahl, begrenzt auf 5 LoRAs. |
| `loras[].path` |  | string | yes |  |  | Speicherort der LoRA-Gewichte, angegeben als URL oder Pfad. |
| `loras[].scale` |  | number | no | `0.1` | 0 – 1 | Multiplikator, der vor dem Zusammenführen mit dem Basismodell auf das LoRA-Gewicht angewendet wird. |
| `refiner_model` |  | enum (string) | no | `None` | `None`, `realisticVisionV60B1_v51VAE.safetensors` | Refiner-Auswahl: SDXL oder SD 1.5. |
| `refiner_switch` |  | number | no | `0.8` | 0 – 1 | Refiner-Umschaltwert: Verwende 0.4 mit realistischen SD1.5-Modellen, 0.667 mit Anime-SD1.5-Modellen und 0.8 mit XL-Refinern. Beim Umschalten zwischen zwei SDXL-Modellen ist jeder Wert zulässig. |
| `output_format` |  | enum (string) | no | `jpeg` | `png`, `jpeg`, `webp` | Dateiformat des resultierenden Bilds. |
| `seed` |  | integer \| null | no |  |  | Seed zur Reproduktion von Bildern in Stable Diffusion. Ein Bild kann bei jedem Durchlauf exakt reproduziert werden, wenn Modellversion, Prompt und Seed unverändert bleiben. |
| `inpaint_image_url` |  | string (image URL) | yes |  |  | Referenzbild für die Verwendung beim Inpainting. |
| `mask_image_url` |  | string (image URL) \| null | no |  |  | Bei der Bildgenerierung angewendetes Maskenbild. |
| `inpaint_mode` |  | enum (string) | no | `Inpaint or Outpaint (default)` | `Inpaint or Outpaint (default)`, `Improve Detail (face, hand, eyes, etc.)`, `Modify Content (add objects, change background, etc.)` | Beim Inpainting angewendeter Modus. |
| `inpaint_additional_prompt` |  | string | no | `` |  | Beschreibung des gewünschten Inpainting-Inhalts. |
| `outpaint_selections` |  | array of enum (string) | no | `[]` |  | Richtungen, in denen Outpainting das Bild erweitert. |
| `override_inpaint_options` |  | boolean | no | `false` |  | Überschreibschalter für erweiterte Inpainting-Einstellungen: `inpaint_disable_initial_latent`, `inpaint_engine`, `inpaint_strength`, `inpaint_respective_field` und `inpaint_erode_or_dilate`. Bei true werden diese Optionen überschrieben, andernfalls gelten ihre Standardwerte. |
| `inpaint_disable_initial_latent` |  | boolean | no | `false` |  | Umschalter für die anfängliche Vorverarbeitung: true deaktiviert diese Vorverarbeitung. |
| `inpaint_engine` |  | enum (string) | no | `v2.6` | `None`, `v1`, `v2.5`, `v2.6` | Modellversion für Fooocus-Inpainting. |
| `inpaint_strength` |  | number | no | `1` | ≤ 1, > 0 | Denoising-Stärke für Inpainting, entsprechend der Inpainting-Einstellung von A1111. Sie gilt nicht für Outpainting, das immer 1.0 verwendet. |
| `inpaint_respective_field` |  | number | no | `0.618` | 0 – 1 | Wähle den Inpainting-Bereich mit den Entsprechungen von A1111: "Only Masked" entspricht 0 und "Whole Image" entspricht 1. Outpainting ignoriert diese Einstellung und verwendet immer 1.0. |
| `inpaint_erode_or_dilate` |  | number | no | `0` | -64 – 64 | Passt den weißen Bereich der Maske vor jeder Invertierung an, mit einem Standardwert von 0. Positive Werte vergrößern diesen Bereich, negative verkleinern ihn. |
| `invert_mask` |  | boolean | no | `false` |  | Umschalter für die Maskeninvertierung; true kehrt die Maske um. |
| `image_prompt_1` |  | object {type, image_url, stop_at, weight} | no |  |  |  |
| `image_prompt_1.type` |  | enum (string) | no | `ImagePrompt` | `ImagePrompt`, `PyraCanny`, `CPDS`, `FaceSwap` |  |
| `image_prompt_1.image_url` |  | string (image URL) \| null | no |  |  |  |
| `image_prompt_1.stop_at` |  | number | no | `0.5` | 0 – 1 |  |
| `image_prompt_1.weight` |  | number | no | `1` | 0 – 2 |  |
| `image_prompt_2` |  | object {type, image_url, stop_at, weight} | no |  |  |  |
| `image_prompt_2.type` |  | enum (string) | no | `ImagePrompt` | `ImagePrompt`, `PyraCanny`, `CPDS`, `FaceSwap` |  |
| `image_prompt_2.image_url` |  | string (image URL) \| null | no |  |  |  |
| `image_prompt_2.stop_at` |  | number | no | `0.5` | 0 – 1 |  |
| `image_prompt_2.weight` |  | number | no | `1` | 0 – 2 |  |
| `image_prompt_3` |  | object {type, image_url, stop_at, weight} | no |  |  |  |
| `image_prompt_3.type` |  | enum (string) | no | `ImagePrompt` | `ImagePrompt`, `PyraCanny`, `CPDS`, `FaceSwap` |  |
| `image_prompt_3.image_url` |  | string (image URL) \| null | no |  |  |  |
| `image_prompt_3.stop_at` |  | number | no | `0.5` | 0 – 1 |  |
| `image_prompt_3.weight` |  | number | no | `1` | 0 – 2 |  |
| `image_prompt_4` |  | object {type, image_url, stop_at, weight} | no |  |  |  |
| `image_prompt_4.type` |  | enum (string) | no | `ImagePrompt` | `ImagePrompt`, `PyraCanny`, `CPDS`, `FaceSwap` |  |
| `image_prompt_4.image_url` |  | string (image URL) \| null | no |  |  |  |
| `image_prompt_4.stop_at` |  | number | no | `0.5` | 0 – 1 |  |
| `image_prompt_4.weight` |  | number | no | `1` | 0 – 2 |  |
| `mixing_image_prompt_and_inpaint` |  | boolean | no | `false` |  | Kombiniert Bild mit Inpaint. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Schalter für die Sicherheitsprüfung; false deaktiviert die Prüfung. |

File parameters (`inpaint_image_url`, `mask_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
{
  "inpaint_image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
}
```

A fuller example:

```json
{
  "inpaint_image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
}
```

## 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/fooocus/inpaint?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "inpaint_image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
  }'

# 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/fooocus/inpaint?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "inpaint_image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
  }),
});
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 = {
    "inpaint_image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/fooocus/inpaint", 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": "fooocus/inpaint",
      "input": {
        "inpaint_image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
      },
      "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": "fooocus/inpaint",
  "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": 55,
    "usd": "0.055",
    "charged": 55,
    "refunded": 0
  },
  "input": {
    "inpaint_image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg"
  },
  "output": {
    "images": [
      {
        "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
      }
    ],
    "timings": {},
    "has_nsfw_concepts": [
      false
    ]
  },
  "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 |
|---|---|---|
| `images` | array of object {url, content_type, file_name, file_size, width, height} | Dateiinformationen für das generierte Bild. |
| `timings` | object | Für die Generierung verstrichene Zeit. |
| `has_nsfw_concepts` | array of boolean | Gibt an, ob NSFW-Konzepte in den generierten Bildern vorkommen. |

## Related models

- [Fooocus](https://doitong.com/developers/models/fooocus.md) (`fooocus`): $0.444 / image
- [Fooocus Image Prompt](https://doitong.com/developers/models/fooocus/image-prompt.md) (`fooocus/image-prompt`): $0.085 / image
- [Fooocus Upscale or Vary](https://doitong.com/developers/models/fooocus/upscale-or-vary.md) (`fooocus/upscale-or-vary`): $0.007 / image
- [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

## Links

- HTML page: https://doitong.com/developers/models/fooocus/inpaint
- 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=fooocus/inpaint
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.ru/v1/models/fooocus/inpaint
