Kolors Virtual Try On - Free Change Clothes with AI Online | Kling v1.5
Virtual try-on model for fashion e-commerce. Composites a garment onto a person in a photo using Kling Kolors v1.5.
Endpoint
fal-ai/kling/v1-5/kolors-virtual-try-on
Cost: $0.07 / generation
Best for: Garment-on-model compositing, fashion e-commerce
About the Model
Kling Kolors Virtual Try-On v1.5 is a commercial-grade virtual try-on model developed by Kuaishou as part of the Kling image generation suite. It uses diffusion-based inpainting to realistically composite a garment onto a person: preserving the model's pose, skin tone, and body shape while accurately rendering fabric texture, color, and fit.
The model is image-in, image-out. It takes a photo of a person and a photo of a garment, and returns a single composited result. It is optimized for fashion e-commerce use cases and is cleared for commercial use.
Kolors refers to the underlying image generation backbone, which is Kuaishou's proprietary text-to-image model trained on a large Chinese and multilingual dataset. In the context of virtual try-on, the Kolors backbone handles perceptual quality and photorealism, while the Kling v1.5 wrapper handles garment alignment and pose conditioning.
Quick Start
JavaScript / Node.js
npm install --save @fal-ai/client
export FAL_KEY="YOUR_API_KEY"
import { fal } from "@fal-ai/client";
const result = await fal.subscribe("fal-ai/kling/v1-5/kolors-virtual-try-on", {
input: {
human_image_url: "https://example.com/person.jpg",
garment_image_url: "https://example.com/shirt.jpg"
},
logs: true,
onQueueUpdate: (update) => {
if (update.status === "IN_PROGRESS") {
update.logs.map((log) => log.message).forEach(console.log);
}
},
});
console.log(result.data.image.url); // output image URL
Python
export FAL_KEY="YOUR_API_KEY"
import fal_client
def on_queue_update(update):
if isinstance(update, fal_client.InProgress):
for log in update.logs:
print(log["message"])
result = fal_client.subscribe(
"fal-ai/kling/v1-5/kolors-virtual-try-on",
arguments={
"human_image_url": "https://example.com/person.jpg",
"garment_image_url": "https://example.com/shirt.jpg"
},
with_logs=True,
on_queue_update=on_queue_update,
)
print(result["image"]["url"]) # output image URL
Schema
| Parameter | Type | Description |
|---|
human_image_url | string | URL of the person photo. Front-facing, clear body visibility recommended. |
garment_image_url | string | URL of the garment photo. Flat lay with clean edges and no background preferred. |
sync_mode | boolean | If true, returns the image directly in the response instead of via queue. |
{
"human_image_url": "https://example.com/person.jpg",
"garment_image_url": "https://example.com/shirt.jpg"
}
Output
| Field | Type | Description |
|---|
image.url | string | URL of the generated try-on image |
image.width | integer | Image width in pixels |
image.height | integer | Image height in pixels |
image.content_type | string | MIME type (e.g. image/png) |
image.file_name | string | File name |
image.file_size | integer | File size in bytes |
{
"image": {
"url": "https://v3.fal.media/files/panda/Hoy3zhimzVKi3F2uoGBnh_result.png",
"width": 768,
"height": 1024,
"content_type": "image/png",
"file_name": "result.png",
"file_size": 595094
}
}
Note: The output is a single image object, not an array. Access the URL at result["image"]["url"] (Python) or result.data.image.url (JS), not result[0].
Strengths and Limitations
Works well with:
- Upper body garments (shirts, jackets, tops)
- Simple silhouettes
- Front-facing models
Known limitations:
- Struggles with garment type switching (e.g. swapping a skirt for pants)
- Complex layering may not render accurately
Person photo:
- Front-facing pose
- Full or upper-body visibility
- Minimal occlusion (arms not crossed, etc.)
Garment photo:
- Flat lay or model shot with clean edges
- White or plain background preferred
- Avoid heavy shadows or folds
File Handling
You can pass images as public URLs or upload them via the client:
// Upload a local file and use the returned URL
const file = new File([fileData], "garment.jpg", { type: "image/jpeg" });
const url = await fal.storage.upload(file);
url = fal_client.upload_file("path/to/garment.jpg")
Base64 data URIs are also accepted, though they may slow down large requests.
Queue (Long-running Requests)
For async usage, submit to the queue and poll for results:
const { request_id } = await fal.queue.submit("fal-ai/kling/v1-5/kolors-virtual-try-on", {
input: { human_image_url: "...", garment_image_url: "..." },
webhookUrl: "https://your-webhook.url/results", // optional
});
const status = await fal.queue.status("fal-ai/kling/v1-5/kolors-virtual-try-on", {
requestId: request_id,
logs: true,
});
const result = await fal.queue.result("fal-ai/kling/v1-5/kolors-virtual-try-on", {
requestId: request_id,
});
If this model doesn't fit your use case, consider:
fal-ai/leffa/virtual-tryon
fal-ai/image-apps-v2/virtual-try-on