평면도 생성 API 문서#
기본 URL:
https://api.ideal.house
버전: v1
갱신일: 2026-08-09
📖 개요#
평면도 생성 API는 구조화된 공간 요구 사항과 선택적 사용자 정의 프롬프트 또는 참조 이미지를 바탕으로 AI가 생성한 흑백의 하향식 CAD 스타일 주거 개념 평면도 하나를 만듭니다.
출력은 초기 배치 검토를 위한 것입니다. 시공 도면이 아니며 생성된 치수, 형상, 설비 배치 및 건축 법규 준수 여부는 자격을 갖춘 전문가가 검토해야 합니다.
작업 흐름은 비동기 방식입니다.
- 작업 생성 — 평면도 매개변수를 제출하고
taskId를 받습니다. - 결과 폴링 — 작업이 종료 상태에 도달할 때까지
taskId로 결과 엔드포인트를 조회합니다.
🔐 인증#
모든 공개 API 요청에는 API 키가 포함되어야 합니다.
| 헤더 | 필수 여부 | 값 |
|---|---|---|
APIKEY | ✅ 예 | API 키 |
Content-Type | ✅ POST 요청에 필수 | application/json |
[!WARNING] API 키를 안전하게 보관하세요. 클라이언트 측 코드 또는 공개 저장소에 노출하지 마세요.
💰 크레딧 차감#
크레딧은 생성 작업이 성공적으로 만들어진 후 차감됩니다. 작업이 최종적으로 실패하면 차감된 크레딧은 자동 환불됩니다. 크레딧이 부족하면 오류 코드 9051을 반환합니다.
모델 (modelType) | 출력 크기 | 크레딧 |
|---|---|---|
Base | 1536 × 1024 | 10 |
Pro | 2496 × 1664 | 20 |
평면도 API는 Flash를 지원하지 않습니다.
공통 과금 동작은 크레딧 차감 참조를 참고하세요.
📌 API 엔드포인트#
1. 평면도 작업 생성#
평면도 생성 작업을 만들고 고유 작업 ID를 반환합니다.
엔드포인트
POST /api/v1/floorPlan/generate
요청 헤더
| 헤더 | 필수 여부 | 설명 |
|---|---|---|
APIKEY | ✅ 예 | API 인증 키 |
Content-Type | ✅ 예 | application/json이어야 함 |
요청 본문#
| 필드 | 유형 | 필수 여부 | 설명 | 기본값 |
|---|---|---|---|---|
bedrooms | integer | ❌ 아니요 | 0부터 5까지의 침실 수 | 2 |
bathrooms | number | ❌ 아니요 | 0.5 단위로 지정하는 0.5부터 4까지의 총 욕실 수 | 1.5 |
totalArea | string | ✅ 예 | 220 m² 또는 1386 ft²처럼 단위 m² 또는 ft²가 있는 양수 목표 총면적 | — |
bedroomAreaRanges | array<object> | ❌ 아니요 | 선택적 침실 크기 지침입니다. 침실 면적 범위를 참고하세요. | 생략하면 totalArea에서 도출 |
bathroomDetails | object | ❌ 아니요 | 일반 욕실에만 적용되는 선호 사항입니다. 욕실 상세를 참고하세요. | — |
kitchenDetails | object | ❌ 아니요 | 선택적 주방 설정입니다. 주방 상세를 참고하세요. | — |
keyRooms | array<string> | ❌ 아니요 | 추가 방 또는 공간입니다. 주요 공간을 참고하세요. | [] |
prompt | string | ❌ 아니요 | 추가 배치 우선 사항입니다. 구조화된 수량 또는 엄격한 시각적 제약 조건을 무시할 수 없습니다. | "" |
refImageUrl | string | ❌ 아니요 | 공개적으로 접근 가능한 참조 이미지 URL | "" |
modelType | string | ❌ 아니요 | 열거형: Base, Pro | Base |
[!IMPORTANT] 공개 API는 현재
bedrooms를0–5,bathrooms를0.5–4범위로 검증합니다. 다른 클라이언트 UI에서 선택할 수 있는 값이 이 서버 측 제한을 늘리지는 않습니다.
일반 요청 규칙#
- 모든 열거형 값은 대소문자를 구분하며 이 문서에 표시된 영어 값을 사용해야 합니다.
totalArea는 축척과 비율을 유도하기 위한 목표 총면적이며 정확한 시공 치수로 취급되지 않습니다.- 구조화된 이미지 프롬프트를 구성할 때 사용자 정의 프롬프트는 처음 800자까지만 적용됩니다.
prompt의 지시와 충돌하면 구조화된 필드가 우선합니다.- 성공한 작업은 정확히 이미지 하나를 생성합니다.
📐 총면적#
totalArea는 양수 숫자 하나와 뒤에 오는 면적 단위로 구성됩니다.
| 단위 | 예 |
|---|---|
m² | 220 m² |
ft² | 1386 ft² |
단위 앞에 공백을 넣는 것이 권장됩니다. 양수인 소수 값도 허용됩니다.
유효한 예:
{
"totalArea": "200 m²"
}
{
"totalArea": "1850 ft²"
}
🛏️ 침실 면적 범위#
bedroomAreaRanges는 침실 간 상대적 크기 지침을 제공합니다. 생성된 이미지에 숫자 면적 라벨을 표시하도록 요청하는 것은 아닙니다.
각 항목의 형식은 다음과 같습니다.
| 필드 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
name | string | ❌ 아니요 | 침실 식별 이름입니다. 예: Room 1 (Master) 또는 Room 2 |
minArea | string | ❌ 아니요 | 양수 최소 면적 |
maxArea | string | ❌ 아니요 | 양수 최대 면적. minArea보다 작을 수 없음 |
unit | string | ❌ 아니요 | 열거형: m², ft². totalArea와 같은 단위 사용 |
명시적 범위 예제
{
"bedroomAreaRanges": [
{
"name": "Room 1 (Master)",
"minArea": "30",
"maxArea": "40",
"unit": "m²"
},
{
"name": "Room 2",
"minArea": "20",
"maxArea": "30",
"unit": "m²"
}
]
}
비어 있지 않은 배열을 제공할 때의 규칙:
- 배열 길이는
bedrooms와 같아야 합니다. - 제공한 각
minArea와maxArea는 양수 숫자 문자열이어야 합니다. - 두 값을 모두 제공하면
minArea <= maxArea여야 합니다. unit을 제공하면m²또는ft²여야 합니다.- 이름은 유지됩니다. 비어 있거나 null인 항목은 크기 지침을 제공하지 않습니다.
생략 시 자동 범위#
필드를 생략하거나 빈 배열로 보낼 수 있습니다. 유효한 minArea 또는 maxArea가 있는 항목이 없으면 구조화된 생성 경로가 totalArea와 bedrooms에서 내부 침실 범위를 도출합니다.
- 침실 면적 배분은 침실이 하나일 때 총면적의 20%에서 시작합니다.
- 침실이 하나 추가될 때마다 배분 비율이 7.5%포인트 증가하며 최대 50%로 제한됩니다.
- 첫 번째 침실에는
1.3, 나머지 침실에는 각각1.0의 크기 가중치를 적용합니다. - 각 목표 면적은 약
±10%범위로 변환되며 면적 단위의 정수로 반올림됩니다. - 단위는
totalArea에서 가져옵니다. - 기존의 비어 있지 않은 공간 이름은 유지되며, 없으면 서버가
Room 1,Room 2등을 사용합니다.
200 m²와 침실 4개의 경우 현재 도출되는 지침은 대략 다음과 같습니다.
[
{ "name": "Room 1", "minArea": "23", "maxArea": "28", "unit": "m²" },
{ "name": "Room 2", "minArea": "18", "maxArea": "22", "unit": "m²" },
{ "name": "Room 3", "minArea": "18", "maxArea": "22", "unit": "m²" },
{ "name": "Room 4", "minArea": "18", "maxArea": "22", "unit": "m²" }
]
이 값은 내부 비율 지침이며 최종 방 면적을 보장하지 않습니다. 명시적으로 지정한 유효한 범위는 항상 자동 범위보다 우선합니다.
bedrooms가 0이면 bedroomAreaRanges를 생략하거나 []를 보내세요.
🛁 욕실 상세#
bathrooms는 총 욕실 수를 나타냅니다.
- 정수 부분은 일반 욕실 수입니다.
- 소수 부분
.5는 간이 화장실 하나를 추가합니다. - 각 일반 욕실에는 변기, 세면대 및 샤워 공간 또는 습식 구역이 포함되도록 지시합니다.
- 간이 화장실에는 변기와 세면대만 있으며 샤워 시설이나 욕조는 없습니다.
bathroomDetails는 일반 욕실만 설정합니다.
{
"bathroomDetails": {
"fullBathroomOptions": [
{
"name": "Bathroom 1",
"wetDrySeparation": "yes",
"bathtub": "required"
},
{
"name": "Bathroom 2",
"wetDrySeparation": "no",
"bathtub": "optional"
}
]
}
}
| 필드 | 유형 | 허용 값 | 설명 |
|---|---|---|---|
name | string | Bathroom 1, Bathroom 2 등 | 선택적 표시 이름 |
wetDrySeparation | string / null | yes, no, null | 분리된 습식 구역을 표시할지 여부 |
bathtub | string / null | no, optional, required, null | 욕조 선호 사항 |
규칙:
fullBathroomOptions.length는floor(bathrooms)를 초과할 수 없습니다.- 배열에는 선호 사항을 선택한 일반 욕실만 포함해도 됩니다.
null값은 지정되지 않았음을 의미합니다.- 필수 욕조는 일반 욕실의 표준 설비에 추가되는 것이며 변기나 샤워 시설을 대체하지 않습니다.
- 건식/습식 분리는 집계된 욕실 내부의 칸막이이며 추가 욕실이 아닙니다.
🍳 주방 상세#
kitchenDetails의 모든 하위 필드는 선택 사항입니다. 주방 선호 사항을 선택하지 않았다면 객체 전체를 생략하세요.
{
"kitchenDetails": {
"type": "open",
"size": "standard",
"layout": "U",
"islandType": "preparation",
"storage": "maximum",
"features": ["breakfast nook", "pantry"]
}
}
| 필드 | 유형 | 허용 값 |
|---|---|---|
type | string | open, semi-open, closed |
size | string | small, standard, large, extra large |
layout | string | I, L, U, gallery |
islandType | string | no, preparation, cooking, entertainment |
storage | string | minimal, standard, maximum |
features | array<string> | eating bar, breakfast nook, pantry |
일부만 설정해도 유효합니다. 예:
{
"kitchenDetails": {
"type": "semi-open"
}
}
🚪 주요 공간#
keyRooms는 다음의 정확한 값을 가진 배열을 허용합니다.
| 값 | 설명 |
|---|---|
walk-in closet | 침실 구역과 연결된 전용 워크인 옷장 |
laundry room | 전용 세탁 공간 |
storage room | 일반 수납실 |
utility room | 기계실 또는 설비실 |
home office | 전용 업무 공간 또는 서재 |
garage | 외부 차량 출입구 및 주택 내부 출입로가 있는 차고 |
pantry | 주방 옆 식료품 저장실 |
combined living-dining | 거실과 식당을 함께 사용하는 하나의 공간 |
balcony | 거실 또는 주 침실과 연결된 외부 발코니 |
기존 웹 값인 balcon도 허용되며 balcony로 정규화됩니다.
규칙:
- 빈 값은 무시하고 중복 값은 제거합니다.
- 선택한 주요 공간은 한 번씩 요청됩니다.
- 선택하지 않은 선택적 공간은 생성되는 공간 구성에서 제외됩니다.
pantry가kitchenDetails.features와keyRooms에 모두 있으면 식료품 저장실은 하나만 요청됩니다.
예:
{
"keyRooms": [
"garage",
"home office",
"combined living-dining"
]
}
🖼️ 참조 이미지#
refImageUrl은 선택 사항이며 API 서버에서 직접 접근할 수 있어야 합니다.
요건:
- 형식: JPG/JPEG, PNG 또는 WebP.
- 최대 파일 크기: 20 MB.
- 최소 크기: 128 × 128 px.
- 최대 크기: 6,000 × 6,000 px. 더 큰 이미지는 처리 전에 비율을 유지하여 축소됩니다.
참조 이미지는 배치, 인접 관계, 비율 또는 시각적 스타일을 유도합니다. 구조화된 공간 수량 또는 다른 엄격한 제약 조건을 무시할 수는 없습니다.
🤖 모델 유형#
| 값 | 설명 |
|---|---|
Base | 기본값. 균형 잡힌 생성 품질, 1536 × 1024 출력 |
Pro | 더 높은 해상도의 2496 × 1664 출력. 예상 생성 시간은 더 깁니다. |
Base와 Pro만 지원합니다.
공개 기능 규약에 포함되지 않는 필드#
공개 API 클라이언트는 다음 필드에 의존해서는 안 됩니다.
| 필드 | 참고 |
|---|---|
imageNumbers | 현재 생성기는 항상 이미지 하나를 반환하므로 이 필드는 필요하지 않음 |
extData | 내부 웹 작업 그룹 추적 메타데이터. 공개 클라이언트는 생략해야 함 |
isApiCall | 요청 본문이 아닌 API 엔드포인트에서 결정 |
genByMember | 내부 생성 메타데이터이며 평면도 요청 필드가 아님 |
제거된 기존 필드로, 전송하면 안 되는 항목:
floorplanSetting
roomCounts
grossArea
totalAreaValue
totalAreaUnit
totalAreaType
fullBathrooms
halfBathrooms
halfBathroomRequirement
kitchenType
diningRooms
livingRooms
extras
referenceImage
hasDetailOptions
📥 작업 생성 예제#
자동 침실 범위를 사용하는 최소 요청#
curl -X POST "https://api.ideal.house/api/v1/floorPlan/generate" \
-H "APIKEY: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"bedrooms": 4,
"bathrooms": 2,
"totalArea": "200 m²",
"modelType": "Pro",
"prompt": "Upper floor of a two-story Saudi Arabian villa with a master bedroom, family living area, staircase landing, and balcony"
}'
전체 요청#
cURL
curl -X POST "https://api.ideal.house/api/v1/floorPlan/generate" \
-H "APIKEY: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"bedrooms": 3,
"bathrooms": 2.5,
"totalArea": "220 m²",
"bedroomAreaRanges": [
{"name": "Room 1 (Master)", "minArea": "30", "maxArea": "40", "unit": "m²"},
{"name": "Room 2", "minArea": "20", "maxArea": "30", "unit": "m²"},
{"name": "Room 3", "minArea": "20", "maxArea": "30", "unit": "m²"}
],
"bathroomDetails": {
"fullBathroomOptions": [
{"name": "Bathroom 1", "wetDrySeparation": "yes", "bathtub": "required"},
{"name": "Bathroom 2", "wetDrySeparation": "no", "bathtub": "optional"}
]
},
"kitchenDetails": {
"type": "open",
"size": "standard",
"layout": "U",
"islandType": "preparation",
"storage": "maximum",
"features": ["breakfast nook", "pantry"]
},
"keyRooms": ["garage", "home office", "combined living-dining"],
"prompt": "Bright modern home with good natural lighting",
"refImageUrl": "https://example.com/reference-plan.png",
"modelType": "Pro"
}'
Java (OkHttp)
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class FloorPlanApiExample {
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 Exception {
OkHttpClient client = new OkHttpClient();
String json = """
{
"bedrooms": 4,
"bathrooms": 2,
"totalArea": "200 m²",
"keyRooms": ["walk-in closet", "balcony"],
"prompt": "Upper floor with a master bedroom and family living area",
"modelType": "Pro"
}
""";
Request request = new Request.Builder()
.url(BASE_URL + "/api/v1/floorPlan/generate")
.addHeader("APIKEY", API_KEY)
.addHeader("Content-Type", "application/json")
.post(RequestBody.create(json, MediaType.parse("application/json")))
.build();
try (Response response = client.newCall(request).execute()) {
System.out.println(response.body().string());
}
}
}
Python (requests)
import requests
BASE_URL = "https://api.ideal.house"
API_KEY = "your_api_key_here"
payload = {
"bedrooms": 4,
"bathrooms": 2,
"totalArea": "200 m²",
"keyRooms": ["walk-in closet", "balcony"],
"prompt": "Upper floor with a master bedroom and family living area",
"modelType": "Pro",
}
response = requests.post(
f"{BASE_URL}/api/v1/floorPlan/generate",
headers={"APIKEY": API_KEY, "Content-Type": "application/json"},
json=payload,
)
response.raise_for_status()
print("Task ID:", response.json()["data"])
Node.js (axios)
const axios = require('axios');
const BASE_URL = 'https://api.ideal.house';
const API_KEY = 'your_api_key_here';
async function createFloorPlanTask() {
const response = await axios.post(
`${BASE_URL}/api/v1/floorPlan/generate`,
{
bedrooms: 4,
bathrooms: 2,
totalArea: '200 m²',
keyRooms: ['walk-in closet', 'balcony'],
prompt: 'Upper floor with a master bedroom and family living area',
modelType: 'Pro'
},
{
headers: {
APIKEY: API_KEY,
'Content-Type': 'application/json'
}
}
);
console.log('Task ID:', response.data.data);
return response.data.data;
}
createFloorPlanTask();
작업 생성 성공 응답#
{
"code": 0,
"message": "success",
"data": 1234567890123456789
}
| 필드 | 유형 | 설명 |
|---|---|---|
code | integer | 0은 작업이 성공적으로 생성되었음을 의미함 |
message | string | 응답 메시지 |
data | long | 결과 엔드포인트 폴링에 사용하는 작업 ID |
2. 작업 결과 조회#
작업 진행 상황과, 준비된 경우 생성된 이미지를 반환합니다.
엔드포인트
GET /api/v1/floorPlan/result?taskId={taskId}
요청 헤더
| 헤더 | 필수 여부 | 설명 |
|---|---|---|
APIKEY | ✅ 예 | API 인증 키 |
쿼리 매개변수
| 매개변수 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
taskId | long | ✅ 예 | 생성 엔드포인트가 반환한 작업 ID |
결과 요청 예제#
cURL
curl -X GET "https://api.ideal.house/api/v1/floorPlan/result?taskId=1234567890123456789" \
-H "APIKEY: your_api_key_here"
Python 폴링
import time
import requests
BASE_URL = "https://api.ideal.house"
API_KEY = "your_api_key_here"
task_id = 1234567890123456789
while True:
response = requests.get(
f"{BASE_URL}/api/v1/floorPlan/result",
headers={"APIKEY": API_KEY},
params={"taskId": task_id},
)
response.raise_for_status()
task = response.json()["data"]
print(task["status"], task["percentage"], task["waitNumber"])
if task["status"] in ("Success", "Failed", "Termination"):
break
time.sleep(3)
if task["status"] == "Success":
print("Result URL:", task["output"]["resultUrl"])
Node.js 폴링
const axios = require('axios');
const BASE_URL = 'https://api.ideal.house';
const API_KEY = 'your_api_key_here';
async function pollFloorPlanResult(taskId) {
while (true) {
const response = await axios.get(
`${BASE_URL}/api/v1/floorPlan/result`,
{
headers: { APIKEY: API_KEY },
params: { taskId }
}
);
const task = response.data.data;
console.log(task.status, task.percentage, task.waitNumber);
if (['Success', 'Failed', 'Termination'].includes(task.status)) {
if (task.status === 'Success') {
console.log('Result URL:', task.output.resultUrl);
}
return task;
}
await new Promise(resolve => setTimeout(resolve, 3000));
}
}
pollFloorPlanResult('1234567890123456789');
완료된 작업 응답#
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Success",
"waitNumber": 0,
"percentage": 100,
"input": {
"bedrooms": 4,
"bathrooms": 2,
"totalArea": "200 m²",
"bedroomAreaRanges": [
{"name": "Room 1", "minArea": "23", "maxArea": "28", "unit": "m²"},
{"name": "Room 2", "minArea": "18", "maxArea": "22", "unit": "m²"},
{"name": "Room 3", "minArea": "18", "maxArea": "22", "unit": "m²"},
{"name": "Room 4", "minArea": "18", "maxArea": "22", "unit": "m²"}
],
"keyRooms": ["walk-in closet", "balcony"],
"prompt": "Upper floor with a master bedroom and family living area",
"modelType": "Pro"
},
"output": {
"resultUrl": "https://cdn.ideal.house/output/floor-plan.jpg",
"width": 2496,
"height": 1664
}
}
}
처리 중 응답#
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Processing",
"waitNumber": 1,
"percentage": 45,
"input": {
"bedrooms": 4,
"bathrooms": 2,
"totalArea": "200 m²",
"modelType": "Pro"
},
"output": null
}
}
실패한 작업 응답#
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Failed",
"waitNumber": 0,
"percentage": 0,
"input": {
"bedrooms": 4,
"bathrooms": 2,
"totalArea": "200 m²",
"modelType": "Pro"
},
"output": null
}
}
결과 필드#
| 필드 | 유형 | 설명 |
|---|---|---|
id | long | 작업 ID |
status | string | 현재 작업 상태 |
waitNumber | integer | 대기열에서 앞에 있는 작업 수. 0은 앞에 대기 중인 작업이 없음을 의미함 |
percentage | integer | 0부터 100까지의 대략적인 완료 비율 |
input | object | 정규화된 작업 입력. 해당되는 경우 자동 도출된 침실 범위 포함 |
output | object / null | 작업 성공 시 생성된 출력. 그 외에는 일반적으로 null |
output.resultUrl | string | 생성된 평면도 이미지의 서명된 URL |
output.width | integer | 출력 너비(픽셀) |
output.height | integer | 출력 높이(픽셀) |
📊 작업 상태#
| 상태 | 설명 |
|---|---|
Unprocessed | 작업이 생성되었지만 아직 시작되지 않음 |
Processing | 작업이 처리 중 |
Success | 작업이 완료되어 output.resultUrl 사용 가능 |
Failed | 작업이 실패함 |
Termination | 작업이 중단되거나 종료됨 |
3–5초마다 폴링하세요. API 작업 제한을 참고하세요.
❌ 오류 응답#
모든 오류 응답은 공통 응답 구조를 사용합니다.
{
"code": 1011,
"message": "bedroomAreaRanges size must match bedrooms",
"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는 서로 다른 엔드포인트 및 인증 방식을 사용합니다.
| 클라이언트 | 엔드포인트 | 인증 |
|---|---|---|
| 웹 애플리케이션 | POST /floorPlan/generate | 로그인 token 헤더 |
| 공개 API | POST /api/v1/floorPlan/generate | APIKEY 헤더 |
기능 필드의 구조는 일치하지만 공개 API 클라이언트는 이 문서의 서버 측 제한 및 공개 규약을 따라야 합니다. 특히 다음에 유의하세요.
- 웹 클라이언트에는 내부용
imageNumbers와extData가 포함될 수 있지만 공개 클라이언트에는 필요하지 않습니다. - 공개 API는 엔드포인트와 인증 정보에서 API 호출 메타데이터를 결정합니다.
isApiCall과genByMember같은 요청 필드는 필요하지 않습니다. balcon은 호환성을 위해 허용되며balcony로 정규화됩니다. 새 연동에서는balcony를 보내세요.- 다른 UI가 일시적으로 더 넓은 선택 범위를 표시하더라도 현재 공개 서버 제한은 침실
0–5개 및 욕실0.5–4개로 유지됩니다.