Documentación de la API de generación 3D con IA#
URL base:
https://api.ideal.house
Versión: v1
Actualizado: 2026-03-06
📖 Descripción general#
La API de generación 3D con IA te permite enviar tareas de generación 3D basadas en imágenes o prompts y recuperar sus resultados de forma asíncrona. El flujo de trabajo consta de dos pasos:
- Crear una tarea — Envía tu entrada (URL de imagen o prompt de texto) y recibe un
taskId. - Sondear para obtener resultados — Utiliza el
taskIdpara consultar el estado de la tarea y recuperar el resultado generado.
🔐 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:
| Encabezado | Valor |
|---|---|
APIKEY | your_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.
⚡ Límite de Concurrencia#
🚦 Importante: Esta API solo permite 1 solicitud concurrente por cuenta a la vez.
Si se envían múltiples solicitudes simultáneamente, las solicitudes posteriores se colocarán en una cola y se procesarán en orden.
Puedes monitorear tu posición en la cola a través del campowaitNumberen la respuesta del resultado de la tarea.
💰 Deducción de créditos#
[!WARNING] 🪙 Cada tarea deduce 20 créditos de tu cuenta al crear la tarea exitosamente.
Los créditos se deducen en el momento de la creación 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 error9051. 📄 Consulta la Referencia de Deducción de Créditos.
📌 Endpoints de la API#
1. Crear Tarea de Generación 3D#
Crea una nueva tarea de generación 3D AI y devuelve un taskId único para sondear.
Endpoint
POST /api/v1/ai3d/generate
Encabezados de la solicitud
| Encabezado | Obligatorio | Descripción |
|---|---|---|
APIKEY | ✅ Sí | Tu clave de autenticación API |
Content-Type | ✅ Sí | application/json |
Cuerpo de la solicitud
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
imageUrl | string | ⚠️ Se requiere imageUrl o prompt | URL de la imagen de origen para generar 3D a partir de ella |
prompt | string | ⚠️ Se requiere imageUrl o prompt | Prompt de texto que describe el contenido 3D a generar |
💡 Nota:
imageUrlypromptson mutuamente excluyentes; proporciona uno de ellos por solicitud.
🖼️ Requisitos de imagen: Usa JPG/JPEG, PNG o WebP. Cada imagen no debe ser más grande que 20 MB, con dimensiones desde 128 × 128 px hasta 5,000 × 5,000 px (inclusive). El URL de la imagen debe ser directamente accesible por el servidor API.
📥 Ejemplos de solicitud#
cURL
# Using imageUrl
curl -X POST "https://api.ideal.house/api/v1/ai3d/generate" \
-H "APIKEY: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"imageUrl": "https://example.com/room.jpg"
}'
# Using prompt
curl -X POST "https://api.ideal.house/api/v1/ai3d/generate" \
-H "APIKEY: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A modern minimalist living room with wooden floor"
}'
Java (OkHttp)
import okhttp3.*;
import java.io.IOException;
public class Ai3dApiExample {
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/room.jpg"
}
""";
Request request = new Request.Builder()
.url(BASE_URL + "/api/v1/ai3d/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"
}
# Using imageUrl
payload = {
"imageUrl": "https://example.com/room.jpg"
}
# Or using prompt
# payload = {
# "prompt": "A modern minimalist living room with wooden floor"
# }
response = requests.post(
f"{BASE_URL}/api/v1/ai3d/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 createTask() {
try {
const response = await axios.post(
`${BASE_URL}/api/v1/ai3d/generate`,
{
imageUrl: 'https://example.com/room.jpg'
// Or use prompt instead:
// prompt: 'A modern minimalist living room with wooden floor',
},
{
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);
}
}
createTask();
📤 Respuesta#
Respuesta de Éxito
{
"code": 0,
"message": "success",
"data": 1234567890123456789
}
| Campo | Tipo | Descripción |
|---|---|---|
code | integer | 0 indica éxito |
message | string | Mensaje de la respuesta |
data | long | El 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 creada previamente.
Endpoint
GET /api/v1/ai3d/result
Encabezados de la solicitud
| Encabezado | Obligatorio | Descripción |
|---|---|---|
APIKEY | ✅ Sí | Tu clave de autenticación API |
Parámetros de consulta
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
taskId | long | ✅ Sí | El ID de la tarea devuelto por el endpoint de creación |
📥 Ejemplos de solicitud#
cURL
curl -X GET "https://api.ideal.house/api/v1/ai3d/result?taskId=1234567890123456789" \
-H "APIKEY: your_api_key_here"
Java (OkHttp)
import okhttp3.*;
import java.io.IOException;
public class Ai3dResultExample {
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/ai3d/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/ai3d/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 failed or terminated")
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/ai3d/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)
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Success",
"waitNumber": 0,
"percentage": 100,
"input": {
"imageUrl": "https://example.com/room.jpg"
},
"output": {
"resultUrl": "https://cdn.ideal.house/output/result_3d_model.zip",
"width": 1024,
"height": 1024
}
}
}
Respuesta (tarea en procesamiento / en cola)
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Processing",
"waitNumber": 2,
"percentage": 35,
"input": {
"imageUrl": "https://example.com/room.jpg"
},
"output": null
}
}
Respuesta (tarea fallida)
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Failed",
"waitNumber": 0,
"percentage": 0,
"input": {
"imageUrl": "https://example.com/room.jpg"
},
"output": null
}
}
Campos de Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
id | long | Identificador único de la tarea |
status | string | Estado actual de la tarea (ver Estado de Tarea) |
waitNumber | integer | Número de tareas por delante de la tarea actual en la cola (0 significa que se está procesando en este momento) |
percentage | integer | Porcentaje de finalización de la tarea (0–100) |
input | object | Los parámetros de entrada originales de la tarea |
input.imageUrl | string | URL de la imagen de origen (si se proporcionó) |
input.prompt | string | Prompt de texto de origen (si se proporcionó) |
input.modelType | string | Tipo de modelo utilizado |
output | object | Resultado de la generación (solo disponible cuando status es Success) |
output.resultUrl | string | URL al archivo del modelo 3D generado |
output.width | integer | Ancho de salida en píxeles |
output.height | integer | Alto de salida en píxeles |
📊 Estado de la tarea#
| Estado | Descripción |
|---|---|
Unprocessed | La tarea se ha creado pero aún no se ha iniciado |
Processing | La tarea se está procesando actualmente |
Success | La tarea se completó correctamente; la salida está disponible |
Failed | La 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:
{
"code": 5002,
"message": "Invalid API Key",
"data": null
}
Referencia de Códigos de Error#
| Código | Nombre | Descripción | Acción Sugerida |
|---|---|---|---|
1001 | FAILED | Error genérico en la solicitud | Comprueba el campo message para ver los detalles específicos del error |
1003 | INTERNAL_ERROR | Error interno del servidor | Reintentar después de un breve retraso; contactar soporte si persiste |
1011 | PARAM_ERROR | Error de parámetro de solicitud | Verifica que todos los parámetros requeridos estén proporcionados y tengan un formato correcto |
5002 | API_KEY_INVALID | Clave API inválida o ausente | Asegúrate de que el encabezado APIKEY está presente y que el valor es correcto |
9010 | SCAN_TEXT_ERROR | El prompt de texto no pasó la revisión de contenido | Modifica el prompt para eliminar cualquier contenido sensible o prohibido |
9038 | PROHIBITED_CONTENT | La imagen de salida generada contiene contenido prohibido | Ajusta la sugerencia/estilo/entradas y reintenta |
9036 | COVERT_3D_FAILED | Esta imagen no admite generación 3D | Prueba con una imagen diferente con estructura y profundidad más claras |
9051 | COINS_NOT_ENOUGH | Monedas / créditos insuficientes | Recarga los créditos de tu cuenta e intenta de nuevo |
Ejemplos de Respuestas de Error#
5002 — Clave API inválida
{
"code": 5002,
"message": "Invalid API Key",
"data": null
}
1011 — Error de parámetro
{
"code": 1011,
"message": "Request parameter error: imageUrl is required",
"data": null
}
9036 — La imagen no es compatible con la generación 3D
{
"code": 9036,
"message": "This image does not support 3D generation",
"data": null
}
9010 — Fallo en la moderación del contenido de texto
{
"code": 9010,
"message": "Text prompt failed content review, contains prohibited content",
"data": null
}
9051 — Créditos insuficientes
{
"code": 9051,
"message": "Insufficient coins",
"data": null
}
📄 Para la lista completa de códigos de error comunes de la API, consulta la Referencia de códigos de error.