Virtual Staging API
The Collov Virtual Staging API enables developers to integrate AI-powered room transformations into their applications, allowing you to virtually redesign spaces or clear rooms entirely from uploaded images.

Room Declutter
Automatically remove all furniture and decorations while preserving walls, floors, and architectural features.

Virtual Staging
Render photorealistic, professionally staged interiors in any room type and design style from a single photo.
These APIs are designed to support asynchronous task processing:
- You initiate a task with a Send Task API.
- You periodically poll the Get Result API using the returned
uuid(for staging) orid(for empty room tasks) until the status isSUCCESS.
This workflow ensures you can process high-quality AI-generated results without blocking client operations, while respecting rate limits and concurrency limits.
Whether you're building a real estate platform, an interior design tool, or a property management solution, the Collov Virtual Staging API provides a scalable, programmatic way to create photorealistic room transformations at scale.
Tutorial
Before you start
- Auth: send
apiKey: YOUR_API_KEYin headers. - Content-Type:
multipart/form-datafor both send-task and get-result endpoints (per spec). - Async task process: send → get a task token (
uuidorid) → poll untilstatus: SUCCESSorFAILED. - Rate limit: 10 requests per second; concurrency limit: 2. If you receive HTTP 429, implement exponential back-off and retry.
You can retrieve your API key from the Enterprise API center in your Collov console. Keep it secret — never ship it in client-side code.
Virtual staging: render a designed room
1. Send task
Form fields
uploadUrl(string, required) — public URL to the original imageroomType(enum, required) — one of the supported room typesstyle(enum, required) — one of the supported stylesemptyRoomUrl(string, optional) — if you already cleared the room, pass its URL to stage on top of it
# Set API_KEY in the environment first
export API_KEY="XXXXXXXXXXX"
curl -X POST "https://api.collov.ai/flair/enterpriseApi/vst/generateImgOnCommon" \
-H "apiKey: $API_KEY" \
-H "Content-Type: multipart/form-data" \
-F "uploadUrl=https://example.com/your/original.jpg" \
-F "roomType=living room" \
-F "style=modern"import time, requests
API_KEY = "YOUR_API_KEY"
BASE = "https://api.collov.ai"
headers = {"apiKey": API_KEY}
# 1) Send task
data = {
"uploadUrl": "https://example.com/your/original.jpg",
"roomType": "living room",
"style": "modern",
# "emptyRoomUrl": "https://example.com/cleared.webp" # optional
}
r = requests.post(f"{BASE}/flair/enterpriseApi/vst/generateImgOnCommon",
headers=headers, files=data) # multipart/form-data
r.raise_for_status()
task = r.json()["data"]
uuid = task["uuid"]
print("Task UUID:", uuid)import FormData from "form-data";
import fetch from "node-fetch";
const API_KEY = process.env.API_KEY;
const form = new FormData();
form.append("uploadUrl", "https://example.com/your/original.jpg");
form.append("roomType", "living room");
form.append("style", "modern");
const res = await fetch(
"https://api.collov.ai/flair/enterpriseApi/vst/generateImgOnCommon",
{
method: "POST",
headers: {
apiKey: API_KEY,
...form.getHeaders(),
},
body: form,
}
);
const json = await res.json();
const uuid = json.data.uuid;
console.log("Task UUID:", uuid);2. Poll for result
Query parameter
uuid(string, required) — from the send-task response
export API_KEY="XXXXXXXXXXX"
curl -X GET 'https://api.collov.ai/flair/enterpriseApi/vst/getRecord' \
-H "apiKey: $API_KEY" \
-F 'uuid="YYYYYYYY"'def poll_vst(uuid, timeout=180, interval=3):
start = time.time()
while True:
res = requests.get(f"{BASE}/flair/enterpriseApi/vst/getRecord",
headers=headers, params={"uuid": uuid})
res.raise_for_status()
j = res.json()
data = j.get("data", {})
status = data.get("status")
if status == "SUCCESS":
out = data["aiGenerateRecord"]["generateUrl"]
print("Result URL:", out)
return out, data
if status == "FAILED":
raise RuntimeError(f"Task failed: {data}")
if time.time() - start > timeout:
raise TimeoutError("VST polling timed out")
time.sleep(interval)
result_url, data = poll_vst(uuid)async function pollVst(uuid, { timeoutMs = 180000, intervalMs = 3000 } = {}) {
const start = Date.now();
while (true) {
const r = await fetch(
`https://api.collov.ai/flair/enterpriseApi/vst/getRecord?uuid=${encodeURIComponent(uuid)}`,
{
method: "GET",
headers: {
"apiKey": process.env.API_KEY,
},
}
);
const j = await r.json();
const data = j.data || {};
const status = data.status;
if (status === "SUCCESS") {
return data.aiGenerateRecord.generateUrl;
}
if (status === "FAILED") {
throw new Error(`Task failed: ${JSON.stringify(data)}`);
}
if (Date.now() - start > timeoutMs) {
throw new Error("VST polling timed out");
}
await new Promise(s => setTimeout(s, intervalMs));
}
}What you'll use from the result
data.status→SUCCESS/PENDING/FAILEDdata.aiGenerateRecord.generateUrl→ final rendered image URLdata.prompt,data.roomType,data.style,data.durationTime→ metadata
Room clearing: create an empty room
1. Send task
Form fields
uploadUrl(string, required) — public URL to the original image
export API_KEY="XXXXXXXXXXX"
curl -X POST "https://api.collov.ai/flair/enterpriseApi/vst/generateEmptyRoom" \
-H "apiKey: $API_KEY" \
-H "Content-Type: multipart/form-data" \
-F "uploadUrl=https://example.com/your/original.jpg"The response gives you a numeric id — store this; you'll poll with it.
2. Poll for result
Query parameter
id(integer, required) — from the send-task response
export API_KEY="XXXXXXXXXXX"
curl -X GET 'https://api.collov.ai/flair/enterpriseApi/vst/getEmptyRoomRecord' \
-H "apiKey: $API_KEY" \
-F 'id=101382'def poll_empty_room(task_id, timeout=180, interval=3):
start = time.time()
while True:
res = requests.get(f"{BASE}/flair/enterpriseApi/vst/getEmptyRoomRecord",
headers=headers, params={"id": str(task_id)})
res.raise_for_status()
j = res.json()
data = j.get("data", {})
status = data.get("status")
if status == "SUCCESS":
print("Empty room URL:", data["emptyRoomUrl"])
return data["emptyRoomUrl"], data
if status == "FAILED":
raise RuntimeError(f"Empty room task failed: {data}")
if time.time() - start > timeout:
raise TimeoutError("Empty room polling timed out")
time.sleep(interval)Recommended workflow
Clear the room first (optional)
Send generateEmptyRoom → poll getEmptyRoomRecord → get emptyRoomUrl.
Stage the room
Send generateImgOnCommon with your original uploadUrl, the cleared emptyRoomUrl from step 1 (improves control and consistency), plus roomType and style.
Poll and collect the render
Poll getRecord using uuid. Use aiGenerateRecord.generateUrl as your final render.
Robustness & production tips
- Backoff on 429: exponential backoff (e.g., 1s, 2s, 4s, … up to 30s).
- Timeouts: client-side timeout per poll (e.g., 3–5 minutes) and a total job timeout.
- Validate enums: force lowercase & whitelist room types/styles; reject early if invalid.
- Id/UUID storage: the room design API polls with
uuid; the empty room API polls with a numericid. - Security:
uploadUrl/emptyRoomUrlshould be on a public CDN/S3 with read access. Don't pass private URLs that require signed headers (unless they're presigned). - Watermark & mode: responses may include
watermark,proMode, etc. — log them if you need auditing. - Concurrency: keep at most 2 active tasks per account to avoid throttling; queue client-side if needed.
API reference
Async AI-rendered room design (Send Task)
Initiate a task to take a picture and render a given type of room with the instructed design style. The process will modify the furniture and decorations in the room, but will keep the room structure unchanged.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
| Content-Type | multipart/form-data | Data exchange format. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| uploadUrl | string | Required | The image provided for the process. |
| roomType | string enum | Required | One of the values below, must be lowercase: game roomkitchenliving roomoutdoorbedroomstudioconference roomhome officehome gymdining roomlaundry roombathroomspa roomkids roomopen living and dining room |
| style | string enum | Required | One of the values below, must be lowercase: scandinavianluxuryindustrialcoastaltransitionalfarmhousemid-centurymodern |
| emptyRoomUrl | string | Optional | Provide if you'd like the generation to happen in a cleared room. |
Sample response
{
"success": true,
"data": {
"roomType": "living room",
"style": "modern",
"recordId": 76474,
"enterpriseId": 8,
"id": 5321,
"uuid": "41021e83-52c3-433b-8fc0-9961eefa90be",
"watermark": false,
"proMode": "soft",
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20250811/404ea691-6757-4ec1-b8a9-86926c9f777a.webp",
"emptyRoomUrl": "https://d1hmb1rfgjccys.cloudfront.net/3ac80051-7886-49b8-8586-dcecd51eeae5.webp",
"apiRoomType": "living room",
"apiStyle": "modern",
"createBy": 189641,
"updateBy": 189641,
"createTime": "Aug 11, 2025 8:45:39 AM",
"updateTime": "Aug 11, 2025 8:45:39 AM"
},
"message": "",
"statusCode": 0
}Async regenerate AI-rendered room design (Send Task)
Re-render a previously processed room image with the same parameters (e.g., style, seed) while preserving the original room structure.
Each source image initially submitted to the Async AI-Rendered Room Design API receives up to 20 free calls to this regeneration API. After that, further requests fail and you must restart a series of generations with a call to the Async AI-Rendered Room Design API.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
| Content-Type | multipart/form-data | Data exchange format. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| uuid | string | Required | The uuid generated from the initial AI-generation API call for the source image. |
Sample response
{
"success": true,
"data": {
"roomType": "living room",
"style": "modern",
"recordId": 76474,
"enterpriseId": 8,
"id": 5321,
"uuid": "41021e83-52c3-433b-8fc0-9961eefa90be",
"watermark": false,
"proMode": "soft",
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20250811/404ea691-6757-4ec1-b8a9-86926c9f777a.webp",
"emptyRoomUrl": "https://d1hmb1rfgjccys.cloudfront.net/3ac80051-7886-49b8-8586-dcecd51eeae5.webp",
"apiRoomType": "living room",
"apiStyle": "modern",
"createBy": 189641,
"updateBy": 189641,
"createTime": "Aug 11, 2025 8:45:39 AM",
"updateTime": "Aug 11, 2025 8:45:39 AM"
},
"message": "",
"statusCode": 0
}Design result retrieval (Get Result)
This endpoint allows repeated queries to retrieve results from both generation APIs:
- The Async AI-Rendered Room Design endpoint;
- The Async Regeneration AI-Rendered Room Design endpoint.
The response bodies from the getRecord call are nearly identical for both generation scenarios, with one key difference:
- For the initial Async AI-Rendered Room Design, the
generateRecordListfield contains only a single GenerateRecord. - For each subsequent Async Regeneration call, an additional GenerateRecord is appended to this list, ordered by request time.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
Query parameter
| Field | Type | Required | Description |
|---|---|---|---|
| uuid | string | Required | The UUID returned from the earlier task initiation API call. |
Sample response
{
"success": true,
"data": {
"recordId": 76474,
"roomType": "living room",
"style": "modern",
"uploadUrl": "https://d1hk2acgirb1eq.cloudfront.net/68173538-f557-41bf-bffc-c69f95a717c8-empty-room-interior-for-gallery-exhibition-vector.jpg",
"enterpriseId": 10,
"uuid": "41021e83-52c3-433b-8fc0-9961eefa90be",
"proMode": "soft",
"generateRecordList": [
{
"enterpriseUser": {
"id": 10
},
"status": "SUCCESS",
"roomType": "living room",
"style": "modern",
"startTime": "Aug 15, 2025 8:58:04 AM",
"endTime": "Aug 15, 2025 8:58:15 AM",
"durationTime": 11,
"uploadUrl": "https://d1hk2acgirb1eq.cloudfront.net/68173538-f557-41bf-bffc-c69f95a717c8-empty-room-interior-for-gallery-exhibition-vector.jpg",
"generateUrl": "https://d1hmb1rfgjccys.cloudfront.net/3aed25a3-0ac6-43f3-a169-43d0599855fc.webp",
"images": "[\"https://d1hmb1rfgjccys.cloudfront.net/3aed25a3-0ac6-43f3-a169-43d0599855fc.webp\"]",
"id": 77238
},
{
"enterpriseUser": {
"id": 10
},
"status": "SUCCESS",
"roomType": "bedroom",
"style": "modern",
"startTime": "Aug 15, 2025 8:58:57 AM",
"endTime": "Aug 15, 2025 8:59:09 AM",
"durationTime": 11,
"uploadUrl": "https://d1hk2acgirb1eq.cloudfront.net/68173538-f557-41bf-bffc-c69f95a717c8-empty-room-interior-for-gallery-exhibition-vector.jpg",
"generateUrl": "https://d1hmb1rfgjccys.cloudfront.net/18f6abc5-8cf9-4d4a-8988-9c22d744d3a4.webp",
"referId": "2287",
"id": 77239
}
],
"id": 2287,
"createBy": 10,
"updateBy": 10,
"createTime": "Aug 15, 2025 8:58:04 AM",
"updateTime": "Aug 15, 2025 8:58:04 AM"
},
"message": "",
"statusCode": 0
}Async AI-powered room clearing (Send Task)
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
| Content-Type | multipart/form-data | Data exchange format. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| uploadUrl | string | Required | The image provided for the process. |
Sample response
{
"success": true,
"data": {
"enterpriseId": 10,
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20240806/099bbd0e-4c05-4dbe-a009-eb99b944ff27.webp",
"requestId": "0df88b79-143f-43ed-880d-6cdb6bf2c864",
"status": "PENDING",
"id": 101382,
"createBy": 8,
"updateBy": 8,
"createTime": "Apr 27, 2025 8:14:57 AM",
"updateTime": "Apr 27, 2025 8:14:58 AM"
},
"message": "",
"statusCode": 0
}Room clearing result retrieval (Get Result)
Retrieve the result of the room clearing task by repeatedly querying this API.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
Query parameter
| Field | Type | Required | Description |
|---|---|---|---|
| id | integer | Required | The id returned from the earlier task initiation API call. |
Sample response
{
"success": true,
"data": {
"id": 101382,
"enterpriseId": 8,
"requestId": "0df88b79-143f-43ed-880d-6cdb6bf2c864",
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20240806/099bbd0e-4c05-4dbe-a009-eb99b944ff27.webp",
"emptyRoomUrl": "https://d1hmb1rfgjccys.cloudfront.net/95746b84-4977-4ddd-905c-0f0a36df9766.webp",
"status": "SUCCESS",
"createBy": 8,
"updateBy": 0,
"createTime": "Apr 27, 2025 8:14:58 AM",
"updateTime": "Apr 27, 2025 8:15:08 AM"
},
"message": "",
"statusCode": 0
}AI-powered photo enhancement
Enhance the quality and resolution of an existing image. The enhanced image URL is returned in data.generateUrl.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
| Content-Type | multipart/form-data | Data exchange format. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| imgUrl | string | Required | Public URL of the image to enhance. |
Sample response
{
"success": true,
"data": {
"enterpriseId": 8,
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260722/chatEditImages/a746ae09-6fce-4873-8dae-4613c325a362.jpeg",
"mode": "ENHANCE",
"generateUrl": "https://d37vt2dds2nfmk.cloudfront.net/HIGH_RES/20260722/dcc5f720-3208-4006-91c4-fd26486461b7.png",
"startTime": "Jul 22, 2026 1:52:59 AM",
"id": 182218,
"createBy": 8,
"updateBy": 8,
"createTime": "Jul 22, 2026 1:53:07 AM",
"updateTime": "Jul 22, 2026 1:53:07 AM"
},
"message": "",
"statusCode": 200
}Async AI-powered photo chat editing (Send Task)
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
| Content-Type | multipart/form-data | Data exchange format. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| uploadUrl | string | Required | The image provided for the process. |
| prompt | string | Required | Photo editing instructions. |
Sample response
{
"success": true,
"data": {
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20251220/6a2b2ef8-27fc-4f16-b73b-022ecf49ac22.jpg",
"prompt": "remove all trees",
"enterpriseId": 10,
"uuid": "f3e43ff9-2064-4717-a7c2-e60999920407",
"startTime": "Feb 6, 2026 9:11:28 AM",
"status": "PENDING"
},
"message": "",
"statusCode": 200
}Photo chat edit result retrieval (Get Result)
Retrieve the result of the photo chat edit task by repeatedly querying this API.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
Query parameter
| Field | Type | Required | Description |
|---|---|---|---|
| uuid | string | Required | The uuid returned from the earlier task initiation API call. |
Sample response
{
"success": true,
"data": {
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20251220/6a2b2ef8-27fc-4f16-b73b-022ecf49ac22.jpg",
"generateUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260206/chatEditImages/984df5ba-ef03-4114-8e65-e9ab98784903.jpeg",
"prompt": "remove all trees",
"enterpriseId": 10,
"uuid": "f3e43ff9-2064-4717-a7c2-e60999920407",
"startTime": "Feb 6, 2026 9:11:29 AM",
"endTime": "Feb 6, 2026 9:11:56 AM",
"status": "SUCCESS"
},
"message": "",
"statusCode": 200
}Async AI virtual tool (Send Task)
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
| Content-Type | application/json | Data exchange format. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| images | array | Required | Array of image objects, e.g. {"imageUrl": "https://…/image.png", "width": 768, "height": 769}. No more than 20 photos. |
| resolution | string | Required | One of: 1080p720p |
| orientation | string | Required | One of the values below, with aspect ratios 4:3 / 16:9 / 9:16 / 1:1 respectively: StandardLandscapePortraitSquare |
| font | string | Optional | One of: OswaldAmaticGreatVibesOpenSansMontserratPlayfair |
| music | string | Optional | One of: EmbraceFuture_DesignWaterfallHappy_HolidaySummer_Ukulele |
| intro | string | Optional | Text overlay on video. Must not exceed 500 characters. |
| profileUrl | string | Optional | Personal profile picture. |
| logoUrl | string | Optional | Company logo image. |
| agentName | string | Optional | Agent name. |
| phoneNumber | string | Optional | Mobile phone number. |
| string | Optional | Email. |
Sample response
{
"code": 202,
"msg": "ACCEPTED",
"data": {
"userId": 29815,
"conversationId": "",
"taskId": "16881c11-d3fb-48ec-b3a8-4655f73b97a6",
"step": {
"stepId": "9e71f4c5-95ec-4c1a-92dd-ed9b17263c36",
"stepType": "IMAGE_RESIZE",
"stepStatus": "CREATED"
},
"videoId": "8ba7eb87-fc02-4003-b54f-43cac9e57a7f",
"previewUrl": "https://d37vt2dds2nfmk.cloudfront.net/20250901/5d194226-2897-4da3-a910-71621fb2dc37.jpg",
"videoMeta": {
"taskPayload": {
"resolution": "1080p",
"orientation": "Landscape",
"intro": "kitchen text",
"font": "Amatic",
"music": "Future_Design",
"profileUrl": "https://d37vt2dds2nfmk.cloudfront.net/20250901/ffa227e7-9ff0-4df4-9160-ab67e948eee4.png",
"logoUrl": "",
"agentName": "kitchen agent name",
"phoneNumber": "15256537768",
"email": "chenyi340123@gmail.com",
"images": [
{
"imageUrl": "https://d37vt2dds2nfmk.cloudfront.net/20250901/5d194226-2897-4da3-a910-71621fb2dc37.jpg",
"height": 512,
"width": 768
},
{
"imageUrl": "https://d37vt2dds2nfmk.cloudfront.net/20250901/396ca40b-0870-40c6-879e-589ebe00b778.jpg",
"height": 1024,
"width": 768
},
{
"imageUrl": "https://d37vt2dds2nfmk.cloudfront.net/20250901/e0dec89b-f095-4df6-b017-3c663eac0896.jpeg",
"height": 513,
"width": 768
},
{
"imageUrl": "https://d37vt2dds2nfmk.cloudfront.net/20250901/1fb60407-4e40-4461-9d70-b1ae5fcadbf1.jpg",
"height": 1024,
"width": 768
},
{
"imageUrl": "https://d37vt2dds2nfmk.cloudfront.net/20250901/d535b795-54ff-4d3d-89bb-4bf810326ae1.png",
"height": 769,
"width": 768
},
{
"imageUrl": "https://d37vt2dds2nfmk.cloudfront.net/20250901/19a7491c-650a-487d-b5e4-960569cdfad0.png",
"height": 576,
"width": 1024
}
]
},
"mimeType": "video/mp4"
},
"createTime": "2025-09-02 12:03:07"
}
}AI virtual tool result retrieval (Get Result)
Retrieve the result of the AI virtual tool task by repeatedly querying this API.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
Query parameter
| Field | Type | Required | Description |
|---|---|---|---|
| taskId | string | Required | The taskId returned from the earlier task initiation API call. |
Sample response
{
"code": 202,
"msg": "ACCEPTED",
"data": {
"taskId": "16881c11-d3fb-48ec-b3a8-4655f73b97a6",
"taskStatus": "COMPLETED",
"videoUrl": "https://collov-vst.s3.us-west-1.amazonaws.com/20250902/29815_ef6fb5bcdac538651b1de3bcaa98217b.mp4",
"agentVideoUrl": "https://collov-vst.s3.us-west-1.amazonaws.com/20250902/29815_a1e8ccb2108daff6bb7fd2879d76d8f5.mp4",
"createTime": {
"date": {
"year": 2025,
"month": 9,
"day": 2
},
"time": {
"hour": 12,
"minute": 3,
"second": 7,
"nano": 0
}
},
"updateTime": {
"date": {
"year": 2025,
"month": 9,
"day": 2
},
"time": {
"hour": 12,
"minute": 6,
"second": 7,
"nano": 0
}
}
}
}Multi-angle staging (Send Task)
Stage 1–4 photos of the same room in one asynchronous task, keeping furniture and styling consistent across views. Submit the photos in the order you want to receive the results.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | Your enterprise API key. The API account must have a client account with the same email, as required by the virtual tool API. |
| Content-Type | application/json | Send a JSON request body. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| images | array | Required | 1–4 views of the same room. |
| images[].imageUrl | string | Required | Publicly accessible HTTP(S) image URL, at most 2,000 characters. Do not submit internal-network URLs. |
| roomType | string | Required | Room type, e.g. Living Room or Bedroom. At most 100 characters. |
| style | string | Required | Design style, e.g. Modern or Scandinavian. At most 100 characters. |
| prompt | string | Optional | Additional design requirements, at most 2,000 characters. |
| referenceImageUrl | string | Optional | Public HTTP(S) image URL used as a style reference. Same URL constraints as imageUrl. |
Each input view uses 24 credits from the linked client account under the existing Multi-angle credit rules. Failed views are refunded by the generation service. A new POST creates a new task and charge; poll the existing task instead of resubmitting it. Watermarks follow the linked account’s subscription rules.
Example request
curl -X POST "https://api.collov.ai/flair/enterpriseApi/multiAngle/task" \
-H "apiKey: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"images": [
{
"imageUrl": "https://example.com/living-room-view-1.jpg"
},
{
"imageUrl": "https://example.com/living-room-view-2.jpg"
}
],
"roomType": "Living Room",
"style": "Modern",
"prompt": "Use a cream sofa and light oak furniture."
}'Sample response · HTTP 202
{
"code": 202,
"msg": "ACCEPTED",
"data": {
"taskId": "bbf7ec66-0a4b-48bf-b2bf-e89444e78934",
"taskType": "GENERATE",
"rootTaskId": "bbf7ec66-0a4b-48bf-b2bf-e89444e78934",
"parentTaskId": null,
"taskStatus": "CREATED",
"images": [
{
"index": 0,
"imageUrl": "https://example.com/living-room-view-1.jpg",
"generateUrl": null,
"status": "CREATED"
},
{
"index": 1,
"imageUrl": "https://example.com/living-room-view-2.jpg",
"generateUrl": null,
"status": "CREATED"
}
],
"errorMsg": null,
"createTime": 1792713600000,
"updateTime": 1792713600000
}
}Multi-angle edit
Edit a completed enterprise Multi-angle task. Send the same apiKey header and Content-Type: application/json. Each request creates a new task and preserves the source results.
| Field | Type | Required | Description |
|---|---|---|---|
| taskId | string | Required | The completed task whose results you want to edit, owned by your API account. |
| prompt | string | Required | Requested changes, at most 2,000 characters. |
| editType | string | Optional | SINGLE (default) edits one result; ALL edits the full set with consistent changes across views. |
| imageIndex | integer | For SINGLE | Zero-based index in the source task’s images array. Omit for ALL. |
SINGLE requires a successful result at imageIndex and returns one image at index 0. ALL requires a full-view task with every view completed; a SINGLE_EDIT task cannot be used for ALL. Batch edits use the source task’s designs and the original room photos. Separate single-image edits are not automatically merged into a batch.
Editing costs 24 credits per image; failed views are refunded. Wait for any ongoing task in the same generation to finish before submitting another edit or regenerate request, otherwise the API returns HTTP 409.
Single-image edit
{
"taskId": "bbf7ec66-0a4b-48bf-b2bf-e89444e78934",
"editType": "SINGLE",
"imageIndex": 0,
"prompt": "Change the sofa to dark blue and keep everything else unchanged."
}Edit all views
{
"taskId": "bbf7ec66-0a4b-48bf-b2bf-e89444e78934",
"editType": "ALL",
"prompt": "Change the sofa to dark blue in every view."
}Sample response · HTTP 202
{
"code": 202,
"msg": "ACCEPTED",
"data": {
"taskId": "f69b8804-c231-40b2-805a-b064641fe318",
"taskType": "SINGLE_EDIT",
"rootTaskId": "bbf7ec66-0a4b-48bf-b2bf-e89444e78934",
"parentTaskId": "bbf7ec66-0a4b-48bf-b2bf-e89444e78934",
"sourceImageIndex": 0,
"taskStatus": "CREATED",
"images": [
{
"index": 0,
"imageUrl": "https://example.com/staged-view-1.webp",
"generateUrl": null,
"status": "CREATED"
}
],
"errorMsg": null,
"createTime": 1792713800000,
"updateTime": 1792713800000
}
}Poll /loadMultiAngleInfo with the new taskId to get edited images.
Multi-angle regenerate
Generate another full set from the original uploaded photos. Regenerate is free, following the web Multi-angle rules. It creates a new task, retains previous results, and uses the root task’s original settings unless overridden below. Passing an edit task still regenerates the original full set, rather than editing that result.
Send the same apiKey header and Content-Type: application/json.
| Field | Type | Required | Description |
|---|---|---|---|
| taskId | string | Required | An existing task owned by your API account. No task in the same generation may still be running (HTTP 409). |
| roomType | string | Optional | Override the original room type, at most 100 characters. |
| style | string | Optional | Override the original style, at most 100 characters. |
| prompt | string | Optional | Override the original design requirements, at most 2,000 characters. An empty string clears them. |
{
"taskId": "bbf7ec66-0a4b-48bf-b2bf-e89444e78934",
"style": "Scandinavian",
"prompt": "Use warm wood and neutral upholstery."
}Returns HTTP 202 with the same task response envelope, a new taskId, taskType REGENERATE, rootTaskId and parentTaskId. Poll the new taskId through /loadMultiAngleInfo.
Multi-angle staging result (Get Result)
Send the same apiKey header and the returned taskId as a query parameter. Tasks and image results belong to the enterprise API account that submitted them. Web Multi-angle project identifiers cannot be used here.
curl --get "https://api.collov.ai/flair/enterpriseApi/multiAngle/loadMultiAngleInfo" \
-H "apiKey: $API_KEY" \
--data-urlencode "taskId=bbf7ec66-0a4b-48bf-b2bf-e89444e78934"Poll every 3–5 seconds with a timeout appropriate for image generation. Stop polling when data.taskStatus is COMPLETED or FAILED. Successful queries return HTTP 202, including terminal results, matching the virtual tool API.
| Field | Description |
|---|---|
| taskId | The task identifier returned by POST. |
| taskType | GENERATE, REGENERATE, SINGLE_EDIT or BATCH_EDIT. |
| rootTaskId / parentTaskId | The original generation task and the task passed to edit/regenerate. parentTaskId is null for the original task. |
| sourceImageIndex | For SINGLE_EDIT, the selected index in the parent task. Its edited output is always images[0]. |
| taskStatus | CREATED: queued; PROCESSING: generating; COMPLETED: results available; FAILED: generation failed. |
| images | One entry per input view in the original order. index is zero-based. imageUrl is the input URL; generateUrl is the output URL. |
| images[].status | CREATED, PROCESSING, COMPLETED or FAILED. A COMPLETED task may include failed views; inspect each entry. Failed or unfinished views have no generateUrl. |
| errorMsg | Failure message for a failed task. |
| createTime / updateTime | Record timestamps as Unix epoch milliseconds. |
Sample response · HTTP 202
{
"code": 202,
"msg": "ACCEPTED",
"data": {
"taskId": "bbf7ec66-0a4b-48bf-b2bf-e89444e78934",
"taskType": "GENERATE",
"rootTaskId": "bbf7ec66-0a4b-48bf-b2bf-e89444e78934",
"parentTaskId": null,
"taskStatus": "COMPLETED",
"images": [
{
"index": 0,
"imageUrl": "https://example.com/living-room-view-1.jpg",
"generateUrl": "https://example.com/staged-view-1.webp",
"status": "COMPLETED"
},
{
"index": 1,
"imageUrl": "https://example.com/living-room-view-2.jpg",
"generateUrl": "https://example.com/staged-view-2.webp",
"status": "COMPLETED"
}
],
"errorMsg": null,
"createTime": 1792713600000,
"updateTime": 1792713720000
}
}Errors: HTTP 400 for invalid input or insufficient credits, HTTP 401 for an invalid API key or missing linked account, HTTP 404 for an unknown task or a task owned by another account, HTTP 409 when another task in the same generation is still in progress, and HTTP 500 for an unexpected server error. Controller errors use the same code / msg envelope. Authentication failures may have an empty response body.
AI-powered furniture addition
Add furniture or decor to an existing room photo using a natural-language prompt. The generated image URL is returned in data.generateUrl.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
| Content-Type | multipart/form-data | Data exchange format. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| uploadUrl | string | Required | Public URL of the room photo to edit. |
| prompt | string | Required | Natural-language description of the furniture to add, e.g. "a floor lamp". |
| style | string | Required | The design style of the furniture, e.g. "modern". |
Sample response
{
"success": true,
"data": {
"enterpriseId": 8,
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260815/chatEditImages/a746ae09-6fce-4873-8dae-4613c325a362.jpeg",
"prompt": "a floor lamp",
"style": "modern",
"generateUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260815/chatEditImages/9a1c2b3d-4e5f-6789-abcd-ef0123456789.jpeg",
"startTime": "Aug 15, 2026 2:12:07 PM",
"id": 184567,
"createBy": 8,
"updateBy": 8,
"createTime": "Aug 15, 2026 2:12:12 PM",
"updateTime": "Aug 15, 2026 2:12:12 PM"
},
"message": "",
"statusCode": 200
}AI-powered material overlay
Overlay a new material finish onto a surface in the photo — floors, walls, cabinet doors, countertops, and backsplashes. The generated image URL is returned in data.generateUrl.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
| Content-Type | multipart/form-data | Data exchange format. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| uploadUrl | string | Required | Public URL of the room photo to edit. |
| surfaceType | string enum | Required | The surface to overlay, one of: floorwallcabinet doorscountertopbacksplash |
| prompt | string | Required | The material to overlay, one of the presets matching the chosen surfaceType (see the table below). |
surfaceType & prompt presets
| surfaceType | prompt presets |
|---|---|
| floor | Warm Oak HardwoodPolished White MarbleSoft Beige Carpet |
| wall | Soft Dove Gray PaintWhite Brick WallTextured Linen Wallpaper |
| cabinet doors | Matte Black Flat-PanelClassic White ShakerNatural Walnut Veneer |
| countertop | White Quartz with Gray VeinsBlack Granite PolishedButcher Block Wood |
| backsplash | White Subway TileMoroccan Blue MosaicMarble Backsplash |
Sample response
{
"success": true,
"data": {
"enterpriseId": 8,
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260820/chatEditImages/a746ae09-6fce-4873-8dae-4613c325a362.jpeg",
"surfaceType": "floor",
"prompt": "Warm Oak Hardwood",
"generateUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260820/chatEditImages/3c4d5e6f-7a8b-9c0d-ef12-3456789abcde.jpeg",
"startTime": "Aug 20, 2026 10:45:11 AM",
"id": 185432,
"createBy": 8,
"updateBy": 8,
"createTime": "Aug 20, 2026 10:45:16 AM",
"updateTime": "Aug 20, 2026 10:45:16 AM"
},
"message": "",
"statusCode": 200
}AI-powered season change
Transform an outdoor photo to a different season. The generated image URL is returned in data.generateUrl.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
| Content-Type | multipart/form-data | Data exchange format. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| uploadUrl | string | Required | Public URL of the photo to edit. |
| targetSeason | string enum | Required | The season to transform the photo into, one of: springsummerfallwinter |
Sample response
{
"success": true,
"data": {
"enterpriseId": 8,
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260822/chatEditImages/a746ae09-6fce-4873-8dae-4613c325a362.jpeg",
"targetSeason": "spring",
"generateUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260822/chatEditImages/7f8a9b0c-1d2e-3f4a-5b6c-7d8e9f0a1b2c.jpeg",
"startTime": "Aug 22, 2026 3:18:42 PM",
"id": 186001,
"createBy": 8,
"updateBy": 8,
"createTime": "Aug 22, 2026 3:18:47 PM",
"updateTime": "Aug 22, 2026 3:18:47 PM"
},
"message": "",
"statusCode": 200
}AI-powered virtual twilight
Transform a daytime exterior photo into a dramatic virtual twilight scene. The generated image URL is returned in data.generateUrl.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
| Content-Type | multipart/form-data | Data exchange format. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| uploadUrl | string | Required | Public URL of the photo to edit. |
Sample response
{
"success": true,
"data": {
"enterpriseId": 8,
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260825/chatEditImages/a746ae09-6fce-4873-8dae-4613c325a362.jpeg",
"generateUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260825/chatEditImages/1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d.jpeg",
"startTime": "Aug 25, 2026 9:05:11 AM",
"id": 186101,
"createBy": 8,
"updateBy": 8,
"createTime": "Aug 25, 2026 9:05:16 AM",
"updateTime": "Aug 25, 2026 9:05:16 AM"
},
"message": "",
"statusCode": 200
}AI-powered pool water enhancement
Enhance the water in a pool photo to look crystal clear and inviting. The generated image URL is returned in data.generateUrl.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
| Content-Type | multipart/form-data | Data exchange format. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| uploadUrl | string | Required | Public URL of the photo to edit. |
Sample response
{
"success": true,
"data": {
"enterpriseId": 8,
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260825/chatEditImages/a746ae09-6fce-4873-8dae-4613c325a362.jpeg",
"generateUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260825/chatEditImages/2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e.jpeg",
"startTime": "Aug 25, 2026 9:12:33 AM",
"id": 186102,
"createBy": 8,
"updateBy": 8,
"createTime": "Aug 25, 2026 9:12:38 AM",
"updateTime": "Aug 25, 2026 9:12:38 AM"
},
"message": "",
"statusCode": 200
}AI-powered lawn replacement
Replace the lawn in an exterior photo with fresh, healthy grass. The generated image URL is returned in data.generateUrl.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
| Content-Type | multipart/form-data | Data exchange format. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| uploadUrl | string | Required | Public URL of the photo to edit. |
Sample response
{
"success": true,
"data": {
"enterpriseId": 8,
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260826/chatEditImages/a746ae09-6fce-4873-8dae-4613c325a362.jpeg",
"generateUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260826/chatEditImages/3c4d5e6f-7a8b-9c0d-1e2f-3a4b5c6d7e8f.jpeg",
"startTime": "Aug 26, 2026 10:04:22 AM",
"id": 186103,
"createBy": 8,
"updateBy": 8,
"createTime": "Aug 26, 2026 10:04:27 AM",
"updateTime": "Aug 26, 2026 10:04:27 AM"
},
"message": "",
"statusCode": 200
}AI-powered night to day
Convert a night-time exterior photo into a bright daytime scene. The generated image URL is returned in data.generateUrl.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
| Content-Type | multipart/form-data | Data exchange format. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| uploadUrl | string | Required | Public URL of the photo to edit. |
Sample response
{
"success": true,
"data": {
"enterpriseId": 8,
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260826/chatEditImages/a746ae09-6fce-4873-8dae-4613c325a362.jpeg",
"generateUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260826/chatEditImages/4d5e6f7a-8b9c-0d1e-2f3a-4b5c6d7e8f9a.jpeg",
"startTime": "Aug 26, 2026 10:21:45 AM",
"id": 186104,
"createBy": 8,
"updateBy": 8,
"createTime": "Aug 26, 2026 10:21:51 AM",
"updateTime": "Aug 26, 2026 10:21:51 AM"
},
"message": "",
"statusCode": 200
}AI-powered rain to shine
Transform a rainy photo into a sunny, clear-sky scene. The generated image URL is returned in data.generateUrl.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
| Content-Type | multipart/form-data | Data exchange format. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| uploadUrl | string | Required | Public URL of the photo to edit. |
Sample response
{
"success": true,
"data": {
"enterpriseId": 8,
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260826/chatEditImages/a746ae09-6fce-4873-8dae-4613c325a362.jpeg",
"generateUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260826/chatEditImages/5e6f7a8b-9c0d-1e2f-3a4b-5c6d7e8f9a0b.jpeg",
"startTime": "Aug 26, 2026 11:02:19 AM",
"id": 186105,
"createBy": 8,
"updateBy": 8,
"createTime": "Aug 26, 2026 11:02:24 AM",
"updateTime": "Aug 26, 2026 11:02:24 AM"
},
"message": "",
"statusCode": 200
}AI-powered natural twilight
Apply a soft, natural twilight effect to an exterior photo. The generated image URL is returned in data.generateUrl.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
| Content-Type | multipart/form-data | Data exchange format. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| uploadUrl | string | Required | Public URL of the photo to edit. |
Sample response
{
"success": true,
"data": {
"enterpriseId": 8,
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260827/chatEditImages/a746ae09-6fce-4873-8dae-4613c325a362.jpeg",
"generateUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260827/chatEditImages/6f7a8b9c-0d1e-2f3a-4b5c-6d7e8f9a0b1c.jpeg",
"startTime": "Aug 27, 2026 8:48:56 AM",
"id": 186106,
"createBy": 8,
"updateBy": 8,
"createTime": "Aug 27, 2026 8:49:01 AM",
"updateTime": "Aug 27, 2026 8:49:01 AM"
},
"message": "",
"statusCode": 200
}AI-powered add water to empty pool
Add crystal-clear water to an empty pool photo. The generated image URL is returned in data.generateUrl.
Request headers
| Field | Value | Description |
|---|---|---|
| apiKey | YOUR_API_KEY | The API key you retrieved from the enterprise API center. |
| Content-Type | multipart/form-data | Data exchange format. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| uploadUrl | string | Required | Public URL of the photo to edit. |
Sample response
{
"success": true,
"data": {
"enterpriseId": 8,
"uploadUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260827/chatEditImages/a746ae09-6fce-4873-8dae-4613c325a362.jpeg",
"generateUrl": "https://d37vt2dds2nfmk.cloudfront.net/20260827/chatEditImages/7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d.jpeg",
"startTime": "Aug 27, 2026 9:30:08 AM",
"id": 186107,
"createBy": 8,
"updateBy": 8,
"createTime": "Aug 27, 2026 9:30:13 AM",
"updateTime": "Aug 27, 2026 9:30:13 AM"
},
"message": "",
"statusCode": 200
}Resources
Limits
Rate limit
All enterprise APIs are rate limited to 10 requests per second. Exceeding this rate limit will result in an HTTP error 429.
Concurrency limit
All enterprise APIs have a concurrency limit of 2 active tasks per account.