Ideal House
콘텐츠로 이동

AI 3D 렌더링 API 문서#

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


📖 개요#

AI 3D 렌더링 API는 원본 이미지를 바탕으로 3D 렌더링 작업을 제출하면서 렌더링 강도, 렌더링 모드, 선택적 텍스트 프롬프트 및 참조 스타일 이미지를 세밀하게 제어할 수 있게 합니다. 작업 흐름은 다음 두 단계의 비동기 방식입니다.

  1. 작업 생성 — 입력 매개변수를 제출하고 taskId를 받습니다.
  2. 결과 폴링taskId로 작업 상태를 조회하고 생성된 출력을 가져옵니다.

🔐 인증#

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

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

헤더
APIKEYyour_api_key_here

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


💰 크레딧 차감#

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

모델 (modelType)차감 크레딧
Flash1크레딧
Base3크레딧
Pro10크레딧

📌 API 엔드포인트#


1. 3D 렌더링 작업 생성#

새 AI 3D 렌더링 작업을 만들고 폴링용 고유 taskId를 반환합니다.

엔드포인트

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

요청 헤더

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

요청 본문

필드유형필수 여부설명
imageUrlstring✅ 예렌더링할 원본 이미지 URL
promptstring❌ 선택렌더링 스타일 또는 콘텐츠를 유도하는 추가 텍스트 프롬프트
modelTypestring❌ 선택모델 품질 유형입니다. 열거형: Flash, Base, Pro. 기본값 Flash
renderDegreeinteger❌ 선택렌더링 강도 수준입니다. 범위: 1(가장 약함) – 6(가장 강함). 기본값 3. modelTypeFlash일 때만 적용됩니다.
renderModestring❌ 선택렌더링 모드입니다. 열거형: default, creativeMode. 기본값 default
refImageUrlstring❌ 선택렌더링 출력을 유도하는 참조 스타일 이미지 URL

⚠️ 참고: renderDegreemodelTypeFlash로 설정된 경우에만 적용됩니다. modelType을 지정하지 않으면 기본값으로 Flash를 사용합니다.

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


모델 유형

설명
Flash기본값. 가장 빠른 생성 속도와 표준 품질. renderDegree 제어 지원
Base속도와 품질의 균형. renderDegree는 무시됨
Pro최고 품질과 더 느린 생성. renderDegree는 무시됨

렌더링 모드

설명
default기본 모드. 렌더링 중 원본 이미지의 텍스처와 구조 유지 (텍스처 유지 모드)
creativeMode창작 모드 — 더 예술적이고 스타일화된 렌더링 변환 적용

렌더링 강도

설명
1가장 약한 렌더링 — 최소 변환
25점진적으로 증가하는 렌더링 강도
6가장 강한 렌더링 — 최대 변환

📥 요청 예제#

cURL
bash
# Using Flash model with renderDegree (texture preservation mode)
curl -X POST "https://api.ideal.house/api/v1/ai3dRendering/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "modelType": "Flash",
    "renderDegree": 4,
    "renderMode": "default"
  }'

# Using Flash model with creative mode, prompt and a reference image
curl -X POST "https://api.ideal.house/api/v1/ai3dRendering/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "prompt": "A modern minimalist living room with wooden floor",
    "modelType": "Flash",
    "renderDegree": 5,
    "renderMode": "creativeMode",
    "refImageUrl": "https://example.com/style-reference.jpg"
  }'

# Using Pro model (renderDegree is ignored)
curl -X POST "https://api.ideal.house/api/v1/ai3dRendering/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "modelType": "Pro",
    "renderMode": "default"
  }'
Java (OkHttp)
java
import okhttp3.*;
import java.io.IOException;

public class Ai3dRenderingApiExample {

    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();

        // Flash model with renderDegree (renderDegree only works with Flash)
        String requestBody = """
            {
                "imageUrl": "https://example.com/room.jpg",
                "modelType": "Flash",
                "renderDegree": 4,
                "renderMode": "default"
            }
            """;

        // Pro model example (renderDegree is ignored)
        // String requestBody = """
        //     {
        //         "imageUrl": "https://example.com/room.jpg",
        //         "modelType": "Pro",
        //         "renderMode": "default"
        //     }
        //     """;

        Request request = new Request.Builder()
            .url(BASE_URL + "/api/v1/ai3dRendering/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"
}

# Flash model — renderDegree takes effect (default texture preservation mode)
payload = {
    "imageUrl": "https://example.com/room.jpg",
    "modelType": "Flash",
    "renderDegree": 4,
    "renderMode": "default"
}

# Flash model with creative mode, prompt and reference image
# payload = {
#     "imageUrl": "https://example.com/room.jpg",
#     "prompt": "A modern minimalist living room with wooden floor",
#     "modelType": "Flash",
#     "renderDegree": 5,
#     "renderMode": "creativeMode",
#     "refImageUrl": "https://example.com/style-reference.jpg"
# }

# Pro model — renderDegree is ignored
# payload = {
#     "imageUrl": "https://example.com/room.jpg",
#     "modelType": "Pro",
#     "renderMode": "default"
# }

response = requests.post(
    f"{BASE_URL}/api/v1/ai3dRendering/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 createRenderingTask() {
  try {
    const response = await axios.post(
      `${BASE_URL}/api/v1/ai3dRendering/generate`,
      {
        // Flash model — renderDegree takes effect
        imageUrl: 'https://example.com/room.jpg',
        modelType: 'Flash',
        renderDegree: 4,
        renderMode: 'default'

        // Flash model with creative mode:
        // prompt: 'A modern minimalist living room with wooden floor',
        // modelType: 'Flash',
        // renderDegree: 5,
        // renderMode: 'creativeMode',
        // refImageUrl: 'https://example.com/style-reference.jpg'

        // Pro model — renderDegree is ignored:
        // imageUrl: 'https://example.com/room.jpg',
        // modelType: 'Pro',
        // renderMode: 'default'
      },
      {
        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);
  }
}

createRenderingTask();

📤 응답#

성공 응답

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

2. 작업 결과 조회#

이전에 생성한 렌더링 작업의 현재 상태와 출력을 조회합니다.

엔드포인트

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

요청 헤더

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

쿼리 매개변수

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

📥 요청 예제#

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

public class Ai3dRenderingResultExample {

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

# Poll until task is complete
while True:
    response = requests.get(
        f"{BASE_URL}/api/v1/ai3dRendering/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)
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/ai3dRendering/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);

📤 응답#

성공 응답 (작업 완료)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Success",
    "waitNumber": 0,
    "percentage": 100,
    "input": {
      "imageUrl": "https://example.com/room.jpg",
      "modelType": "Flash",
      "renderDegree": 4,
      "renderMode": "default"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/rendered_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/room.jpg",
      "modelType": "Flash",
      "renderDegree": 4,
      "renderMode": "default"
    },
    "output": null
  }
}

응답 (작업 실패)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Failed",
    "waitNumber": 0,
    "percentage": 0,
    "input": {
      "imageUrl": "https://example.com/room.jpg",
      "modelType": "Flash",
      "renderDegree": 4,
      "renderMode": "default"
    },
    "output": null
  }
}

응답 필드

필드유형설명
idlong작업 고유 식별자
statusstring현재 작업 상태 (작업 상태 참조)
waitNumberinteger대기열에서 앞에 있는 작업 수 (0은 현재 처리 중임을 의미함)
percentageinteger작업 완료 비율 (0–100)
inputobject작업의 원래 입력 매개변수
input.imageUrlstring원본 이미지 URL (제공된 경우)
input.promptstring원본 텍스트 프롬프트 (제공된 경우)
input.modelTypestring사용된 모델 유형
input.renderDegreeinteger사용된 렌더링 강도 수준 (1–6)
input.renderModestring사용된 렌더링 모드 (default 또는 creativeMode)
input.refImageUrlstring참조 스타일 이미지 URL (제공된 경우)
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 오류 코드 목록은 오류 코드 참조를 참고하세요.