# FLUX.1 [dev] with Controlnets and Loras · Rf Inversion API

> Promptbaseret redigering af et referencebillede via RF-inversion

Redigerer billedet på `image_url` efter en `prompt` ved hjælp af RF-Inversion-pipelinen, som arbejder ud fra det oprindelige billede i stedet for at starte med støj. LoRA'er, control-LoRA'er, ControlNets og et referencebillede kan tilføjes, og NAG-indstillingerne (`nag_scale`, `nag_tau`, `nag_alpha`, `nag_end`) finjusterer styringen via negativ prompt.

- Model id: `flux-general/rf-inversion`
- Made by: Black Forest Labs
- Category: Image Editing
- Output: image
- Estimated price per run: $0.025 / image (cheapest run $0.025 (25 API credits))
- Run: `POST https://api.doitong.com/v1/run/flux-general/rf-inversion`
- Quote: `POST https://api.doitong.com/v1/quote/flux-general/rf-inversion`
- Docs page: https://doitong.com/da/developers/models/flux-general/rf-inversion

## Pricing

Price: **$0.025 / 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.025 = 25 API credits (1 image × 25 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/flux-general/rf-inversion` 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 | yes |  |  | Prompt, der styrer redigeringer af billedet. |
| `image_size` |  | object {width, height} \| enum (string) | no |  | `square_hd`, `square`, `portrait_4_3`, `portrait_16_9`, `landscape_4_3`, `landscape_16_9` | Dimensioner for det genererede billede. |
| `num_inference_steps` |  | integer | no | `28` | 1 – 50 | Antal inferenstrin, der skal køres. |
| `seed` |  | integer \| null | no |  |  | Seed til reproducerbare billeder: En identisk prompt og seed producerer et identisk billede, når modelversionen er uændret. |
| `loras` |  | array of object {path, scale} | no | `[]` |  | LoRA'er, hvis kombinerede effekt producerer det genererede billede, uden begrænsning på antallet, du angiver. |
| `loras[].path` |  | string | yes |  |  | Placering af LoRA-vægtene, angivet som en URL eller sti. |
| `loras[].scale` |  | object \| number | no | `1` |  | Skalering anvendt på LoRA-vægte, før de flettes ind i basismodellen. Angiv en ordbog i formen {"layer_name":layer_scale} for at indstille individuelle lagskaleringer; lag, der ikke er angivet, bruger 1.0. |
| `control_loras` |  | array of object {path, scale, control_image_url, preprocess} | no | `[]` |  | Kontrolbilledets LoRA'er flettet til en kombineret konfiguration til generering af det endelige billede; antallet, der angives, er ubegrænset. |
| `control_loras[].path` |  | string | yes |  |  | Placering af LoRA-vægtene, angivet som en URL eller sti. |
| `control_loras[].scale` |  | object \| number | no | `1` |  | Skalering anvendt på LoRA-vægte, før de flettes ind i basismodellen. Angiv en ordbog i formen {"layer_name":layer_scale} for at indstille individuelle lagskaleringer; lag, der ikke er angivet, bruger 1.0. |
| `control_loras[].control_image_url` |  | string (image URL) | yes |  |  | Billed-URL, der leverer kontrolbilledet. |
| `control_loras[].preprocess` |  | enum (string) | no | `None` | `canny`, `depth`, `None` | Forbehandlingsmetode anvendt på det leverede billede. |
| `controlnets` |  | array of object {path, config_url, variant, control_image_url, mask_image_url, mask_threshold, conditioning_scale, start_percentage, end_percentage} | no | `[]` |  | ControlNet-konfiguration til billedgenerering, i øjeblikket begrænset til ét ControlNet. |
| `controlnets[].path` |  | string | yes |  |  | Placering af ControlNet-vægt angivet som en URL eller sti. |
| `controlnets[].config_url` |  | string \| null | no |  |  | Valgfri URL, der peger på ControlNets config.json-fil. |
| `controlnets[].variant` |  | string \| null | no |  |  | Valgfri variant til brug sammen med en Hugging Face-repositorynøgle. |
| `controlnets[].control_image_url` |  | string (image URL) | yes |  |  | Billed-URL, der leverer kontrolbilledet. |
| `controlnets[].mask_image_url` |  | string (image URL) | no |  |  | Maske-URL knyttet til kontrolbilledet. |
| `controlnets[].mask_threshold` |  | number | no | `0.5` | 0.01 – 0.99 | Masketærskelværdi. |
| `controlnets[].conditioning_scale` |  | number | no | `1` | 0 – 2 | Skalering anvendt på ControlNet-vægte, før de flettes ind i basismodellen. |
| `controlnets[].start_percentage` |  | number | no | `0` | 0 – 1 | Procentdel af de samlede timesteps, hvor ControlNet begynder at påvirke billedgenereringen. |
| `controlnets[].end_percentage` |  | number | no | `1` | 0 – 1 | Procentdel af de samlede timesteps, hvor ControlNet stopper med at påvirke billedgenereringen. |
| `controlnet_unions` |  | array of object {path, config_url, variant, controls} | no | `[]` |  | ControlNet-unionskonfiguration til billedgenerering, underlagt den aktuelle begrænsning på ét ControlNet. |
| `controlnet_unions[].path` |  | string | yes |  |  | Placering af ControlNet-vægt angivet som en URL eller sti. |
| `controlnet_unions[].config_url` |  | string \| null | no |  |  | Valgfri URL, der peger på ControlNets config.json-fil. |
| `controlnet_unions[].variant` |  | string \| null | no |  |  | Valgfri variant til brug sammen med en Hugging Face-repositorynøgle. |
| `controlnet_unions[].controls` |  | array of object {control_image_url, mask_image_url, control_mode, conditioning_scale, mask_threshold, start_percentage, end_percentage} | yes |  |  | Kontrolbilleder og tilknyttede tilstande, der leveres til ControlNet. |
| `controlnet_unions[].controls[].control_image_url` |  | string (image URL) | yes |  |  | Billed-URL, der leverer kontrolbilledet. |
| `controlnet_unions[].controls[].mask_image_url` |  | string (image URL) | no |  |  | Maske-URL knyttet til kontrolbilledet. |
| `controlnet_unions[].controls[].control_mode` |  | enum (string) | yes |  | `canny`, `tile`, `depth`, `blur`, `pose`, `gray`, `low-quality` | Kontroltilstand anvendt af Flux Controlnet Union. Valgmuligheder: canny styrer genereringen med kanter; tile styrer den med fliser; depth styrer den med et gråtone-dybdekort; blur slører billedet; pose styrer genereringen med billedets positur; gray gør billedet til gråtone; low-quality producerer en version af billedet i lav kvalitet. |
| `controlnet_unions[].controls[].conditioning_scale` |  | number | no | `1` | 0 – 2 | Skalering anvendt på ControlNet-vægte, før de flettes ind i basismodellen. |
| `controlnet_unions[].controls[].mask_threshold` |  | number | no | `0.5` | 0.01 – 0.99 | Masketærskelværdi. |
| `controlnet_unions[].controls[].start_percentage` |  | number | no | `0` | 0 – 1 | Procentdel af de samlede timesteps, hvor ControlNet begynder at påvirke billedgenereringen. |
| `controlnet_unions[].controls[].end_percentage` |  | number | no | `1` | 0 – 1 | Procentdel af de samlede timesteps, hvor ControlNet stopper med at påvirke billedgenereringen. |
| `easycontrols` |  | array of object {control_method_url, scale, image_url, image_control_type} | no | `[]` |  | EasyControl-input anvendt under billedgenerering. |
| `easycontrols[].control_method_url` |  | string | yes |  |  | Safetensor-vægt-URL for kontrolmetoden eller en understøttet identifikator: `canny`, `depth`, `hedsketch`, `inpainting`, `pose`, `seg`, `subject`, `ghibli`. |
| `easycontrols[].scale` |  | number | no | `1` | 0 – 2 | Skaleringsfaktor for kontrolmetoden. |
| `easycontrols[].image_url` |  | string (image URL) | yes |  |  | Billed-URL, der leverer et kontrolinput. |
| `easycontrols[].image_control_type` |  | enum (string) | yes |  | `subject`, `spatial` | Billedkontroltilstand; accepterer enten `spatial` eller `subject`. |
| `fill_image` |  | object {fill_image_url} \| null | no |  |  | Inputbillede, der styrer genereringen og kan levere indhold til maskerede områder. |
| `fill_image.fill_image_url` |  | string (image URL) \| array of image URL | no | `[]` |  | Billed-URL'er til udfyldning via redux-prompts. |
| `guidance_scale` |  | number | no | `3.5` | 0 – 20 | Styrke for prompt-overensstemmelse ved billedvalg, udtrykt som CFG (Classifier Free Guidance). |
| `use_cfg_zero` |  | boolean | no | `false` |  | Aktiverer CFG-zero-initialiseringssampling, beskrevet på https://arxiv.org/abs/2503.18886. |
| `num_images` | `num_outputs` | integer | no | `1` | 1 – 10 | Angiv, hvor mange billeder der skal genereres; dette valg er fastsat til 1, når output streames. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Sikkerhedskontrol, der returnerer sorte billeder i stedet for billeder, der markeres som usikre. true aktiverer kontrollen; false deaktiverer den kun for autoriserede konti, mens anmodninger uden autorisation altid kontrolleres. |
| `reference_image_url` |  | string (image URL) | no |  |  | Billed-URL anvendt til Reference-Only-guidance. |
| `reference_strength` |  | number | no | `0.65` | -3 – 3 | Referencebilledets indflydelse under reference_only-generering; uden et leveret referencebillede har denne styrkeindstilling ingen effekt. |
| `reference_start` |  | number | no | `0` | 0 – 1 | Startpunkt for referenceguidance angivet som en procentdel af alle timesteps. |
| `reference_end` |  | number | no | `1` | 0 – 1 | Slutpunkt for referenceguidance angivet som en procentdel af alle timesteps. |
| `base_shift` |  | number | no | `0.5` | 0.01 – 5 | Grundlinjeforskydning anvendt på planlagte timesteps. |
| `max_shift` |  | number | no | `1.15` | 0.01 – 5 | Maksimal forskydning anvendt på planlagte timesteps. |
| `output_format` |  | enum (string) | no | `png` | `jpeg`, `png` | Filformat for det resulterende billede. |
| `use_beta_schedule` |  | boolean | no | `false` |  | Styrer, om beta-sigmaer skal anvendes. |
| `sigma_schedule` |  | string \| null | no |  |  | Sigma-plan anvendt under denoising. |
| `scheduler` |  | enum (string) | no | `euler` | `euler`, `dpmpp_2m` | Scheduler anvendt under denoising. |
| `negative_prompt` |  | string | no | `` |  | Negativ prompt, der som standard behandles med NAG for at modvirke de angivne uønskede egenskaber i genererede billeder. |
| `nag_scale` |  | number | no | `3` | ≤ 10, > 1 | Undgåelse af negativ prompt styret af NAG-skalaen: en forøgelse gør det genererede billede mindre lig den negative beskrivelse. |
| `nag_tau` |  | number | no | `2.5` | > 0 | NAG tau-indstilling til normalisering af skjulte tilstande; det anbefales at lade den være uændret. En forøgelse svækker normaliseringen og indebærer risiko for uventede afvigelser fra det oprindelige billede. |
| `nag_alpha` |  | number | no | `0.25` | ≤ 1, > 0 | NAG alpha angiver, hvor meget den positive prompt omdirigerer den normaliserede guidance, der kombinerer de positive og negative prompts. Denne endelige vægtning giver den positive prompt større indflydelse ved lavere indstillinger og reducerer omdirigeringen ved højere indstillinger. |
| `nag_end` |  | number | no | `0.25` | ≤ 1, > 0 | NAG-cutoff angivet som en andel af genereringstrinnene. FLUX's oprindelige attention-processorer overtager, efter at NAG har kørt i denne indledende andel. |
| `image_url` | `image` | string (image URL) | yes |  |  | Billed-URL, der identificerer redigeringsinputtet. |
| `controller_guidance_forward` |  | number | no | `0.6` | 0.01 – 3 | Controller-guidance (gamma) til generering af struktureret støj. |
| `controller_guidance_reverse` |  | number | no | `0.75` | 0.01 – 3 | Indstil eta, denoise-controllerens guidance-værdi; et billede, der ligner inputtet mere, opnås med indstillinger tættere på 1. |
| `reverse_guidance_start` |  | integer | no | `0` |  | Start-timestep for guidance i den omvendte proces. |
| `reverse_guidance_end` |  | integer | no | `8` |  | Slut-timestep for guidance i den omvendte proces. |
| `reverse_guidance_schedule` |  | enum (string) | no | `constant` | `constant`, `linear_increase`, `linear_decrease` | Plan, der styrer anvendelsen af omvendt guidance. |

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

A fuller example:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
  "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/flux-general/rf-inversion?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",
    "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/flux-general/rf-inversion?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",
    "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 = {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "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/flux-general/rf-inversion", 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": "flux-general/rf-inversion",
      "input": {
        "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
        "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": "flux-general/rf-inversion",
  "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": 25,
    "usd": "0.025",
    "charged": 25,
    "refunded": 0
  },
  "input": {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "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",
        "width": 1024,
        "height": 768,
        "content_type": "image/jpeg"
      }
    ],
    "timings": {},
    "seed": 42,
    "has_nsfw_concepts": [
      false
    ],
    "prompt": "string"
  },
  "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, width, height, content_type} | Filoplysninger for de genererede billeder. |
| `timings` | object |  |
| `seed` | integer | Seed til billedgenerering, inklusive den tilfældigt valgte værdi, hvis inputtet ikke angav en seed; ellers gentages den angivne værdi. |
| `has_nsfw_concepts` | array of boolean | Angiver, om NSFW-koncepter forekommer i de genererede billeder. |
| `prompt` | string | Prompt brugt under billedgenerering. |

## Related models

- [FLUX.1 \[dev\] with Controlnets and Loras](https://doitong.com/developers/models/flux-general.md) (`flux-general`): $0.30 / image
- [FLUX.1 \[dev\] with Controlnets and Loras · Differential Diffusion](https://doitong.com/developers/models/flux-general/differential-diffusion.md) (`flux-general/differential-diffusion`): $0.138 / image
- [FLUX.1 \[dev\] with Controlnets and Loras · Image to Image](https://doitong.com/developers/models/flux-general/image-to-image.md) (`flux-general/image-to-image`): $0.15 / image
- [FLUX.1 \[dev\] with Controlnets and Loras · Inpainting](https://doitong.com/developers/models/flux-general/inpainting.md) (`flux-general/inpainting`): $0.192 / 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

## Links

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