Ideal House
Pular para o conteúdo

Documentação da Object Remover API#

URL base: https://api.ideal.house
Versão: v1
Atualizado: 2026-03-06


📖 Visão geral#

A Object Remover API permite remover objetos ou móveis indesejados de imagens de interiores usando IA. Ela oferece dois modos:

  • single_furniture — Remove um móvel específico fornecendo uma imagem de máscara que marca a área desejada. A IA preenche inteligentemente a área removida, produzindo um resultado limpo e natural.
  • whole_house — Remove automaticamente todos os móveis de todo o cômodo, sem necessidade de máscara.

O fluxo de trabalho é assíncrono e envolve duas etapas:

  1. Criar uma tarefa — Envie a imagem original, a máscara e os parâmetros para receber um taskId.
  2. Consultar resultados — Use o taskId para verificar o status da tarefa e recuperar a imagem resultante.

🔐 Autenticação#

Todas as requisições da API devem ser autenticadas por meio de uma Chave de API.

Inclua sua Chave de API no cabeçalho da requisição:

CabeçalhoValor
APIKEYyour_api_key_here

⚠️ Mantenha sua Chave de API segura. Não a exponha em código client-side ou repositórios públicos.


💰 Dedução de créditos#

[!WARNING] 🪙 Cada tarefa deduz 1 crédito da sua conta após a criação bem-sucedida. Se a tarefa eventualmente falhar, os créditos deduzidos serão automaticamente reembolsados para a sua conta.
Créditos insuficientes retornarão o código de erro 9051. 📄 Consulte Referência de dedução de créditos.


🖼️ Formato da imagem de máscara#

A imagem de máscara define a área que deve ser removida da imagem original.

Regras da máscara:

CorSignificado
PretoÁrea a ser removida (objeto / região a apagar)
BrancoÁrea a ser preservada (fundo a manter)

⚠️ A imagem de máscara deve ter as mesmas dimensões da imagem original (imageUrl).

Exemplo de máscara:

Exemplo de máscara

A área preta na máscara indica o móvel a ser removido; a área branca corresponde ao fundo a preservar.


📌 Endpoints da API#


1. Criar tarefa de remoção de objetos#

Cria uma nova tarefa de remoção de objetos por IA e retorna um taskId único para consulta.

Endpoint

Texto simples
POST /api/v1/objectRemover/generate

Cabeçalhos da requisição

CabeçalhoObrigatórioDescrição
APIKEY✅ SimSua chave de autenticação da API
Content-Type✅ Simapplication/json

Corpo da requisição

CampoTipoObrigatórioDescrição
imageUrlstring✅ SimURL da imagem original
emptyTypestring✅ SimModo de remoção. Valores: whole_house ou single_furniture. Controla como a IA preenche a área removida
maskUrlstring⚠️ Obrigatório quando emptyType=single_furnitureURL da imagem de máscara. Áreas pretas serão removidas; áreas brancas serão preservadas. Somente válido no modo single_furniture
maskBase64string⚠️ Obrigatório quando emptyType=single_furnitureImagem de máscara codificada em Base64 (recomendado o formato PNG). Alternativa ao maskUrl. Somente válido no modo single_furniture

⚠️ Requisito de máscara por modo:

  • No modo single_furniture, pelo menos um dos campos maskUrl ou maskBase64 deve ser fornecido. Se ambos forem informados, maskUrl terá precedência.
  • No modo whole_house, os campos de máscara são ignorados. A IA remove automaticamente todos os móveis de todo o cômodo.

🖼️ Requisitos de imagem: A imagem de origem e a máscara devem usar JPG/JPEG, PNG ou WebP. Cada imagem não deve exceder 20 MB, com dimensões de 128 × 128 px até 6,000 × 6,000 px (inclusivo). Imagens que excedam as dimensões máximas em pixels serão redimensionadas proporcionalmente para caber dentro de 6,000 × 6,000 px antes do processamento. Os URLs de imagem devem ser diretamente acessíveis pelo servidor da API. Uma máscara Base64 está sujeita aos mesmos limites de imagem decodificada e não deve incluir um prefixo data-URL.


Opções de Empty Type

ValorMáscara obrigatóriaDescrição
single_furniture✅ SimRemove um móvel específico definido pela máscara e preenche a área de forma natural
whole_house❌ NãoRemove automaticamente todos os móveis do cômodo inteiro — não requer máscara

📥 Exemplos de requisição#

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

📤 Resposta#

Resposta de sucesso

json
{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
CampoTipoDescrição
codeintegerValor 0 indica sucesso
messagestringMensagem de resposta
datalongID único da tarefa para consulta dos resultados

2. Obter resultado da tarefa#

Recupera o status atual e a saída de uma tarefa de remoção de objetos criada anteriormente.

Endpoint

Texto simples
GET /api/v1/objectRemover/result

Cabeçalhos da requisição

CabeçalhoObrigatórioDescrição
APIKEY✅ SimSua chave de autenticação da API

Parâmetros de query

ParâmetroTipoObrigatórioDescrição
taskIdlong✅ SimO ID da tarefa retornado pelo endpoint de criação

📥 Exemplos de requisição#

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

📤 Resposta#

Resposta de sucesso (tarefa concluída)

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

Resposta (tarefa em processamento / na fila)

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

Resposta (tarefa falhou)

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 da resposta

CampoTipoDescrição
idlongIdentificador único da tarefa
statusstringStatus atual da tarefa (consulte Status da tarefa)
waitNumberintegerNúmero de tarefas à frente na fila (0 indica processamento no momento)
percentageintegerPercentual de conclusão da tarefa (0–100)
inputobjectParâmetros de entrada originais da tarefa
input.imageUrlstringURL da imagem original
input.maskUrlstringURL da imagem de máscara (se fornecida por maskUrl)
input.emptyTypestringModo de remoção utilizado (single_furniture ou whole_house)
outputobjectResultado da geração (disponível apenas quando status é Success)
output.resultUrlstringURL para a imagem de resultado com os objetos removidos
output.widthintegerLargura de saída em pixels
output.heightintegerAltura de saída em pixels

📊 Status da tarefa#

StatusDescrição
UnprocessedTarefa criada, mas ainda não iniciada
ProcessingTarefa está sendo processada no momento
SuccessTarefa concluída com sucesso — a saída está disponível
FailedTarefa falhou devido a um erro

Faça polling a cada 3 a 5 segundos. Consulte Limite de tarefas da API.


❌ Respostas de erro#

Todas as respostas de erro compartilham a mesma estrutura JSON:

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

Referência de códigos de erro#

CódigoNomeDescriçãoAção sugerida
1001FAILEDFalha na requisição (erro genérico)Verifique o campo message para obter detalhes específicos do erro
1003INTERNAL_ERRORErro interno do servidorTente novamente após breve pausa; entre em contato com o suporte se persistir
1011PARAM_ERRORErro nos parâmetros da requisição — por exemplo, campos maskUrl e maskBase64 ausentesCertifique-se de fornecer pelo menos um campo de máscara
5002API_KEY_INVALIDChave de API inválida ou ausenteVerifique a presença do cabeçalho APIKEY e a validade do valor
9038PROHIBITED_CONTENTA imagem gerada contém conteúdo proibidoAjuste o prompt, o estilo ou as entradas e tente novamente
9051COINS_NOT_ENOUGHSaldo insuficiente de moedas / créditosRecarregue os créditos da sua conta e tente novamente

📄 Para a lista completa de códigos de erro comuns da API, consulte a Referência de códigos de erro.