Ideal House
ข้ามไปยังเนื้อหา

เอกสาร API การสร้างแปลนบ้าน#

URL พื้นฐาน: https://api.ideal.house
เวอร์ชัน: v1
อัปเดต: 2026-06-12


📖 ภาพรวม#

API แปลนบ้าน Generation ช่วยให้คุณสร้างบอร์ดนำเสนอแปลนบ้านที่สร้างด้วย 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✅ ใช่จำนวนชั้น Enum: 1, 2, 3+2
bedroomsstring✅ ใช่จำนวนห้องนอน Enum: 1, 2, 3, 4, 5+2
bathroomsstring✅ ใช่จำนวนห้องน้ำ Enum: 1, 1.5, 2, 2.5, 3, 3.5, 4+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✅ ใช่ประเภทคุณภาพโมเดล 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 ค่าระบบเมตริกใช้ ; ค่าระบบอิมพีเรียลใช้ ft². ค่าต่ำสุดต้องต่ำกว่าค่าสูงสุดอย่างน้อยหนึ่งขั้น

หน่วยต่ำสุดสูงสุดขั้นตัวอย่าง
5050010150-200 m²
ft²50050001001500-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 แต่ละรายการใช้รูปแบบดังนี้:

ฟิลด์ประเภทคำอธิบาย
namestringชื่อแสดงของห้องนอน เช่น Room 1 (Master)
minAreastringพื้นที่ห้องนอนขั้นต่ำ ต้องเป็นสตริงตัวเลขที่ไม่ติดลบ
maxAreastringพื้นที่ห้องนอนสูงสุด ต้องมากกว่าหรือเท่ากับ minArea
unitstringหน่วยพื้นที่ Enum: , 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 / nullEnum: With Wet & Dry Separation, Without Separation หรือ null

ตัวอย่างค่าเริ่มต้นสำหรับ 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คุณภาพและความละเอียดของผลลัพธ์สูงกว่า ช้ากว่า

⚠️ หมายเหตุ: โหมด Flash ไม่พร้อมใช้งาน สำหรับ API นี้ รองรับเฉพาะ Base และ Pro


📥 ตัวอย่างคำขอ#

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รหัสงานที่ไม่ซ้ำกันสำหรับการตรวจสอบสถานะ

2. รับผลลัพธ์งาน#

ดึงสถานะปัจจุบันและผลลัพธ์ของงานแปลนบ้านที่สร้างไว้ก่อนหน้า

เอนด์พอยต์

ข้อความธรรมดา
GET /api/v1/housePlan/result

หัวข้อความขอ

หัวข้อจำเป็นคำอธิบาย
APIKEY✅ ใช่คีย์ API สำหรับยืนยันตัวตนของคุณ

พารามิเตอร์คิวรี

พารามิเตอร์ประเภทจำเป็นคำอธิบาย
taskIdlong✅ ใช่รหัสงานที่คืนจากเอนด์พอยต์สร้างงาน

📥 ตัวอย่างคำขอ#

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.refImageUrlstringURL ของภาพอ้างอิง (ถ้ามี)
input.modelTypestringประเภทโมเดลที่ใช้
outputobjectผลลัพธ์การสร้าง (พร้อมใช้งานเฉพาะเมื่อ status เป็น Success)
output.resultUrlstringURL ไปยังบอร์ดนำเสนอแปลนบ้านแบบคอมโพสิตที่สร้างแล้ว
output.resultListarray<string>URLs ไปยังภาพผลลัพธ์ที่สร้าง สำหรับ แปลนบ้าน โดยปกติจะเป็นอาร์เรย์ที่มีรายการเดียวซึ่งมี URL เดียวกับ output.resultUrl
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_INVALIDคีย์ API ไม่ถูกต้องหรือไม่พบตรวจสอบว่าเฮดเดอร์ APIKEY มีอยู่และค่าถูกต้อง
9010SCAN_TEXT_ERRORคำสั่งข้อความไม่ผ่านการตรวจสอบเนื้อหาแก้ไขคำสั่งเพื่อลบเนื้อหาที่อ่อนไหวหรือห้ามใช้
9038PROHIBITED_CONTENTภาพผลลัพธ์ที่สร้างมามีเนื้อหาที่ห้ามใช้ปรับคำสั่ง/สไตล์/อินพุตและลองใหม่
9051COINS_NOT_ENOUGHเหรียญ/เครดิตไม่เพียงพอเติมเครดิตในบัญชีและลองใหม่

📄 สำหรับรายการรหัสข้อผิดพลาด API ทั่วไปทั้งหมด ดู อ้างอิงรหัสข้อผิดพลาด