Ideal House
콘텐츠로 이동

건물 외관 리노베이션 API 문서#

기본 URL: https://api.ideal.house
버전: v1
갱신일: 2026-05-20


📖 개요#

건물 외관 리노베이션 API는 입력 이미지를 바탕으로 건물 외관을 개조하거나 스타일을 변경합니다. 원본 이미지를 제공하고 선택적으로 텍스트 지침, 참조 이미지, 건축 스타일 또는 환경 선호 사항을 추가하여 결과를 유도할 수 있습니다.

작업 흐름은 다음 두 단계의 비동기 방식입니다.

  1. 작업 생성 — 외관 이미지와 선택적 지침을 제출하고 taskId를 받습니다.
  2. 결과 폴링taskId로 작업 상태를 조회하고 생성된 이미지를 가져옵니다.

🔐 인증#

모든 API 요청은 API 키로 인증해야 합니다.

요청 헤더에 API 키를 포함하세요.

헤더
APIKEYyour_api_key_here

⚠️ API 키를 안전하게 보관하세요. 클라이언트 측 코드 또는 공개 저장소에 노출하지 마세요.


💰 크레딧 차감#

[!WARNING] 🪙 작업이 성공적으로 생성되면 1크레딧이 차감됩니다. 작업이 최종적으로 실패하면 차감된 크레딧은 계정으로 자동 환불됩니다.
크레딧이 부족하면 오류 코드 9051을 반환합니다. 📄 크레딧 차감 참조를 참고하세요.

작업차감 크레딧
건물 외관 리노베이션 작업1크레딧

자세한 크레딧 규칙은 크레딧 차감 참조를 참고하세요.


📌 API 엔드포인트#


1. 건물 외관 리노베이션 작업 생성#

새 외관 리노베이션 작업을 생성하고 폴링용 고유 taskId를 반환합니다.

엔드포인트

일반 텍스트
POST /api/v1/exteriorRenovator/generate

요청 헤더

헤더필수 여부설명
APIKEY✅ 예API 인증 키
Content-Type✅ 예application/json

요청 본문

필드유형필수 여부설명
imageUrlstring✅ 예리노베이션할 원본 외관 이미지 URL
promptstring❌ 선택리노베이션 결과에 대한 선택적 텍스트 지침
referenceUrlstring❌ 선택시각적 스타일을 유도하는 선택적 참조 이미지 URL
buildingStyleIdstring❌ 선택선택적 건축 스타일 ID
environmentIdstring❌ 선택선택적 환경 또는 장면 스타일 ID입니다. id1,id2처럼 여러 ID를 쉼표로 구분하여 사용할 수 있습니다.

⚠️ imageUrl만 필수입니다. 나머지 요청 본문 필드는 모두 선택 사항입니다.

🖼️ 이미지 요건: 모든 원본 및 참조 이미지는 JPG/JPEG, PNG 또는 WebP여야 합니다. 각 이미지는 20 MB 이하여야 하며 크기는 128 × 128 px부터 6,000 × 6,000 px까지 허용됩니다(경계값 포함). 최대 픽셀 크기를 초과하는 이미지는 처리 전에 6,000 × 6,000 px 안에 들어오도록 비율을 유지하여 자동 축소됩니다. 이미지 URLs는 API 서버에서 직접 접근할 수 있어야 합니다.


🎨 스타일 옵션#

buildingStyleIdenvironmentIdAPI 스타일 설정 엔드포인트에서 선택할 수 있습니다.

사용 항목:

일반 텍스트
GET /api/v1/style/exterior_renovator/getStyles
스타일 그룹요청 필드설명
buildingStylebuildingStyleId건축 스타일 옵션
environmentenvironmentId환경 또는 장면 옵션입니다. id1,id2처럼 여러 옵션 ID를 쉼표로 구분하여 사용할 수 있습니다.

각 옵션에는 name, idurl이 포함됩니다. 옵션의 id를 해당 요청 필드에 전달하세요.


📥 요청 예제#

cURL
bash
# Minimal request
curl -X POST "https://api.ideal.house/api/v1/exteriorRenovator/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/exterior.jpg"
  }'

# Request with optional guidance
curl -X POST "https://api.ideal.house/api/v1/exteriorRenovator/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/exterior.jpg",
    "prompt": "Modern farmhouse exterior with warm wood accents, black window frames, and clean landscaping",
    "referenceUrl": "https://example.com/reference-house.jpg",
    "buildingStyleId": "modern-farmhouse",
    "environmentId": "Architecture_Enviroment_Time_Night,Architecture_Enviroment_Time_Day"
  }'
Java (OkHttp)
java
import okhttp3.*;

import java.io.IOException;

public class ExteriorRenovatorApiExample {

    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 = """
                {
                    "imageUrl": "https://example.com/exterior.jpg",
                    "prompt": "Modern farmhouse exterior with warm wood accents, black window frames, and clean landscaping",
                    "referenceUrl": "https://example.com/reference-house.jpg",
                    "buildingStyleId": "modern-farmhouse",
                    "environmentId": "Architecture_Enviroment_Time_Night,Architecture_Enviroment_Time_Day"
                }
                """;

        Request request = new Request.Builder()
                .url(BASE_URL + "/api/v1/exteriorRenovator/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 = {
    "imageUrl": "https://example.com/exterior.jpg",
    "prompt": "Modern farmhouse exterior with warm wood accents, black window frames, and clean landscaping",
    "referenceUrl": "https://example.com/reference-house.jpg",
    "buildingStyleId": "modern-farmhouse",
    "environmentId": "Architecture_Enviroment_Time_Night,Architecture_Enviroment_Time_Day"
}

response = requests.post(
    f"{BASE_URL}/api/v1/exteriorRenovator/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 createExteriorRenovatorTask() {
  try {
    const response = await axios.post(
      `${BASE_URL}/api/v1/exteriorRenovator/generate`,
      {
        imageUrl: 'https://example.com/exterior.jpg',
        prompt: 'Modern farmhouse exterior with warm wood accents, black window frames, and clean landscaping',
        referenceUrl: 'https://example.com/reference-house.jpg',
        buildingStyleId: 'modern-farmhouse',
        environmentId: 'Architecture_Enviroment_Time_Night,Architecture_Enviroment_Time_Day'
      },
      {
        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);
  }
}

createExteriorRenovatorTask();

📤 응답#

성공 응답

json
{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
필드유형설명
codeinteger0은 성공을 의미함
messagestring응답 메시지
datalong결과 폴링용 고유 작업 ID

2. 작업 결과 조회#

이전에 생성한 외관 리노베이션 작업의 현재 상태와 출력을 조회합니다.

엔드포인트

일반 텍스트
GET /api/v1/exteriorRenovator/result

요청 헤더

헤더필수 여부설명
APIKEY✅ 예API 인증 키

쿼리 매개변수

매개변수유형필수 여부설명
taskIdlong✅ 예작업 생성 엔드포인트가 반환한 작업 ID

📥 요청 예제#

cURL
bash
curl -X GET "https://api.ideal.house/api/v1/exteriorRenovator/result?taskId=1234567890123456789" \
  -H "APIKEY: your_api_key_here"
Java (OkHttp)
java
import okhttp3.*;

import java.io.IOException;

public class ExteriorRenovatorResultExample {

    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/exteriorRenovator/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

while True:
    response = requests.get(
        f"{BASE_URL}/api/v1/exteriorRenovator/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)

if status == "Success":
    print("Result URL:", result["output"]["resultUrl"])
else:
    print("Task failed")
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/exteriorRenovator/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);
        console.log('Size:', result.output.width, 'x', result.output.height);
      } else {
        console.log('Task failed');
      }
      break;
    }

    await new Promise(resolve => setTimeout(resolve, 3000));
  }
}

pollResult(1234567890123456789);

📤 응답#

성공 응답 (작업 완료)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Success",
    "waitNumber": 0,
    "percentage": 100,
    "input": {
      "imageUrl": "https://example.com/exterior.jpg",
      "prompt": "Modern farmhouse exterior with warm wood accents, black window frames, and clean landscaping",
      "refImageUrl": "https://example.com/reference-house.jpg",
      "buildingStyleId": "modern-farmhouse",
      "environmentId": "Architecture_Enviroment_Time_Night,Architecture_Enviroment_Time_Day"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/exterior_renovator_result.jpg",
      "width": 1024,
      "height": 1024
    }
  }
}

응답 (작업 처리 중 / 대기열에 있음)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Processing",
    "waitNumber": 1,
    "percentage": 50,
    "input": {
      "imageUrl": "https://example.com/exterior.jpg"
    },
    "output": null
  }
}

응답 (작업 실패)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Failed",
    "waitNumber": 0,
    "percentage": 0,
    "input": {
      "imageUrl": "https://example.com/exterior.jpg"
    },
    "output": null
  }
}

응답 필드

필드유형설명
idlong작업 고유 식별자
statusstring현재 작업 상태 (작업 상태 참조)
waitNumberinteger대기열에서 앞에 있는 작업 수 (0은 현재 처리 중임을 의미함)
percentageinteger작업 완료 비율 (0–100)
inputobject작업의 원래 입력 매개변수
input.imageUrlstring원본 외관 이미지 URL
input.promptstring제공된 경우 선택적 텍스트 지침
input.refImageUrlstring제공된 경우 선택적 참조 이미지 URL
input.buildingStyleIdstring제공된 경우 선택적 건축 스타일 ID
input.environmentIdstring제공된 경우 선택적 환경 또는 장면 스타일 ID입니다. 쉼표로 구분한 여러 ID를 포함할 수 있습니다.
outputobject생성 결과 (statusSuccess일 때만 제공됨)
output.resultUrlstring외관 리노베이션 결과 이미지 URL
output.widthinteger출력 너비(픽셀)
output.heightinteger출력 높이(픽셀)

📊 작업 상태#

상태설명
Unprocessed작업이 생성되었지만 아직 시작되지 않음
Processing작업이 현재 처리 중
Success작업이 성공적으로 완료되어 출력 사용 가능
Failed오류로 작업이 실패함

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 오류 코드 목록은 오류 코드 참조를 참고하세요.