Build AI fashion experiences with the Vrool Fashion Makeover API. Commercial, credit-metered, and production-ready.
The Vrool Fashion Makeover API dresses a person photo in the clothing you supply and returns a realistic AI-generated image. It is designed for ecommerce stores, marketplaces, fashion apps and agencies who want virtual try-on without running their own AI.
Send a customer photo plus your product image. The API returns the customer realistically wearing that product.
person_imagetop_imageimage_base64Add bottom_image, shoes_image or outfit_image to dress the full look. The person's face, pose and background are preserved β only the clothing changes.
The Fashion Makeover API powers virtual try-on anywhere your customers shop.
Let shoppers see clothes on themselves on product pages before they buy.
Add try-on to listings so buyers visualise second-hand and new items.
Build virtual fitting rooms and outfit builders inside your app.
Generate shareable "wear the look" content for ads and UGC.
Show AI recommendations on the actual customer for higher conversion.
Help customers pick the right look first time and cut return rates.
POST https://vrool.com/api/v1/fashion/makeover
Also reachable at: https://vrool.com/content/plugins/vrool_ai/api/makeover.php
All requests use HTTPS. The same endpoint serves sandbox and live traffic β the key you use decides the mode.
Every request needs your public key and secret key. Send them in the Authorization header:
Authorization: Bearer PUBLIC_KEY:SECRET_KEY
Or as separate headers:
X-Api-Key: PUBLIC_KEY
X-Api-Secret: SECRET_KEY
Keep your secret key server-side. Never expose it in browsers or mobile apps. If a key leaks, rotate or revoke it instantly in the Developer Portal.
| Sandbox | Live | |
|---|---|---|
| Key prefix | vk_test_ | vk_live_ |
| Credits | 5 free on signup | Purchased credits |
| Real image output | Yes | Yes |
| Use for | Testing / integration | Production traffic |
The response includes a "mode" field so you always know which key handled the request.
Send a person image plus one or more garment images. Each image can be a public HTTPS URL or a base64 data URI.
curl -X POST https://vrool.com/api/v1/fashion/makeover \
-H "Authorization: Bearer PUBLIC_KEY:SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"person_image": "https://yourcdn.com/user.jpg",
"top_image": "https://yourcdn.com/top.jpg",
"bottom_image": "https://yourcdn.com/jeans.jpg",
"shoes_image": "https://yourcdn.com/trainers.jpg",
"attributes": { "gender": "female", "notes": "" }
}'
| Field | Type | Required | Description |
|---|---|---|---|
person_image | string | Yes | Photo of the person. HTTPS URL or data URI. |
top_image | string | β | Upper-body garment. |
bottom_image | string | β | Lower-body garment. |
shoes_image | string | β | Footwear. |
outfit_image | string | β | A full outfit in one image. |
clothing_image | string | β | Generic single garment. |
attributes.gender | string | β | Optional hint: male / female / unisex. |
attributes.body_type | string | β | Optional body-type hint. |
attributes.notes | string | β | Optional extra styling notes. |
At least one garment image is required. Up to 4 garment images are combined into one outfit. You can also send a generic array: garments: [{ "src": "...", "label": "top" }].
const res = await fetch("https://vrool.com/api/v1/fashion/makeover", {
method: "POST",
headers: {
"Authorization": "Bearer " + PUBLIC_KEY + ":" + SECRET_KEY,
"Content-Type": "application/json"
},
body: JSON.stringify({
person_image: "https://yourcdn.com/user.jpg",
top_image: "https://yourcdn.com/top.jpg"
})
});
const data = await res.json();
// The image is returned inline β store it on YOUR platform.
const bytes = Uint8Array.from(atob(data.image_base64), c => c.charCodeAt(0));
// e.g. upload `bytes` to your own storage, or use data.image_data_uri directly.
<?php
$ch = curl_init("https://vrool.com/api/v1/fashion/makeover");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer {$publicKey}:{$secretKey}",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"person_image" => "https://yourcdn.com/user.jpg",
"top_image" => "https://yourcdn.com/top.jpg",
]),
]);
$data = json_decode(curl_exec($ch), true);
// Save the returned image on YOUR platform:
file_put_contents("makeover." . $data["image_format"], base64_decode($data["image_base64"]));
import requests, base64
res = requests.post(
"https://vrool.com/api/v1/fashion/makeover",
headers={"Authorization": f"Bearer {public_key}:{secret_key}"},
json={
"person_image": "https://yourcdn.com/user.jpg",
"top_image": "https://yourcdn.com/top.jpg",
},
)
data = res.json()
# Save the returned image on YOUR platform:
with open(f"makeover.{data['image_format']}", "wb") as f:
f.write(base64.b64decode(data["image_base64"]))
A successful call returns HTTP 200 with the generated image inline as base64. Vrool does not keep a copy β decode and store it on your own platform.
{
"success": true,
"request_id": 10432,
"image_base64": "iVBORw0KGgoAAAANSUhEUgAA...",
"image_format": "png",
"image_data_uri": "data:image/png;base64,iVBORw0KGgoAAA...",
"credits_used": 1,
"credits_remaining": 99,
"mode": "sandbox",
"time_ms": 8421
}
| Field | Description |
|---|---|
image_base64 | The generated image, base64-encoded. |
image_format | File extension, e.g. png. |
image_data_uri | Ready-to-use data: URI (embed directly in an <img> src). |
credits_used | Credits charged for this request. |
credits_remaining | Your balance after the request. |
request_id | Unique id for support & reconciliation. |
mode | sandbox or live. |
Errors return a non-2xx status with:
{
"success": false,
"error": { "code": "insufficient_credits", "message": "Not enough API credits. Please top up." }
}
| HTTP | Code | Meaning |
|---|---|---|
| 401 | missing_credentials | Key and/or secret not supplied. |
| 401 | invalid_key | Key not found or revoked. |
| 401 | invalid_secret | Secret does not match. |
| 401 | invalid_signature | HMAC signature missing or wrong (when signing is required). |
| 403 | suspended | Account suspended. |
| 403 | ip_blocked | Request IP not in allowlist. |
| 400 | missing_person_image | person_image not supplied. |
| 400 | missing_clothing | No garment image supplied. |
| 402 | insufficient_credits | Top up your API credits. |
| 429 | rate_limited | Too many requests per minute. |
| 429 | daily_limit / monthly_limit | Usage cap reached. |
| 502 | generation_failed | Generation failed β your credit was refunded. |
| 503 | api_disabled | The API is temporarily unavailable. |
Credits are deducted before processing and automatically refunded if generation fails, so you are never charged for a failed generation.
Exceeding a limit returns HTTP 429. Enterprise accounts can request higher limits β contact support.
For extra security you can sign the raw request body with your secret using HMAC-SHA256 and send it as a header:
X-Vrool-Signature: base64(hmac_sha256(rawBody, SECRET_KEY))
<?php
$body = json_encode(["person_image" => $personUrl, "top_image" => $topUrl]);
$signature = base64_encode(hash_hmac("sha256", $body, $secretKey, true));
// send header: X-Vrool-Signature: $signature
Signing is currently optional. Your account can require it for all traffic.
Each generation costs 1 credit (≈ Β£0.060). 5 free sandbox credits on signup. Buy credit packs securely by card in the Developer Portal β credits are added instantly.
| Credits | Price | Per credit |
|---|---|---|
| 100 | Β£6.00 | Β£0.060 |
| 500 | Β£28.00 | Β£0.056 |
| 1,000 | Β£55.00 | Β£0.055 |
Need higher volume or custom pricing? Contact Vrool for an enterprise plan.
This is API v1. Breaking changes will ship under a new version path so your integration keeps working.
Manage keys, credits and usage anytime in the Developer Portal: https://vrool.com/developers