เอกสาร API การสร้างแปลนบ้าน#
URL พื้นฐาน:
https://api.ideal.house
เวอร์ชัน: v1
อัปเดต: 2026-06-12
📖 ภาพรวม#
API แปลนบ้าน Generation ช่วยให้คุณสร้างบอร์ดนำเสนอแปลนบ้านที่สร้างด้วย AI ได้ตามสไตล์สถาปัตยกรรม พื้นที่ การวางโครงสร้าง และความต้องการการจัดวางภายใน เมื่อสร้างเสร็จสมบูรณ์ API จะสร้างภาพผลลัพธ์รวม 1 ต่องานหนึ่งภาพเท่านั้น ภาพนี้ประกอบด้วยแผนผัง 2D, ภาพตัดขวางภายนอก และภาพเรนเดอร์ภายนอกแบบสมจริงในบอร์ดนำเสนอเดียว ผลลัพธ์จะถูกเก็บไว้ใน output.resultUrl และรวมอยู่ใน output.resultList เป็นรายการเดียว กระบวนการทำงานเป็นแบบไม่ซิงโครนัสและมีสองขั้นตอน:
- สร้างงาน — ส่งพารามิเตอร์แปลนบ้านของคุณและรับ
taskIdกลับมา - ตรวจสอบผลลัพธ์ — ใช้
taskIdเพื่อสอบถามสถานะงานและดึงภาพที่สร้างแล้ว
🔐 การยืนยันตัวตน#
คำขอ API ทั้งหมดต้องได้รับการยืนยันตัวตนโดยใช้ คีย์ API
รวมคีย์ API ของคุณในหัวข้อความขอ:
| หัวข้อ | ค่า |
|---|---|
APIKEY | your_api_key_here |
⚠️ รักษาความปลอดภัยคีย์ API ของคุณ อย่าเปิดเผยในโค้ดฝั่งไคลเอนต์หรือรีโพสิทอรีสาธารณะ
💰 การหักเครดิต#
[!WARNING] 🪙 เครดิตจะถูกหักตาม
modelTypeที่เลือกเมื่อสร้างงานสำเร็จ หากงาน ล้มเหลว ในที่สุด เครดิตที่ถูกหักจะ ถูกคืนอัตโนมัติ เข้าบัญชีของคุณ
เครดิตไม่เพียงพอจะคืนรหัสข้อผิดพลาด9051📄 ดู อ้างอิงการหักเครดิต
โมเดล (modelType) | เครดิตที่ถูกหัก |
|---|---|
Base | 10 เครดิต |
Pro | 20 เครดิต |
📌 เอนด์พอยต์ API#
1. สร้างงานแปลนบ้าน#
สร้างงานสร้างแปลนบ้าน AI ใหม่และคืน taskId ที่ไม่ซ้ำกันสำหรับการตรวจสอบสถานะ
เอนด์พอยต์
POST /api/v1/housePlan/generate
หัวข้อความขอ
| หัวข้อ | จำเป็น | คำอธิบาย |
|---|---|---|
APIKEY | ✅ ใช่ | คีย์ API สำหรับยืนยันตัวตนของคุณ |
Content-Type | ✅ ใช่ | application/json |
เนื้อหาข้อความขอ
| ฟิลด์ | ประเภท | จำเป็น | คำอธิบาย | ค่าเริ่มต้น |
|---|---|---|---|---|
style | string / null | ✅ ใช่ | ชื่อสไตล์สถาปัตยกรรมภาษาอังกฤษ ดู ตัวเลือกสไตล์ | Barndominium |
stories | string | ✅ ใช่ | จำนวนชั้น Enum: 1, 2, 3+ | 2 |
bedrooms | string | ✅ ใช่ | จำนวนห้องนอน Enum: 1, 2, 3, 4, 5+ | 2 |
bathrooms | string | ✅ ใช่ | จำนวนห้องน้ำ Enum: 1, 1.5, 2, 2.5, 3, 3.5, 4+ | 1 |
totalArea | string | ✅ ใช่ | ช่วงพื้นที่รวมในรูปแบบ min-max unit ดู ตัวเลือกพื้นที่รวม | 150-200 m² |
garageEnabled | boolean | ✅ ใช่ | ว่าจะรวมโรงรถหรือไม่ | false |
garageType | string / null | ⚠️ เงื่อนไข | จำเป็นเมื่อ garageEnabled=true ดู ตัวเลือกประเภทโรงรถ | null |
garageCapacity | string / null | ⚠️ เงื่อนไข | จำเป็นเมื่อ garageEnabled=true ดู ความจุโรงรถ | null |
basement | string | ✅ ใช่ | ประเภทห้องใต้ดิน ดู ตัวเลือกห้องใต้ดิน | None |
roofType | string / null | ❌ ไม่ | ประเภทโครงสร้างหลังคา ดู ตัวเลือกประเภทหลังคา | null |
outdoorSpaces | array<string> | ❌ ไม่ | พื้นที่กลางแจ้ง ดู ตัวเลือกพื้นที่กลางแจ้ง | [] |
layoutConcept | string / null | ❌ ไม่ | แนวคิดการจัดวางภายในโดยรวม ดู ตัวเลือกแนวคิดการจัดวาง | null |
bedroomAreaRanges | array<object> | ✅ ใช่ | ช่วงพื้นที่ห้องนอน ความยาวต้องตรงกับจำนวนห้องนอน ดู ช่วงพื้นที่ห้องนอน | ดูตัวอย่าง |
bathroomLayouts | array<object> | ✅ ใช่ | การเลือกเลย์เอาต์ห้องน้ำ ความยาวต้องเป็น Math.floor(bathrooms) ดู เลย์เอาต์ห้องน้ำ | ดูตัวอย่าง |
kitchenLayout | string / null | ❌ ไม่ | เลย์เอาต์ห้องครัว ดู ตัวเลือกห้องครัว | null |
kitchenFeatureOptions | array<string> | ❌ ไม่ | ฟีเจอร์ห้องครัวเพิ่มเติม ดู ตัวเลือกห้องครัว | [] |
keyRooms | string / null | ❌ ไม่ | ห้องพิเศษที่เชื่อมต่อด้วยเครื่องหมายจุลภาคและช่องว่าง ดู ตัวเลือกห้องหลัก | null |
prompt | string | ❌ ไม่ | คำสั่งข้อความแบบกำหนดเองเพื่อชี้นำการสร้าง | "" |
refImageUrl | string | ❌ ไม่ | URL ของภาพบ้านอ้างอิงเพื่อชี้นำสไตล์ | "" |
modelType | string | ✅ ใช่ | ประเภทคุณภาพโมเดล Enum: Base, Pro. ⚠️ โหมด Flash ไม่รองรับ | Base |
🖼️ ข้อกำหนดของภาพ: ภาพอ้างอิงแบบไม่บังคับต้องเป็น JPG/JPEG, PNG หรือ WebP ต้องมีขนาดไม่เกิน 20 MB และต้องมีขนาดตั้งแต่ 128 × 128 px ถึง 6,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 Modern | มินิมอลเรขาคณิตสมัยใหม่ยุค 1950s–70s |
Modern | การออกแบบสมัยใหม่แบบมินิมอลที่มีมุมและเส้นตรง |
Ranch | การจัดวางแบบชั้นเดียวที่แผ่ขยาย |
Shingle Style | ภายนอกปูด้วยไม้สังกะสีต่อเนื่อง |
Southwestern | สไตล์ทะเลทรายที่ได้รับแรงบันดาลใจจากอะโดบี |
Transitional | การผสมผสานระหว่างแบบดั้งเดิมและร่วมสมัย |
Tudor | สไตล์อังกฤษยุคกลางแบบไม้ครึ่งหลัง |
Victorian | สไตล์ตกแต่งวิคตอเรียนที่วิจิตรในศตวรรษที่ 19 |
📐 ตัวเลือกพื้นที่รวม#
ฟิลด์ totalArea ใช้รูปแบบ min-max unit ค่าระบบเมตริกใช้ m²; ค่าระบบอิมพีเรียลใช้ ft². ค่าต่ำสุดต้องต่ำกว่าค่าสูงสุดอย่างน้อยหนึ่งขั้น
| หน่วย | ต่ำสุด | สูงสุด | ขั้น | ตัวอย่าง |
|---|---|---|---|---|
m² | 50 | 500 | 10 | 150-200 m² |
ft² | 500 | 5000 | 100 | 1500-2000 ft² |
🏠 ตัวเลือกประเภทหลังคา#
| ค่า | คำอธิบาย |
|---|---|
Gable roof | หลังคาทรงสามเหลี่ยมยอดแหลมแบบคลาสสิก |
Hip roof | เอียงทั้งสี่ด้าน |
Flat roof | หลังคาแบนเอียงน้อยที่สุด |
Pitched roof | หลังคาเอียงชันทั่วไป |
🏗️ ตัวเลือกห้องใต้ดิน#
| ค่า | คำอธิบาย |
|---|---|
None | ไม่มีห้องใต้ดิน |
Partial | ห้องใต้ดินบางส่วน |
Full | ห้องใต้ดินเต็มรูปแบบ |
🚗 ตัวเลือกประเภทโรงรถ#
garageType จำเป็นเฉพาะเมื่อ garageEnabled=true; หากไม่ตรงเงื่อนไขให้ส่ง null
| ค่า | คำอธิบาย |
|---|---|
Detached | โรงรถแยกส่วน |
Front Entry | ทางเข้าโรงรถหันหน้าไปทางหน้าบ้าน |
Side Entry | ทางเข้าโรงรถหันหน้าไปทางด้านข้าง |
Rear Entry | ทางเข้าโรงรถหันหน้าไปทางด้านหลัง |
🚗 ความจุโรงรถ#
garageCapacity จำเป็นเฉพาะเมื่อ garageEnabled=true; หากไม่ตรงเงื่อนไขให้ส่ง 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 แต่ละรายการใช้รูปแบบดังนี้:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
name | string | ชื่อแสดงของห้องนอน เช่น Room 1 (Master) |
minArea | string | พื้นที่ห้องนอนขั้นต่ำ ต้องเป็นสตริงตัวเลขที่ไม่ติดลบ |
maxArea | string | พื้นที่ห้องนอนสูงสุด ต้องมากกว่าหรือเท่ากับ minArea |
unit | string | หน่วยพื้นที่ Enum: m², ft² |
ตัวอย่างค่าเริ่มต้นสำหรับ bedrooms="2"
[
{ "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 รายการ
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
name | string | ชื่อแสดงของห้องน้ำ เช่น Bathroom 1 |
layout | string / null | Enum: With Wet & Dry Separation, Without Separation หรือ null |
ตัวอย่างค่าเริ่มต้นสำหรับ bathrooms="1"
[
{ "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 | คุณภาพและความละเอียดของผลลัพธ์สูงกว่า ช้ากว่า |
⚠️ หมายเหตุ: โหมด
Flashไม่พร้อมใช้งาน สำหรับ API นี้ รองรับเฉพาะBaseและPro
📥 ตัวอย่างคำขอ#
cURL
# 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)
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)
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)
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();
📤 คำตอบ#
คำตอบสำเร็จ
{
"code": 0,
"message": "success",
"data": 1234567890123456789
}
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
code | integer | 0 บ่งชี้ว่าสำเร็จ |
message | string | ข้อความตอบกลับ |
data | long | รหัสงานที่ไม่ซ้ำกันสำหรับการตรวจสอบสถานะ |
2. รับผลลัพธ์งาน#
ดึงสถานะปัจจุบันและผลลัพธ์ของงานแปลนบ้านที่สร้างไว้ก่อนหน้า
เอนด์พอยต์
GET /api/v1/housePlan/result
หัวข้อความขอ
| หัวข้อ | จำเป็น | คำอธิบาย |
|---|---|---|
APIKEY | ✅ ใช่ | คีย์ API สำหรับยืนยันตัวตนของคุณ |
พารามิเตอร์คิวรี
| พารามิเตอร์ | ประเภท | จำเป็น | คำอธิบาย |
|---|---|---|---|
taskId | long | ✅ ใช่ | รหัสงานที่คืนจากเอนด์พอยต์สร้างงาน |
📥 ตัวอย่างคำขอ#
cURL
curl -X GET "https://api.ideal.house/api/v1/housePlan/result?taskId=1234567890123456789" \
-H "APIKEY: your_api_key_here"
Java (OkHttp)
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)
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)
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 เดียวกันเป็นอาร์เรย์รายการเดียวเพื่อรองรับความเข้ากันได้
คำตอบสำเร็จ (งานเสร็จสมบูรณ์)
{
"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
}
}
}
คำตอบ (งานกำลังประมวลผล / อยู่ในคิว)
{
"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
}
}
คำตอบ (งานล้มเหลว)
{
"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
}
}
ฟิลด์คำตอบ
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | long | ตัวระบุเฉพาะของงาน |
status | string | สถานะงานปัจจุบัน (ดู สถานะงาน) |
waitNumber | integer | จำนวนงานที่อยู่ข้างหน้าในคิว (0 หมายถึงกำลังประมวลผล) |
percentage | integer | ร้อยละความคืบหน้าของงาน (0–100) |
input | object | พารามิเตอร์อินพุตเดิมของงาน |
input.style | string | สไตล์สถาปัตยกรรม |
input.totalArea | string | ช่วงพื้นที่รวม |
input.stories | string | จำนวนชั้น |
input.bedrooms | string | จำนวนห้องนอน |
input.bathrooms | string | จำนวนห้องน้ำ |
input.garageEnabled | boolean | ระบุว่ามีโรงรถหรือไม่ |
input.garageType | string / null | ประเภทโรงรถ |
input.garageCapacity | string / null | จำนวนที่จอดรถ |
input.basement | string | ประเภทห้องใต้ดิน |
input.roofType | string | ประเภทหลังคา |
input.outdoorSpaces | array<string> | พื้นที่กลางแจ้ง |
input.layoutConcept | string | แนวคิดการจัดวางโดยรวม |
input.bedroomAreaRanges | array<object> | ช่วงพื้นที่ห้องนอน |
input.bathroomLayouts | array<object> | การเลือกเลย์เอาต์ห้องน้ำ |
input.kitchenLayout | string | สไตล์เลย์เอาต์ห้องครัว |
input.kitchenFeatureOptions | array<string> | ฟีเจอร์ห้องครัวเพิ่มเติม |
input.keyRooms | string | ห้องพิเศษหลัก (แยกด้วยเครื่องหมายจุลภาค) |
input.prompt | string | คำสั่งข้อความแบบกำหนดเอง (ถ้ามี) |
input.refImageUrl | string | URL ของภาพอ้างอิง (ถ้ามี) |
input.modelType | string | ประเภทโมเดลที่ใช้ |
output | object | ผลลัพธ์การสร้าง (พร้อมใช้งานเฉพาะเมื่อ status เป็น Success) |
output.resultUrl | string | URL ไปยังบอร์ดนำเสนอแปลนบ้านแบบคอมโพสิตที่สร้างแล้ว |
output.resultList | array<string> | URLs ไปยังภาพผลลัพธ์ที่สร้าง สำหรับ แปลนบ้าน โดยปกติจะเป็นอาร์เรย์ที่มีรายการเดียวซึ่งมี URL เดียวกับ output.resultUrl |
output.width | integer | ความกว้างของผลลัพธ์ในพิกเซล |
output.height | integer | ความสูงของผลลัพธ์ในพิกเซล |
📊 สถานะงาน#
| สถานะ | คำอธิบาย |
|---|---|
Unprocessed | งานถูกสร้างแล้วแต่ยังไม่เริ่ม |
Processing | งานกำลังถูกประมวลผล |
Success | งานสำเร็จ — ผลลัพธ์พร้อมใช้งาน |
Failed | งานล้มเหลวเนื่องจากข้อผิดพลาด |
Termination | งานถูกขัดจังหวะหรือยุติ |
ตรวจสอบสถานะเป็นระยะทุก 3-5 วินาที ดู API ข้อจำกัดงาน
❌ คำตอบข้อผิดพลาด#
คำตอบข้อผิดพลาดทั้งหมดใช้โครงสร้าง JSON เดียวกัน:
{
"code": 5002,
"message": "Invalid API Key",
"data": null
}
อ้างอิงรหัสข้อผิดพลาด#
| รหัส | ชื่อ | คำอธิบาย | การดำเนินการที่แนะนำ |
|---|---|---|---|
1001 | FAILED | คำขอล้มเหลว (ข้อผิดพลาดทั่วไป) | ตรวจสอบฟิลด์ message เพื่อรายละเอียดข้อผิดพลาดเฉพาะ |
1003 | INTERNAL_ERROR | ข้อผิดพลาดภายในเซิร์ฟเวอร์ | ลองใหม่หลังจากพักสั้นๆ; ติดต่อฝ่ายสนับสนุนหากยังเกิดขึ้น |
1011 | PARAM_ERROR | ข้อผิดพลาดพารามิเตอร์คำขอ | ตรวจสอบว่าพารามิเตอร์ที่จำเป็นทั้งหมดถูกให้มาและจัดรูปแบบถูกต้อง |
5002 | API_KEY_INVALID | คีย์ API ไม่ถูกต้องหรือไม่พบ | ตรวจสอบว่าเฮดเดอร์ APIKEY มีอยู่และค่าถูกต้อง |
9010 | SCAN_TEXT_ERROR | คำสั่งข้อความไม่ผ่านการตรวจสอบเนื้อหา | แก้ไขคำสั่งเพื่อลบเนื้อหาที่อ่อนไหวหรือห้ามใช้ |
9038 | PROHIBITED_CONTENT | ภาพผลลัพธ์ที่สร้างมามีเนื้อหาที่ห้ามใช้ | ปรับคำสั่ง/สไตล์/อินพุตและลองใหม่ |
9051 | COINS_NOT_ENOUGH | เหรียญ/เครดิตไม่เพียงพอ | เติมเครดิตในบัญชีและลองใหม่ |
📄 สำหรับรายการรหัสข้อผิดพลาด API ทั่วไปทั้งหมด ดู อ้างอิงรหัสข้อผิดพลาด