Skip to main content

Qwen Image 2.1 LoRA text-to-image renders a prompt of up to 5,000 characters with up to three of your own LoRA weights, each at a strength from 0 to 4. Choose 1k, 1.5k or 2k in fifteen aspect ratios, with no review of the weights.

From $0.03/image

Workbench

Input

Text to image
445/5000
Up to 5,000 characters. There is no negative prompt on this family, so exclusions belong here too. When a LoRA is loaded, keep the prompt describing the scene and let the weights carry the style or the character — restating what the LoRA already knows tends to fight it. at least 1 characters · at most 5000 characters
Composes the frame before generation rather than cropping afterwards. Fifteen options, from 3:1 and 21:9 strips to 1:3 and 9:21 columns. All ratios cost the same.
affects price
Sets output size and price: 1k default, 1.5k in between, 2k where skin texture and fabric hold together. Iterate at 1k, promote the keeper to 2k.
Style LoRAs1/3

2512 Storybook Anime

Up to three weight files, each {path, scale}. path is a direct HTTPS URL to a .safetensors file or a Hugging Face repository — nothing is uploaded to us and nothing is reviewed. scale runs 0 to 4, where 1 is neutral. The file is fetched at generation time, so the first call with new weights is slower: a 1.2 GB LoRA added roughly 25 seconds in our testing. Weights built for a different base can load silently and do almost nothing — verify a new LoRA visibly changes the output before trusting a batch to it. at most 3 items
Output format
JPEGPNGWebP
JPEG by default; PNG for compositing, WebP to ship straight to a page. Does not change the price or the render.
Seed
Steadies a draw so a series stays in the same neighbourhood. Not a reproduction guarantee — the same prompt and seed twice returned two different frames in our testing. no lower than 0 · no higher than 2147483647
Safety checkerOff

SpicyAPI does not run a safety checker on this model. Your prompt and media go to the model as written, and the model itself decides what comes back.

Checking your account before enabling submission and pricing.

Output

Ready for a new run
window-seat-sweater-loraExample result

Related models and next tasks

Missing the model you need?

Tell us what to add and where you would use it. Requests go to the people who decide what gets onboarded next.

A weights URL is a dependency, not a parameter

Qwen Image 2.1 LoRA renders a prompt with up to three of your own weight files loaded on top of the base model, and every one of those files is fetched at generation time from a link you host. Nothing about that link is checked when the request is accepted, so a typo, an expired signature and a repository that went private all come back later as the same unexplained failure. This page is about the half of the integration that sits on your side of the URL: how to tell a dead link from an ill-fitting weight, and what the request shape and the quote actually depend on.

Open the playground
A weights URL is a dependency, not a parameter
LoRA entries
Up to 3 per request, each {path, scale}; scale runs 0 to 4 and defaults to 1
Weights source
A direct HTTPS link to a .safetensors file, or a Hugging Face repository
Link validation
None at submit time; a bad path surfaces later as a failed task
Quote dimensions
Resolution tier only — one entry and three quote the same
Request shape
prompt required, 5,000 characters; plus ratio, tier, container and seed
Content declaration
No maturity flag, and no review of the weights you point at
Failure shape
The link is read when the job runs, not when it is acceptedA request carrying an unreachable or misspelled path is accepted like any other and hands back a task handle. The failure lands at inference and names no cause — nothing in it points at the file — so the diagnosis has to start from your side. A task that fails this way is not billed, which makes a probe cheap but does not make it obvious.
Evidence
Wall-clock time is the signal that weights were really fetchedThe file is pulled before any pixels are produced, so a loaded call runs measurably longer than a bare one. In our own testing a render with the array empty finished in eight to eleven seconds, while the same prompt with weights loaded took twenty-nine seconds in one test and thirty-seven in another, the longer one being a 1.18 GB file.
Slots
Three entries cost exactly what one doesThe quote on this endpoint moves with the resolution tier and nothing else, so a request carrying three weight files prices the same as one carrying a single file. There is no saving in loading fewer of them. The reason to add them one at a time is being able to say which file did what, not the bill.

Integrating the Qwen Image 2.1 LoRA API

Tell a dead link apart from a weight that does not fit

Tell a dead link apart from a weight that does not fit

Two very different problems look identical on screen when the picture comes back unchanged, and the duration separates them. A call that finishes at baseline speed fetched nothing, so the path is the suspect. A call that ran long and still produced an unmoved frame loaded the file successfully — what happened next is a question of which generation of the base model those weights were trained against, and how hard they assert themselves on this one.

Keep one known-good weight as a canary

Keep one known-good weight as a canary

Because the failure message names no cause, the fastest way to split your problem from ours is a second request that loads a file you have already watched work. If the canary renders and the new path fails, the link is the only difference. If both fail, the cause sits above both of them. Keep that canary URL in the same configuration as the rest of the deployment, not in somebody's notes.

  • Host weights the way you host static assets

    The file is fetched at generation time from wherever you point, which puts availability, bandwidth and link lifetime inside your integration rather than ours. Signed links that expire, repositories that turn private and branches that move all become failed tasks eventually. A stable, publicly reachable address with a version in the path is the shape that survives a year.

  • Every field except loras belongs to the base family

    Prompt length, the fifteen aspect ratios, the three resolution tiers, the output containers and the seed range are identical to Qwen Image 2.1, and the schema rejects anything it does not declare. Moving a working request over from the base family means attaching one array, not rewriting the body — and moving back means removing it.

  • Uncensored weights need no second switch

    There is no maturity flag on the request and no review step in front of the array, so uncensored weights load through the same two fields as any other file and the prompt is read the same way. We ran that path ourselves rather than inferring it from a policy page: the weights were fetched, the request completed, and nothing was refused or quietly substituted along the way.

Who calls the Qwen Image 2.1 LoRA API

  • Fail fast on the link before you fail slowly on the task

    Teams wiring this into a service

    Fail fast on the link before you fail slowly on the task

    A single request against the weights URL at deploy time costs nothing and catches the whole class of errors that would otherwise arrive minutes later as an unexplained failure. Check it where the service checks its other external dependencies, not inside the request path, and treat a change of URL as a change of configuration.

  • Spend the first call on a question you can answer

    Anyone evaluating new weights

    Spend the first call on a question you can answer

    Give a new file a prompt whose result you would recognise instantly, at the default tier, and watch the duration as closely as the picture. That one call answers whether the file was reachable and whether it has any grip at all — the two things the error message will never tell you, and the two things everything afterwards depends on.

  • Pin the file, not just the repository

    Studios running a fixed stack

    Pin the file, not just the repository

    Weights that move under an unchanged address change your output without changing your code, and nothing in the response will mention it. Point at something immutable — a revision, a release tag, a copy in your own bucket — so that a render from last month can still be explained by the inputs it was made with.

  • Attach one array and change nothing else

    Coming over from the base family

    Attach one array and change nothing else

    The base family and this one publish the same fields apart from loras, so an existing request body runs here as it stands once the array is added. Send the same prompt and seed both ways and read the pair: the difference between the two frames is the whole contribution of the weights, which is hard to see in a single image.

How to call the Qwen Image 2.1 LoRA API

  1. Put the weights somewhere that stays reachable

    path takes a direct HTTPS link to a .safetensors file or a Hugging Face repository. Nothing is uploaded here and nothing is kept on our side, so the file has to be live at the moment the job runs — which is later, and sometimes much later, than the moment you send the request.

  2. Send one entry before you send three

    Start with a single {path, scale} object so the first result has exactly one explanation behind it. The array accepts three and the quote does not move with the count, but a picture produced by three unfamiliar files is a picture you cannot reason about or repeat.

  3. Time the first call and write the number down

    The fetch happens before generation, so the first request with a new file runs noticeably longer than a bare one. That number is the baseline for that file. Later calls that never rise above the empty-array timing are telling you something about the link rather than about the weights.

  4. Submit the task and poll for a terminal state

    The endpoint is asynchronous: the response carries a handle and the image arrives afterwards. Poll until the task reaches a terminal state, then read the image from the result, which is served from platform storage rather than from wherever the weights were fetched.

  5. Raise the resolution tier last

    The tier is the one field that moves the quote here, so iterate at the default while the wording and the weights are both still moving, and re-send the settled request at a higher tier once there is something worth delivering. Nothing about the array has to be revisited when you do.

Qwen Image 2.1 LoRA integration patterns

  • A baseline and a loaded call, one field apart

    Send the prompt once with loras empty and once with a single entry at the default strength, holding the seed and everything else. Two frames and two durations from identical wording is the smallest experiment that answers both questions at the same time.

    Full-length studio portrait of a woman in a tailored charcoal coat, plain seamless backdrop, soft key light from the left, sharp focus on the weave of the fabric
  • A style weight under a described scene

    Let the prompt carry the scene and let the file carry the treatment. Writing the look out in words as well tends to pull the render in two directions and produce something that resembles neither.

    A rain-slicked side street at night seen from across the road, one lit shopfront, reflections stretching across the wet asphalt, no people in frame
  • The same request on a much wider frame

    The ratio is chosen before generation rather than cropped after it, so weights that read well square do not automatically read well in a strip. Re-send the settled request on the widest ratio you actually intend to deliver.

    A long marble counter running the full width of the frame, rows of glassware catching a single overhead light, deep shadow at both ends

Qwen Image 2.1 LoRA integration questions

Before you wire it in

Treat the weights URL as an external dependency of your service rather than as one more parameter in a request body. Resolve it where you check your other dependencies, pin it to something immutable, and keep one file you have already watched work so that any failure can be split into yours or ours in a single call. On the request itself: add one entry at a time, read the duration alongside the picture, and leave the resolution tier alone until the wording and the weights have both stopped moving.