Documentação da Smart Replace API#
URL Base:
https://api.ideal.house
Versão: v1
Atualizado: 2026-03-06
📖 Visão Geral#
A Smart Replace API permite substituir de forma inteligente uma área selecionada em uma imagem por conteúdo gerado por IA com base no seu prompt de texto. Você fornece uma imagem de origem, uma imagem de máscara que define a área a ser substituída e um prompt de texto descrevendo o que deve preencher essa área. A IA integrará perfeitamente o conteúdo gerado na imagem original. O fluxo de trabalho é assíncrono e envolve duas etapas:
- Criar uma tarefa — Envie sua imagem, máscara e prompt, então receba um
taskId. - Consultar resultados — Use o
taskIdpara consultar o status da tarefa e recuperar a imagem resultante.
🔐 Autenticação#
Todas as requisições da API devem ser autenticadas usando uma Chave API Key.
Inclua sua Chave API no cabeçalho da solicitação:
| Cabeçalho | Valor |
|---|---|
APIKEY | your_api_key_here |
⚠️ Mantenha sua Chave API segura. Não a exponha em código do lado do cliente 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 da tarefa. Se a tarefa eventualmente falhar, os créditos deduzidos serão automaticamente reembolsados para sua conta.
Créditos insuficientes retornarão o código de erro9051. 📄 Consulte Referência de Dedução de Créditos.
🖼️ Formato da Imagem de Máscara#
A imagem de máscara define a área a ser substituída na imagem de origem.
Regras da Máscara:
| Cor | Significado |
|---|---|
| ⬛ Preto | Área a ser substituída (região onde novo conteúdo será gerado) |
| ⬜ Branco | Área a ser preservada (fundo a manter inalterado) |
⚠️ A imagem de máscara deve corresponder às mesmas dimensões da imagem de origem (
imageUrl).
Exemplo de Máscara:
A área preta na máscara indica a região a ser substituída pela IA; a área branca é o fundo a preservar.
📌 Endpoints da API#
1. Criar Tarefa de Substituição Inteligente#
Cria uma nova tarefa de substituição inteligente via IA e retorna um taskId único para consulta.
Endpoint
POST /api/v1/smartReplace/generate
Cabeçalhos da Solicitação
| Cabeçalho | Obrigatório | Descrição |
|---|---|---|
APIKEY | ✅ Sim | Sua chave de autenticação API |
Content-Type | ✅ Sim | application/json |
Corpo da Solicitação
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
imageUrl | string | ✅ Sim | URL da imagem de origem |
prompt | string | ✅ Sim | Prompt de texto descrevendo o conteúdo a ser gerado na área mascarada (por exemplo, "a modern armchair", "marble flooring") |
maskUrl | string | ⚠️ Um entre maskUrl ou maskBase64 | URL da imagem de máscara. Áreas pretas serão substituídas; áreas brancas serão preservadas |
maskBase64 | string | ⚠️ Um entre maskUrl ou maskBase64 | Imagem de máscara codificada em Base64 (formato PNG recomendado). Usado quando você não consegue fornecer um URL hospedado |
⚠️ Pelo menos um de
maskUrloumaskBase64deve ser fornecido. Se ambos forem fornecidos,maskUrlterá precedência.
🖼️ Requisitos da imagem: A imagem fonte e a máscara devem usar JPG/JPEG, PNG ou WebP. Cada imagem não pode ter mais de 20 MB, com dimensões de 128 × 128 px até 6,000 × 6,000 px (incluso). Imagens que excedam as dimensões máximas de pixels são automaticamente dimensionadas proporcionalmente para caber dentro de 6,000 × 6,000 px antes do processamento. As URLs das imagens devem ser diretamente acessíveis pelo servidor API. Uma máscara em Base64 está sujeita aos mesmos limites da imagem decodificada e não deve incluir o prefixo data-URL.
📥 Exemplos de Solicitação#
cURL
# Using maskUrl
curl -X POST "https://api.ideal.house/api/v1/smartReplace/generate" \
-H "APIKEY: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"imageUrl": "https://example.com/room.jpg",
"prompt": "a modern velvet sofa in dark blue",
"maskUrl": "https://example.com/mask.png"
}'
# Using maskBase64
curl -X POST "https://api.ideal.house/api/v1/smartReplace/generate" \
-H "APIKEY: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"imageUrl": "https://example.com/room.jpg",
"prompt": "a modern velvet sofa in dark blue",
"maskBase64": "iVBORw0KGgoAAAANSUhEUgAA..."
}'
Java (OkHttp)
import okhttp3.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;
public class SmartReplaceApiExample {
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",
"prompt": "a modern velvet sofa in dark blue",
"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",
// "prompt": "a modern velvet sofa in dark blue",
// "maskBase64": "%s"
// }
// """.formatted(maskBase64);
Request request = new Request.Builder()
.url(BASE_URL + "/api/v1/smartReplace/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
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",
"prompt": "a modern velvet sofa in dark blue",
"maskUrl": "https://example.com/mask.png"
}
# 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",
# "prompt": "a modern velvet sofa in dark blue",
# "maskBase64": mask_base64
# }
response = requests.post(
f"{BASE_URL}/api/v1/smartReplace/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 fs = require('fs');
const BASE_URL = 'https://api.ideal.house';
const API_KEY = 'your_api_key_here';
async function createSmartReplaceTask() {
try {
// Option 1: Use maskUrl
const payload = {
imageUrl: 'https://example.com/room.jpg',
prompt: 'a modern velvet sofa in dark blue',
maskUrl: 'https://example.com/mask.png'
};
// 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',
// prompt: 'a modern velvet sofa in dark blue',
// maskBase64: maskBase64
// };
const response = await axios.post(
`${BASE_URL}/api/v1/smartReplace/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);
}
}
createSmartReplaceTask();
📤 Resposta#
Resposta de Sucesso
{
"code": 0,
"message": "success",
"data": 1234567890123456789
}
| Campo | Tipo | Descrição |
|---|---|---|
code | integer | 0 indica sucesso |
message | string | Mensagem de resposta |
data | long | O ID único da tarefa para consulta dos resultados |
2. Obter Resultado da Tarefa#
Recupera o status atual e a saída de uma tarefa de substituição inteligente criada anteriormente.
Endpoint
GET /api/v1/smartReplace/result
Cabeçalhos da Solicitação
| Cabeçalho | Obrigatório | Descrição |
|---|---|---|
APIKEY | ✅ Sim | Sua chave de autenticação API |
Parâmetros de Consulta
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
taskId | long | ✅ Sim | O ID da tarefa retornado pelo endpoint de criação da tarefa |
📥 Exemplos de Solicitação#
cURL
curl -X GET "https://api.ideal.house/api/v1/smartReplace/result?taskId=1234567890123456789" \
-H "APIKEY: your_api_key_here"
Java (OkHttp)
import okhttp3.*;
import java.io.IOException;
public class SmartReplaceResultExample {
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/smartReplace/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/smartReplace/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)
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/smartReplace/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)
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Success",
"waitNumber": 0,
"percentage": 100,
"input": {
"imageUrl": "https://example.com/room.jpg",
"prompt": "a modern velvet sofa in dark blue",
"maskUrl": "https://example.com/mask.png"
},
"output": {
"resultUrl": "https://cdn.ideal.house/output/smart_replace_result.jpg",
"width": 1024,
"height": 1024
}
}
}
Resposta (Tarefa em Processamento / Em Fila)
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Processing",
"waitNumber": 1,
"percentage": 45,
"input": {
"imageUrl": "https://example.com/room.jpg",
"prompt": "a modern velvet sofa in dark blue",
"maskUrl": "https://example.com/mask.png"
},
"output": null
}
}
Resposta (Tarefa Falhou)
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Failed",
"waitNumber": 0,
"percentage": 0,
"input": {
"imageUrl": "https://example.com/room.jpg",
"prompt": "a modern velvet sofa in dark blue",
"maskUrl": "https://example.com/mask.png"
},
"output": null
}
}
Campos da Resposta
| Campo | Tipo | Descrição |
|---|---|---|
id | long | Identificador único da tarefa |
status | string | Status atual da tarefa (consulte Status da Tarefa) |
waitNumber | integer | Número de tarefas à frente na fila (0 significa em processamento atual) |
percentage | integer | Percentual de conclusão da tarefa (0–100) |
input | object | Os parâmetros de entrada originais da tarefa |
input.imageUrl | string | URL da imagem de origem |
input.prompt | string | Prompt de texto descrevendo o conteúdo de substituição |
input.maskUrl | string | URL da imagem de máscara (se fornecido via maskUrl) |
output | object | Resultado da geração (disponível apenas quando status é Success) |
output.resultUrl | string | URL para a imagem resultante da substituição inteligente |
output.width | integer | Largura de saída em pixels |
output.height | integer | Altura de saída em pixels |
📊 Status da Tarefa#
| Status | Descrição |
|---|---|
Unprocessed | A tarefa foi criada mas ainda não iniciou |
Processing | A tarefa está atualmente em processamento |
Success | Tarefa concluída com sucesso — a saída está disponível |
Failed | A 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:
{
"code": 5002,
"message": "Invalid API Key",
"data": null
}
Referência de Códigos de Erro#
| Código | Nome | Descrição | Ação Sugerida |
|---|---|---|---|
1001 | FAILED | Falha na solicitação (erro genérico) | Verifique o campo message para detalhes específicos do erro |
1003 | INTERNAL_ERROR | Erro interno do servidor | Tente novamente após um curto atraso; entre em contato com o suporte se persistir |
1011 | PARAM_ERROR | Erro nos parâmetros da solicitação — por exemplo, prompt ou máscara ausentes | Garanta que tanto prompt quanto pelo menos um campo de máscara estejam fornecidos |
5002 | API_KEY_INVALID | Chave API inválida ou ausente | Garanta que o cabeçalho APIKEY esteja presente e que o valor esteja correto |
9010 | SCAN_TEXT_ERROR | O prompt de texto falhou na revisão de conteúdo | Modifique o prompt para remover qualquer conteúdo sensível ou proibido |
9038 | PROHIBITED_CONTENT | A imagem de saída gerada contém conteúdo proibido | Ajuste o prompt/estilo/entradas e tente novamente |
9051 | COINS_NOT_ENOUGH | Moedas/créditos insuficientes | Adicione 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.
