You want one thing in a photo changed (the light, the background, an outfit, a line of lettering) from code, with an editor that does not refuse or quietly soften the instruction. This guide covers which edit endpoint to call, what it costs, what it accepts, how to try an edit in the Playground and then from code or an Agent, and what to do when it fails.
Short answer: an image-to-image call is a task on an endpoint whose model ID ends in /edit: send a prompt and a source image and get the edited file back. For one photo and one instruction, start with Qwen Image Edit Spicy: $0.038 per edit, one source, no mask, no strength dial. For several sources in one edit, use Qwen Image 3.0, Seedream 5.0 Pro or Wan 2.7. For a mask, use Qwen Image 2.1 or FLUX.1 Dev LoRA; strength exists only on FLUX.1 Dev LoRA and Z-Image Turbo LoRA.
Prices and limits below are from the live catalogue and documentation, each priced with a free quote.
What “uncensored” means on an edit endpoint
“Uncensored” is the catalogue label for a model that declares no content filter: SpicyAPI adds no platform content scan, and the model decides what comes back. It does not promise every instruction is carried out. Plan for two outcomes:
- A refusal ends the task as
failedwitherrorCode: "content_rejected". The hold on your balance is released in full. - A softened result is a finished image that is milder than you asked for. It is a successful task, so it is billed, and nothing in the response marks it; only looking at the picture catches it.
Some limits apply to every model: no sexualised depiction of a minor in any style, no intimate or sexualised depiction of an identifiable real person without their documented consent (face swap and likeness transfer included), no impersonation, nothing unlawful where you operate. Edit endpoints make the second one easy to break, because the source is often a real photo. Under the acceptable use policy, a public photograph, celebrity status or a prior relationship is not consent, ambiguous-age material is covered by the minors rule, and you must not upload private material you have no right to process.
SpicyAPI does no per-request review, so if your own users upload photos the duties are yours: age assurance, a consent attestation at upload stored with the task ID, refusing sources whose subject's age is unclear, blocking edits of identifiable real people without documented consent, and a way for users to report content. This is not legal advice.
The service is not available in mainland China, Russia, Belarus, Cuba, Iran, North Korea or Syria, nor under the terms in the United Kingdom, Hong Kong, Macau, Saudi Arabia, the United Arab Emirates, Qatar, Kuwait, Bahrain, Oman, Pakistan, Bangladesh, Afghanistan, Indonesia, Malaysia or Brunei; the content and usage policy says the list can grow. Face and head swaps are separate endpoints with their own workflow, covered in the AI face swap API workflow.
Choose the edit endpoint
Endpoints differ in how many sources they take, which extra controls exist, and the shape of the result:
| Endpoint | Sources | Controls besides the prompt | Result shape | Price per image |
|---|---|---|---|---|
Qwen Image Edit Spicy alibaba/qwen-image-spicy-edit/edit | Exactly 1 (image_url) | seed | No size field | $0.038 |
Qwen Image 2 alibaba/qwen-image-2/edit | Exactly 1; prompt up to 800 characters | aspect_ratio, seed | Set by aspect_ratio, default 1:1, does not follow the source | $0.035 |
Qwen Image 3.0 alibaba/qwen-image-3.0/edit | 1 to 3 | negative_prompt, aspect_ratio, resolution (1k or 2k), enable_prompt_expansion (on by default), seed | Set by aspect_ratio, default 1:1 | $0.033 with one source, $0.039 with three |
Seedream 5.0 Pro bytedance/seedream-5.0-pro/edit | 1 to 10 | aspect_ratio, resolution, output_format; no seed | auto (default) picks the ratio nearest the first source | $0.036 at 1k, $0.072 at 2k (the default); +$0.003 per extra source |
Wan 2.7 alibaba/wan-2.7/edit | 1 to 9 | bounding_boxes (up to 2 per image), color_palette, resolution (1k or 2k, same price), num_outputs (1 to 4), seed | Follows the last source unless aspect_ratio is set | $0.03 per output (4 outputs $0.12), the same for 1 to 9 sources |
Qwen Image 2.1 alibaba/qwen-image-2.1/edit | 1 to 10; a mask only works with exactly 1 | mask_url (PNG, JPEG or WebP; one source only), resolution, aspect_ratio, enable_prompt_expansion (on by default), seed | aspect_ratio, default 1:1 | $0.036 at 1k with one source, +$0.012 per extra source; flat $0.048 at 2k; $0.072 at 1.5k |
FLUX.1 Dev LoRA black-forest-labs/flux-1-dev-lora/edit | Exactly 1 | mask_url, strength, steps, guidance_scale, up to 3 LoRAs, seed | Keeps the source's shape | $0.018 |
Prices are quoted amounts for a one-image request. Seedream 5.0 Pro costs twice as much at its default 2k tier as at 1k, and Qwen Image 3.0 adds a charge per source. Qwen Image 2.1's tiers do not rise in order (1.5k quotes above 2k, and 2k is flat across sources), so quote the exact body before budgeting.
The catalogue has more uncensored-labelled editors, such as Seedream 5.0 Flash, Qwen Image 3.0 Pro and Wan 2.7 Pro. GPT Image 2 and 2.5 and Nano Banana edit endpoints carry a Filtered label, so they are the wrong tool when an uncensored result is the point.
One photo, one change. Use Qwen Image Edit Spicy. The whole request is image_url, prompt and an optional seed; the instruction is the only control, so a sentence that names what must stay is also your preservation setting. Its review puts a typical edit at about 21 seconds. Qwen Image 2 is the same idea at a slightly lower price, with a one-source limit and a prompt cap of 800 characters.
Several sources in one edit. A face from one photo, a garment from another, a room from a third: Qwen Image 3.0 (three sources), Seedream 5.0 Pro (ten) or Wan 2.7 (nine). With more than one source the prompt must say which image supplies what. Seedream 5.0 Pro stays nearest the first source's shape by default, Wan 2.7 the last one's, and the Qwen endpoints default to a square: a portrait sent to Qwen Image 3.0 without aspect_ratio comes back 1:1.
Local edits with a mask, or a strength dial. Qwen Image 2.1 and FLUX.1 Dev LoRA take a mask as mask_url, a black-and-white image the size of the source where white is repainted and black is kept. strength (0 to 1, default 0.8, how far the result moves from the source) exists on FLUX.1 Dev LoRA and on Z-Image Turbo LoRA's edit endpoint. Wan 2.7 marks regions differently, with up to two pixel rectangles per image in bounding_boxes.
Content results. Based on our September 2026 public test reports, each editor ran through five content levels, from Mild to Maximum, usually three runs per level. The test prompts are not published.
| Endpoint | Edit runs delivered as asked | Where it fell short |
|---|---|---|
| Qwen Image Edit Spicy | 18 of 18 | None |
| Qwen Image 3.0 | 17 of 17 | None |
| Qwen Image 2.1 | 18 of 18 | None |
| Qwen Image 2 | 16 of 18 | Two of three runs at the Very strong level came back softened |
| Seedream 5.0 Pro | 16 of 17 | One Very strong edit came back as a plain portrait |
| Wan 2.7 | 11 of 15 | One of three delivered at Very strong and at one Maximum probe; the editor is more permissive than the same model's text-to-image |
FLUX.1 Dev LoRA is the cheapest mask-plus-strength route, but its public report covers text-to-image, where the stronger levels came back softened, so try your own content level on a single edit before committing.
Per-model details are on the review pages, for example Seedream 5.0 Pro; Qwen Image Edit uncensored test shows before and after pairs for the Qwen editors.
Local or hosted? With a GPU of at least 8 GB VRAM and bulk edits, running a local model in ComfyUI (Qwen Image Edit or FLUX.2 Klein) is a real option. Hosted makes sense when you do not want to run a GPU, need to call an editor from an app, or prefer paying per image: at $0.018 to $0.072 an image, a hundred edits cost $1.80 to $7.20 before retries.
Try it in the Playground first
The fastest way to see what an editor does with your photo is the Playground on its model page, with no code or key handling.
- Open the Qwen Image Edit Spicy page and stay on the Playground tab, in Form view. Sign in with a funded account to run.
- Under Input image, drop a file in (JPG, PNG, WEBP or GIF, up to 10 MB) or use Asset URL and Add URL for a direct link to the image file.
- In Prompt, say what must stay, then name the one change (the examples in the next section show the wording).
- Optionally set a Seed. Reusing it with the same image and instruction makes two wordings comparable.
- Press Run model and look at the picture in Output before anything else: a softened result is billed like any other.
Other editors have their own fields in the same form, such as extra source images or a mask on Qwen Image 2.1. The JSON view beside Form shows the exact request body, and the code tabs next to it (JavaScript, Python, cURL and others) show the same call, so a setup that works here can be copied into your project.
Then run it from code
Install the Python SDK (pip install spicyapi), set SPICY_API_KEY in your environment, and run one edit. It uploads the photo, shows the price and waits for your yes before creating the task:
import uuid
from spicyapi import SpicyClient, output_assets
client = SpicyClient() # reads SPICY_API_KEY from the environment
MODEL = "alibaba/qwen-image-spicy-edit/edit"
source = client.upload_file("photo.jpg") # or put a public HTTPS link in image_url
body = {
"image_url": source["uri"],
"prompt": "Keep the person, pose, framing and room exactly as they are. "
"Change only the light to warm late-afternoon sun from the window on the left.",
}
quote = client.quote_task(model=MODEL, input_data=body)
print("Estimated", quote["estimatedCost"], "maximum", quote["maxCharge"])
if input("Create the task? [y/N] ").strip().lower() != "y":
raise SystemExit
task = client.create_task(
model=MODEL,
input_data=body,
idempotency_key=str(uuid.uuid4()),
quote_id=quote["quoteId"],
expected_cost=quote["estimatedCost"],
)
print("Resume task:", task["taskId"], flush=True)
final = client.wait_for_terminal(task["taskId"])
if final["state"] != "succeeded":
raise SystemExit(f"{task['taskId']} ended as {final['state']}: {final.get('errorCode')}")
assets = output_assets(final)
if not assets or any(a.get("pending") or a.get("unavailable") or not a.get("url") for a in assets):
raise RuntimeError(f"Task {task['taskId']} has no ready output; check this task before a new run")
print(assets[0]["url"]) # copy the image to your own storage nowThe Python SDK reference and the tasks guide cover everything beyond this one call; a service that should be called back instead of waiting can use webhooks.
Or let an Agent run it
When an assistant should run the edits, all three official tools show the price and ask you before a paid call.
- CLI. Upload the photo, put the returned
spicy://address and your prompt ininput.jsonasimage_urlandprompt, then:
``bash spicyapi files upload photo.jpg spicyapi tasks create --model alibaba/qwen-image-spicy-edit/edit --input-file input.json --wait ``
See the CLI docs; npx @spicyapi/cli works without installing.
- MCP server. Add the MCP server to your assistant, then ask: "Edit /path/to/photo.jpg with Qwen Image Edit Spicy: keep the person, pose and room, change only the light to warm late-afternoon sun." It uploads the file with
spicyapi_upload_file, callsspicyapi_task_create, which stops for your price confirmation, thenspicyapi_task_wait. - Skill.
npx skills add spicyapi-ai/spicy-skillinstalls the Agent Skill, which has a coding assistant read the live model schema instead of guessing fields.
What you can send, and what it costs
A source image can reach the task three ways:
- A public HTTPS URL, no upload needed. It must return the image file itself without credentials; a cloud-drive or album share page is a web page and is refused with a 400.
- A small inline image, written as
data:image/png;base64,...in the same field. It must be JPEG, PNG, WebP or GIF, at most 1 MiB decoded and 8192 pixels on a side. - An upload, for anything larger or private: JPEG, PNG, WebP or GIF up to 10 MiB. Uploading is free; you pay only for the task that uses the file. The upload returns a
spicy://URI valid for one day.
Qwen Image 2 accepts only JPEG, PNG and WebP. Fields differ between endpoints: Qwen Image Edit Spicy and FLUX.1 Dev LoRA take one image_url string, while the rest take an image_urls array, and an endpoint rejects a field it does not list rather than ignoring it.
Cost depends on the resolution tier, the number of sources and, on Wan 2.7, num_outputs; the price shown before you confirm covers your exact request. See quotes and the media guide.
Other endpoints: only the input changes
Models that take an array use image_urls, and with more than one source the prompt carries the roles. Use the same code with the model ID and body below:
{
"model": "alibaba/qwen-image-3.0/edit",
"input": {
"prompt": "Use the person from the first image and the jacket from the second. Keep her face, hair and pose from the first image. Change nothing else.",
"image_urls": ["spicy://f/fil_...", "spicy://f/fil_..."],
"aspect_ratio": "3:4",
"resolution": "2k"
}
}A masked edit on FLUX.1 Dev LoRA adds the mask and the strength to a single-source body:
{
"model": "black-forest-labs/flux-1-dev-lora/edit",
"input": {
"prompt": "A black satin jacket with a high collar, same light as the rest of the photo.",
"image_url": "spicy://f/fil_...",
"mask_url": "spicy://f/fil_...",
"strength": 0.9,
"seed": 7
}
}Lower strength stays closer to the original; the default is 0.8. Copy field values from the live schema on each model page; the image generation guide explains how the image endpoints differ.
Write the instruction: what stays, then what changes
An editing endpoint redraws whatever you do not pin down: say first what must stay identical, then name the one change. Listing more preserved elements costs nothing extra. On Qwen Image 3.0 and 2.1 set enable_prompt_expansion to false for a faithful edit; it is on by default and rewrites the prompt into a fuller scene description, which can dilute a preservation sentence.
- Light only: “Keep the person, pose, framing and room exactly as they are. Change only the light to warm late-afternoon sun from the window on the left. Keep the colour grade and film grain.”
- Background only: “Keep the subject, outfit and crop. Replace the studio wall with dark theatre curtains. Add no logos or text.”
- Several sources: “Use the person from the first image, the jacket from the second and the street from the third. Keep her face and pose from the first image. Change nothing else.”
Change one thing per pass; combined restyle-and-retype edits are where identity drifts. When the result misses:
| What you see | Likely cause | Next try |
|---|---|---|
| The result is square or reframed | aspect_ratio defaults to 1:1 on Qwen Image 2, 2.1 and 3.0 | Send the source's ratio explicitly |
| The face is close but not hers after a merge | The prompt does not say which source owns the face; more sources give more room to drift | Use fewer sources, name the face source in the first sentence, change one thing per pass |
| Furniture or windows moved though you did not ask | Qwen Image 2's report notes complex edits can rebuild the room | Split into two passes; list the objects that must stay |
| A milder or plainer picture than you asked for | A softened result; the task still succeeded | Re-read the prompt for one clear change, or move to an endpoint with a better test record for that level |
| Lettering on a sign comes out wrong | Short strings work best | Quote the old text and the new text in the sentence; leave dense copy to Qwen Image 3.0 |
When it fails
These are the failures specific to editing; branch on the numeric code or the task's errorCode, not the message text.
| What you see | What it means | What to do |
|---|---|---|
400 strength: is not a supported field | The field belongs to another endpoint; unknown fields are refused, not ignored | Remove it, or use FLUX.1 Dev LoRA if you need it |
400 image_urls: must contain at most 1 items | Qwen Image 2 and the Spicy editor take one source | Send one, or pick a multi-source endpoint |
400 Reference asset not found or does not belong to this account | A spicy:// URI that is not committed, has expired or belongs to another account | Upload the file again |
400 The file linked in image_urls was not found or ... opens a web page | The HTTPS link is wrong, offline or a viewer page | Use a direct link to the file, or upload it |
Task failed, invalid_asset | The HTTPS link was a viewer page or has expired | Upload the file and create a new task with the new URI |
Task failed, content_rejected | The model declined the content | Do not resend unchanged; change the prompt or the model. Check settled and cost |
Balance, timeout and other general errors are in the error reference.
What happens to the files
Uploaded photos stay for one day and results for up to 14 days, so copy a result you want to keep into your own storage as soon as the task succeeds. If a photo should not sit on the platform that long, the retention documentation shows how to shorten the window or destroy a finished task's media and prompt. See also temporary uploads and durable media delivery and the image and video API starter guide.
FAQ
Is there an uncensored image-to-image API with a strength setting?
Yes: FLUX.1 Dev LoRA (strength 0 to 1, default 0.8, plus an optional mask) and Z-Image Turbo LoRA's edit endpoint. On the others the instruction is the control, and sending strength returns 400 strength: is not a supported field.
Do I have to upload the photo?
No. A public HTTPS link or an inline image up to 1 MiB works; upload when the file is larger or private.
Does a refused or failed edit cost money?
Normally no: a failed task releases the whole hold and a creation error charges nothing. A softened result is a finished image and is billed.
Will the edit keep the face and the pose?
Not by guarantee. Name what stays, change one thing per pass and use one source where possible. Seedream 5.0 Pro kept the person through relights and re-dressing but placed a face less accurately when merging a person into a new set from a second photo; Qwen Image 2 handled simple edits cleanly but rebuilt some furniture in complex ones.
Can I edit a photo of a real person?
Only with that person's documented consent, and never sexualised without it. This applies to every model; keep the consent record in your own system.
Which endpoint should I start with?
Qwen Image Edit Spicy for one photo and one change; switch only when the job needs several sources, a mask or strength. Run one edit first and look at the picture before you change endpoint.
Where to go from here
Run one edit in the Playground with a harmless test photo and read the price before you confirm; then pick the resolution tier you will pay for and decide whether production should use a webhook instead of waiting.
For the Spicy editor's prompting in detail, read the Qwen Image Edit Spicy source-preservation workflow. To compare editors for existing images beyond the API, see best uncensored AI image editors. The uncensored image API catalogue lists every callable image model with its content label and live price.












