Ideal House
Pular para o conteúdo

Documentação da API de geração de vídeo a partir de imagem#

URL Base: https://api.ideal.house
Versão: v1
Atualizado: 2026-03-25


📖 Visão Geral#

A API de geração de vídeo a partir de imagem permite gerar vídeos com IA a partir de uma única imagem de origem ou, especificando tanto uma imagem de primeiro quadro quanto de último quadro, controlar o início e o fim do vídeo gerado. O fluxo é assíncrono e envolve duas etapas:

  1. Criar uma tarefa — Envie sua(s) imagem(ns), tipo de modelo, duração e resolução, e receba um taskId.
  2. Consultar resultados — Use o taskId para consultar o status da tarefa e recuperar o vídeo gerado.

🔐 Autenticação#

Todas as solicitações da API devem ser autenticadas usando uma Chave API.

Inclua sua Chave API no cabeçalho da solicitação:

CabeçalhoValor
APIKEYyour_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] 🪙 Os créditos são deduzidos com base no modelType selecionado, resolution, duration e se generateAudio está habilitado no momento da criação bem-sucedida da tarefa. Se a tarefa eventualmente falhar, os créditos deduzidos serão automaticamente reembolsados na sua conta.
Créditos insuficientes retornam o código de erro 9051. 📄 Consulte Referência de Dedução de Créditos.

Modelo Flash (modelType: "Flash", padrão):

ResoluçãoDuraçãoCréditos Deduzidos
480p5s10 créditos
480p10s20 créditos
720p5s20 créditos
720p10s40 créditos
1080p5s40 créditos
1080p10s80 créditos

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

ResoluçãoDuraçãoCréditos Deduzidos
480p5s8 créditos
480p10s16 créditos
720p5s16 créditos
720p10s32 créditos
1080p5s32 créditos
1080p10s64 créditos

Modelo Base com áudio (modelType: "Base", generateAudio: true):

ResoluçãoDuraçãoCréditos Deduzidos
480p5s16 créditos
480p10s32 créditos
720p5s32 créditos
720p10s64 créditos
1080p5s64 créditos
1080p10s128 créditos

📌 Endpoints da API#


1. Criar Tarefa de Imagem para Vídeo#

Cria uma nova tarefa de geração de IA de imagem para vídeo e retorna um taskId único para consulta.

Endpoint

Texto simples
POST /api/v1/imageToVideo/generate

Cabeçalhos da Solicitação

CabeçalhoObrigatórioDescrição
APIKEY✅ SimSua chave de autenticação da API
Content-Type✅ Simapplication/json

Corpo da Solicitação

CampoTipoObrigatórioDescrição
imageUrlstring✅ SimURL da imagem de origem. No modo primeiro-último quadro, este campo funciona como o primeiro quadro
durationinteger✅ SimDuração do vídeo em segundos. Enum: 5, 10
resolutionstring✅ SimResolução de saída do vídeo. Enum: 480p, 720p, 1080p
modelTypestring❌ OpcionalTipo de modelo a ser usado na geração. Enum: Flash, Base. Padrão: Flash
generateAudioboolean❌ OpcionalDefine se deve gerar áudio de fundo para o vídeo. Apenas aplicável quando modelType é Base. Padrão: false
promptstring❌ OpcionalPrompt de texto para orientar o estilo e o movimento da geração de vídeo
lastImageUrlstring❌ OpcionalURL da imagem do último quadro. Quando fornecido, habilita o modo primeiro-último quadro: o vídeo fará a transição de imageUrl (primeiro quadro) para lastImageUrl (último quadro)

💡 Modo Primeiro-Último Quadro: Se lastImageUrl for fornecido, a API gera um vídeo que transiciona suavemente da imagem do primeiro quadro (imageUrl) para a imagem do último quadro (lastImageUrl), permitindo controle preciso do início e do final do vídeo.

🖼️ Requisitos de imagem: As imagens do primeiro quadro e do último quadro (opcional) devem estar nos formatos JPG/JPEG, PNG ou WebP. Cada imagem deve ter no máximo 20 MB, com dimensões de 128 × 128 px até 6,000 × 6,000 px (inclusivo). Imagens que excedam as dimensões máximas em pixels serão redimensionadas proporcionalmente para caber dentro de 6,000 × 6,000 px antes do processamento. Os URLs das imagens devem ser diretamente acessíveis pelo servidor da API.


Tipos de Modelo

ValorDescrição
FlashPadrão. Velocidade de geração mais rápida com saída de alta qualidade
BaseModelo alternativo — suporta geração opcional de áudio por IA (generateAudio)

Opções de Duração

ValorDescrição
5Vídeo de 5 segundos
10Vídeo de 10 segundos

Opções de Resolução

ValorDescrição
480pDefinição padrão — processamento mais rápido
720pAlta definição — saída de maior qualidade
1080pFull HD — saída de máxima qualidade

📥 Exemplos de Solicitação#

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

📤 Resposta#

Resposta de Sucesso

json
{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
CampoTipoDescrição
codeinteger0 indica sucesso
messagestringMensagem da resposta
datalongO 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 imagem para vídeo criada anteriormente.

Endpoint

Texto simples
GET /api/v1/imageToVideo/result

Cabeçalhos da Solicitação

CabeçalhoObrigatórioDescrição
APIKEY✅ SimSua chave de autenticação da API

Parâmetros de Query

ParâmetroTipoObrigatórioDescrição
taskIdlong✅ SimO ID da tarefa retornado pelo endpoint de criação de tarefa

📥 Exemplos de Solicitação#

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

📤 Resposta#

Resposta de Sucesso (Tarefa Concluída — Modo Padrão)

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

Resposta de Sucesso (Tarefa Concluída — Modo Primeiro-Último Quadro)

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

Resposta (Tarefa em Processamento / Em Fila)

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

Resposta (Tarefa Falhou)

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

Campos da Resposta

CampoTipoDescrição
idlongIdentificador único da tarefa
statusstringStatus atual da tarefa (consulte Status da Tarefa)
waitNumberintegerNúmero de tarefas à frente na fila (0 significa que está sendo processada no momento)
percentageintegerPercentual de conclusão da tarefa (0–100)
inputobjectOs parâmetros de entrada originais da tarefa
input.imageUrlstringURL da imagem de origem (primeiro quadro no modo primeiro-último)
input.lastImageUrlstringURL da imagem do último quadro (presente apenas no modo primeiro-último quadro)
input.durationintegerDuração do vídeo em segundos (5 ou 10)
input.resolutionstringResolução do vídeo (480p, 720p ou 1080p)
input.modelTypestringTipo de modelo utilizado (Flash ou Base)
input.generateAudiobooleanDefine se a geração de áudio foi habilitada (somente modelo Base)
input.promptstringPrompt de texto (se fornecido)
outputobjectResultado da geração (disponível apenas quando status é Success)
output.resultUrlstringURL para o arquivo de vídeo gerado
output.coverstringURL para a capa/imagem de thumbnail do vídeo
output.widthintegerLargura do vídeo em pixels
output.heightintegerAltura do vídeo em pixels

📊 Status da Tarefa#

StatusDescrição
UnprocessedA tarefa foi criada, mas ainda não iniciou
ProcessingA tarefa está sendo processada no momento
SuccessTarefa concluída com sucesso — a saída em vídeo está disponível
FailedA 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:

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

Referência de Códigos de Erro#

CódigoNomeDescriçãoAção Sugerida
1001FAILEDFalha na solicitação (erro genérico)Verifique o campo message para detalhes específicos do erro
1003INTERNAL_ERRORErro interno do servidorTente novamente após um breve atraso; entre em contato com o suporte se persistir
1011PARAM_ERRORErro nos parâmetros da solicitação — por exemplo, combinação inválida de modelType, resolution ou durationVerifique se todos os parâmetros obrigatórios foram fornecidos e estão formatados corretamente
5002API_KEY_INVALIDChave API inválida ou ausenteCertifique-se de que o cabeçalho APIKEY está presente e que o valor está correto
9010SCAN_TEXT_ERRORO prompt de texto falhou na revisão de conteúdoModifique o prompt para remover qualquer conteúdo sensível ou proibido
9038PROHIBITED_CONTENTA imagem de saída gerada contém conteúdo proibidoAjuste o prompt/estilo/inputs e tente novamente
9051COINS_NOT_ENOUGHMoedas/créditos insuficientesAdicione 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.