Ideal House
コンテンツにスキップ

間取り図生成 API ドキュメント#

ベース URL: https://api.ideal.house
バージョン: v1
更新日: 2026-08-09


📖 概要#

間取り図生成 API は、構造化された部屋の要件と、任意の独自プロンプトまたは参照画像から、AI による白黒の住宅間取り案を一枚作成します。図面は真上から見た CAD 風の形式です。

出力は初期段階のレイアウト検討を目的としています。施工図ではないため、生成された寸法、形状、設備の配置、法規適合性は、資格を持つ専門家による確認が必要です。

処理は非同期で行います。

  1. タスクを作成 — 間取り図のパラメータを送信し、taskId を受け取ります。
  2. 結果をポーリング — タスクが終端ステータスに達するまで、taskId を使って結果エンドポイントを照会します。

🔐 認証#

公開 API のすべてのリクエストには API キーを含める必要があります。

ヘッダー必須
APIKEY✅ はい利用する API キー
Content-Type✅ POST では必須application/json

[!WARNING] API キーは安全に保管してください。クライアント側のコードや公開リポジトリに含めないでください。


💰 クレジットの消費#

クレジットは生成タスクの作成が成功した後に差し引かれます。タスクが最終的に失敗した場合、差し引いたクレジットは自動返還されます。クレジットが不足している場合はエラーコード 9051 が返されます。

モデル(modelType出力サイズクレジット
Base1536 × 102410
Pro2496 × 166420

間取り図 API は Flash に対応していません。

共通の課金動作については、クレジット消費リファレンスを参照してください。


📌 API エンドポイント#

1. 間取り図タスクの作成#

間取り図生成タスクを作成し、一意なタスク ID を返します。

エンドポイント

http
POST /api/v1/floorPlan/generate

リクエストヘッダー

ヘッダー必須説明
APIKEY✅ はいAPI の認証キー
Content-Type✅ はいapplication/json である必要があります

リクエスト本文#

フィールド必須説明既定値
bedroomsinteger❌ いいえ05 の寝室数2
bathroomsnumber❌ いいえ0.54 のバスルーム総数。0.5 刻み1.5
totalAreastring✅ はい または ft² 単位の正の目標総面積。例:220 m²1386 ft²
bedroomAreaRangesarray<object>❌ いいえ任意の寝室サイズの目安。寝室の面積範囲を参照省略時は totalArea から算出
bathroomDetailsobject❌ いいえフルバスルームのみを対象とする希望。バスルームの詳細を参照
kitchenDetailsobject❌ いいえ任意のキッチン設定。キッチンの詳細を参照
keyRoomsarray<string>❌ いいえ追加の部屋や空間。特別用途の部屋を参照[]
promptstring❌ いいえレイアウトでさらに優先する事項。構造化された部屋数や厳格な視覚的制約を上書きすることはできません""
refImageUrlstring❌ いいえ公開アクセス可能な参照画像の URL""
modelTypestring❌ いいえ列挙値:BaseProBase

[!IMPORTANT] 公開 API では現在、bedrooms0–5bathrooms0.5–4 として検証します。他のクライアントの UI で選択できる値によって、サーバー側の上限が拡張されることはありません。

リクエストの一般規則#

  • すべての列挙値は大文字と小文字を区別し、このドキュメントに記載された英語の値を使用する必要があります。
  • totalArea は縮尺と比率の目安となる目標総面積です。正確な施工寸法としては扱いません。
  • 構造化された画像プロンプトを組み立てる際、独自プロンプトで有効になるのは先頭 800 文字までです。
  • 構造化フィールドは、prompt 内の矛盾する指示より優先されます。
  • 成功したタスクは必ず一枚の画像を生成します。

📐 総面積#

totalArea には、正の数値一つと、それに続く面積単位を指定します。

単位
220 m²
ft²1386 ft²

単位の前にスペースを入れることを推奨します。正の小数も使用できます。

有効な例:

json
{
  "totalArea": "200 m²"
}
json
{
  "totalArea": "1850 ft²"
}

🛏️ 寝室の面積範囲#

bedroomAreaRanges は寝室の相対的なサイズの目安を指定します。生成画像に面積の数値ラベルを表示するよう要求するものではありません。

各要素は次の形式です。

フィールド必須説明
namestring❌ いいえ寝室の識別名。例:Room 1 (Master)Room 2
minAreastring❌ いいえ正の最小面積
maxAreastring❌ いいえ正の最大面積。minArea 未満にはできません
unitstring❌ いいえ列挙値:ft²totalArea と同じ単位を使用してください

範囲を明示する例

json
{
  "bedroomAreaRanges": [
    {
      "name": "Room 1 (Master)",
      "minArea": "30",
      "maxArea": "40",
      "unit": "m²"
    },
    {
      "name": "Room 2",
      "minArea": "20",
      "maxArea": "30",
      "unit": "m²"
    }
  ]
}

空でない配列を指定する場合の規則:

  • 配列の長さは bedrooms と等しい必要があります。
  • 指定する各 minAreamaxArea は、正の数値文字列である必要があります。
  • 両方の値を指定する場合は、minArea <= maxArea を満たす必要があります。
  • unit を指定する場合は、 または ft² である必要があります。
  • 名前は保持されます。空または null の要素はサイズの目安を指定しません。

省略時の範囲の自動算出#

このフィールドは省略するか、空の配列として送信できます。どの要素にも有効な minArea または maxArea がない場合、構造化生成では totalAreabedrooms から内部的な寝室面積範囲を算出します。

  • 寝室が一つの場合、寝室に割り当てる面積は総面積の 20% から始まります。
  • 寝室が一つ増えるごとに割り当てを 7.5 パーセントポイント増やし、上限を 50% とします。
  • 最初の寝室には 1.3 のサイズ重みを、その他の寝室にはそれぞれ 1.0 の重みを適用します。
  • 各目標値は、およそ ±10% の範囲とし、面積単位の整数に丸めます。
  • 単位は totalArea から引き継ぎます。
  • 既存の空でない部屋名は保持します。それ以外はサーバーが Room 1Room 2 などを使用します。

200 m² で寝室数が 4 の場合、現在算出される目安はおよそ次のとおりです。

json
[
  { "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²" }
]

これらは内部的な比率の目安であり、最終的な部屋面積を保証するものではありません。明示した有効な範囲は、自動算出した範囲より常に優先されます。

bedrooms0 の場合、bedroomAreaRanges を省略するか [] を送信してください。


🛁 バスルームの詳細#

bathrooms はバスルームの総数を表します。

  • 整数部分はフルバスルームの数です。
  • 小数部分の .5 は、ハーフバスルーム一つを追加します。
  • 各フルバスルームには、トイレ、洗面台・シンク、シャワーまたは水を使う区画を含めるよう指示します。
  • ハーフバスルームにはトイレと洗面台・シンクのみを含め、シャワーや浴槽は含めません。

bathroomDetails はフルバスルームのみを設定します。

json
{
  "bathroomDetails": {
    "fullBathroomOptions": [
      {
        "name": "Bathroom 1",
        "wetDrySeparation": "yes",
        "bathtub": "required"
      },
      {
        "name": "Bathroom 2",
        "wetDrySeparation": "no",
        "bathtub": "optional"
      }
    ]
  }
}
フィールド許可される値説明
namestringBathroom 1Bathroom 2 など任意の表示用識別名
wetDrySeparationstring / nullyesnonull水を使う区画を分離して表示するかどうか
bathtubstring / nullnooptionalrequirednull浴槽に関する希望

規則:

  • fullBathroomOptions.lengthfloor(bathrooms) を超えることはできません。
  • 配列には、希望を選択したフルバスルームだけを含めることができます。
  • null は未指定を意味します。
  • 必須とした浴槽は、フルバスルームの標準設備に追加されます。トイレやシャワーを置き換えるものではありません。
  • 乾湿分離は、数に含まれるバスルーム内の仕切りであり、追加のバスルームではありません。

🍳 キッチンの詳細#

kitchenDetails のすべての子フィールドは任意です。キッチンの希望を選択しない場合は、オブジェクト全体を省略してください。

json
{
  "kitchenDetails": {
    "type": "open",
    "size": "standard",
    "layout": "U",
    "islandType": "preparation",
    "storage": "maximum",
    "features": ["breakfast nook", "pantry"]
  }
}
フィールド許可される値
typestringopen, semi-open, closed
sizestringsmall, standard, large, extra large
layoutstringI, L, U, gallery
islandTypestringno, preparation, cooking, entertainment
storagestringminimal, standard, maximum
featuresarray<string>eating bar, breakfast nook, pantry

一部のみの設定も有効です。例:

json
{
  "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 に正規化します。

規則:

  • 空白の値は無視し、重複する値は除去します。
  • 選択された特別用途の部屋は、それぞれ一回ずつ要求します。
  • 選択されていない任意の空間は、生成する部屋構成から除外します。
  • pantrykitchenDetails.featureskeyRooms の両方にある場合も、食品庫は一つだけ要求します。

例:

json
{
  "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 を出力。生成時間はより長くなる見込みです

BasePro のみに対応します。


公開インターフェースの仕様に含まれないフィールド#

公開 API のクライアントは、以下のフィールドに依存しないでください。

フィールド備考
imageNumbers現在の生成処理は常に一枚の画像を返すため、このフィールドは不要です
extDataWeb 内部のタスクグループ追跡用メタデータ。公開クライアントでは省略してください
isApiCallリクエスト本文ではなく、API エンドポイントで決まります
genByMember内部の生成メタデータであり、間取り図リクエストのフィールドではありません

削除済みの旧フィールドで、送信してはいけないもの:

text
floorplanSetting
roomCounts
grossArea
totalAreaValue
totalAreaUnit
totalAreaType
fullBathrooms
halfBathrooms
halfBathroomRequirement
kitchenType
diningRooms
livingRooms
extras
referenceImage
hasDetailOptions

📥 タスク作成の例#

寝室面積範囲を自動算出する最小限のリクエスト#

bash
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
bash
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)
java
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)
python
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)
javascript
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();

タスク作成成功時のレスポンス#

json
{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
フィールド説明
codeinteger0 はタスクの作成成功を示します
messagestringレスポンスのメッセージ
datalong結果エンドポイントのポーリングに使用するタスク ID

2. タスク結果の取得#

タスクの進捗と、利用可能になった生成画像を返します。

エンドポイント

http
GET /api/v1/floorPlan/result?taskId={taskId}

リクエストヘッダー

ヘッダー必須説明
APIKEY✅ はいAPI の認証キー

クエリパラメータ

パラメーター必須説明
taskIdlong✅ はい作成エンドポイントから返されたタスク ID

結果取得リクエストの例#

cURL
bash
curl -X GET "https://api.ideal.house/api/v1/floorPlan/result?taskId=1234567890123456789" \
  -H "APIKEY: your_api_key_here"
Python のポーリング
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 のポーリング
javascript
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');

タスク完了時のレスポンス#

json
{
  "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
    }
  }
}

処理中のレスポンス#

json
{
  "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
  }
}

タスク失敗時のレスポンス#

json
{
  "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
  }
}

結果フィールド#

フィールド説明
idlongタスク ID
statusstring現在のタスクの状態
waitNumberintegerキュー内で先行するタスク数。0 は先行する待機タスクがないことを示します
percentageinteger0100 のおおよその完了率
inputobject正規化されたタスク入力。該当する場合は、自動算出した寝室面積範囲を含みます
outputobject / nullタスク成功時の生成出力。それ以外は通常 null
output.resultUrlstring生成された間取り図画像の署名付き URL
output.widthinteger出力の幅(ピクセル単位)
output.heightinteger出力の高さ(ピクセル単位)

📊 タスクの状態#

状態説明
Unprocessedタスクは作成済みですが、まだ開始していません
Processingタスクを処理中です
Successタスクが完了し、output.resultUrl を利用できます
Failedタスクが失敗しました
Terminationタスクが中断または終了されました

3~5 秒ごとにポーリングしてください。API のタスク制限を参照してください。


❌ エラーレスポンス#

すべてのエラーレスポンスは共通のレスポンス構造を使用します。

json
{
  "code": 1011,
  "message": "bedroomAreaRanges size must match bedrooms",
  "data": null
}
コード名前説明推奨する対応
1001FAILED一般的なリクエスト失敗message フィールドを確認してください
1003INTERNAL_ERRORサーバー内部エラー後で再試行し、続く場合はサポートに連絡してください
1011PARAM_ERROR無効なリクエストパラメータ部屋数、単位、列挙値、入れ子の配列を確認してください
5002API_KEY_INVALIDAPI キーが無効、または未指定APIKEY ヘッダーを確認してください
9010SCAN_TEXT_ERRORプロンプトがコンテンツ審査を通過しませんでしたプロンプトを修正してください
9038PROHIBITED_CONTENT生成出力に禁止コンテンツが含まれています入力を調整して再試行してください
9051COINS_NOT_ENOUGHクレジット不足クレジットを追加して再試行してください

共通エラーの全一覧は、エラーコードリファレンスを参照してください。


🔄 Web 連携の注意点#

認証済みの Web アプリケーションと公開 API では、異なるエンドポイントと認証方法を使用します。

クライアントエンドポイント認証
Web アプリケーションPOST /floorPlan/generateログイン用の token ヘッダー
公開 APIPOST /api/v1/floorPlan/generateAPIKEY ヘッダー

業務フィールドの形式は揃えていますが、公開 API のクライアントは、このドキュメントのサーバー側制限と公開仕様に従ってください。特に次の点に注意してください。

  • Web クライアントは内部用の imageNumbersextData を含む場合がありますが、公開クライアントには不要です。
  • 公開 API は、エンドポイントと認証情報から API 呼び出しのメタデータを決定します。isApiCallgenByMember などのリクエストフィールドは不要です。
  • balcon は互換性のために受け付け、balcony に正規化します。新しい連携では balcony を送信してください。
  • 他の UI が一時的により広い選択範囲を表示していても、現在の公開サーバーの制限は寝室 0–5、バスルーム 0.5–4 のままです。