Ideal House
Saltar al contenido

Documentación de la API de eliminación de objetos#

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


📖 Descripción general#

La API de eliminación de objetos te permite eliminar objetos o muebles no deseados de imágenes de interiores mediante IA. Ofrece dos modos:

  • single_furniture — Elimina un mueble específico proporcionando una imagen de máscara que marca el área objetivo. La IA rellena inteligentemente el área eliminada para producir un resultado limpio y natural.
  • whole_house — Elimina automáticamente todo el mobiliario de toda la habitación sin necesidad de máscara.

El flujo de trabajo es asíncrono e implica dos pasos:

  1. Crear una tarea — Envía tu imagen original, máscara y parámetros, luego recibe un taskId.
  2. Consultar resultados — Usa el taskId para consultar el estado de la tarea y obtener la imagen resultante.

🔐 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] 🪙 Cada tarea descuenta 1 crédito de tu cuenta tras la creación exitosa. Si la tarea finalmente falla, los créditos descontados serán reintegrados 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.


🖼️ Formato de imagen de máscara#

La imagen de máscara define el área que se eliminará de la imagen original.

Reglas de la máscara:

ColorSignificado
NegroÁrea que se eliminará (objeto/región a borrar)
BlancoÁrea que se conservará (fondo a mantener)

⚠️ La imagen de máscara debe tener las mismas dimensiones que la imagen original (imageUrl).

Ejemplo de máscara:

Ejemplo de máscara

El área negra en la máscara marca el mueble a eliminar; el área blanca es el fondo a conservar.


📌 Endpoints de la API#


1. Crear tarea de eliminador de objetos#

Crea una nueva tarea de eliminación de objetos por IA y devuelve un taskId único para su consulta.

Endpoint

Texto plano
POST /api/v1/objectRemover/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 original
emptyTypestring✅ SíModo de eliminación. Enumeración: whole_house, single_furniture. Controla cómo la IA rellena el área eliminada
maskUrlstring⚠️ Requerido cuando emptyType=single_furnitureURL de la imagen de máscara. Las áreas negras se eliminarán; las blancas se conservarán. Solo tiene efecto en modo single_furniture
maskBase64string⚠️ Requerido cuando emptyType=single_furnitureImagen de máscara codificada en Base64 (formato PNG recomendado). Alternativa a maskUrl. Solo tiene efecto en modo single_furniture

⚠️ Requisito de máscara por modo:

  • single_furniture — Se debe proporcionar al menos uno de maskUrl o maskBase64. Si se proporcionan ambos, maskUrl tiene prioridad.
  • whole_house — Los campos de máscara son ignorados. La IA elimina automáticamente todo el mobiliario de toda la habitación.

🖼️ Requisitos de imagen: La imagen original y la máscara deben estar en formato JPG/JPEG, PNG o WebP. Cada imagen no debe superar los 20 MB, con dimensiones desde 128 × 128 px hasta 6,000 × 6,000 px (inclusive). Las imágenes que excedan las dimensiones máximas en píxeles se reducirán proporcionalmente automáticamente para ajustarse dentro de 6,000 × 6,000 px antes del procesamiento. Las URLs de imagen deben ser accesibles directamente por el servidor de la API. Una máscara Base64 está sujeto a los mismos límites de imagen decodificada y no debe incluir el prefijo data-URL.


Opciones de tipo vacío

ValorMáscara requeridaDescripción
single_furniture✅ SíElimina un mueble específico definido por la máscara y rellena el área de forma natural
whole_house❌ NoElimina automáticamente todo el mobiliario de toda la habitación; no requiere máscara

📥 Ejemplos de solicitud#

cURL
bash
# single_furniture mode — mask required (using maskUrl)
curl -X POST "https://api.ideal.house/api/v1/objectRemover/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "emptyType": "single_furniture",
    "maskUrl": "https://example.com/mask.png"
  }'

# single_furniture mode — mask required (using maskBase64)
curl -X POST "https://api.ideal.house/api/v1/objectRemover/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "emptyType": "single_furniture",
    "maskBase64": "iVBORw0KGgoAAAANSUhEUgAA..."
  }'

# whole_house mode — no mask needed
curl -X POST "https://api.ideal.house/api/v1/objectRemover/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "emptyType": "whole_house"
  }'
Java (OkHttp)
java
import okhttp3.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;

public class ObjectRemoverApiExample {

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

        // Option 1: Use maskUrl
        String requestBody = """
            {
                "imageUrl": "https://example.com/room.jpg",
                "maskUrl": "https://example.com/mask.png",
                "emptyType": "single_furniture"
            }
            """;

        // Option 2: Use maskBase64 (encode local mask file)
        // byte[] maskBytes = Files.readAllBytes(Path.of("/path/to/mask.png"));
        // String maskBase64 = Base64.getEncoder().encodeToString(maskBytes);
        // String requestBody = """
        //     {
        //         "imageUrl": "https://example.com/room.jpg",
        //         "maskBase64": "%s",
        //         "emptyType": "single_furniture"
        //     }
        //     """.formatted(maskBase64);

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

BASE_URL = "https://api.ideal.house"
API_KEY  = "your_api_key_here"

headers = {
    "APIKEY": API_KEY,
    "Content-Type": "application/json"
}

# Option 1: Use maskUrl
payload = {
    "imageUrl": "https://example.com/room.jpg",
    "maskUrl": "https://example.com/mask.png",
    "emptyType": "single_furniture"
}

# Option 2: Use maskBase64 (encode local mask file)
# with open("/path/to/mask.png", "rb") as f:
#     mask_base64 = base64.b64encode(f.read()).decode("utf-8")
# payload = {
#     "imageUrl": "https://example.com/room.jpg",
#     "maskBase64": mask_base64,
#     "emptyType": "single_furniture"
# }

response = requests.post(
    f"{BASE_URL}/api/v1/objectRemover/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 fs = require('fs');

const BASE_URL = 'https://api.ideal.house';
const API_KEY  = 'your_api_key_here';

async function createObjectRemoverTask() {
  try {
    // Option 1: Use maskUrl
    const payload = {
      imageUrl: 'https://example.com/room.jpg',
      maskUrl: 'https://example.com/mask.png',
      emptyType: 'single_furniture'
    };

    // Option 2: Use maskBase64 (encode local mask file)
    // const maskBuffer = fs.readFileSync('/path/to/mask.png');
    // const maskBase64 = maskBuffer.toString('base64');
    // const payload = {
    //   imageUrl: 'https://example.com/room.jpg',
    //   maskBase64: maskBase64,
    //   emptyType: 'single_furniture'
    // };

    const response = await axios.post(
      `${BASE_URL}/api/v1/objectRemover/generate`,
      payload,
      {
        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);
  }
}

createObjectRemoverTask();

📤 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 eliminación de objetos creada previamente.

Endpoint

Texto plano
GET /api/v1/objectRemover/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/objectRemover/result?taskId=1234567890123456789" \
  -H "APIKEY: your_api_key_here"
Java (OkHttp)
java
import okhttp3.*;
import java.io.IOException;

public class ObjectRemoverResultExample {

    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/objectRemover/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/objectRemover/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/objectRemover/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 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",
      "maskUrl": "https://example.com/mask.png",
      "emptyType": "single_furniture"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/object_remover_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",
      "maskUrl": "https://example.com/mask.png",
      "emptyType": "single_furniture"
    },
    "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",
      "maskUrl": "https://example.com/mask.png",
      "emptyType": "single_furniture"
    },
    "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 original
input.maskUrlstringURL de la imagen de máscara (si se proporcionó mediante maskUrl)
input.emptyTypestringModo de eliminación utilizado (single_furniture o whole_house)
outputobjectResultado de la generación (solo disponible cuando status es Success)
output.resultUrlstringURL a la imagen resultante sin objetos
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 solicitud — por ejemplo, tanto maskUrl como maskBase64 faltanAsegúrese de proporcionar al menos un campo de máscara
5002API_KEY_INVALIDClave API inválida o ausenteAsegúrate de que el encabezado APIKEY está presente y que el valor es correcto
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.