# Fooocus Inpainting API

> Udfører inpainting eller outpainting på et billede med en valgfri maske og tilstande til detaljeforbedringer eller indholdsændringer

Redigerer et eksisterende billede ved at generere et maskeret område på ny eller udvide dets kanter. Angiv `inpaint_image_url` og valgfrit `mask_image_url`, og vælg derefter en `inpaint_mode`: almindelig inpaint/outpaint, detaljeforbedring eller indholdsændring. Den accepterer også LoRA'er, op til fire billedprompter, et valg af refiner og 1 til 4 outputs pr. anmodning i png, jpeg eller webp. Indstillingerne for strength og de tilsvarende felter giver finere kontrol over ændringernes omfang.

- 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.com/v1/run/fooocus/inpaint`
- Quote: `POST https://api.doitong.com/v1/quote/fooocus/inpaint`
- Docs page: https://doitong.com/da/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.com/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 | `` |  | Beskriv det billede, du vil have genereret, med så mange detaljer som muligt for at opnå de bedste resultater. |
| `negative_prompt` |  | string | no | `` |  | Negativ prompt, der angiver billeddetaljer, som skal udelukkes, herunder farver, objekter, sceneri eller finere træk. Eksempler omfatter overskæg, sløring eller lav opløsning. |
| `styles` |  | array of enum (string) | no | `["Fooocus Enhance","Fooocus Sharp","Fooocus V2"]` |  | Stil, der anvendes under generering. |
| `performance` |  | enum (string) | no | `Extreme Speed` | `Speed`, `Quality`, `Extreme Speed`, `Lightning` | Ydelsesvalg: Speed eller Quality. |
| `guidance_scale` |  | number | no | `4` | 1 – 30 | Styrke for prompt-overensstemmelse ved billedvalg, udtrykt som CFG (Classifier Free Guidance). |
| `sharpness` |  | number | no | `2` | 0 – 30 | Skarphedsindstilling for outputbilledet. En højere værdi gør både billedet og dets teksturer skarpere. |
| `aspect_ratio` |  | string | no | `1024x1024` |  | Outputbilledets dimensioner, valgt fra forudindstillinger eller angivet som brugerdefineret bredde og højde. Begge brugerdefinerede dimensioner skal kunne divideres med 8. |
| `num_images` | `num_outputs` | integer | no | `1` | 1 – 4 | Antal billeder, der skal genereres pr. anmodning. |
| `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}]` |  | LoRA-udvalg flettet ind i den endelige billedgenerering, begrænset til 5 LoRA'er. |
| `loras[].path` |  | string | yes |  |  | Placering af LoRA-vægtene, angivet som en URL eller sti. |
| `loras[].scale` |  | number | no | `0.1` | 0 – 1 | Multiplikator anvendt på LoRA-vægten, før den flettes ind i basismodellen. |
| `refiner_model` |  | enum (string) | no | `None` | `None`, `realisticVisionV60B1_v51VAE.safetensors` | Refiner-valg: SDXL eller SD 1.5. |
| `refiner_switch` |  | number | no | `0.8` | 0 – 1 | Værdi for refiner-skift: brug 0.4 med realistiske SD1.5-modeller, 0.667 med anime-SD1.5-modeller og 0.8 med XL-refiners. Skift mellem to SDXL-modeller tillader enhver værdi. |
| `output_format` |  | enum (string) | no | `jpeg` | `png`, `jpeg`, `webp` | Filformat for det resulterende billede. |
| `seed` |  | integer \| null | no |  |  | Seed til genskabelse af billeder i Stable Diffusion. Et billede kan genskabes nøjagtigt ved hver kørsel ved at holde modelversion, prompt og seed uændrede. |
| `inpaint_image_url` |  | string (image URL) | yes |  |  | Referencebillede, der bruges under inpainting. |
| `mask_image_url` |  | string (image URL) \| null | no |  |  | Maskebillede, der anvendes under billedgenerering. |
| `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.)` | Tilstand, der anvendes under inpainting. |
| `inpaint_additional_prompt` |  | string | no | `` |  | Beskrivelse af det ønskede inpainting-indhold. |
| `outpaint_selections` |  | array of enum (string) | no | `[]` |  | Retninger, som outpainting udvider billedet i. |
| `override_inpaint_options` |  | boolean | no | `false` |  | Tilsidesættelse af avancerede inpainting-indstillinger: `inpaint_disable_initial_latent`, `inpaint_engine`, `inpaint_strength`, `inpaint_respective_field` og `inpaint_erode_or_dilate`. Hvis den sættes til true, tilsidesættes disse indstillinger; ellers anvendes deres standardværdier. |
| `inpaint_disable_initial_latent` |  | boolean | no | `false` |  | Indledende forbehandlingsindstilling: true deaktiverer denne forbehandling. |
| `inpaint_engine` |  | enum (string) | no | `v2.6` | `None`, `v1`, `v2.5`, `v2.6` | Modelversion til Fooocus-inpainting. |
| `inpaint_strength` |  | number | no | `1` | ≤ 1, > 0 | Denoising-styrke til inpainting, svarende til A1111's inpaint-indstilling. Den gælder ikke for outpainting, som altid bruger 1.0. |
| `inpaint_respective_field` |  | number | no | `0.618` | 0 – 1 | Vælg området til inpainting ved hjælp af A1111's ækvivalenter: "Only Masked" svarer til 0, og "Whole Image" svarer til 1. Outpainting ignorerer denne indstilling og bruger altid 1.0. |
| `inpaint_erode_or_dilate` |  | number | no | `0` | -64 – 64 | Juster maskens hvide område før inversion med standardværdien 0. Brug positive værdier til at udvide området eller negative værdier til at formindske det. |
| `invert_mask` |  | boolean | no | `false` |  | Indstilling for maskinversion; true vender masken om. |
| `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` |  | Kombinerer billede Prompt med Inpaint. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Kontakt til sikkerhedskontrol; indstilling til false deaktiverer kontrollen. |

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.com/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.com/v1/requests/REQUEST_ID?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```

### JavaScript

```javascript
const API = "https://api.doitong.com/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.com/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.com/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.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `images` | array of object {url, content_type, file_name, file_size, width, height} | Filoplysninger for det genererede billede. |
| `timings` | object | Forløbet tid for generering. |
| `has_nsfw_concepts` | array of boolean | Angiver, om NSFW-koncepter forekommer i de genererede billeder. |

## 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.com/v1/models/fooocus/inpaint
