# edit_image (https://sellersheetai.com/docs/mcp-api/tools/edit_image)

> Edit one image, or compose 2–10 into one, from a text instruction (1 input = revise, 2 or more = compose): background swaps, style transfer, object add/remove, composites.

Access: **WRITE** · toolset sellersheet · family null

Returns a job receipt — poll check_image_job until status is 'done', then read cdn_url and revised_prompt (the drift signal). Priced per delivered image (credits_quote gives the number; HTTP 402 with error_code insufficient_credits when the balance is short — top up at sellersheetai.com/billing); a failure is refunded.

## Call it

MCP tool call:

```json
{
  "name": "edit_image",
  "arguments": {
    "prompt": "<prompt>",
    "image_sources": []
  }
}
```

Tool API (early access — contact us):

```bash
curl -X POST https://api.sellersheetai.com/api/v1/tools/edit_image \
  -H "Authorization: Bearer $SELLERSHEET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"<prompt>","image_sources":[]}'
```

## Arguments

| Name | Type | Required | Description |
|---|---|---|---|
| `prompt` | string | yes | the edit or composition instruction; for a restyle, the adapted json_prompt from reverse_prompt, stringified. Restate the preserve-list every turn ("change only X; keep geometry, branding, text and camera identical") and index several inputs ("Image 1 = master, Image 2 = colour reference only"). |
| `image_sources` | object[] | yes | 1–10 sources — a public URL (a Drive link must be shared 'anyone with the link') or base64; for a refinement turn, the previous turn's cdn_url. |
| `provider` | string |  | 'openai' (default; up to 10 inputs + mask) \| 'nanobanana' (first image only; priced at its ~1K canvas) \| 'both'. |
| `size` | string |  | '2048x2048' (default; best for Amazon zoom) \| '1536x1536' \| '1024x1024' \| '1024x1536' \| '1536x1024'. |
| `quality` | string |  | 'low' \| 'medium' \| 'high' (default). |
| `mask_source` | string |  | optional PNG mask (transparent = edit area). Applied as a real mask only when the user's model route has a mask-capable model (get_user_context data.credits.routes[key = data.credits.route].answers.image_mask non-null); otherwise the server describes the painted box in the instruction and runs the edit unmasked (check_image_job's data.mask = 'described' — check the result stayed inside the area), and a route that cannot edit at all is refused before billing. For exact masked edits switch route on Billing & Credits. |
| `output_format` | string |  | 'png' \| 'jpeg' \| 'webp'; omit and the server decides (currently jpeg). |
| `synthetic_performer` | boolean |  | Amazon's contains-synthetic-performer disclosure (XMP metadata in the upload); omit and the server infers it from the prompt; true or false overrides. set_synthetic_performer toggles it later without regenerating. |
| `store` | string |  | the store ref `<store>-<CC>` (name-country, e.g. 'myStore-US') — one of get_user_context's store_refs, verbatim. Required. |
| `parent_sku` | string |  | the family SKU; defaults to sku. |
| `sku` | string |  | the child SKU. Required. |
| `slot` | string |  | the Image Library slot: 's0'–'s8' (PDP) or 'a1'–'a5' / 'p1'–'p5' (A+). Required. |
| `filename_prefix` | string |  | upload filename prefix. |

## Result

- `data.job_id` — the receipt — poll check_image_job.

## Gotchas

- store, sku and slot are required — a call missing one is refused (400) before anything is charged. A single edit takes ~60–120 s (openai) or ~10–30 s (nanobanana), a compose 2–5 minutes. Never resubmit a 'processing' job (a resubmit is a new, billed job); re-run only on status 'error'.