Ideal House
Перейти к содержанию

Документация API генерации 3D с помощью ИИ#

Базовый URL: https://api.ideal.house
Версия: v1
Обновлено: 2026-03-06


📖 Обзор#

API генерации 3D с помощью ИИ позволяет создавать 3D-модели на основе изображения или текстового запроса и асинхронно получать результаты. Процесс состоит из двух шагов:

  1. Создание задачи — Передайте входные данные: URL изображения или текстовый запрос — и получите taskId.
  2. Опрос результатов — Используйте taskId для запроса статуса задачи и получения сгенерированного результата.

🔐 Аутентификация#

Все запросы API должны проходить аутентификацию с помощью ключа API.

Укажите ваш ключ API в заголовке запроса:

ЗаголовокЗначение
APIKEYyour_api_key_here

⚠️ Держите ваш ключ API в тайне. Не публикуйте его в клиентском коде или публичных репозиториях.


⚡ Ограничение параллельной обработки#

🚦 Важно: Этот API допускает только 1 одновременно обрабатываемый запрос на аккаунт.
Если несколько запросов отправляются одновременно, последующие запросы будут помещены в очередь и обработаны по порядку.
Вы можете отслеживать свое место в очереди через поле waitNumber в ответе о результате задачи.


💰 Списание кредитов#

[!WARNING] 🪙 За каждую задачу списывается 20 кредитов с вашего аккаунта при её успешном создании.
Кредиты списываются при создании задачи. Если задача в итоге завершится ошибкой, списанные кредиты будут автоматически возвращены на ваш аккаунт.
При недостатке кредитов возвращается код ошибки 9051. 📄 См. Справочник по списанию кредитов.


📌 Конечные точки API#


1. Создание задачи генерации 3D#

Создаёт новую задачу генерации 3D с помощью ИИ и возвращает уникальный taskId для опроса результатов.

Конечная точка

Обычный текст
POST /api/v1/ai3d/generate

Заголовки запроса

ЗаголовокОбязательныйОписание
APIKEY✅ ДаВаш ключ аутентификации API
Content-Type✅ Даapplication/json

Тело запроса

ПолеТипОбязательныйОписание
imageUrlstring⚠️ Требуется либо imageUrl, либо promptURL исходного изображения для генерации 3D
promptstring⚠️ Требуется либо imageUrl, либо promptТекстовый промпт, описывающий содержимое 3D для генерации

💡 Примечание: imageUrl и prompt взаимоисключающие — предоставьте один из них на каждый запрос.

🖼️ Требования к изображениям: Используйте JPG/JPEG, PNG или WebP. Размер файла не должен превышать 20 МБ, а размеры изображения должны находиться в пределах от 128 × 128 пикс. до 5,000 × 5,000 пикс. (включительно). Изображение по указанному URL должно быть напрямую доступно серверу API.


📥 Примеры запросов#

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

📤 Ответ#

Успешный ответ

json
{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
ПолеТипОписание
codeinteger0 указывает на успех
messagestringСообщение в ответе
datalongУникальный идентификатор задачи для опроса результатов

2. Получение результата задачи#

Получает текущий статус и результат ранее созданной задачи.

Конечная точка

Обычный текст
GET /api/v1/ai3d/result

Заголовки запроса

ЗаголовокОбязательныйОписание
APIKEY✅ ДаВаш ключ аутентификации API

Параметры запроса

ПараметрТипОбязательныйОписание
taskIdlong✅ ДаИдентификатор задачи, возвращенный из конечной точки создания задачи

📥 Примеры запросов#

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

📤 Ответ#

Успешный ответ (задача завершена)

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

Ответ (обработка задачи / в очереди)

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

Ответ (задача завершилась ошибкой)

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

Поля ответа

ПолеТипОписание
idlongУникальный идентификатор задачи
statusstringТекущий статус задачи (см. Статус задачи)
waitNumberintegerКоличество задач впереди в очереди (0 означает текущую обработку)
percentageintegerПроцент завершения задачи (0–100)
inputobjectИсходные входные параметры задачи
input.imageUrlstringURL исходного изображения (если предоставлено)
input.promptstringИсходный текстовый промпт (если предоставлен)
input.modelTypestringИспользованный тип модели
outputobjectРезультат генерации (доступен только когда status равно Success)
output.resultUrlstringURL на сгенерированный файл модели 3D
output.widthintegerШирина результата в пикселях
output.heightintegerВысота результата в пикселях

📊 Статус задачи#

СтатусОписание
UnprocessedЗадача создана, но еще не начата
ProcessingЗадача в настоящее время обрабатывается
SuccessЗадача успешно завершена — результат доступен
FailedЗадача не выполнена из-за ошибки

Опрашивайте каждые 3-5 секунд. См. Лимит задач API.


❌ Ответы об ошибках#

Все ответы об ошибках имеют одинаковую структуру JSON:

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

Справочник кодов ошибок#

КодНазваниеОписаниеРекомендуемое действие
1001FAILEDЗапрос не выполнен (общая ошибка)Проверьте поле message для получения конкретных деталей ошибки
1003INTERNAL_ERRORВнутренняя ошибка сервераПовторите попытку после короткой задержки; обратитесь в поддержку, если проблема сохраняется
1011PARAM_ERRORОшибка параметра запросаУбедитесь, что все обязательные параметры предоставлены и правильно отформатированы
5002API_KEY_INVALIDНедействительный или отсутствующий ключ APIУбедитесь, что заголовок APIKEY присутствует и значение корректно
9010SCAN_TEXT_ERRORТекстовый запрос не прошёл проверку контентаУдалите из запроса чувствительный или запрещённый контент
9038PROHIBITED_CONTENTСгенерированное выходное изображение содержит запрещенный контентОтрегулируйте промпт/стиль/входные данные и повторите попытку
9036COVERT_3D_FAILEDЭто изображение не поддерживает генерацию 3DПопробуйте другое изображение с более четкой структурой и глубиной
9051COINS_NOT_ENOUGHНедостаточно монет / кредитовПополните кредиты на аккаунте и повторите попытку

Примеры ответов об ошибках#

5002 — Недействительный ключ API
json
{
  "code": 5002,
  "message": "Invalid API Key",
  "data": null
}
1011 — Ошибка параметров
json
{
  "code": 1011,
  "message": "Request parameter error: imageUrl is required",
  "data": null
}
9036 — Изображение не поддерживает генерацию 3D
json
{
  "code": 9036,
  "message": "This image does not support 3D generation",
  "data": null
}
9010 — Не пройдена модерация текстового содержимого
json
{
  "code": 9010,
  "message": "Text prompt failed content review, contains prohibited content",
  "data": null
}
9051 — Недостаточно кредитов
json
{
  "code": 9051,
  "message": "Insufficient coins",
  "data": null
}

📄 Для полного списка общих кодов ошибок API см. Справочник кодов ошибок.