Ideal House
跳转到主要内容

房屋平面图生成 API 文档#

基础 URL: https://api.ideal.house
版本: v1
更新时间: 2026-06-12


📖 概述#

房屋平面图生成 API 允许您根据建筑风格、面积、结构配置和室内布局偏好,创建 AI 生成的户型排版展示图。生成成功后,该 API 将为每个任务恰好生成 1 张合成结果图。该图像在一个排版板中整合了协调的 2D 平面布置图、立面图和写实外观效果图。结果存储在 output.resultUrl 中,并作为唯一项包含在 output.resultList 里。工作流程是异步的,分为两个步骤:

  1. 创建任务 — 提交您的房屋平面图参数并获取 taskId
  2. 轮询结果 — 使用 taskId 查询任务状态并检索生成的图像。

🔐 身份验证#

所有 API 请求都必须使用 API 密钥进行身份验证。

在请求头中包含您的 API 密钥:

头字段
APIKEYyour_api_key_here

⚠️ 妥善保管您的 API 密钥。 请勿在客户端代码或公共仓库中暴露它。


💰 积分扣除#

[!WARNING] 🪙 成功创建任务后,将根据所选的 modelType 扣除积分。如果任务最终 失败,扣除的积分将 自动退还 到您的账户。
积分不足将返回错误代码 9051。📄 参见 积分扣除说明

模型(modelType扣除积分
Base10 积分
Pro20 积分

📌 API 端点#


1. 创建房屋平面图任务#

创建一个新的 AI 房屋平面图生成任务,并返回一个唯一的 taskId 用于轮询。

端点

纯文本
POST /api/v1/housePlan/generate

请求头

头字段必填说明
APIKEY✅ 是您的 API 认证密钥
Content-Type✅ 是application/json

请求体

字段类型必填说明默认值
stylestring / null✅ 是建筑风格英文名称。参见 风格选项Barndominium
storiesstring✅ 是层数。枚举:123+2
bedroomsstring✅ 是卧室数量。枚举:12345+2
bathroomsstring✅ 是卫生间数量。枚举:11.522.533.54+1
totalAreastring✅ 是总面积范围,格式为 min-max unit。参见 总面积选项150-200 m²
garageEnabledboolean✅ 是是否包含车库false
garageTypestring / null⚠️ 条件必填garageEnabled=true 时必填。参见 车库类型选项null
garageCapacitystring / null⚠️ 条件必填garageEnabled=true 时必填。参见 车库容量null
basementstring✅ 是地下室类型。参见 地下室选项None
roofTypestring / null❌ 否屋顶结构类型。参见 屋顶类型选项null
outdoorSpacesarray<string>❌ 否室外区域。参见 室外空间选项[]
layoutConceptstring / null❌ 否整体室内布局概念。参见 布局概念选项null
bedroomAreaRangesarray<object>✅ 是卧室面积范围。数组长度必须与卧室数量匹配。参见 卧室面积范围参见示例
bathroomLayoutsarray<object>✅ 是卫生间布局选项。数组长度应为 Math.floor(bathrooms)。参见 卫生间布局参见示例
kitchenLayoutstring / null❌ 否厨房布局。参见 厨房选项null
kitchenFeatureOptionsarray<string>❌ 否可选厨房特色功能。参见 厨房选项[]
keyRoomsstring / null❌ 否特色房间,多个用逗号和空格分隔。参见 关键房间选项null
promptstring❌ 否自定义文本提示,用于进一步引导生成""
refImageUrlstring❌ 否参考房屋图像的 URL,用于指导风格""
modelTypestring✅ 是模型质量类型。枚举:BasePro。⚠️ Flash 模式不支持Base

🖼️ 图片要求: 可选参考图片须使用 JPG/JPEG、PNG 或 WebP 格式,大小不得超过 20 MB,尺寸须在 128 × 128 px6,000 × 6,000 px(含边界)之间。超出最大像素尺寸的图片会自动按比例缩小,以适配 6,000 × 6,000 px 后再进行处理。其 URL 必须能被 API 服务器直接访问。


🎨 风格选项#

说明
Barndominium默认。 金属谷仓风格混合住宅
Cabin乡村木屋风格
Cape Cod经典新英格兰对称风格
Coastal轻盈通透的海滨风格
Colonial传统对称殖民风格建筑
Contemporary线条简洁的现代材质
Craftsman手工细节与自然材质
Farmhouse乡村农舍风格
French Country优雅的法国乡村风格
Mediterranean暖色灰泥搭配赤陶元素
Mid-Century Modern1950年代–70年代简约几何现代主义
Modern极简主义平顶/几何现代设计
Ranch单层延展布局
Shingle Style连续木质瓦片外立面
Southwestern受土坯启发的沙漠风格
Transitional传统与现代融合
Tudor半木结构的英格兰中世纪风格
Victorian繁复的 19世纪装饰风格

📐 总面积选项#

totalArea 字段采用 min-max unit 格式。公制值使用 ;英制值使用 ft²。最小值必须比最大值低至少一个步长。

单位最小值最大值步长示例
5050010150-200 m²
ft²50050001001500-2000 ft²

🏠 屋顶类型选项#

说明
Gable roof经典三角形坡屋顶
Hip roof四面坡屋顶
Flat roof微坡度平顶
Pitched roof通用陡坡屋顶

🏗️ 地下室选项#

说明
None无地下室
Partial局部地下室
Full全地下室

🚗 车库类型选项#

仅在 garageEnabled=true 时必填 garageType;否则发送 null

说明
Detached独立车库
Front Entry车库入口朝前
Side Entry车库入口朝侧
Rear Entry车库入口朝后

🚗 车库容量#

仅在 garageEnabled=true 时必填 garageCapacity;否则发送 null

说明
1单车位车库
2双车位车库
3+三个或以上车位

🌿 室外空间选项#

outdoorSpaces 字段接受以下值的数组。

说明
Front porch正面带顶门廊
Covered patio带顶户外露台
Deck木质或复合材料露台
Balcony抬高的户外平台
Courtyard封闭式或半封闭户外庭院
Breezeway连接建筑的带顶通道
Outdoor Kitchen户外烹饪与用餐区

示例

纯文本
"outdoorSpaces": ["Front porch", "Deck", "Balcony"]

🏛️ 布局概念选项#

说明
Open Concept开放式连通起居空间
Traditional分隔房间与明确边界
Split-Level区域间错层楼板

🛏️ 卧室面积范围#

bedroomAreaRanges 字段必须是一个数组,其长度须与 bedrooms 数量匹配。每项采用如下结构:

字段类型说明
namestring卧室显示名称,例如 Room 1 (Master)
minAreastring最小卧室面积,必须为非负数字字符串
maxAreastring最大卧室面积,必须大于等于 minArea
unitstring面积单位。枚举:ft²

bedrooms="2" 的默认示例

json
[
  { "name": "Room 1 (Master)", "minArea": "12", "maxArea": "18", "unit": "m²" },
  { "name": "Room 2", "minArea": "10", "maxArea": "14", "unit": "m²" }
]

🛁 卫生间布局#

bathroomLayouts 字段必须是一个数组,其长度应为 Math.floor(bathrooms)。例如,bathrooms="2.5" 需要 2 个卫生间布局对象。

字段类型说明
namestring卫生间显示名称,例如 Bathroom 1
layoutstring / null枚举:With Wet & Dry SeparationWithout Separationnull

bathrooms="1" 的默认示例

json
[
  { "name": "Bathroom 1", "layout": null }
]

🍳 厨房选项#

厨房布局

说明
Open Kitchen与起居/用餐区相连的开敞厨房
Closed Kitchen封闭独立厨房空间

厨房特色功能选项

说明
Eating Bar餐吧台 / 柜台座椅
Kitchen Island厨房中岛
Breakfast Nook早餐角

🚪 关键房间选项#

keyRooms 字段接受以下一个或多个值。选择多个选项时,用 逗号(, 连接。

说明
Home Office专用家庭办公室或书房
Bonus Room灵活多功能附加室
Media Room家庭影院或媒体中心
Mudroom户外装备入户间
Laundry Room专用洗衣房
Guest Suite独立客人卧室套房

示例

纯文本
"keyRooms": "Home Office, Media Room, Guest Suite"

模型类型

说明
Base默认。 速度与质量平衡。生成高分辨率合成排版展示图
Pro更高质量和更高分辨率输出,速度较慢

⚠️ 注意: 此 API 不提供 Flash 模式。仅支持 BasePro


📥 请求示例#

cURL
bash
# Basic request with default values
curl -X POST "https://api.ideal.house/api/v1/housePlan/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "style": "Barndominium",
    "stories": "2",
    "bedrooms": "2",
    "bathrooms": "1",
    "totalArea": "150-200 m²",
    "garageEnabled": false,
    "garageType": null,
    "garageCapacity": null,
    "basement": "None",
    "roofType": null,
    "outdoorSpaces": [],
    "layoutConcept": null,
    "bedroomAreaRanges": [
      { "name": "Room 1 (Master)", "minArea": "12", "maxArea": "18", "unit": "m²" },
      { "name": "Room 2", "minArea": "10", "maxArea": "14", "unit": "m²" }
    ],
    "bathroomLayouts": [
      { "name": "Bathroom 1", "layout": null }
    ],
    "kitchenLayout": null,
    "kitchenFeatureOptions": [],
    "keyRooms": null,
    "prompt": "",
    "refImageUrl": "",
    "modelType": "Base"
  }'

# Pro model with reference image and custom prompt
curl -X POST "https://api.ideal.house/api/v1/housePlan/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "style": "Victorian",
    "stories": "3+",
    "bedrooms": "5+",
    "bathrooms": "4+",
    "totalArea": "300-380 m²",
    "garageEnabled": true,
    "garageType": "Front Entry",
    "garageCapacity": "3+",
    "basement": "Full",
    "roofType": "Gable roof",
    "outdoorSpaces": ["Front porch", "Balcony", "Courtyard", "Outdoor Kitchen"],
    "layoutConcept": "Traditional",
    "bedroomAreaRanges": [
      { "name": "Room 1 (Master)", "minArea": "18", "maxArea": "28", "unit": "m²" },
      { "name": "Room 2", "minArea": "12", "maxArea": "16", "unit": "m²" },
      { "name": "Room 3", "minArea": "12", "maxArea": "16", "unit": "m²" },
      { "name": "Room 4", "minArea": "10", "maxArea": "14", "unit": "m²" },
      { "name": "Room 5", "minArea": "10", "maxArea": "14", "unit": "m²" }
    ],
    "bathroomLayouts": [
      { "name": "Bathroom 1", "layout": "With Wet & Dry Separation" },
      { "name": "Bathroom 2", "layout": "With Wet & Dry Separation" },
      { "name": "Bathroom 3", "layout": "Without Separation" },
      { "name": "Bathroom 4", "layout": null }
    ],
    "kitchenLayout": "Closed Kitchen",
    "kitchenFeatureOptions": ["Kitchen Island", "Breakfast Nook"],
    "keyRooms": "Home Office, Bonus Room, Media Room, Guest Suite",
    "prompt": "Grand Victorian mansion with ornate details and wraparound porch",
    "refImageUrl": "https://example.com/reference-house.jpg",
    "modelType": "Pro"
  }'
Java (OkHttp)
java
import okhttp3.*;
import java.io.IOException;

public class HousePlanApiExample {

    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 = """
            {
                "style": "Barndominium",
                "stories": "2",
                "bedrooms": "2",
                "bathrooms": "1",
                "totalArea": "150-200 m²",
                "garageEnabled": false,
                "garageType": null,
                "garageCapacity": null,
                "basement": "None",
                "roofType": null,
                "outdoorSpaces": [],
                "layoutConcept": null,
                "bedroomAreaRanges": [
                    { "name": "Room 1 (Master)", "minArea": "12", "maxArea": "18", "unit": "m²" },
                    { "name": "Room 2", "minArea": "10", "maxArea": "14", "unit": "m²" }
                ],
                "bathroomLayouts": [
                    { "name": "Bathroom 1", "layout": null }
                ],
                "kitchenLayout": null,
                "kitchenFeatureOptions": [],
                "keyRooms": null,
                "prompt": "",
                "refImageUrl": "",
                "modelType": "Base"
            }
            """;

        Request request = new Request.Builder()
            .url(BASE_URL + "/api/v1/housePlan/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)
python
import requests

BASE_URL = "https://api.ideal.house"
API_KEY  = "your_api_key_here"

headers = {
    "APIKEY": API_KEY,
    "Content-Type": "application/json"
}

payload = {
    "style": "Barndominium",
    "stories": "2",
    "bedrooms": "2",
    "bathrooms": "1",
    "totalArea": "150-200 m²",
    "garageEnabled": False,
    "garageType": None,
    "garageCapacity": None,
    "basement": "None",
    "roofType": None,
    "outdoorSpaces": [],
    "layoutConcept": None,
    "bedroomAreaRanges": [
        { "name": "Room 1 (Master)", "minArea": "12", "maxArea": "18", "unit": "m²" },
        { "name": "Room 2", "minArea": "10", "maxArea": "14", "unit": "m²" }
    ],
    "bathroomLayouts": [
        { "name": "Bathroom 1", "layout": None }
    ],
    "kitchenLayout": None,
    "kitchenFeatureOptions": [],
    "keyRooms": None,
    "prompt": "",
    "refImageUrl": "",
    "modelType": "Base"
}

response = requests.post(
    f"{BASE_URL}/api/v1/housePlan/generate",
    headers=headers,
    json=payload
)

data = response.json()
task_id = data.get("data")
print(f"Task ID: {task_id}")
Node.js (axios)
javascript
const axios = require('axios');

const BASE_URL = 'https://api.ideal.house';
const API_KEY  = 'your_api_key_here';

async function createHousePlanTask() {
  try {
    const response = await axios.post(
      `${BASE_URL}/api/v1/housePlan/generate`,
      {
        style: 'Barndominium',
        stories: '2',
        bedrooms: '2',
        bathrooms: '1',
        totalArea: '150-200 m²',
        garageEnabled: false,
        garageType: null,
        garageCapacity: null,
        basement: 'None',
        roofType: null,
        outdoorSpaces: [],
        layoutConcept: null,
        bedroomAreaRanges: [
          { name: 'Room 1 (Master)', minArea: '12', maxArea: '18', unit: 'm²' },
          { name: 'Room 2', minArea: '10', maxArea: '14', unit: 'm²' }
        ],
        bathroomLayouts: [
          { name: 'Bathroom 1', layout: null }
        ],
        kitchenLayout: null,
        kitchenFeatureOptions: [],
        keyRooms: null,
        prompt: '',
        refImageUrl: '',
        modelType: 'Base'
      },
      {
        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);
  }
}

createHousePlanTask();

📤 响应#

成功响应

json
{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
字段类型说明
codeinteger0 表示成功
messagestring响应消息
datalong用于轮询结果的唯一任务 ID

2. 获取任务结果#

检索之前创建的房屋平面图任务的当前状态和输出。

端点

纯文本
GET /api/v1/housePlan/result

请求头

头字段必填说明
APIKEY✅ 是您的 API 认证密钥

查询参数

参数类型必填说明
taskIdlong✅ 是创建任务端点返回的任务 ID

📥 请求示例#

cURL
bash
curl -X GET "https://api.ideal.house/api/v1/housePlan/result?taskId=1234567890123456789" \
  -H "APIKEY: your_api_key_here"
Java (OkHttp)
java
import okhttp3.*;
import java.io.IOException;

public class HousePlanResultExample {

    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/housePlan/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)
python
import requests
import time

BASE_URL = "https://api.ideal.house"
API_KEY  = "your_api_key_here"

headers = {
    "APIKEY": API_KEY
}

task_id = 1234567890123456789

# Poll until task is complete
while True:
    response = requests.get(
        f"{BASE_URL}/api/v1/housePlan/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", "Termination"):
        break

    time.sleep(3)  # Poll every 3 seconds

if status == "Success":
    output = result["output"]
    print("Composite Result URL:", output["resultUrl"])
    print("Result List:", output.get("resultList", []))
else:
    print("Task ended with status:", status)
Node.js (axios)
javascript
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/housePlan/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', 'Termination'].includes(status)) {
      if (status === 'Success') {
        console.log('Composite Result URL:', result.output.resultUrl);
        console.log('Result List:', result.output.resultList);
      } else {
        console.log('Task ended with status:', status);
      }
      break;
    }

    // Wait 3 seconds before next poll
    await new Promise(resolve => setTimeout(resolve, 3000));
  }
}

pollResult(1234567890123456789n);

📤 响应#

📸 注意: 此 API 将为每个成功任务恰好生成 1 张合成结果图。该图像在一个排版板中整合了 2D 平面布置图、立面图和写实外观效果图。output.resultUrl 包含合成图像 URL,output.resultList 则为兼容起见包含同一个 URL 的单元素数组。

成功响应(任务完成)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Success",
    "waitNumber": 0,
    "percentage": 100,
    "input": {
      "style": "Barndominium",
      "stories": "2",
      "bedrooms": "2",
      "bathrooms": "1",
      "totalArea": "150-200 m²",
      "garageEnabled": false,
      "garageType": null,
      "garageCapacity": null,
      "basement": "None",
      "roofType": null,
      "outdoorSpaces": [],
      "layoutConcept": null,
      "bedroomAreaRanges": [
        { "name": "Room 1 (Master)", "minArea": "12", "maxArea": "18", "unit": "m²" },
        { "name": "Room 2", "minArea": "10", "maxArea": "14", "unit": "m²" }
      ],
      "bathroomLayouts": [
        { "name": "Bathroom 1", "layout": null }
      ],
      "kitchenLayout": null,
      "kitchenFeatureOptions": [],
      "keyRooms": null,
      "prompt": "",
      "refImageUrl": "",
      "modelType": "Base"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/house_plan_composite.jpg",
      "resultList": [
        "https://cdn.ideal.house/output/house_plan_composite.jpg"
      ],
      "width": 2560,
      "height": 1440
    }
  }
}

响应(任务处理中 / 队列中)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Processing",
    "waitNumber": 1,
    "percentage": 45,
    "input": {
      "style": "Barndominium",
      "stories": "2",
      "bedrooms": "2",
      "bathrooms": "1",
      "totalArea": "150-200 m²",
      "garageEnabled": false,
      "garageType": null,
      "garageCapacity": null,
      "basement": "None",
      "roofType": null,
      "outdoorSpaces": [],
      "layoutConcept": null,
      "bedroomAreaRanges": [
        { "name": "Room 1 (Master)", "minArea": "12", "maxArea": "18", "unit": "m²" },
        { "name": "Room 2", "minArea": "10", "maxArea": "14", "unit": "m²" }
      ],
      "bathroomLayouts": [
        { "name": "Bathroom 1", "layout": null }
      ],
      "kitchenLayout": null,
      "kitchenFeatureOptions": [],
      "keyRooms": null,
      "prompt": "",
      "refImageUrl": "",
      "modelType": "Base"
    },
    "output": null
  }
}

响应(任务失败)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Failed",
    "waitNumber": 0,
    "percentage": 0,
    "input": {
      "style": "Barndominium",
      "stories": "2",
      "bedrooms": "2",
      "bathrooms": "1",
      "totalArea": "150-200 m²",
      "garageEnabled": false,
      "basement": "None",
      "modelType": "Base"
    },
    "output": null
  }
}

响应字段

字段类型说明
idlong任务唯一标识符
statusstring当前任务状态(参见 任务状态
waitNumberinteger队列中排在任务前面的数量(0 表示正在处理)
percentageinteger任务完成百分比(0–100
inputobject任务的原始输入参数
input.stylestring建筑风格
input.totalAreastring总面积范围
input.storiesstring楼层数
input.bedroomsstring卧室数量
input.bathroomsstring卫生间数量
input.garageEnabledboolean是否请求了车库
input.garageTypestring / null车库类型
input.garageCapacitystring / null车库泊位数
input.basementstring地下室类型
input.roofTypestring屋顶类型
input.outdoorSpacesarray<string>室外空间
input.layoutConceptstring整体布局概念
input.bedroomAreaRangesarray<object>卧室面积范围
input.bathroomLayoutsarray<object>卫生间布局选项
input.kitchenLayoutstring厨房布局风格
input.kitchenFeatureOptionsarray<string>可选厨房特色功能
input.keyRoomsstring关键特色房间(逗号分隔)
input.promptstring自定义文本提示(如有提供)
input.refImageUrlstring参考图像 URL(如有提供)
input.modelTypestring使用的模型类型
outputobject生成结果(仅当 statusSuccess 时可获取)
output.resultUrlstring指向生成合成房屋平面图排版展示板的 URL
output.resultListarray<string>指向生成结果图像的 URLs。对于房屋平面图,通常是一个单元素数组,包含与 output.resultUrl 相同的 URL
output.widthinteger输出宽度(像素)
output.heightinteger输出高度(像素)

📊 任务状态#

状态说明
Unprocessed任务已创建但尚未开始
Processing任务正在处理中
Success任务成功完成 — 输出可用
Failed任务因错误而失败
Termination任务被中断或终止

3-5 秒 轮询一次。参见 API 任务限制


❌ 错误响应#

所有错误响应共享相同的 JSON 结构:

json
{
  "code": 5002,
  "message": "Invalid API Key",
  "data": null
}

错误代码说明#

代码名称说明建议操作
1001FAILED请求失败(通用错误)查看 message 字段以获取具体错误详情
1003INTERNAL_ERROR内部服务器错误短暂延迟后重试;若持续发生请联系支持团队
1011PARAM_ERROR请求参数错误确认所有必填参数均已提供且格式正确
5002API_KEY_INVALIDAPI 密钥无效或缺失确保 APIKEY 头字段存在且值正确
9010SCAN_TEXT_ERROR文本提示内容审核失败修改提示词以去除任何敏感或禁止内容
9038PROHIBITED_CONTENT生成的输出图像包含禁止内容调整提示词/风格/输入后重试
9051COINS_NOT_ENOUGH积分不足充值账户积分后重试

📄 完整的常见 API 错误代码列表,请参阅 错误代码说明