Ideal House
Przejdź do treści

Dokumentacja API generowania filmów z obrazów#

Podstawowy URL: https://api.ideal.house
Wersja: v1
Zaktualizowano: 2026-03-25


📖 Przegląd#

API generowania filmów z obrazów pozwala generować filmy oparte na AI z pojedynczego obrazu źródłowego lub przez podanie zarówno obrazu pierwszej klatki, jak i obrazu ostatniej klatki, aby kontrolować początek i koniec generowanego filmu. Przepływ pracy jest asynchroniczny i obejmuje dwa kroki:

  1. Utwórz zadanie — Wyślij swój obraz(y), typ modelu, czas trwania i rozdzielczość, a następnie otrzymasz taskId.
  2. Cyklicznie sprawdzaj wyniki — Użyj taskId, aby zapytać o status zadania i pobrać wygenerowany film.

🔐 Uwierzytelnianie#

Wszystkie żądania API muszą być uwierzytelniane za pomocą klucza API Key.

Włącz swój klucz API Key w nagłówku żądania:

NagłówekWartość
APIKEYyour_api_key_here

⚠️ Zachowaj swój klucz API Key w tajemnicy. Nie ujawniaj go w kodzie po stronie klienta ani w publicznych repozytoriach.


💰 Odejmowanie kredytów#

[!WARNING] 🪙 Kredyty są pobierane w oparciu o wybrany modelType, resolution, duration oraz o to, czy generateAudio jest włączone przy pomyślnym utworzeniu zadania. Jeśli zadanie ostatecznie zawiedzie, pobrane kredyty zostaną automatycznie zwrócone na Twoje konto.
Niewystarczające kredyty spowodują zwrócenie kodu błędu 9051. 📄 Zobacz Referencja odejmowania kredytów.

Model Flash (modelType: "Flash", domyślny):

RozdzielczośćCzas trwaniaPobrane kredyty
480p5s10 kredytów
480p10s20 kredytów
720p5s20 kredytów
720p10s40 kredytów
1080p5s40 kredytów
1080p10s80 kredytów

Model Base (modelType: "Base", generateAudio: false):

RozdzielczośćCzas trwaniaPobrane kredyty
480p5s8 kredytów
480p10s16 kredytów
720p5s16 kredytów
720p10s32 kredytów
1080p5s32 kredytów
1080p10s64 kredytów

Model Base z dźwiękiem (modelType: "Base", generateAudio: true):

RozdzielczośćCzas trwaniaPobrane kredyty
480p5s16 kredytów
480p10s32 kredytów
720p5s32 kredytów
720p10s64 kredytów
1080p5s64 kredytów
1080p10s128 kredytów

📌 Endpoints API#


1. Utwórz zadanie generowania filmu z obrazu#

Tworzy nowe zadanie generowania obrazu do wideo oparte na AI i zwraca unikalny taskId do cyklicznego sprawdzania.

Endpoint

Zwykły tekst
POST /api/v1/imageToVideo/generate

Nagłówki żądania

NagłówekWymaganyOpis
APIKEY✅ TakTwój klucz uwierzytelniający API
Content-Type✅ Takapplication/json

Ciało żądania

PoleTypWymaganeOpis
imageUrlstring✅ TakURL obrazu źródłowego. W trybie pierwszej i ostatniej klatki służy jako pierwsza klatka
durationinteger✅ TakCzas trwania wideo w sekundach. Wyliczenie: 5, 10
resolutionstring✅ TakRozdzielczość wyjściowa wideo. Wyliczenie: 480p, 720p, 1080p
modelTypestring❌ OpcjonalnieTyp modelu do użycia w generowaniu. Wyliczenie: Flash, Base. Domyślnie Flash
generateAudioboolean❌ OpcjonalnieCzy generować dźwięk tła dla wideo. Dotyczy tylko, gdy modelType to Base. Domyślnie false
promptstring❌ OpcjonalnieTekst podpowiedzi kierujący stylem i ruchem generowania wideo
lastImageUrlstring❌ OpcjonalnieURL obrazu ostatniej klatki. Jeśli zostanie podany, włącza tryb pierwszej i ostatniej klatki: wideo będzie przechodzić od imageUrl (pierwsza klatka) do lastImageUrl (ostatnia klatka)

💡 Tryb pierwszej i ostatniej klatki: Jeśli podano lastImageUrl, API generuje wideo, które płynnie przechodzi od obrazu pierwszej klatki (imageUrl) do obrazu ostatniej klatki (lastImageUrl), dając Ci precyzyjną kontrolę nad początkiem i końcem wideo.

🖼️ Wymagania dotyczące obrazów: Obrazy pierwszej klatki i opcjonalnej ostatniej klatki muszą być w formacie JPG/JPEG, PNG lub WebP. Każdy obraz nie może być większy niż 20 MB, a jego wymiary muszą mieścić się w przedziale od 128 × 128 px do 6,000 × 6,000 px (włącznie). Obrazy przekraczające maksymalne wymiary pikseli są automatycznie skalowane proporcjonalnie, aby zmieściły się w 6,000 × 6,000 px przed przetwarzaniem. Adresy URL obrazów muszą być bezpośrednio dostępne dla serwera API.


Typy modeli

WartośćOpis
FlashDomyślny. Szybsza prędkość generowania przy wysokiej jakości wyjścia
BaseAlternatywny model — obsługuje opcjonalne generowanie dźwięku AI (generateAudio)

Opcje czasu trwania

WartośćOpis
5Wideo 5-sekundowe
10Wideo 10-sekundowe

Opcje rozdzielczości

WartośćOpis
480pStandardowa definicja — szybsze przetwarzanie
720pWysoka definicja — wyższa jakość wyjścia
1080pPełny HD — najwyższa jakość wyjścia

📥 Przykłady żądań#

cURL
bash
# Flash model (default) — single source image
curl -X POST "https://api.ideal.house/api/v1/imageToVideo/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "duration": 5,
    "resolution": "720p",
    "modelType": "Flash",
    "prompt": "Gentle camera zoom in with soft lighting"
  }'

# Base model with audio — single source image
curl -X POST "https://api.ideal.house/api/v1/imageToVideo/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "duration": 5,
    "resolution": "1080p",
    "modelType": "Base",
    "generateAudio": true,
    "prompt": "Peaceful living room ambiance"
  }'

# First-last frame mode — specify both first and last frame
curl -X POST "https://api.ideal.house/api/v1/imageToVideo/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room-day.jpg",
    "lastImageUrl": "https://example.com/room-night.jpg",
    "duration": 10,
    "resolution": "720p",
    "modelType": "Flash",
    "prompt": "Smooth day to night transition"
  }'
Java (OkHttp)
java
import okhttp3.*;
import java.io.IOException;

public class ImageToVideoApiExample {

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

        // Flash model — standard mode
        String requestBody = """
            {
                "imageUrl": "https://example.com/room.jpg",
                "duration": 5,
                "resolution": "720p",
                "modelType": "Flash",
                "prompt": "Gentle camera zoom in with soft lighting"
            }
            """;

        // Base model with audio
        // String requestBody = """
        //     {
        //         "imageUrl": "https://example.com/room.jpg",
        //         "duration": 5,
        //         "resolution": "1080p",
        //         "modelType": "Base",
        //         "generateAudio": true,
        //         "prompt": "Peaceful living room ambiance"
        //     }
        //     """;

        // First-last frame mode
        // String requestBody = """
        //     {
        //         "imageUrl": "https://example.com/room-day.jpg",
        //         "lastImageUrl": "https://example.com/room-night.jpg",
        //         "duration": 10,
        //         "resolution": "720p",
        //         "modelType": "Flash",
        //         "prompt": "Smooth day to night transition"
        //     }
        //     """;

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

# Flash model — single source image
payload = {
    "imageUrl": "https://example.com/room.jpg",
    "duration": 5,
    "resolution": "720p",
    "modelType": "Flash",
    "prompt": "Gentle camera zoom in with soft lighting"
}

# Base model with audio
# payload = {
#     "imageUrl": "https://example.com/room.jpg",
#     "duration": 5,
#     "resolution": "1080p",
#     "modelType": "Base",
#     "generateAudio": True,
#     "prompt": "Peaceful living room ambiance"
# }

# First-last frame mode
# payload = {
#     "imageUrl": "https://example.com/room-day.jpg",
#     "lastImageUrl": "https://example.com/room-night.jpg",
#     "duration": 10,
#     "resolution": "720p",
#     "modelType": "Flash",
#     "prompt": "Smooth day to night transition"
# }

response = requests.post(
    f"{BASE_URL}/api/v1/imageToVideo/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 createVideoTask() {
  try {
    // Flash model — standard mode
    const payload = {
      imageUrl: 'https://example.com/room.jpg',
      duration: 5,
      resolution: '720p',
      modelType: 'Flash',
      prompt: 'Gentle camera zoom in with soft lighting'
    };

    // Base model with audio:
    // const payload = {
    //   imageUrl: 'https://example.com/room.jpg',
    //   duration: 5,
    //   resolution: '1080p',
    //   modelType: 'Base',
    //   generateAudio: true,
    //   prompt: 'Peaceful living room ambiance'
    // };

    // First-last frame mode:
    // const payload = {
    //   imageUrl: 'https://example.com/room-day.jpg',
    //   lastImageUrl: 'https://example.com/room-night.jpg',
    //   duration: 10,
    //   resolution: '720p',
    //   modelType: 'Flash',
    //   prompt: 'Smooth day to night transition'
    // };

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

createVideoTask();

📤 Odpowiedź#

Odpowiedź sukcesu

json
{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
PoleTypOpis
codeinteger0 oznacza sukces
messagestringKomunikat odpowiedzi
datalongUnikalny identyfikator zadania do sprawdzania wyników

2. Pobierz wynik zadania#

Pobiera bieżący status i wynik wcześniej utworzonego zadania generowania filmu z obrazu.

Endpoint

Zwykły tekst
GET /api/v1/imageToVideo/result

Nagłówki żądania

NagłówekWymaganyOpis
APIKEY✅ TakTwój klucz uwierzytelniający API

Parametry zapytania

ParametrTypWymaganyOpis
taskIdlong✅ TakIdentyfikator zadania zwrócony z endpointu tworzenia zadania

📥 Przykłady żądań#

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

public class ImageToVideoResultExample {

    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/imageToVideo/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/imageToVideo/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(5)  # Poll every 5 seconds (video generation takes longer)

if status == "Success":
    output = result["output"]
    print("Video URL:", output["resultUrl"])
    print("Cover Image:", output["cover"])
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/imageToVideo/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('Video URL:', result.output.resultUrl);
        console.log('Cover Image:', result.output.cover);
        console.log('Resolution:', result.output.width, 'x', result.output.height);
      } else {
        console.log('Task failed');
      }
      break;
    }

    // Wait 5 seconds before next poll (video tasks take longer)
    await new Promise(resolve => setTimeout(resolve, 5000));
  }
}

pollResult(1234567890123456789n);

📤 Odpowiedź#

Odpowiedź sukcesu (Zadanie zakończone — Tryb standardowy)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Success",
    "waitNumber": 0,
    "percentage": 100,
    "input": {
      "imageUrl": "https://example.com/room.jpg",
      "duration": 5,
      "resolution": "720p",
      "modelType": "Flash",
      "prompt": "Gentle camera zoom in with soft lighting"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/video_result.mp4",
      "cover": "https://cdn.ideal.house/output/video_cover.jpg",
      "width": 1280,
      "height": 720
    }
  }
}

Odpowiedź sukcesu (Zadanie zakończone — Tryb pierwszej i ostatniej klatki)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Success",
    "waitNumber": 0,
    "percentage": 100,
    "input": {
      "imageUrl": "https://example.com/room-day.jpg",
      "lastImageUrl": "https://example.com/room-night.jpg",
      "duration": 10,
      "resolution": "720p",
      "modelType": "Flash",
      "prompt": "Smooth day to night transition"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/video_result.mp4",
      "cover": "https://cdn.ideal.house/output/video_cover.jpg",
      "width": 1280,
      "height": 720
    }
  }
}

Odpowiedź (Zadanie w trakcie przetwarzania / W kolejce)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Processing",
    "waitNumber": 2,
    "percentage": 30,
    "input": {
      "imageUrl": "https://example.com/room.jpg",
      "duration": 5,
      "resolution": "720p",
      "modelType": "Flash"
    },
    "output": null
  }
}

Odpowiedź (Zadanie nie powiodło się)

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

Pola odpowiedzi

PoleTypOpis
idlongUnikalny identyfikator zadania
statusstringBieżący status zadania (zobacz Status zadania)
waitNumberintegerLiczba zadań przed Tobą w kolejce (0 oznacza, że zadanie jest obecnie przetwarzane)
percentageintegerProcent ukończenia zadania (0–100)
inputobjectOryginalne parametry wejściowe zadania
input.imageUrlstringURL obrazu źródłowego (pierwsza klatka w trybie pierwszej i ostatniej)
input.lastImageUrlstringURL obrazu ostatniej klatki (pojawia się tylko w trybie pierwszej i ostatniej klatki)
input.durationintegerCzas trwania wideo w sekundach (5 lub 10)
input.resolutionstringRozdzielczość wideo (480p, 720p lub 1080p)
input.modelTypestringUżyty typ modelu (Flash lub Base)
input.generateAudiobooleanCzy generowanie dźwięku było włączone (tylko model Base)
input.promptstringTekst podpowiedzi (jeśli podany)
outputobjectWynik generacji (dostępny tylko, gdy status wynosi Success)
output.resultUrlstringURL do wygenerowanego pliku wideo
output.coverstringURL do okładki / miniatury wideo
output.widthintegerSzerokość wideo w pikselach
output.heightintegerWysokość wideo w pikselach

📊 Status zadania#

StatusOpis
UnprocessedZadanie zostało utworzone, ale nie zostało jeszcze rozpoczęte
ProcessingZadanie jest obecnie przetwarzane
SuccessZadanie zakończyło się pomyślnie — wynik wideo jest dostępny
FailedZadanie nie powiodło się z powodu błędu

Wykonuj cykliczne sprawdzanie stanu co 3-5 sekund. Zobacz Limit zadań API.


❌ Odpowiedzi błędów#

Wszystkie odpowiedzi błędów mają tę samą strukturę JSON:

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

Referencja kodów błędów#

KodNazwaOpisSugerowane działanie
1001FAILEDŻądanie nie powiodło się (błąd ogólny)Sprawdź pole message, aby uzyskać szczegółowe informacje o błędzie
1003INTERNAL_ERRORWewnętrzny błąd serweraPonów próbę po krótkim opóźnieniu; skontaktuj się z pomocą techniczną, jeśli problem utrzymuje się
1011PARAM_ERRORBłąd parametru żądania — e.g. nieprawidłowa kombinacja modelType, resolution lub durationZweryfikuj, czy wszystkie wymagane parametry zostały podane i poprawnie sformatowane
5002API_KEY_INVALIDNieprawidłowy lub brakujący klucz APIUpewnij się, że nagłówek APIKEY jest obecny i ma poprawną wartość
9010SCAN_TEXT_ERRORWskazówka tekstowa nie przeszła weryfikacji treściZmodyfikuj wskazówkę, aby usunąć wszelkie treści wrażliwe lub zakazane
9038PROHIBITED_CONTENTWygenerowany obraz wyjściowy zawiera treści zakazaneDostosuj wskazówkę/styl/wejścia i ponów próbę
9051COINS_NOT_ENOUGHniewystarczające monety / kredytyDoładuj kredyty na swoim koncie i ponów

📄 Pełną listę wspólnych kodów błędów API znajdziesz w Referencji kodów błędów.