Exterior Renovator API Documentation
Base URL:
https://api.ideal.house
Version: v1
Updated: 2026-05-20
ЁЯУЦ Overview
The Exterior Renovator API allows you to renovate or restyle the exterior of a building from an input image. You provide a source image, and optionally add text guidance, a reference image, building style, or environment preference to guide the renovation result.
The workflow is asynchronous and involves two steps:
- Create a task тАФ Submit your exterior image and optional guidance, then receive a
taskId. - Poll for results тАФ Use the
taskIdto query task status and retrieve the generated image.
ЁЯФР Authentication
All API requests must be authenticated using an API Key.
Include your API Key in the request header:
| Header | Value |
|---|---|
APIKEY | your_api_key_here |
тЪая╕П Keep your API Key secure. Do not expose it in client-side code or public repositories.
ЁЯТ░ Credits Deduction
[!WARNING] ЁЯкЩ 1 credit is deducted upon successful task creation. If the task ultimately fails, the deducted credit will be automatically refunded to your account.
Insufficient credits will return error code9051. ЁЯУД See Credits Deduction Reference.
| Operation | Credits Deducted |
|---|---|
| Exterior Renovator task | 1 credit |
For detailed credit rules, see Credits Deduction Reference.
ЁЯУМ API Endpoints
1. Create Exterior Renovator Task
Creates a new exterior renovation task and returns a unique taskId for polling.
Endpoint
POST /api/v1/exteriorRenovator/generate
Request Headers
| Header | Required | Description |
|---|---|---|
APIKEY | тЬЕ Yes | Your API authentication key |
Content-Type | тЬЕ Yes | application/json |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
imageUrl | string | тЬЕ Yes | URL of the source exterior image to renovate |
prompt | string | тЭМ Optional | Optional text guidance for the renovation result |
referenceUrl | string | тЭМ Optional | Optional reference image URL to guide the visual style |
buildingStyleId | string | тЭМ Optional | Optional building style ID |
environmentId | string | тЭМ Optional | Optional environment or scene style ID. Supports multiple IDs joined by comma, for example id1,id2 |
тЪая╕П Only
imageUrlis required. All other request body fields are optional.
ЁЯОи Style Options
buildingStyleId and environmentId can be selected from the API Style Config endpoint.
Use:
GET /api/v1/style/exterior_renovator/getStyles
| Style Group | Request Field | Description |
|---|---|---|
buildingStyle | buildingStyleId | Building style option |
environment | environmentId | Environment or scene option. Supports multiple option IDs joined by comma, for example id1,id2 |
Each option contains name, id, and url. Pass the option id into the corresponding request field.
ЁЯУе Request Examples
cURL
# Minimal request
curl -X POST "https://api.ideal.house/api/v1/exteriorRenovator/generate" \
-H "APIKEY: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"imageUrl": "https://example.com/exterior.jpg"
}'
# Request with optional guidance
curl -X POST "https://api.ideal.house/api/v1/exteriorRenovator/generate" \
-H "APIKEY: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"imageUrl": "https://example.com/exterior.jpg",
"prompt": "Modern farmhouse exterior with warm wood accents, black window frames, and clean landscaping",
"referenceUrl": "https://example.com/reference-house.jpg",
"buildingStyleId": "modern-farmhouse",
"environmentId": "Architecture_Enviroment_Time_Night,Architecture_Enviroment_Time_Day"
}'
Java (OkHttp)
import okhttp3.*;
import java.io.IOException;
public class ExteriorRenovatorApiExample {
private static final String BASE_URL = "https://api.ideal.house";
private static final String API_KEY = "your_api_key_here";
public static void main(String[] args) throws IOException {
OkHttpClient client = new OkHttpClient();
String requestBody = """
{
"imageUrl": "https://example.com/exterior.jpg",
"prompt": "Modern farmhouse exterior with warm wood accents, black window frames, and clean landscaping",
"referenceUrl": "https://example.com/reference-house.jpg",
"buildingStyleId": "modern-farmhouse",
"environmentId": "Architecture_Enviroment_Time_Night,Architecture_Enviroment_Time_Day"
}
""";
Request request = new Request.Builder()
.url(BASE_URL + "/api/v1/exteriorRenovator/generate")
.addHeader("APIKEY", API_KEY)
.addHeader("Content-Type", "application/json")
.post(RequestBody.create(requestBody, MediaType.parse("application/json")))
.build();
try (Response response = client.newCall(request).execute()) {
System.out.println("Response: " + response.body().string());
}
}
}
Python (requests)
import requests
BASE_URL = "https://api.ideal.house"
API_KEY = "your_api_key_here"
headers = {
"APIKEY": API_KEY,
"Content-Type": "application/json"
}
payload = {
"imageUrl": "https://example.com/exterior.jpg",
"prompt": "Modern farmhouse exterior with warm wood accents, black window frames, and clean landscaping",
"referenceUrl": "https://example.com/reference-house.jpg",
"buildingStyleId": "modern-farmhouse",
"environmentId": "Architecture_Enviroment_Time_Night,Architecture_Enviroment_Time_Day"
}
response = requests.post(
f"{BASE_URL}/api/v1/exteriorRenovator/generate",
headers=headers,
json=payload
)
data = response.json()
task_id = data.get("data")
print(f"Task ID: {task_id}")
Node.js (axios)
const axios = require('axios');
const BASE_URL = 'https://api.ideal.house';
const API_KEY = 'your_api_key_here';
async function createExteriorRenovatorTask() {
try {
const response = await axios.post(
`${BASE_URL}/api/v1/exteriorRenovator/generate`,
{
imageUrl: 'https://example.com/exterior.jpg',
prompt: 'Modern farmhouse exterior with warm wood accents, black window frames, and clean landscaping',
referenceUrl: 'https://example.com/reference-house.jpg',
buildingStyleId: 'modern-farmhouse',
environmentId: 'Architecture_Enviroment_Time_Night,Architecture_Enviroment_Time_Day'
},
{
headers: {
'APIKEY': API_KEY,
'Content-Type': 'application/json'
}
}
);
const taskId = response.data.data;
console.log('Task ID:', taskId);
return taskId;
} catch (error) {
console.error('Error:', error.response?.data || error.message);
}
}
createExteriorRenovatorTask();
ЁЯУд Response
Success Response
{
"code": 0,
"message": "success",
"data": 1234567890123456789
}
| Field | Type | Description |
|---|---|---|
code | integer | 0 indicates success |
message | string | Response message |
data | long | The unique task ID for polling results |
2. Get Task Result
Retrieves the current status and output of a previously created exterior renovation task.
Endpoint
GET /api/v1/exteriorRenovator/result
Request Headers
| Header | Required | Description |
|---|---|---|
APIKEY | тЬЕ Yes | Your API authentication key |
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
taskId | long | тЬЕ Yes | The task ID returned from the create task endpoint |
ЁЯУе Request Examples
cURL
curl -X GET "https://api.ideal.house/api/v1/exteriorRenovator/result?taskId=1234567890123456789" \
-H "APIKEY: your_api_key_here"
Java (OkHttp)
import okhttp3.*;
import java.io.IOException;
public class ExteriorRenovatorResultExample {
private static final String BASE_URL = "https://api.ideal.house";
private static final String API_KEY = "your_api_key_here";
public static void main(String[] args) throws IOException {
OkHttpClient client = new OkHttpClient();
long taskId = 1234567890123456789L;
Request request = new Request.Builder()
.url(BASE_URL + "/api/v1/exteriorRenovator/result?taskId=" + taskId)
.addHeader("APIKEY", API_KEY)
.get()
.build();
try (Response response = client.newCall(request).execute()) {
System.out.println("Response: " + response.body().string());
}
}
}
Python (requests)
import requests
import time
BASE_URL = "https://api.ideal.house"
API_KEY = "your_api_key_here"
headers = {
"APIKEY": API_KEY
}
task_id = 1234567890123456789
while True:
response = requests.get(
f"{BASE_URL}/api/v1/exteriorRenovator/result",
headers=headers,
params={"taskId": task_id}
)
data = response.json()
result = data.get("data", {})
status = result.get("status")
print(f"Status: {status}, Progress: {result.get('percentage')}%, Queue: {result.get('waitNumber')}")
if status in ("Success", "Failed"):
break
time.sleep(3)
if status == "Success":
print("Result URL:", result["output"]["resultUrl"])
else:
print("Task failed")
Node.js (axios)
const axios = require('axios');
const BASE_URL = 'https://api.ideal.house';
const API_KEY = 'your_api_key_here';
async function pollResult(taskId) {
const headers = { 'APIKEY': API_KEY };
while (true) {
const response = await axios.get(
`${BASE_URL}/api/v1/exteriorRenovator/result`,
{
headers,
params: { taskId }
}
);
const result = response.data.data;
const { status, percentage, waitNumber } = result;
console.log(`Status: ${status} | Progress: ${percentage}% | Queue: ${waitNumber}`);
if (['Success', 'Failed'].includes(status)) {
if (status === 'Success') {
console.log('Result URL:', result.output.resultUrl);
console.log('Size:', result.output.width, 'x', result.output.height);
} else {
console.log('Task failed');
}
break;
}
await new Promise(resolve => setTimeout(resolve, 3000));
}
}
pollResult(1234567890123456789);
ЁЯУд Response
Success Response (Task Completed)
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Success",
"waitNumber": 0,
"percentage": 100,
"input": {
"imageUrl": "https://example.com/exterior.jpg",
"prompt": "Modern farmhouse exterior with warm wood accents, black window frames, and clean landscaping",
"refImageUrl": "https://example.com/reference-house.jpg",
"buildingStyleId": "modern-farmhouse",
"environmentId": "Architecture_Enviroment_Time_Night,Architecture_Enviroment_Time_Day"
},
"output": {
"resultUrl": "https://cdn.ideal.house/output/exterior_renovator_result.jpg",
"width": 1024,
"height": 1024
}
}
}
Response (Task Processing / In Queue)
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Processing",
"waitNumber": 1,
"percentage": 50,
"input": {
"imageUrl": "https://example.com/exterior.jpg"
},
"output": null
}
}
Response (Task Failed)
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Failed",
"waitNumber": 0,
"percentage": 0,
"input": {
"imageUrl": "https://example.com/exterior.jpg"
},
"output": null
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
id | long | Task unique identifier |
status | string | Current task status (see Task Status) |
waitNumber | integer | Number of tasks ahead in the queue (0 means currently processing) |
percentage | integer | Task completion percentage (0тАУ100) |
input | object | The original input parameters of the task |
input.imageUrl | string | Source exterior image URL |
input.prompt | string | Optional text guidance, if provided |
input.refImageUrl | string | Optional reference image URL, if provided |
input.buildingStyleId | string | Optional building style ID, if provided |
input.environmentId | string | Optional environment or scene style ID, if provided. May contain multiple IDs joined by comma |
output | object | Generation result (only available when status is Success) |
output.resultUrl | string | URL to the exterior renovation result image |
output.width | integer | Output width in pixels |
output.height | integer | Output height in pixels |
ЁЯУК Task Status
| Status | Description |
|---|---|
Unprocessed | Task has been created but not yet started |
Processing | Task is currently being processed |
Success | Task completed successfully тАФ output is available |
Failed | Task failed due to an error |
Poll every 3-5 seconds. See API Task Limit.
тЭМ Error Responses
All error responses share the same JSON structure:
{
"code": 5002,
"message": "Invalid API Key",
"data": null
}
Error Code Reference
| Code | Name | Description | Suggested Action |
|---|---|---|---|
1001 | FAILED | Request failed (generic error) | Check the message field for specific error details |
1003 | INTERNAL_ERROR | Internal server error | Retry after a short delay; contact support if it persists |
1011 | PARAM_ERROR | Request parameter error | Ensure request parameters are correctly formatted |
5002 | API_KEY_INVALID | Invalid or missing API Key | Ensure the APIKEY header is present and the value is correct |
9010 | SCAN_TEXT_ERROR | Text prompt failed content review | Modify the prompt to remove any sensitive or prohibited content |
9038 | PROHIBITED_CONTENT | Generated output image contains prohibited content | Adjust prompt/style/inputs and retry |
9051 | COINS_NOT_ENOUGH | Insufficient coins / credits | Top up your account credits and retry. See Credits Deduction Reference |
ЁЯУД For the complete list of common API error codes, refer to the Error Code Reference.