Ideal House
Pular para o conteúdo

Documentação da Texture Replacer API#

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


📖 Visão geral#

A Texture Replacer API permite substituir a textura ou o material de uma área selecionada em uma imagem usando uma imagem de referência de estilo. Você fornece uma imagem de origem, uma imagem de referência de estilo que define a textura/material alvo e uma imagem de máscara que especifica a área na qual aplicar a nova textura. A IA mescla a nova textura de forma contínua à cena original. O fluxo de trabalho é assíncrono e envolve duas etapas:

  1. Criar uma tarefa — Envie sua imagem de origem, imagem de estilo, máscara e parâmetros, e receba um taskId.
  2. Consultar os resultados — Use o taskId para consultar o status da tarefa e recuperar a imagem de resultado.

🔐 Autenticação#

Todas as requisições da API devem ser autenticadas com 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 do lado do cliente ou em repositórios públicos.


💰 Dedução de créditos#

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

OperaçãoCréditos deduzidos
Tarefa do Texture Replacer3 créditos

🖼️ Formato da imagem de máscara#

A imagem de máscara define a área na qual a substituição de textura será aplicada.

Regras da máscara:

CorSignificado
PretoÁrea na qual aplicar a nova textura (região a substituir)
BrancoÁrea a preservar (fundo a manter inalterado)

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

Exemplo de máscara:

Exemplo de máscara

A área preta na máscara define onde a nova textura será aplicada; a área branca é o fundo a preservar.


📌 API Endpoints#


1. Criar tarefa do Texture Replacer#

Cria uma nova tarefa de substituição de textura por IA e retorna um taskId exclusivo para consulta.

Endpoint

Texto simples
POST /api/v1/textureReplacer/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 de origem (o cômodo/cena ao qual aplicar a textura)
styleImageUrlstring✅ SimURL da imagem de referência de estilo que define a textura ou material alvo
maskUrlstring⚠️ Um entre maskUrl ou maskBase64URL da imagem de máscara. As áreas pretas receberão a nova textura; as áreas brancas serão preservadas
maskBase64string⚠️ Um entre maskUrl ou maskBase64Imagem de máscara codificada em Base64 (formato PNG recomendado). Usado quando não for possível fornecer um URL hospedado
promptstring❌ OpcionalPrompt de texto adicional para orientar ainda mais a geração da textura

⚠️ É necessário fornecer pelo menos um entre maskUrl ou maskBase64. Se ambos forem fornecidos, maskUrl terá precedência.

🖼️ Requisitos das imagens: as imagens de origem, estilo e máscara devem usar JPG/JPEG, PNG ou WebP. Cada imagem deve ter no máximo 20 MB, com dimensões de 128 × 128 px até 6,000 × 6,000 px (inclusivo). As imagens que excederem as dimensões máximas em pixels serão automaticamente 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 o prefixo data-URL.


📥 Exemplos de requisição#

cURL
bash
# Using maskUrl
curl -X POST "https://api.ideal.house/api/v1/textureReplacer/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "styleImageUrl": "https://example.com/marble-texture.jpg",
    "maskUrl": "https://example.com/mask.png"
  }'

# Using maskBase64 with optional prompt
curl -X POST "https://api.ideal.house/api/v1/textureReplacer/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "styleImageUrl": "https://example.com/wood-texture.jpg",
    "maskBase64": "iVBORw0KGgoAAAANSUhEUgAA...",
    "prompt": "natural oak wood grain texture"
  }'
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 TextureReplacerApiExample {

    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",
                    "styleImageUrl": "https://example.com/marble-texture.jpg",
                    "maskUrl": "https://example.com/mask.png"
                }
                """;

        // 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",
        //         "styleImageUrl": "https://example.com/marble-texture.jpg",
        //         "maskBase64": "%s",
        //         "prompt": "natural oak wood grain texture"
        //     }
        //     """.formatted(maskBase64);

        Request request = new Request.Builder()
                .url(BASE_URL + "/api/v1/textureReplacer/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",
    "styleImageUrl": "https://example.com/marble-texture.jpg",
    "maskUrl": "https://example.com/mask.png"
}

# Option 2: Use maskBase64 with optional prompt
# 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",
#     "styleImageUrl": "https://example.com/wood-texture.jpg",
#     "maskBase64": mask_base64,
#     "prompt": "natural oak wood grain texture"
# }

response = requests.post(
    f"{BASE_URL}/api/v1/textureReplacer/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 createTextureReplacerTask() {
  try {
    // Option 1: Use maskUrl
    const payload = {
      imageUrl: 'https://example.com/room.jpg',
      styleImageUrl: 'https://example.com/marble-texture.jpg',
      maskUrl: 'https://example.com/mask.png'
    };

    // Option 2: Use maskBase64 with optional prompt
    // const maskBuffer = fs.readFileSync('/path/to/mask.png');
    // const maskBase64 = maskBuffer.toString('base64');
    // const payload = {
    //   imageUrl: 'https://example.com/room.jpg',
    //   styleImageUrl: 'https://example.com/wood-texture.jpg',
    //   maskBase64: maskBase64,
    //   prompt: 'natural oak wood grain texture'
    // };

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

createTextureReplacerTask();

📤 Resposta#

Resposta de sucesso

json
{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
CampoTipoDescrição
codeinteger0 indica sucesso
messagestringMensagem de resposta
datalongO ID exclusivo da tarefa para consulta de resultados

2. Obter resultado da tarefa#

Recupera o status atual e a saída de uma tarefa de texture replacer criada anteriormente.

Endpoint

Texto simples
GET /api/v1/textureReplacer/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 no endpoint de criação da tarefa

📥 Exemplos de requisição#

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

import java.io.IOException;

public class TextureReplacerResultExample {

    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/textureReplacer/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/textureReplacer/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")
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/textureReplacer/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 failed');
      }
      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",
      "styleImageUrl": "https://example.com/marble-texture.jpg",
      "maskUrl": "https://example.com/mask.png",
      "prompt": "natural marble texture with grey veining"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/texture_replacer_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",
      "styleImageUrl": "https://example.com/marble-texture.jpg",
      "maskUrl": "https://example.com/mask.png"
    },
    "output": null
  }
}

Resposta (tarefa com falha)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Failed",
    "waitNumber": 0,
    "percentage": 0,
    "input": {
      "imageUrl": "https://example.com/room.jpg",
      "styleImageUrl": "https://example.com/marble-texture.jpg",
      "maskUrl": "https://example.com/mask.png"
    },
    "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 significa que está sendo processada no momento)
percentageintegerPorcentagem de conclusão da tarefa (0–100)
inputobjectOs parâmetros de entrada originais da tarefa
input.imageUrlstringURL da imagem de origem
input.styleImageUrlstringURL da imagem de referência de estilo
input.maskUrlstringURL da imagem de máscara (se fornecida por meio de maskUrl)
input.promptstringPrompt de texto adicional (se fornecido)
outputobjectResultado da geração (disponível apenas quando status é Success)
output.resultUrlstringURL para a imagem de resultado com textura substituída
output.widthintegerLargura de saída em pixels
output.heightintegerAltura de saída em pixels

📊 Status da tarefa#

StatusDescrição
UnprocessedA tarefa foi criada, mas ainda não começou
ProcessingA tarefa está sendo processada no momento
SuccessTarefa concluída com sucesso — a saída está disponível
FailedA tarefa falhou devido a um erro

Consulte a cada 3-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 um curto intervalo; entre em contato com o suporte se persistir
1011PARAM_ERRORErro nos parâmetros da requisição — por exemplo, imageUrl, styleImageUrl ou máscara ausenteCertifique-se de que todos os campos obrigatórios foram fornecidos
5002API_KEY_INVALIDChave API inválida ou ausenteCertifique-se de que o cabeçalho APIKEY está presente e que o valor está correto
9010SCAN_TEXT_ERRORO prompt de texto não passou pela análise de conteúdoModifique o prompt para remover qualquer conteúdo sensível ou proibido
9038PROHIBITED_CONTENTA imagem de saída gerada contém conteúdo proibidoAjuste o prompt/estilo/entradas e tente novamente
9051COINS_NOT_ENOUGHMoedas/créditos insuficientesAdicione créditos à 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.