Documentazione API di sostituzione intelligente#
URL di base:
https://api.ideal.house
Versione: v1
Aggiornato: 2026-03-06
📖 Panoramica#
API di sostituzione intelligente consente di sostituire in modo intelligente un'area selezionata in un'immagine con contenuti generati dall'intelligenza artificiale in base al tuo prompt testuale. Fornisci un'immagine originale, un'immagine maschera che definisce l'area da sostituire e un prompt testuale che descrive cosa deve riempire quell'area. L'intelligenza artificiale integra armoniosamente il contenuto generato nell'immagine originale. Il flusso di lavoro è asincrono e prevede due passaggi:
- Crea un'attività — Invia immagine, maschera e prompt, quindi ricevi un
taskId. - Interroga periodicamente i risultati — Usa il
taskIdper interrogare lo stato dell'attività e recuperare l'immagine risultante.
🔐 Autenticazione#
Tutte le richieste API devono essere autenticate con una chiave API.
Includi la chiave API nell'intestazione della richiesta:
| Intestazione | Valore |
|---|---|
APIKEY | your_api_key_here |
⚠️ Conserva la chiave API in sicurezza. Non esporla nel codice lato client o in repository pubblici.
💰 Detrazione dei crediti#
[!WARNING] 🪙 Ogni attività detrae 1 credito dal tuo account alla creazione riuscita dell'attività. Se alla fine l'attività non riesce, i crediti detratti vengono rimborsati automaticamente sul tuo account.
Un saldo di crediti insufficiente restituisce il codice di errore9051. 📄 Consulta il Riferimento delle detrazioni dei crediti.
🖼️ Formato dell'immagine maschera#
L'immagine maschera definisce l'area da sostituire nell'immagine originale.
Regole della maschera:
| Colore | Significato |
|---|---|
| ⬛ Nero | Area da sostituire (regione in cui verranno generati nuovi contenuti) |
| ⬜ Bianco | Area da conservare (sfondo da mantenere invariato) |
⚠️ L'immagine maschera deve avere le stesse dimensioni dell'immagine originale (
imageUrl).
Esempio di maschera:
L'area nera della maschera indica la regione da sostituire tramite intelligenza artificiale; l'area bianca è lo sfondo da conservare.
📌 Endpoint API#
1. Crea un'attività di sostituzione intelligente#
Crea una nuova attività di sostituzione intelligente con intelligenza artificiale e restituisce un taskId univoco per le interrogazioni periodiche.
Endpoint
POST /api/v1/smartReplace/generate
Intestazioni della richiesta
| Intestazione | Obbligatoria | Descrizione |
|---|---|---|
APIKEY | ✅ Sì | La tua chiave di autenticazione API |
Content-Type | ✅ Sì | application/json |
Corpo della richiesta
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
imageUrl | string | ✅ Sì | URL dell'immagine originale |
prompt | string | ✅ Sì | Prompt testuale che descrive il contenuto da generare nell'area mascherata (e.g., "a modern armchair", "marble flooring") |
maskUrl | string | ⚠️ Uno tra maskUrl e maskBase64 | URL dell'immagine maschera. Le aree nere verranno sostituite; quelle bianche verranno conservate |
maskBase64 | string | ⚠️ Uno tra maskUrl e maskBase64 | Immagine maschera codificata in Base64 (formato PNG consigliato). Usata quando non puoi fornire una URL ospitata |
⚠️ Deve essere fornito almeno uno tra
maskUrlemaskBase64. Se sono forniti entrambi,maskUrlha la precedenza.
🖼️ Requisiti delle immagini: l'immagine originale e la maschera devono usare JPG/JPEG, PNG o WebP. Ogni immagine non deve superare 20 MB, con dimensioni da 128 × 128 px fino a 6,000 × 6,000 px (estremi inclusi). Prima dell'elaborazione, le immagini che superano le dimensioni massime in pixel vengono ridotte automaticamente in modo proporzionale per rientrare in 6,000 × 6,000 px. Le URLs delle immagini devono essere direttamente accessibili dal server API. Una maschera Base64 è soggetta agli stessi limiti per l'immagine decodificata e non deve includere un prefisso data-URL.
📥 Esempi di richiesta#
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();
📤 Risposta#
Risposta di successo
{
"code": 0,
"message": "success",
"data": 1234567890123456789
}
| Campo | Tipo | Descrizione |
|---|---|---|
code | integer | 0 indica il successo |
message | string | Messaggio della risposta |
data | long | Identificatore univoco dell'attività per interrogare periodicamente i risultati |
2. Ottieni il risultato dell'attività#
Recupera lo stato e l'output correnti di un'attività di sostituzione intelligente creata in precedenza.
Endpoint
GET /api/v1/smartReplace/result
Intestazioni della richiesta
| Intestazione | Obbligatoria | Descrizione |
|---|---|---|
APIKEY | ✅ Sì | La tua chiave di autenticazione API |
Parametri di interrogazione
| Parametro | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
taskId | long | ✅ Sì | Identificatore dell'attività restituito dall'endpoint di creazione dell'attività |
📥 Esempi di richiesta#
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);
📤 Risposta#
Risposta di successo (attività completata)
{
"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
}
}
}
Risposta (attività in elaborazione / in coda)
{
"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
}
}
Risposta (attività non riuscita)
{
"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
}
}
Campi della risposta
| Campo | Tipo | Descrizione |
|---|---|---|
id | long | Identificatore univoco dell'attività |
status | string | Stato corrente dell'attività (vedi Stato dell'attività) |
waitNumber | integer | Numero di attività precedenti in coda (0 significa attualmente in elaborazione) |
percentage | integer | Percentuale di completamento dell'attività (0–100) |
input | object | Parametri di input originali dell'attività |
input.imageUrl | string | URL dell'immagine originale |
input.prompt | string | Prompt testuale che descrive il contenuto sostitutivo |
input.maskUrl | string | URL dell'immagine maschera (se fornita tramite maskUrl) |
output | object | Risultato della generazione (disponibile soltanto quando status è Success) |
output.resultUrl | string | URL dell'immagine risultante dalla sostituzione intelligente |
output.width | integer | Larghezza dell'output in pixel |
output.height | integer | Altezza dell'output in pixel |
📊 Stato dell'attività#
| Stato | Descrizione |
|---|---|
Unprocessed | L'attività è stata creata ma non è ancora iniziata |
Processing | L'attività è attualmente in elaborazione |
Success | L'attività è stata completata correttamente — l'output è disponibile |
Failed | L'attività non è riuscita a causa di un errore |
Interroga lo stato ogni 3-5 secondi. Consulta i Limiti delle attività API.
❌ Risposte di errore#
Tutte le risposte di errore condividono la stessa struttura JSON:
{
"code": 5002,
"message": "Invalid API Key",
"data": null
}
Riferimento dei codici di errore#
| Codice | Nome | Descrizione | Azione suggerita |
|---|---|---|---|
1001 | FAILED | Richiesta non riuscita (errore generico) | Controlla il campo message per i dettagli specifici dell'errore |
1003 | INTERNAL_ERROR | Errore interno del server | Riprova dopo una breve attesa; contatta l'assistenza se il problema persiste |
1011 | PARAM_ERROR | Errore nei parametri della richiesta — e.g., prompt prompt o maschera mancante | Assicurati che siano forniti sia prompt sia almeno un campo della maschera |
5002 | API_KEY_INVALID | Chiave API non valida o mancante | Assicurati che l'intestazione APIKEY sia presente e che il valore sia corretto |
9010 | SCAN_TEXT_ERROR | Il prompt testuale non ha superato la verifica dei contenuti | Modifica il prompt per rimuovere eventuali contenuti sensibili o vietati |
9038 | PROHIBITED_CONTENT | L'immagine generata contiene contenuti vietati | Modifica prompt/stile/input e riprova |
9051 | COINS_NOT_ENOUGH | Monete / crediti insufficienti | Ricarica i crediti dell'account e riprova |
📄 Per l'elenco completo dei codici di errore API comuni, consulta il Riferimento dei codici di errore.
