Docs

API Documentation

Floor Plan Generation API Documentation

Base URL: https://api.ideal.house
Version: v1
Updated: 2026-03-06


๐Ÿ“– Overview

The Floor Plan Generation API allows you to create AI-generated floor plan images based on room configuration parameters such as bedrooms, bathrooms, kitchen type, gross area, and extra functional spaces. The workflow is asynchronous and involves two steps:

  1. Create a task โ€” Submit your floor plan parameters and receive a taskId.
  2. Poll for results โ€” Use the taskId to query task status and retrieve the generated floor plan image.

๐Ÿ” Authentication

All API requests must be authenticated using an API Key.

Include your API Key in the request header:

HeaderValue
APIKEYyour_api_key_here

โš ๏ธ Keep your API Key secure. Do not expose it in client-side code or public repositories.


๐Ÿ’ฐ Credits Deduction

[!WARNING] ๐Ÿช™ Credits are deducted based on the selected modelType upon successful task creation. If the task ultimately fails, the deducted credits will be automatically refunded to your account.
Insufficient credits will return error code 9051. ๐Ÿ“„ See Credits Deduction Reference.

Model (modelType)Credits Deducted
Base10 credits
Pro20 credits

๐Ÿ“Œ API Endpoints


1. Create Floor Plan Task

Creates a new AI floor plan generation task and returns a unique taskId for polling.

Endpoint

POST /api/v1/floorPlan/generate

Request Headers

HeaderRequiredDescription
APIKEYโœ… YesYour API authentication key
Content-Typeโœ… Yesapplication/json

Request Body

FieldTypeRequiredDescription
bedroomsintegerโŒ OptionalNumber of bedrooms. Defaults to 2
bathroomsintegerโŒ OptionalNumber of bathrooms. Defaults to 1
kitchenTypestringโŒ OptionalKitchen layout type. Defaults to open. Common values: open, closed
grossAreastringโŒ OptionalGross floor area range. Supports metric (mยฒ) and imperial (ftยฒ) values. See Gross Area Options
extrasstringโŒ OptionalExtra functional spaces, multiple values joined with commas. See Extras Options
promptstringโŒ OptionalCustom text prompt to further guide the floor plan generation
refImageUrlstringโŒ OptionalURL of a reference floor plan image to guide the generation
modelTypestringโŒ OptionalModel quality type. Enum: Base, Pro. Defaults to Base. โš ๏ธ Flash mode is not supported

๐Ÿ“ Gross Area Options

The grossArea field accepts predefined range values in either metric (mยฒ) or imperial (ftยฒ) units. You may also enter a custom value.

Metric (mยฒ)

ValueDescription
< 50mยฒLess than 50 square meters
50-80mยฒ50 to 80 square meters
80-100mยฒ80 to 100 square meters
100-120mยฒ100 to 120 square meters
120-150mยฒ120 to 150 square meters
> 150mยฒGreater than 150 square meters

Imperial (ftยฒ)

ValueDescription
< 540ftยฒLess than 540 square feet
540-860ftยฒ540 to 860 square feet
860-1,080ftยฒ860 to 1080 square feet
1,080-1,290ftยฒยฒ1080 to 1290 square feet
1,290-1,610ftยฒ1290 to 1610 square feet
> 1,610ftยฒGreater than 1615 square feet

๐Ÿ’ก You can also provide a custom value such as "90mยฒ" or "1000ftยฒ".


๐Ÿ  Extras Options

The extras field accepts one or more of the following values. When selecting multiple options, join them with a comma (,).

ValueDescription
walk-in closetWalk-in wardrobe / dressing room
laundry roomDedicated laundry space
storage roomStorage or utility storage room
utility roomUtility / service room
home officeHome office / study room
garageGarage
pantryPantry / food storage area
combined living-diningOpen-plan combined living and dining room
balconyBalcony

Examples

"extras": "walk-in closet,laundry room,home office"
"extras": "garage,balcony"
"extras": "pantry,storage room,utility room"

๐Ÿ’ก You can also provide custom descriptions not listed above.


Model Types

ValueDescription
BaseDefault. Balanced speed and quality
ProHigher quality output, slower generation

โš ๏ธ Note: Flash mode is not available for this API. Only Base and Pro are supported.


๐Ÿ“ฅ Request Examples

cURL

# Basic request with default settings
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,
    "kitchenType": "open",
    "grossArea": "100-120mยฒ",
    "extras": "walk-in closet,laundry room,home office",
    "modelType": "Base"
  }'

# Pro model with reference image and custom prompt
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": 3,
    "kitchenType": "closed",
    "grossArea": "> 150mยฒ",
    "extras": "garage,pantry,storage room,balcony",
    "prompt": "Modern open-plan layout with large windows",
    "refImageUrl": "https://example.com/reference-floorplan.jpg",
    "modelType": "Pro"
  }'

Java (OkHttp)

import okhttp3.*;
import java.io.IOException;

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 IOException {
        OkHttpClient client = new OkHttpClient();

        String requestBody = """
            {
                "bedrooms": 3,
                "bathrooms": 2,
                "kitchenType": "open",
                "grossArea": "100-120mยฒ",
                "extras": "walk-in closet,laundry room,home office",
                "modelType": "Base"
            }
            """;

        Request request = new Request.Builder()
            .url(BASE_URL + "/api/v1/floorPlan/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 = {
    "bedrooms": 3,
    "bathrooms": 2,
    "kitchenType": "open",
    "grossArea": "100-120mยฒ",
    "extras": "walk-in closet,laundry room,home office",
    "modelType": "Base"
}

# Pro model with reference image and custom prompt
# payload = {
#     "bedrooms": 4,
#     "bathrooms": 3,
#     "kitchenType": "closed",
#     "grossArea": "> 150mยฒ",
#     "extras": "garage,pantry,storage room,balcony",
#     "prompt": "Modern open-plan layout with large windows",
#     "refImageUrl": "https://example.com/reference-floorplan.jpg",
#     "modelType": "Pro"
# }

response = requests.post(
    f"{BASE_URL}/api/v1/floorPlan/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 createFloorPlanTask() {
  try {
    const response = await axios.post(
      `${BASE_URL}/api/v1/floorPlan/generate`,
      {
        bedrooms: 3,
        bathrooms: 2,
        kitchenType: 'open',
        grossArea: '100-120mยฒ',
        extras: 'walk-in closet,laundry room,home office',
        modelType: 'Base'

        // Pro model with reference and prompt:
        // bedrooms: 4,
        // bathrooms: 3,
        // kitchenType: 'closed',
        // grossArea: '> 150mยฒ',
        // extras: 'garage,pantry,storage room,balcony',
        // prompt: 'Modern open-plan layout with large windows',
        // refImageUrl: 'https://example.com/reference-floorplan.jpg',
        // modelType: 'Pro'
      },
      {
        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);
  }
}

createFloorPlanTask();

๐Ÿ“ค Response

Success Response

{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
FieldTypeDescription
codeinteger0 indicates success
messagestringResponse message
datalongThe unique task ID for polling results

2. Get Task Result

Retrieves the current status and output of a previously created floor plan task.

Endpoint

GET /api/v1/floorPlan/result

Request Headers

HeaderRequiredDescription
APIKEYโœ… YesYour API authentication key

Query Parameters

ParameterTypeRequiredDescription
taskIdlongโœ… YesThe task ID returned from the create task endpoint

๐Ÿ“ฅ Request Examples

cURL

curl -X GET "https://api.ideal.house/api/v1/floorPlan/result?taskId=1234567890123456789" \
  -H "APIKEY: your_api_key_here"

Java (OkHttp)

import okhttp3.*;
import java.io.IOException;

public class FloorPlanResultExample {

    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/floorPlan/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/floorPlan/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"):
        break

    time.sleep(3)  # Poll every 3 seconds

if status == "Success":
    print("Result URL:", result["output"]["resultUrl"])
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/floorPlan/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'].includes(status)) {
      if (status === 'Success') {
        console.log('Result URL:', result.output.resultUrl);
      } else {
        console.log('Task ended with status:', status);
      }
      break;
    }

    // Wait 3 seconds before next poll
    await new Promise(resolve => setTimeout(resolve, 3000));
  }
}

pollResult(1234567890123456789n);

๐Ÿ“ค Response

Success Response (Task Completed)

{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Success",
    "waitNumber": 0,
    "percentage": 100,
    "input": {
      "bedrooms": 3,
      "bathrooms": 2,
      "kitchenType": "open",
      "grossArea": "100-120mยฒ",
      "extras": "walk-in closet,laundry room,home office",
      "modelType": "Base"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/floorplan_result.jpg",
      "width": 1024,
      "height": 1024
    }
  }
}

Response (Task Processing / In Queue)

{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Processing",
    "waitNumber": 1,
    "percentage": 40,
    "input": {
      "bedrooms": 3,
      "bathrooms": 2,
      "kitchenType": "open",
      "grossArea": "100-120mยฒ",
      "extras": "walk-in closet,laundry room,home office",
      "modelType": "Base"
    },
    "output": null
  }
}

Response (Task Failed)

{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Failed",
    "waitNumber": 0,
    "percentage": 0,
    "input": {
      "bedrooms": 3,
      "bathrooms": 2,
      "kitchenType": "open",
      "grossArea": "100-120mยฒ",
      "extras": "walk-in closet,laundry room,home office",
      "modelType": "Base"
    },
    "output": null
  }
}

Response Fields

FieldTypeDescription
idlongTask unique identifier
statusstringCurrent task status (see Task Status)
waitNumberintegerNumber of tasks ahead in the queue (0 means currently processing)
percentageintegerTask completion percentage (0โ€“100)
inputobjectThe original input parameters of the task
input.bedroomsintegerNumber of bedrooms
input.bathroomsintegerNumber of bathrooms
input.kitchenTypestringKitchen layout type
input.grossAreastringGross floor area range
input.extrasstringExtra functional spaces (comma-separated)
input.promptstringCustom text prompt (if provided)
input.refImageUrlstringReference floor plan image URL (if provided)
input.modelTypestringModel type used
outputobjectGeneration result (only available when status is Success)
output.resultUrlstringURL to the generated floor plan image
output.widthintegerOutput width in pixels
output.heightintegerOutput height in pixels

๐Ÿ“Š Task Status

StatusDescription
UnprocessedTask has been created but not yet started
ProcessingTask is currently being processed
SuccessTask completed successfully โ€” output is available
FailedTask failed due to an error

๐Ÿ’ก Polling Recommendation: Poll the result endpoint every 3โ€“5 seconds. Avoid polling too frequently to prevent rate limiting.


โŒ Error Responses

All error responses share the same JSON structure:

{
  "code": 5002,
  "message": "Invalid API Key",
  "data": null
}

Error Code Reference

CodeNameDescriptionSuggested Action
1001FAILEDRequest failed (generic error)Check the message field for specific error details
1003INTERNAL_ERRORInternal server errorRetry after a short delay; contact support if it persists
1011PARAM_ERRORRequest parameter errorVerify all required parameters are provided and correctly formatted
5002API_KEY_INVALIDInvalid or missing API KeyEnsure the APIKEY header is present and the value is correct
9010SCAN_TEXT_ERRORText prompt failed content reviewModify the prompt to remove any sensitive or prohibited content
9038PROHIBITED_CONTENTGenerated output image contains prohibited contentAdjust prompt/style/inputs and retry
9051COINS_NOT_ENOUGHInsufficient coins / creditsTop up your account credits and retry

๐Ÿ“„ For the complete list of common API error codes, refer to the Error Code Reference.


โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                                                         โ”‚
โ”‚  1. POST /api/v1/floorPlan/generate                     โ”‚
โ”‚     โ†’ Receive taskId                                    โ”‚
โ”‚                                                         โ”‚
โ”‚  2. Wait 3โ€“5 seconds                                    โ”‚
โ”‚                                                         โ”‚
โ”‚  3. GET /api/v1/floorPlan/result?taskId={taskId}        โ”‚
โ”‚     โ†’ Check status field                               โ”‚
โ”‚                                                         โ”‚
โ”‚     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚     โ”‚ status == "Unprocessed" or "Processing"       โ”‚   โ”‚
โ”‚     โ”‚   โ†’ waitNumber: position in queue             โ”‚   โ”‚
โ”‚     โ”‚   โ†’ percentage: current progress              โ”‚   โ”‚
โ”‚     โ”‚   โ†’ Repeat step 2 & 3                         โ”‚   โ”‚
โ”‚     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                                                         โ”‚
โ”‚     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚     โ”‚ status == "Success"                           โ”‚   โ”‚
โ”‚     โ”‚   โ†’ output.resultUrl: floor plan image        โ”‚   โ”‚
โ”‚     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                                                         โ”‚
โ”‚     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚     โ”‚ status == "Failed"                            โ”‚   โ”‚
โ”‚     โ”‚   โ†’ Handle error accordingly                  โ”‚   โ”‚
โ”‚     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                                                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ยฉ Ideal House AI โ€” All rights reserved.