# Fooocus Inpainting API

> Faz inpaint ou outpaint de uma imagem com uma máscara opcional, com modos para corrigir detalhes ou alterar conteúdo

Edita uma imagem existente regenerando uma região mascarada ou estendendo suas bordas. Forneça `inpaint_image_url` e, opcionalmente, `mask_image_url`, depois escolha um `inpaint_mode`: inpaint/outpaint simples, melhoria de detalhes ou modificação de conteúdo. Também aceita LoRAs, até quatro prompts de imagem, uma opção de refiner e de 1 a 4 saídas por solicitação em png, jpeg ou webp. As configurações de strength e do respectivo campo permitem controlar melhor a intensidade das alterações.

- 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/pt-BR/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 | `` |  | Descreva a imagem que deseja gerar com o máximo de detalhes possível para obter os melhores resultados. |
| `negative_prompt` |  | string | no | `` |  | Prompt negativo que especifica detalhes da imagem a excluir, incluindo cores, objetos, cenários ou características mais sutis. Exemplos incluem bigode, desfoque ou baixa resolução. |
| `styles` |  | array of enum (string) | no | `["Fooocus Enhance","Fooocus Sharp","Fooocus V2"]` |  | Estilo aplicado durante a geração. |
| `performance` |  | enum (string) | no | `Extreme Speed` | `Speed`, `Quality`, `Extreme Speed`, `Lightning` | Escolha de desempenho: Speed ou Quality. |
| `guidance_scale` |  | number | no | `4` | 1 – 30 | Intensidade de aderência ao prompt para seleção de imagem, expressa como CFG (Classifier Free Guidance). |
| `sharpness` |  | number | no | `2` | 0 – 30 | Configuração de nitidez da imagem de saída. Aumentá-la torna a imagem e suas texturas mais nítidas. |
| `aspect_ratio` |  | string | no | `1024x1024` |  | Dimensões da imagem de saída, selecionadas entre predefinições ou especificadas como largura e altura personalizadas. Ambas as dimensões personalizadas devem ser divisíveis por 8. |
| `num_images` | `num_outputs` | integer | no | `1` | 1 – 4 | Quantidade de imagens a gerar por requisição. |
| `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}]` |  | Seleção de LoRA mesclada para a geração da imagem final, limitada a 5 LoRAs. |
| `loras[].path` |  | string | yes |  |  | Localização dos pesos da LoRA, especificada como URL ou caminho. |
| `loras[].scale` |  | number | no | `0.1` | 0 – 1 | Multiplicador aplicado ao peso da LoRA antes de sua mesclagem ao modelo base. |
| `refiner_model` |  | enum (string) | no | `None` | `None`, `realisticVisionV60B1_v51VAE.safetensors` | Seleção do refinador: SDXL ou SD 1.5. |
| `refiner_switch` |  | number | no | `0.8` | 0 – 1 | Valor de alternância do refinador: use 0.4 com modelos SD1.5 realistas, 0.667 com modelos SD1.5 de anime e 0.8 com XL-refiners. Ao alternar entre dois modelos SDXL, qualquer valor é permitido. |
| `output_format` |  | enum (string) | no | `jpeg` | `png`, `jpeg`, `webp` | Formato de arquivo da imagem resultante. |
| `seed` |  | integer \| null | no |  |  | Seed para reproduzir imagens no Stable Diffusion. Uma imagem pode ser reproduzida exatamente em cada execução mantendo inalterados a versão do modelo, o prompt e a seed. |
| `inpaint_image_url` |  | string (image URL) | yes |  |  | Imagem de referência usada durante o inpainting. |
| `mask_image_url` |  | string (image URL) \| null | no |  |  | Imagem de máscara aplicada durante a geração da imagem. |
| `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.)` | Modo aplicado durante o inpainting. |
| `inpaint_additional_prompt` |  | string | no | `` |  | Descrição do conteúdo desejado para o inpainting. |
| `outpaint_selections` |  | array of enum (string) | no | `[]` |  | Direções nas quais o outpainting estende a imagem. |
| `override_inpaint_options` |  | boolean | no | `false` |  | Alternância de substituição das configurações avançadas de inpainting: `inpaint_disable_initial_latent`, `inpaint_engine`, `inpaint_strength`, `inpaint_respective_field` e `inpaint_erode_or_dilate`. Defini-la como true substitui essas opções; caso contrário, seus valores padrão são aplicados. |
| `inpaint_disable_initial_latent` |  | boolean | no | `false` |  | Alternância do pré-processamento inicial: `true` desativa esse pré-processamento. |
| `inpaint_engine` |  | enum (string) | no | `v2.6` | `None`, `v1`, `v2.5`, `v2.6` | Versão do modelo para o inpainting do Fooocus. |
| `inpaint_strength` |  | number | no | `1` | ≤ 1, > 0 | Intensidade de redução de ruído para inpainting, equivalente à configuração de inpaint do A1111. Ela não se aplica ao outpainting, que sempre usa 1.0. |
| `inpaint_respective_field` |  | number | no | `0.618` | 0 – 1 | Selecione a área para inpainting usando os equivalentes do A1111: "Only Masked" corresponde a 0, e "Whole Image" corresponde a 1. O outpainting ignora essa configuração e sempre usa 1.0. |
| `inpaint_erode_or_dilate` |  | number | no | `0` | -64 – 64 | Ajuste a área branca da máscara antes de qualquer inversão, com valor padrão de 0. Use valores positivos para expandir essa área ou valores negativos para contraí-la. |
| `invert_mask` |  | boolean | no | `false` |  | Alternância de inversão da máscara; `true` inverte a máscara. |
| `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` |  | Combina imagem Prompt com Inpaint. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Alternância do verificador de segurança; defini-la como false desativa a verificação. |

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} | Informações do arquivo da imagem gerada. |
| `timings` | object | Tempo decorrido para a geração. |
| `has_nsfw_concepts` | array of boolean | Indica se conceitos NSFW aparecem nas imagens geradas. |

## 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
