Ideal House
تخطّي إلى المحتوى

توثيق API الصورة إلى فيديو#

URL الأساسي: https://api.ideal.house
الإصدار: v1
آخر تحديث: 2026-03-25


📖 نظرة عامة#

يتيح لك API الصورة إلى فيديو توليد فيديوهات تعمل بالذكاء الاصطناعي من صورة مصدر واحدة، أو من خلال تحديد كل من صورة الإطار الأول و الإطار الأخير للتحكم في بداية ونهاية الفيديو المُولّد. سير العمل غير متزامن ويتضمن خطوتين:

  1. إنشاء مهمة — قدّم صورتك أو صورك ونوع النموذج والمدة والدقة، ثم احصل على taskId.
  2. الاستفسار عن النتائج — استخدم taskId للاستعلام عن حالة المهمة واسترجاع الفيديو المُولّد.

🔐 المصادقة#

يجب مصادقة جميع طلبات API باستخدام مفتاح API.

تضمّن مفتاح API في رأس الطلب:

الرأسالقيمة
APIKEYyour_api_key_here

⚠️ احفظ مفتاح API بأمان. لا تعرضه في كود الواجهة الأمامية أو المستودعات العامة.


💰 خصم الرصيد#

[!WARNING] 🪙 تُخصم الأرصدة عند إنشاء المهمة بنجاح، بحسب modelType و**resolution** و**duration** المختارة، وما إذا كان generateAudio مفعّلًا. إذا فشلت المهمة في النهاية، تُعاد الأرصدة المخصومة إلى حسابك تلقائيًا.
سيعيد نقص الرصيد رمز الخطأ 9051. 📄 اطّلِع على مرجع خصم الرصيد.

نموذج Flash (modelType: "Flash"، افتراضي):

الدقةالمدةالأرصدة المخصومة
480p5s10 رصيد
480p10s20 رصيد
720p5s20 رصيد
720p10s40 رصيد
1080p5s40 رصيد
1080p10s80 رصيد

نموذج Base (modelType: "Base"، generateAudio: false):

الدقةالمدةالأرصدة المخصومة
480p5s8 رصيد
480p10s16 رصيد
720p5s16 رصيد
720p10s32 رصيد
1080p5s32 رصيد
1080p10s64 رصيد

نموذج Base مع صوت (modelType: "Base"، generateAudio: true):

الدقةالمدةالأرصدة المخصومة
480p5s16 رصيد
480p10s32 رصيد
720p5s32 رصيد
720p10s64 رصيد
1080p5s64 رصيد
1080p10s128 رصيد

📌 نقاط نهاية API#


1. إنشاء مهمة صورة إلى فيديو#

ينشئ مهمة توليد ذكاء اصطناعي جديدة لتحويل الصورة إلى فيديو ويعيد taskId فريد للاستفسار.

نقطة النهاية

نص عادي
POST /api/v1/imageToVideo/generate

رؤوس الطلب

الرأسمطلوبالوصف
APIKEY✅ نعممفتاح مصادقة API الخاص بك
Content-Type✅ نعمapplication/json

جسم الطلب

الحقلالنوعمطلوبالوصف
imageUrlstring✅ نعمURL الصورة المصدر. في وضع الإطار الأول/الأخير، يعمل هذا كـ الإطار الأول
durationinteger✅ نعممدة الفيديو بالثواني. التعداد: 5، 10
resolutionstring✅ نعمدقة إخراج الفيديو. التعداد: 480p، 720p، 1080p
modelTypestring❌ اختيارينوع النموذج المستخدم للتوليد. التعداد: Flash، Base. الافتراضي هو Flash
generateAudioboolean❌ اختياريما إذا كان سيتم توليد صوت خلفية للفيديو. ينطبق فقط عندما يكون modelType هو Base. الافتراضي هو false
promptstring❌ اختياريتوجيه نصي لتوجيه أسلوب وحركة توليد الفيديو
lastImageUrlstring❌ اختياريURL صورة الإطار الأخير. عند توفيرها، تفعّل وضع الإطار الأول/الأخير: سيتحول الفيديو من imageUrl (الإطار الأول) إلى lastImageUrl (الإطار الأخير)

💡 وضع الإطار الأول/الأخير: إذا تم توفير lastImageUrl، فإن API يولد فيديو يتحول بسلاسة من صورة الإطار الأول (imageUrl) إلى صورة الإطار الأخير (lastImageUrl)، مما يمنحك تحكمًا دقيقًا في بداية ونهاية الفيديو.

🖼️ متطلبات الصورة: يجب أن تستخدم صور الإطار الأول والإطار الأخير (اختياري) JPG/JPEG أو PNG أو WebP. يجب ألا يتجاوز حجم كل صورة 20 MB، وأن تكون الأبعاد من 128 × 128 بكسل إلى 6,000 × 6,000 بكسل (ضمنيًا). تتم تصغير الصور التي تتجاوز أبعاد البكسل القصوى تلقائيًا بشكل متناسب لتناسب حدود 6,000 × 6,000 بكسل قبل المعالجة. يجب أن تكون URLs الصور قابلة للوصول مباشرة من قبل خادم API.


أنواع النماذج

القيمةالوصف
Flashافتراضي. سرعة توليد أسرع مع إخراج عالي الجودة
Baseنموذج بديل — يدعم التوليد الصوتي بالذكاء الاصطناعي الاختياري (generateAudio)

خيارات المدة

القيمةالوصف
5فيديو مدته 5 ثانية
10فيديو مدته 10 ثانية

خيارات الدقة

القيمةالوصف
480pدقة قياسية — معالجة أسرع
720pدقة عالية — إخراج بجودة أعلى
1080pFull HD — أعلى جودة إخراج

📥 أمثلة الطلب#

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

📤 الاستجابة#

استجابة النجاح

json
{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
الحقلالنوعالوصف
codeintegerيشير 0 إلى النجاح
messagestringرسالة الاستجابة
datalongمعرف المهمة الفريد للاستعلام عن النتائج

2. استرداد نتيجة المهمة#

يسترجع الحالة الحالية وإخراج مهمة تحويل الصورة إلى فيديو تم إنشاؤها سابقًا.

نقطة النهاية

نص عادي
GET /api/v1/imageToVideo/result

رؤوس الطلب

الرأسمطلوبالوصف
APIKEY✅ نعممفتاح مصادقة API الخاص بك

معاملات الاستعلام

المعاملالنوعمطلوبالوصف
taskIdlong✅ نعممعرف المهمة الذي تمت إعادته من نقطة النهاية لإنشاء المهمة

📥 أمثلة الطلب#

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

📤 الاستجابة#

استجابة النجاح (اكتمال المهمة — الوضع القياسي)

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

استجابة النجاح (اكتمال المهمة — وضع الإطار الأول/الأخير)

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

استجابة (معالجة المهمة / في الطابور)

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

استجابة (فشل المهمة)

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

حقول الاستجابة

الحقلالنوعالوصف
idlongمعرّف المهمة الفريد
statusstringحالة المهمة الحالية (اطّلِع على حالة المهمة)
waitNumberintegerعدد المهام التي تسبق هذه المهمة في الطابور (يعني 0 المعالجة حاليًا)
percentageintegerنسبة اكتمال المهمة (0–100)
inputobjectمعاملات الإدخال الأصلية للمهمة
input.imageUrlstringURL صورة المصدر (الإطار الأول في الوضع الأول/الأخير)
input.lastImageUrlstringURL صورة الإطار الأخير (تظهر فقط في وضع الإطار الأول/الأخير)
input.durationintegerمدة الفيديو بالثواني (5 أو 10)
input.resolutionstringدقة الفيديو (480p، أو 720p، أو 1080p)
input.modelTypestringنوع النموذج المستخدم (Flash أو Base)
input.generateAudiobooleanما إذا كان توليد الصوت مفعلاً (لنموذج Base فقط)
input.promptstringالطلب النصي (إذا تم تقديمه)
outputobjectنتيجة التوليد (متاحة فقط عندما يكون status هو Success)
output.resultUrlstringURL ملف الفيديو المُولّد
output.coverstringURL غطاء الفيديو / صورة مصغرة
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خطأ معلمة الطلب — مثلًا، تكوين غير صالح لـ modelType، resolution، أو durationتحقق من تقديم جميع المعلمات المطلوبة وتنسيقها بشكل صحيح
5002API_KEY_INVALIDمفتاح API غير صالح أو مفقودتأكد من وجود رأس APIKEY وأن القيمة صحيحة
9010SCAN_TEXT_ERRORفشل مراجعة محتوى مطالبة النصعدّل المطالبة لإزالة أي محتوى حساس أو محظور
9038PROHIBITED_CONTENTتحتوي صورة الإخراج المُولَّدة على محتوى محظورعدّل التوجيه النصي/النمط/الإدخالات وأعد المحاولة
9051COINS_NOT_ENOUGHرصيد غير كافٍ / اعتماداتقم بتعبئة رصيد حسابك وحاول مرة أخرى

📄 للحصول على القائمة الكاملة لرموز خطأ API الشائعة، راجع مرجع رموز الخطأ.