Appy Pie’s Virtual Try-On API allows you to overlay garments onto a background image, enabling a seamless virtual fitting experience. This guide provides all the necessary details to integrate, authenticate, and effectively use the API.
To access this Kolors Virtual-Try-On API, you must subscribe and acquire an Subscription Key. Include this key in the request header to authenticate and gain access.
Content-Type | Set to application/json |
---|---|
Cache-Control | Recommended to set to no-cache |
Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Base URL: https://gateway.appypie.com/kling-ai-vton/v1/getVirtualTryOnTask
API Parameters: The API POST- https://gateway.appypie.com/kling-ai-vton/v1/getVirtualTryOnTask takes the following parameters:
Parameters | Type | Required | Description |
human_image | string | Yes | Accepts a Base64-encoded string or image URL (e.g., https://storage.googleapis.com/imagesai.appypie.com/testing/00034_00.jpg). For Base64, submit the string without prefixes like data:image/png;base64. |
image_tail | string | optional | Defaults to null. Accepts a Base64-encoded string or image URL. Similar to human_image, avoid prefixes when using Base64. |
callback_url | string | optional | Defaults to None. A callback URL for task status updates. If provided, the server sends notifications when the task status changes. See "Callback Protocol" for details. |
JSON
{ "human_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/vt_human.jpg", "cloth_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/vt_top.jpeg", "callback_url": "" }
POST https://gateway.appypie.com/kling-ai-vton/v1/getVirtualTryOnTask HTTP/1.1 Content-Type: application/json Cache-Control: no-cache { "human_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/vt_human.jpg", "cloth_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/vt_top.jpeg", "callback_url": "" }
import urllib.request, json try: url = "https://gateway.appypie.com/kling-ai-vton/v1/getVirtualTryOnTask" hdr ={ # Request headers 'Content-Type': 'application/json', 'Cache-Control': 'no-cache', } # Request body data = data = json.dumps(data) req = urllib.request.Request(url, headers=hdr, data = bytes(data.encode("utf-8"))) req.get_method = lambda: 'POST' response = urllib.request.urlopen(req) print(response.getcode()) print(response.read()) except Exception as e: print(e)
// Request body const body = { "human_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/vt_human.jpg", "cloth_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/vt_top.jpeg", "callback_url": "" }; fetch('https://gateway.appypie.com/kling-ai-vton/v1/getVirtualTryOnTask', { method: 'POST', body: JSON.stringify(body), // Request headers headers: { 'Content-Type': 'application/json', 'Cache-Control': 'no-cache',} }) .then(response => { console.log(response.status); console.log(response.text()); }) .catch(err => console.error(err));
curl -v -X POST "https://gateway.appypie.com/kling-ai-vton/v1/getVirtualTryOnTask" -H "Content-Type: application/json" -H "Cache-Control: no-cache" --data-raw "{ \"human_image\": \"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/vt_human.jpg\", \"cloth_image\": \"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/vt_top.jpeg\", \"callback_url\": \"\" }"
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import java.io.UnsupportedEncodingException; import java.io.DataInputStream; import java.io.InputStream; import java.io.FileInputStream; public class HelloWorld { public static void main(String[] args) { try { String urlString = "https://gateway.appypie.com/kling-ai-vton/v1/getVirtualTryOnTask"; URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //Request headers connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Cache-Control", "no-cache"); connection.setRequestMethod("POST"); // Request body connection.setDoOutput(true); connection .getOutputStream() .write( "{ \"human_image\": \"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/vt_human.jpg\", \"cloth_image\": \"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/vt_top.jpeg\", \"callback_url\": \"\" }".getBytes() ); int status = connection.getResponseCode(); System.out.println(status); BufferedReader in = new BufferedReader( new InputStreamReader(connection.getInputStream()) ); String inputLine; StringBuffer content = new StringBuffer(); while ((inputLine = in.readLine()) != null) { content.append(inputLine); } in.close(); System.out.println(content); connection.disconnect(); } catch (Exception ex) { System.out.print("exception:" + ex.getMessage()); } } }
$url = "https://gateway.appypie.com/kling-ai-vton/v1/getVirtualTryOnTask"; $curl = curl_init($url); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); # Request headers $headers = array( 'Content-Type: application/json', 'Cache-Control: no-cache',); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); # Request body $request_body = '{ "human_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/vt_human.jpg", "cloth_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/vt_top.jpeg", "callback_url": "" }'; curl_setopt($curl, CURLOPT_POSTFIELDS, $request_body); $resp = curl_exec($curl); curl_close($curl); var_dump($resp);
JSON
HTTP/1.1 200 OK { "code": 0, "message": "SUCCEED", "request_id": "ChBRS2c7DlgAAAAAAAIzCw", "data": { "task_id": "ChBRS2c7DlgAAAAAAXXXX", "task_status": "submitted", "created_at": 1731928289693, "updated_at": 1731928289693 } }
To verify the completion status of your image request and retrieve the image URL, make a follow-up API call using the task_id provided in the initial response.
Base URL: https://gateway.appypie.com/lumalabs-ai-polling/v1/getStatus
Content-Type | Set to application/json |
---|---|
Cache-Control | Recommended to set to no-cache |
API Parameters: The API POST- https://gateway.appypie.com/kling-ai-polling/v1/getVirtualTryOnStatus takes the following parameters:
Parameters | Type | Required | Description |
task_id | string | Yes | A task_id is a unique identifier provided by the Kolors Virtual Try-On API in the initial response to track the progress of your request. |
Pass the task_id received from the initial response in your request body.
JSON
{ "task_id":"task_id" }
POST https://gateway.appypie.com/kling-ai-polling/v1/getVirtualTryOnStatus HTTP/1.1 Content-Type: application/json Cache-Control: no-cache { "task_id": "task_id" }
import urllib.request, json try: url = "https://gateway.appypie.com/kling-ai-polling/v1/getVirtualTryOnStatus" hdr ={ # Request headers 'Content-Type': 'application/json', 'Cache-Control': 'no-cache', } # Request body data = data = json.dumps(data) req = urllib.request.Request(url, headers=hdr, data = bytes(data.encode("utf-8"))) req.get_method = lambda: 'POST' response = urllib.request.urlopen(req) print(response.getcode()) print(response.read()) except Exception as e: print(e)
// Request body const body = { "task_id": "task_id" }; fetch('https://gateway.appypie.com/kling-ai-polling/v1/getVirtualTryOnStatus', { method: 'POST', body: JSON.stringify(body), // Request headers headers: { 'Content-Type': 'application/json', 'Cache-Control': 'no-cache',} }) .then(response => { console.log(response.status); console.log(response.text()); }) .catch(err => console.error(err));
curl -v -X POST "https://gateway.appypie.com/kling-ai-polling/v1/getVirtualTryOnStatus" -H "Content-Type: application/json" -H "Cache-Control: no-cache" --data-raw "{ \"task_id\": \"task_id\" }"
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import java.io.UnsupportedEncodingException; import java.io.DataInputStream; import java.io.InputStream; import java.io.FileInputStream; public class HelloWorld { public static void main(String[] args) { try { String urlString = "https://gateway.appypie.com/kling-ai-polling/v1/getVirtualTryOnStatus"; URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //Request headers connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Cache-Control", "no-cache"); connection.setRequestMethod("POST"); // Request body connection.setDoOutput(true); connection .getOutputStream() .write( "{ \"task_id\": \"task_id\" }".getBytes() ); int status = connection.getResponseCode(); System.out.println(status); BufferedReader in = new BufferedReader( new InputStreamReader(connection.getInputStream()) ); String inputLine; StringBuffer content = new StringBuffer(); while ((inputLine = in.readLine()) != null) { content.append(inputLine); } in.close(); System.out.println(content); connection.disconnect(); } catch (Exception ex) { System.out.print("exception:" + ex.getMessage()); } } }
$url = "https://gateway.appypie.com/kling-ai-polling/v1/getVirtualTryOnStatus"; $curl = curl_init($url); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); # Request headers $headers = array( 'Content-Type: application/json', 'Cache-Control: no-cache',); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); # Request body $request_body = '{ "task_id": "" }'; curl_setopt($curl, CURLOPT_POSTFIELDS, $request_body); $resp = curl_exec($curl); curl_close($curl); var_dump($resp);
Upon successful polling, the API returns a response indicating the video generation status and the URL of the generated video if it is complete.
JSON
{ "code": 0, "message": "SUCCEED", "request_id": "Cji7DWc7DlsAAAAAAALyfg", "data": { "task_id": "ChBRS2c7DlgAAAAAAAXXXX", "task_status": "succeed", "task_status_msg": "", "task_info": {}, "task_result": { "images": [{ "index": 0, "url": "https://cdn.klingai.com/bs2/upload-kling-api/7128237050/virtualTryOn/ChBRS2c7DlgAAAAAAAIzCw-0.png" }] }, "created_at": 1731928289693, "updated_at": 1731928309425 } }
Kolors Virtual Try-On API provides specific HTTP status codes and detailed response bodies to indicate the outcome of a request. Developers should implement robust error handling in their applications to process these responses effectively and ensure a seamless user experience.
Status Code | Description | Response Body |
200 | Success - The request was successfully processed, and the image generation is in progress or completed. | { "msg": "Image Getting Created", ... } |
400 | Bad Request - The request contains invalid parameters or missing fields. | { "error": "Invalid request parameters" } |
401 | Unauthorized - The provided subscription key is missing or invalid. | { "error": "Invalid or missing authentication" } |
403 | Forbidden - The subscription does not have access to this API or action. | { "error": "Access denied for this operation" } |
404 | Not Found - The requested resource or endpoint could not be found. | { "error": "Endpoint not found" } |
429 | Too Many Requests - The request rate limit has been exceeded. | { "error": "Rate limit exceeded, please retry later" } |
500 | Internal Server Error - An unexpected error occurred on the server. | { "error": "An unexpected error occurred, please try again later" } |
{ "task_status": "failed", "task_status_msg": "task not found" }
This documentation outlines all the key details needed to effectively utilize Kolors Virtual Try-On API. Ensure that you replace YOUR_SUBSCRIPTION_KEY with the actual key provided upon subscribing to the service.