Ideal House
Naar inhoud gaan

Documentatie voor de API voor AI-3D-generatie#

Basis-URL: https://api.ideal.house
Versie: v1
Bijgewerkt: 2026-03-06


📖 Overzicht#

Met de API voor AI-3D-generatie kun je 3D-generatietaken indienen op basis van een afbeelding of tekstinstructie en de resultaten asynchroon ophalen. De werkstroom bestaat uit twee stappen:

  1. Een taak aanmaken — Dien je invoer in, een afbeeldings-URL of tekstinstructie, en ontvang een taskId.
  2. Resultaten regelmatig opvragen — Gebruik de taskId om de taakstatus op te vragen en de gegenereerde uitvoer op te halen.

🔐 Authenticatie#

Alle API-verzoeken moeten worden geauthenticeerd met een API Key.

Neem je API Key op in de verzoekheader:

VerzoekheaderWaarde
APIKEYyour_api_key_here

⚠️ Houd je API Key geheim. Maak deze niet zichtbaar in clientcode of openbare opslagplaatsen.


⚡ Limiet voor gelijktijdige verwerking#

🚦 Belangrijk: Deze API staat slechts 1 gelijktijdig verzoek per account toe.
Als meerdere verzoeken tegelijk worden ingediend, worden volgende verzoeken in een wachtrij geplaatst en op volgorde verwerkt.
Je kunt je wachtrijpositie volgen via het veld waitNumber in het taakresultaatantwoord.


💰 Creditafschrijving#

[!WARNING] 🪙 Elke taak kost 20 tegoedeenheden, afgeschreven van je account zodra de taak succesvol is aangemaakt.
Credits worden afgeschreven op het moment dat de taak wordt aangemaakt. Als de taak uiteindelijk mislukt, worden de afgeschreven credits automatisch terugbetaald op je account.
Onvoldoende credits leveren foutcode 9051 op. 📄 Zie de referentie voor creditafschrijving.


📌 API-endpoints#


1. Een 3D-generatietaak aanmaken#

Maakt een nieuwe AI-3D-generatietaak aan en retourneert een unieke taskId om de status regelmatig op te vragen.

Eindpunt

Platte tekst
POST /api/v1/ai3d/generate

Verzoekheaders

VerzoekheaderVerplichtBeschrijving
APIKEY✅ JaJe API-authenticatiesleutel
Content-Type✅ Jaapplication/json

Verzoekinhoud

VeldTypeVerplichtBeschrijving
imageUrlstring⚠️ imageUrl of prompt is verplichtURL van de bronafbeelding voor het genereren van 3D
promptstring⚠️ imageUrl of prompt is verplichtTekstinstructie die de te genereren 3D-inhoud beschrijft

💡 Opmerking: imageUrl en prompt sluiten elkaar uit; geef per verzoek één van beide op.

🖼️ Afbeeldingsvereisten: Gebruik JPG/JPEG, PNG of WebP. Elke afbeelding mag maximaal 20 MB groot zijn, met afmetingen van 128 × 128 px tot en met 5,000 × 5,000 px. De afbeeldings-URL moet rechtstreeks bereikbaar zijn voor de API-server.


📥 Verzoekvoorbeelden#

cURL
bash
# Using imageUrl
curl -X POST "https://api.ideal.house/api/v1/ai3d/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg"
  }'

# Using prompt
curl -X POST "https://api.ideal.house/api/v1/ai3d/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A modern minimalist living room with wooden floor"
  }'
Java (OkHttp)
java
import okhttp3.*;
import java.io.IOException;

public class Ai3dApiExample {

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

        String requestBody = """
            {
                "imageUrl": "https://example.com/room.jpg"
            }
            """;

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

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

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

# Using imageUrl
payload = {
    "imageUrl": "https://example.com/room.jpg"
}

# Or using prompt
# payload = {
#     "prompt": "A modern minimalist living room with wooden floor"
# }

response = requests.post(
    f"{BASE_URL}/api/v1/ai3d/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 BASE_URL = 'https://api.ideal.house';
const API_KEY  = 'your_api_key_here';

async function createTask() {
  try {
    const response = await axios.post(
      `${BASE_URL}/api/v1/ai3d/generate`,
      {
        imageUrl: 'https://example.com/room.jpg'
        // Or use prompt instead:
        // prompt: 'A modern minimalist living room with wooden floor',
      },
      {
        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);
  }
}

createTask();

📤 Antwoord#

Succesantwoord

json
{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
VeldTypeBeschrijving
codeinteger0 geeft succes aan
messagestringAntwoordbericht
datalongDe unieke taak-ID voor het regelmatig opvragen van resultaten

2. Taakresultaat ophalen#

Haalt de huidige status en uitvoer van een eerder aangemaakte taak op.

Eindpunt

Platte tekst
GET /api/v1/ai3d/result

Verzoekheaders

VerzoekheaderVerplichtBeschrijving
APIKEY✅ JaJe API-authenticatiesleutel

Queryparameters

QueryparameterTypeVerplichtBeschrijving
taskIdlong✅ JaDe taak-ID die het endpoint voor het aanmaken van taken retourneert

📥 Verzoekvoorbeelden#

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

public class Ai3dResultExample {

    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/ai3d/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/ai3d/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 or terminated")
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/ai3d/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);
      } else {
        console.log('Task ended with status:', status);
      }
      break;
    }

    // Wait 3 seconds before next poll
    await new Promise(resolve => setTimeout(resolve, 3000));
  }
}

pollResult(1234567890123456789n);

📤 Antwoord#

Succesantwoord: taak voltooid

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Success",
    "waitNumber": 0,
    "percentage": 100,
    "input": {
      "imageUrl": "https://example.com/room.jpg"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/result_3d_model.zip",
      "width": 1024,
      "height": 1024
    }
  }
}

Antwoord: taak in verwerking of in de wachtrij

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Processing",
    "waitNumber": 2,
    "percentage": 35,
    "input": {
      "imageUrl": "https://example.com/room.jpg"
    },
    "output": null
  }
}

Antwoord: taak mislukt

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Failed",
    "waitNumber": 0,
    "percentage": 0,
    "input": {
      "imageUrl": "https://example.com/room.jpg"
    },
    "output": null
  }
}

Antwoordvelden

VeldTypeBeschrijving
idlongUnieke taakidentificatie
statusstringHuidige taakstatus; zie taakstatus
waitNumberintegerAantal taken vóór deze taak in de wachtrij; 0 betekent dat de taak wordt verwerkt
percentageintegerVoltooiingspercentage van de taak (0–100)
inputobjectDe oorspronkelijke invoerparameters van de taak
input.imageUrlstringURL van de bronafbeelding, indien opgegeven
input.promptstringOorspronkelijke tekstinstructie, indien opgegeven
input.modelTypestringGebruikt modeltype
outputobjectGeneratieresultaat, alleen beschikbaar wanneer status gelijk is aan Success
output.resultUrlstringURL van het gegenereerde 3D-modelbestand
output.widthintegerUitvoerbreedte in pixels
output.heightintegerUitvoerhoogte in pixels

📊 Taakstatus#

StatusBeschrijving
UnprocessedDe taak is aangemaakt, maar nog niet gestart
ProcessingDe taak wordt momenteel verwerkt
SuccessDe taak is succesvol voltooid; uitvoer is beschikbaar
FailedDe taak is door een fout mislukt

Vraag de status elke 3-5 seconden op. Zie de taaklimiet voor de API.


❌ Foutantwoorden#

Alle foutantwoorden hebben dezelfde JSON-structuur:

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

Foutcodereferentie#

CodeNaamBeschrijvingAanbevolen actie
1001FAILEDVerzoek mislukt: algemene foutControleer het veld message voor specifieke foutdetails
1003INTERNAL_ERRORInterne serverfoutProbeer het na een korte wachttijd opnieuw; neem contact op met ondersteuning als de fout blijft optreden
1011PARAM_ERRORFout in verzoekparametersControleer dat alle verplichte parameters zijn opgegeven en correct zijn opgemaakt
5002API_KEY_INVALIDOngeldige of ontbrekende API KeyControleer dat de header APIKEY aanwezig is en de waarde klopt
9010SCAN_TEXT_ERRORTekstinstructie afgekeurd bij inhoudscontrolePas de instructie aan om gevoelige of verboden inhoud te verwijderen
9038PROHIBITED_CONTENTDe gegenereerde uitvoerafbeelding bevat verboden inhoudPas instructie, stijl of invoer aan en probeer opnieuw
9036COVERT_3D_FAILEDDeze afbeelding ondersteunt geen 3D-generatieProbeer een andere afbeelding met duidelijkere structuur en diepte
9051COINS_NOT_ENOUGHOnvoldoende munten / creditsVul je accountcredits aan en probeer opnieuw

Voorbeelden van foutantwoorden#

5002 — Ongeldige API Key
json
{
  "code": 5002,
  "message": "Invalid API Key",
  "data": null
}
1011 — Parameterfout
json
{
  "code": 1011,
  "message": "Request parameter error: imageUrl is required",
  "data": null
}
9036 — Afbeelding niet ondersteund voor 3D-generatie
json
{
  "code": 9036,
  "message": "This image does not support 3D generation",
  "data": null
}
9010 — Tekst afgekeurd bij inhoudscontrole
json
{
  "code": 9010,
  "message": "Text prompt failed content review, contains prohibited content",
  "data": null
}
9051 — Onvoldoende credits
json
{
  "code": 9051,
  "message": "Insufficient coins",
  "data": null
}

📄 Raadpleeg de foutcodereferentie voor de volledige lijst van algemene API-foutcodes.