間取り図生成 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~4 のバスルーム総数。0.5 刻み | 1.5 |
totalArea | string | ✅ はい | m² または ft² 単位の正の目標総面積。例:220 m²、1386 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 | 居住空間または主寝室につながる屋外バルコニー |
旧 Web 版の値 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 | Web 内部のタスクグループ追跡用メタデータ。公開クライアントでは省略してください |
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 | クレジット不足 | クレジットを追加して再試行してください |
共通エラーの全一覧は、エラーコードリファレンスを参照してください。
🔄 Web 連携の注意点#
認証済みの Web アプリケーションと公開 API では、異なるエンドポイントと認証方法を使用します。
| クライアント | エンドポイント | 認証 |
|---|---|---|
| Web アプリケーション | POST /floorPlan/generate | ログイン用の token ヘッダー |
| 公開 API | POST /api/v1/floorPlan/generate | APIKEY ヘッダー |
業務フィールドの形式は揃えていますが、公開 API のクライアントは、このドキュメントのサーバー側制限と公開仕様に従ってください。特に次の点に注意してください。
- Web クライアントは内部用の
imageNumbersとextDataを含む場合がありますが、公開クライアントには不要です。 - 公開 API は、エンドポイントと認証情報から API 呼び出しのメタデータを決定します。
isApiCallやgenByMemberなどのリクエストフィールドは不要です。 balconは互換性のために受け付け、balconyに正規化します。新しい連携ではbalconyを送信してください。- 他の UI が一時的により広い選択範囲を表示していても、現在の公開サーバーの制限は寝室
0–5、バスルーム0.5–4のままです。