> ## Documentation Index
> Fetch the complete documentation index at: https://docs.runflow.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Logo Inpaint

> Place a logo onto a target image, with optional mask to constrain placement. When the mask is omitted, the workflow picks a placement automatically.

<Info>
  Pricing: **\$0.2/request**. Endpoint: `POST /v1/models/runflow/logo-inpaint/runs`.
</Info>

Place a logo onto a target image, with optional mask to constrain placement. When the mask is omitted, the workflow picks a placement automatically.

## Overview

* **Endpoint**: [https://api.runflow.io/v1/models/runflow/logo-inpaint/runs](https://api.runflow.io/v1/models/runflow/logo-inpaint/runs)
* **Model ID**: runflow/logo-inpaint
* **Provider**: Runflow
* **License**: commercial
* **Last Updated**: 2026-05-21

## Pricing

* **Base price**: \$0.2/request
* **Note**: Per image: logo inpaint (v2, 2026-05-21)

# Logo Inpaint API

**Endpoint:** `POST /v1/models/runflow/logo-inpaint/runs`

## Run the model

### Python

```python theme={"dark"}
import requests

response = requests.post(
    "https://api.runflow.io/v1/models/runflow/logo-inpaint/runs",
    headers={"Authorization": "Bearer RUNFLOW_API_KEY"},
    json={
        "input": {
            "prompt": "Apply the logo from Image 2 onto the masked area of the garment in Image 1, matching the fabric texture, surface curvature, lighting, and color tone of the garment. The logo should look professionally printed or embroidered into the surface, not pasted on top.",
            "logo_url": "https://public.runflow.io/images/models/runflow/logo-inpaint/examples/1/logo.webp",
            "mask_url": "https://public.runflow.io/images/models/runflow/logo-inpaint/examples/1/mask.png",
            "image_url": "https://public.runflow.io/images/models/runflow/logo-inpaint/examples/1/image.png"
        },
        "callback_url": "https://your-server.com/webhook"
    },
)

data = response.json()
print(data)
```

### Node.js

```javascript theme={"dark"}
const response = await fetch(
  "https://api.runflow.io/v1/models/runflow/logo-inpaint/runs",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer RUNFLOW_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
        "input": {
            "prompt": "Apply the logo from Image 2 onto the masked area of the garment in Image 1, matching the fabric texture, surface curvature, lighting, and color tone of the garment. The logo should look professionally printed or embroidered into the surface, not pasted on top.",
            "logo_url": "https://public.runflow.io/images/models/runflow/logo-inpaint/examples/1/logo.webp",
            "mask_url": "https://public.runflow.io/images/models/runflow/logo-inpaint/examples/1/mask.png",
            "image_url": "https://public.runflow.io/images/models/runflow/logo-inpaint/examples/1/image.png"
        },
        "callback_url": "https://your-server.com/webhook"
    }),
  }
);

const data = await response.json();
console.log(data);
```

### cURL

```bash theme={"dark"}
curl -X POST https://api.runflow.io/v1/models/runflow/logo-inpaint/runs \
  -H "Authorization: Bearer $RUNFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @- <<'JSON'
{
    "input": {
        "prompt": "Apply the logo from Image 2 onto the masked area of the garment in Image 1, matching the fabric texture, surface curvature, lighting, and color tone of the garment. The logo should look professionally printed or embroidered into the surface, not pasted on top.",
        "logo_url": "https://public.runflow.io/images/models/runflow/logo-inpaint/examples/1/logo.webp",
        "mask_url": "https://public.runflow.io/images/models/runflow/logo-inpaint/examples/1/mask.png",
        "image_url": "https://public.runflow.io/images/models/runflow/logo-inpaint/examples/1/image.png"
    },
    "callback_url": "https://your-server.com/webhook"
}
JSON
```

## Request parameters

| Parameter      | Type           | Required | Description                                                 |
| -------------- | -------------- | -------- | ----------------------------------------------------------- |
| `input`        | object         | required | Model input parameters. See "Input schema" below.           |
| `callback_url` | string \| null | optional | Webhook URL - POSTed when the run reaches a terminal state. |
| `metadata`     | object \| null | optional | Arbitrary key-value pairs attached to the run.              |

## Input schema

| Field       | Type   | Required | Allowed values | Description                                                                                    |
| ----------- | ------ | -------- | -------------- | ---------------------------------------------------------------------------------------------- |
| `image_url` | image  | required | Any            | URL of the target image. HTTPS required.                                                       |
| `logo_url`  | image  | required | Any            | URL of the logo to place. PNG with transparency preferred.                                     |
| `mask_url`  | image  | required | Any            | URL of a black-and-white mask. White pixels mark the placement zone; black keeps the original. |
| `prompt`    | string | optional | Any            | Optional placement instruction (e.g. 'top-right, 20% width').                                  |

## Output schema

| Field           | Type | Description                                                         |
| --------------- | ---- | ------------------------------------------------------------------- |
| `outputs`       | json | Array of result items with url, type, width, height, content\_type. |
| `seed`          | json | Random seed used (null if N/A).                                     |
| `timing`        | json | Provider timing breakdown (null if not surfaced).                   |
| `nsfw_detected` | json | Provider NSFW flag (null if not surfaced).                          |

## Callback payload

When you provide a `callback_url`, Runflow POSTs to it once the run reaches a terminal state.

| Field          | Type           | Description                                                    |
| -------------- | -------------- | -------------------------------------------------------------- |
| `event`        | string         | Event type: "run.completed", "run.failed", or "run.cancelled". |
| `run_id`       | string         | The unique identifier of the run.                              |
| `status`       | string         | Terminal status: "succeeded", "failed", or "cancelled".        |
| `output`       | object \| null | The run output. Null if the run failed or was cancelled.       |
| `duration_ms`  | number \| null | Total run duration in milliseconds.                            |
| `created_at`   | string \| null | ISO 8601 timestamp when the run was created.                   |
| `completed_at` | string \| null | ISO 8601 timestamp when the run reached terminal state.        |
| `metadata`     | object \| null | The metadata object passed at run creation, if any.            |

* **Retries:** 3 attempts with exponential backoff (1s, 2s). Retries on 5xx / network errors only.
* **Headers:** `Runflow-Request-Id` is always sent. `Runflow-Signature` is sent if a signing secret is configured.

## Additional Resources

* [Playground](https://app.runflow.io/models/runflow/logo-inpaint)
* [API Reference](https://app.runflow.io/models/runflow/logo-inpaint?tab=api)
* [Documentation](https://docs.runflow.io)
* [OpenAPI](https://docs.runflow.io/api/openapi.public.json)

## Related

<CardGroup cols={2}>
  <Card title="Browse all models" icon="grid" href="/models">Browse the catalog.</Card>
  <Card title="Run lifecycle" icon="play" href="/concepts/runs">Callbacks, polling, statuses.</Card>
  <Card title="Callbacks" icon="webhook" href="/concepts/callbacks">Handle async results.</Card>
  <Card title="Pricing" icon="coin" href="/concepts/pricing">How requests bill out.</Card>
</CardGroup>
