Ideal House
Saltar al contenido

Documentación de la API de renderizado 3D con IA#

URL base: https://api.ideal.house
Versión: v1
Actualizado: 2026-03-06


📖 Descripción general#

La API de renderizado 3D con IA te permite enviar una tarea de renderizado 3D basada en una imagen de origen, con control preciso sobre el grado de renderizado, el modo de renderizado, un prompt de texto opcional e imágenes de estilo de referencia. El flujo de trabajo es asíncrono e implica dos pasos:

  1. Crear una tarea: envía tus parámetros de entrada y recibe un taskId.
  2. Consultar resultados: usa el taskId para consultar el estado de la tarea y recuperar la salida generada.

🔐 Autenticación#

Todas las solicitudes a la API deben autenticarse mediante una Clave de API.

Incluye tu Clave de API en el encabezado de la solicitud:

EncabezadoValor
APIKEYyour_api_key_here

⚠️ Mantén tu Clave de API segura. No la expongas en código del lado del cliente ni en repositorios públicos.


💰 Deducción de créditos#

[!WARNING] 🪙 Los créditos se deducen según el modelType seleccionado tras la creación exitosa de la tarea. Si la tarea finalmente falla, los créditos deducidos se reembolsarán automáticamente a tu cuenta.
Los créditos insuficientes devolverán el código de error 9051. 📄 Consulta la Referencia de Deducción de Créditos.

Modelo (modelType)Créditos Descontados
Flash1 crédito
Base3 créditos
Pro10 créditos

📌 Endpoints de la API#


1. Crear tarea de renderizado 3D#

Crea una nueva tarea de renderizado 3D AI y devuelve un taskId único para consultar.

Endpoint

Texto plano
POST /api/v1/ai3dRendering/generate

Encabezados de la solicitud

EncabezadoObligatorioDescripción
APIKEY✅ SíTu clave de autenticación API
Content-Type✅ Síapplication/json

Cuerpo de la solicitud

CampoTipoObligatorioDescripción
imageUrlstring✅ SíURL de la imagen de origen para renderizar
promptstring❌ OpcionalPrompt de texto adicional para guiar el estilo o el contenido del renderizado
modelTypestring❌ OpcionalTipo de calidad del modelo. Enum: Flash, Base, Pro. Predeterminado: Flash
renderDegreeinteger❌ OpcionalNivel de intensidad de renderizado. Rango: 1 (más suave) – 6 (más fuerte). Predeterminado: 3. Solo efectivo cuando modelType es Flash
renderModestring❌ OpcionalModo de renderizado. Enum: default, creativeMode. Predeterminado: default
refImageUrlstring❌ OpcionalURL de una imagen de estilo de referencia para guiar la salida del renderizado

⚠️ Nota: renderDegree solo surte efecto cuando modelType está configurado como Flash. Si no se especifica modelType, se usa Flash de forma predeterminada.

🖼️ Requisitos de imagen: todas las imágenes de entrada y referencia deben usar los formatos JPG/JPEG, PNG o WebP. Cada imagen no debe superar los 20 MB, con dimensiones entre 128 × 128 px y 6,000 × 6,000 px (inclusive). Las imágenes que excedan las dimensiones máximas en píxeles se reducirán automáticamente de forma proporcional para ajustarse a 6,000 × 6,000 px antes del procesamiento. Las URLs de las imágenes deben ser accesibles directamente por el servidor de la API.


Tipos de Modelo

ValorDescripción
FlashPredeterminado. Velocidad de generación más rápida, calidad estándar. Admite control de renderDegree
BaseEquilibrio entre velocidad y calidad. renderDegree se ignora
ProMáxima calidad, generación más lenta. renderDegree se ignora

Modos de renderizado

ValorDescripción
defaultModo predeterminado. Conserva la textura y la estructura originales durante el renderizado (modo de mantenimiento de textura)
creativeModeModo creativo: aplica transformaciones de renderizado más artísticas y estilizadas

Grado de renderizado

ValorDescripción
1Renderizado más suave: transformación mínima
25Intensidad de renderizado progresiva
6Renderizado más fuerte: transformación máxima

📥 Ejemplos de solicitud#

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

📤 Respuesta#

Respuesta de Éxito

json
{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
CampoTipoDescripción
codeinteger0 indica éxito
messagestringMensaje de la respuesta
datalongEl ID único de la tarea para consultar los resultados

2. Obtener resultado de la tarea#

Recupera el estado actual y la salida de una tarea de renderizado creada previamente.

Endpoint

Texto plano
GET /api/v1/ai3dRendering/result

Encabezados de la solicitud

EncabezadoObligatorioDescripción
APIKEY✅ SíTu clave de autenticación API

Parámetros de consulta

ParámetroTipoObligatorioDescripción
taskIdlong✅ SíEl ID de la tarea devuelto por el endpoint de creación

📥 Ejemplos de solicitud#

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

📤 Respuesta#

Respuesta de Éxito (Tarea Completada)

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
    }
  }
}

Respuesta (tarea en procesamiento / en cola)

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
  }
}

Respuesta (tarea fallida)

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
  }
}

Campos de Respuesta

CampoTipoDescripción
idlongIdentificador único de la tarea
statusstringEstado actual de la tarea (ver Estado de Tarea)
waitNumberintegerNúmero de tareas por delante de la tarea actual en la cola (0 significa que se está procesando en este momento)
percentageintegerPorcentaje de finalización de la tarea (0–100)
inputobjectLos parámetros de entrada originales de la tarea
input.imageUrlstringURL de la imagen de origen (si se proporcionó)
input.promptstringPrompt de texto de origen (si se proporcionó)
input.modelTypestringTipo de modelo utilizado
input.renderDegreeintegerNivel de intensidad de renderizado utilizado (1–6)
input.renderModestringModo de renderizado utilizado (default o creativeMode)
input.refImageUrlstringURL de la imagen de estilo de referencia (si se proporcionó)
outputobjectResultado de la generación (solo disponible cuando status es Success)
output.resultUrlstringURL a la imagen de salida renderizada
output.widthintegerAncho de salida en píxeles
output.heightintegerAlto de salida en píxeles

📊 Estado de la tarea#

EstadoDescripción
UnprocessedLa tarea se ha creado pero aún no se ha iniciado
ProcessingLa tarea se está procesando actualmente
SuccessLa tarea se completó correctamente; la salida está disponible
FailedLa tarea falló debido a un error

Consulta cada 3-5 segundos. Consulta Límite de tareas de la API.


❌ Respuestas de error#

Todas las respuestas de error comparten la misma estructura JSON:

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

Referencia de Códigos de Error#

CódigoNombreDescripciónAcción Sugerida
1001FAILEDError genérico en la solicitudComprueba el campo message para ver los detalles específicos del error
1003INTERNAL_ERRORError interno del servidorReintentar después de un breve retraso; contactar soporte si persiste
1011PARAM_ERRORError de parámetro de solicitudVerifica que todos los parámetros requeridos estén proporcionados y tengan un formato correcto
5002API_KEY_INVALIDClave API inválida o ausenteAsegúrate de que el encabezado APIKEY está presente y que el valor es correcto
9010SCAN_TEXT_ERROREl prompt de texto no pasó la revisión de contenidoModifica el prompt para eliminar cualquier contenido sensible o prohibido
9038PROHIBITED_CONTENTLa imagen de salida generada contiene contenido prohibidoAjusta la sugerencia/estilo/entradas y reintenta
9051COINS_NOT_ENOUGHMonedas / créditos insuficientesRecarga los créditos de tu cuenta e intenta de nuevo

📄 Para la lista completa de códigos de error comunes de la API, consulta la Referencia de códigos de error.