واجهة برمجة تطبيقات Seedance

أدمج ميزة إنشاء الفيديو في منتجك باستخدام Seedance 2.5 أو Seedance 2.0، مع مهام غير متزامنة، وخطافات ويب، ونظام فوترة يراعي الرصيد.

رابط المورد الأساسي (Base URL)
https://api.seevio.ai
في هذه الصفحة

مقدمة

تتيح لك واجهة برمجة التطبيقات إرسال مهام إنشاء الفيديو لـ Seedance 2.5 و Seedance 2.0 برمجياً. يعد Seedance 2.5 النموذج الموصى به، وهو يدعم تحويل النص إلى فيديو، وتحويل الصورة إلى فيديو (سواء صورة الإطار الأول أو الإطار الأول والأخير)، ومراجع الفيديو متعددة الوسائط. تتم عملية الإنشاء بشكل غير متزامن: حيث تنشئ مهمة وتتلقى معرف المهمة فوراً، ثم تحصل على الفيديو النهائي من خلال الاستعلام الدوري عن نقطة نهاية المهمة أو عبر خطاف ويب.

مهام غير متزامنة

يعمل الاستعلام الدوري بشكل ممتاز لأغراض التطوير وعمليات الربط البسيطة.

جاهز لخطاف الويب

يُوصى باستخدام خطافات الويب في بيئات التشغيل الفعلي لتجنب الاستعلام الدوري المتكرر وإشعار خدمتك فور وصول المهمة إلى حالتها النهائية.

مراعاة الرصيد

يتم حجز الرصيد عند إرسال الطلب. وتُخصم التكلفة من الرصيد المحجوز للمهام الناجحة، بينما تُسترد تلقائياً للمهام الفاشلة أو التي انتهت مهلتها.

المصادقة

أنشئ مفتاح واجهة برمجة التطبيقات من لوحة التحكم وأرسله كرمز حامل (Bearer token) في ترويسة كل طلب. يظهر المفتاح كاملاً مرة واحدة فقط عند إنشائه.

Authorization: Bearer sk_live_xxxxxxxx
sk_live_

استخدم المفاتيح التي تبدأ بـ sk_live_ لطلبات التشغيل الفعلي.

sk_test_

استخدم المفاتيح التي تبدأ بـ sk_test_ لاختبار الربط في بيئة التجربة المعزولة (Sandbox) بنفس واجهة الربط.

401

المفاتيح المفقودة أو غير الصالحة أو الملغاة ترجع الخطأ invalid_api_key مع رمز حالة HTTP 401.

البدء السريع

أرسل المهمة أولاً. بعد قبول المهمة، اختر طريقة واحدة لتلقي النتيجة: إما الاستعلام الدوري عن نقطة نهاية حالة المهمة، أو تلقي النتيجة النهائية عبر خطاف ويب.

إرسال المهمة

أنشئ مهمة فيديو غير متزامنة واحصل على معرف المهمة فوراً.

curl https://api.seevio.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-5",
    "callback_url": "https://your-domain.com/api/seedance/webhook",
    "input": {
      "prompt": "a cat surfing on a neon wave, cinematic lighting",
      "generation_type": "text-to-video",
      "duration": 5,
      "aspect_ratio": "16:9",
      "resolution": "720p",
      "generate_audio": true,
      "watermark": false,
      "web_search": false,
      "return_last_frame": false
    }
  }'
خيار النتيجة: الاستعلام الدوري

استعلم عن نقطة نهاية حالة المهمة عندما يفضل نظامك الاستعلام المباشر الواضح.

curl https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
  -H "Authorization: Bearer sk_live_xxx"
خيار النتيجة: خطاف الويب

مرر callback_url عند إرسال المهمة، لتتلقى إشعارات النجاح أو الفشل وتحديث سجلات المهمة في نظامك.

export async function POST(request: Request) {
  const callbackData = await request.json();

  if (callbackData.status === "completed") {
    const videoUrl = callbackData.data.results[0];
    // Save the video URL or update your own task record here.
  }

  if (callbackData.status === "failed") {
    const errorMessage = callbackData.data.failed_reason;
    // Mark your own task record as failed here.
  }

  return new Response(null, { status: 200 });
}

إنشاء مهمة فيديو

أنشئ مهمة فيديو باستخدام الطلب POST /v1/videos/generations. يحتوي نص الطلب على حقل النموذج في المستوى الأعلى، وحقل callback_url اختياري، وكائن مدخلات (input) يحتوي على الوصف النصي وإعدادات الإنشاء.

POST
/v1/videos/generations
curl https://api.seevio.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-5",
    "callback_url": "https://your-domain.com/api/seedance/webhook",
    "input": {
      "prompt": "a cat surfing on a neon wave, cinematic lighting",
      "generation_type": "text-to-video",
      "duration": 5,
      "aspect_ratio": "16:9",
      "resolution": "720p",
      "generate_audio": true,
      "watermark": false,
      "web_search": false,
      "return_last_frame": false
    }
  }'

أنماط الإنشاء

يتحكم حقل generation_type في وسائط الإدخال المقبولة وكيفية تفسير النموذج لها.

قدرات Seedance 2.5
seedance-2-5

اضبط النموذج على seedance-2-5 لإنشاء فيديو بدقة 480p أو 720p وبمدة تتراوح من 4 إلى 30 ثانية.

  • تحويل النص إلى فيديو بأبعاد متجاوبة، أو أبعاد 16:9، 9:16، 1:1، 4:3، 3:4، أو 21:9
  • تحويل الصورة إلى فيديو باستخدام صورة واحدة للإطار الأول، أو صورتين للإطارين الأول والأخير، ويجب أن تكون الأبعاد متجاوبة
  • تحويل المراجع إلى فيديو مع دعم ما يصل إلى 30 صورة، و10 مقاطع فيديو، و10 ملفات صوتية، بحد أقصى 50 مادة إجمالاً
  • يجب أن تكون مدة كل مرجع فيديو أو صوت بين 2 و30 ثانية؛ ويجب ألا تتجاوز المدة الإجمالية للفيديوهات أو الصوتيات المدمجة 30 ثانية لكل منهما
  • يدعم الإدخال المرجعي للملفات الصوتية فقط وخيار return_last_frame؛ ولا يدعم حقل seed (القيمة العشوائية)
النمطالوسائط المطلوبةالوسائط الاختياريةملاحظات
text-to-videoprompt (الوصف النصي)duration, aspect_ratio, resolution, seedوصف نصي فقط. لا حاجة لحقول image_urls أو video_urls أو audio_urls.
image-to-videoprompt + مصفوفة image_urls (رابط إلى رابطين للصور)duration, aspect_ratio, resolution, seedيجب أن يكون حقل image_urls مصفوفة. قدم رابط صورة واحداً للإطار الأول، أو رابطين للإطارين الأول والأخير. يتم تجاهل الفيديو والصوت.
reference-to-videoprompt + مرجع واحد على الأقل (صورة أو فيديو أو صوت)صور وفيديوهات وصوتيات ضمن حدود المواد المرجعيةيدعم Seedance 2.5 المراجع الصوتية فقط. بالنسبة لـ Seedance 2.0، يرجى إضافة صورة أو فيديو واحد على الأقل عند تزويد ملف صوتي.
text-to-video

استخدم نمط تحويل النص إلى فيديو عندما يكون الوصف النصي هو المدخل الإبداعي الوحيد.

curl https://api.seevio.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-5",
    "callback_url": "https://your-domain.com/api/seedance/webhook",
    "input": {
      "prompt": "a cinematic drone shot over a futuristic coastal city at sunrise",
      "generation_type": "text-to-video",
      "duration": 5,
      "aspect_ratio": "16:9",
      "resolution": "720p",
      "generate_audio": true,
      "watermark": false,
      "web_search": false,
      "return_last_frame": false
    }
  }'
image-to-video

استخدم نمط تحويل الصورة إلى فيديو عندما تحتوي مصفوفة input.image_urls على رابط أو رابطين للصور: يحدد الرابط الأول الإطار الأول، والرابط الثاني يحدد الإطار الأخير. يتم تجاهل مراجع الفيديو والصوت في هذا النمط.

curl https://api.seevio.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-5",
    "input": {
      "prompt": "the subject turns toward camera, soft studio motion",
      "generation_type": "image-to-video",
      "image_urls": ["https://your.cdn.com/first-frame.jpg"],
      "duration": 5,
      "resolution": "720p"
    }
  }'
reference-to-video

استخدم نمط تحويل المراجع إلى فيديو لتوجيه فني غني باستخدام صور أو فيديوهات أو صوتيات مرجعية. يقبل Seedance 2.5 الصوت كنوع مرجعي وحيد؛ بينما يتطلب Seedance 2.0 صورة أو فيديو واحداً على الأقل عند إرفاق ملف صوتي.

حدود المواد المرجعية

  • إصدار Seedance 2.5: ما يصل إلى 30 صورة مرجعية
  • إصدار Seedance 2.5: ما يصل إلى 10 فيديوهات مرجعية، مدة كل منها 2-30 ثانية والمدة الإجمالية <= 30 ثانية
  • إصدار Seedance 2.5: ما يصل إلى 10 ملفات صوت مرجعية، مدة كل منها 2-30 ثانية والمدة الإجمالية <= 30 ثانية
  • إصدار Seedance 2.5: حد أقصى 50 مادة إجمالاً عبر جميع الأنواع
  • تحتفظ إصدارات Seedance 2.0 بحدودها الحالية: 9 صور، و3 فيديوهات، و3 ملفات صوتية، بحد أقصى 15 ثانية لكل مجموعة فيديو/صوت

توليفات الإدخال المدعومة

نص + صورة
نص + فيديو
نص + صوت (Seedance 2.5)
نص + صورة + فيديو
نص + صورة + صوت
نص + فيديو + صوت
نص + صورة + فيديو + صوت
curl https://api.seevio.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-5",
    "input": {
      "prompt": "use the product from image 1 and the camera motion from the reference video",
      "generation_type": "reference-to-video",
      "image_urls": ["https://your.cdn.com/product.jpg"],
      "video_urls": ["https://your.cdn.com/camera-motion.mp4"],
      "audio_urls": [],
      "duration": 8,
      "resolution": "720p"
    }
  }'

معلمات الطلب

تعد أسماء المعلمات، وقيم الـ Enum، ومسارات نقاط النهاية، والأمثلة جزءاً من عقد واجهة برمجة التطبيقات. توضح الأوصاف أدناه سلوك كل حقل.

الترويسات

الترويسةمطلوبالوصفمثال
Authorizationنعممفتاح واجهة برمجة التطبيقات (Bearer API key) المستخدم لمصادقة الطلب.Bearer sk_live_xxx
Content-Typeنعمتستخدم جميع طلبات الكتابة تنسيق JSON.application/json

حقول المستوى الأعلى

الحقلالنوعمطلوبالافتراضيالمدى / Enumالأنماطمثال
model

إصدار النموذج المستخدم للإنشاء. استخدم seedance-2-5 لـ Seedance 2.5، أو seedance-2-0 لـ Seedance 2.0، أو seedance-2-0-fast لـ Seedance 2.0 Fast، أو seedance-2-0-mini لـ Seedance 2.0 Mini.

stringنعم-seedance-2-5 | seedance-2-0 | seedance-2-0-fast | seedance-2-0-miniالكلseedance-2-5
callback_url

نقطة نهاية HTTPS التي تتلقى إشعارات اكتمال المهمة أو فشلها.

stringلا-رابط HTTPS، يمنع استخدام الشبكات الخاصةالكلhttps://your-domain.com/hook
input

إعدادات الإنشاء ومراجع الوسائط.

objectنعم--الكل-

input.* الحقول

الحقلالنوعمطلوبالافتراضيالمدى / Enumالأنماطمثال
input.prompt

الوصف النصي الذي يصف الفيديو المراد إنشاؤه.

stringنعم-نص غير فارغالكلa cat surfing
input.generation_type

نمط الإنشاء. القيمة الافتراضية هي text-to-video.

stringلاtext-to-videotext-to-video | image-to-video | reference-to-video-image-to-video
input.image_urls

روابط صور يمكن الوصول إليها عاماً. لنمط تحويل الصورة إلى فيديو، أرسل صورة واحدة للإطار الأول أو صورتين للإطارين الأول والأخير. لنمط تحويل المراجع إلى فيديو، يقبل Seedance 2.5 ما يصل إلى 30 صورة ويقبل Seedance 2.0 ما يصل إلى 9 صور.

string[]مشروط[]من صورة إلى فيديو: صورة واحدة أو صورتان. من مراجع إلى فيديو: ما يصل إلى 30 لـ Seedance 2.5؛ وما يصل إلى 9 لـ Seedance 2.0.image-to-video / reference-to-video["https://.../a.jpg"]
input.video_urls

مقاطع فيديو مرجعية يمكن الوصول إليها عاماً لنمط تحويل المراجع إلى فيديو فقط. يقبل Seedance 2.5 ما يصل إلى 10 فيديوهات، مدة كل منها 2-30 ثانية وبإجمالي وقت تشغيل <= 30 ثانية. بينما يقبل Seedance 2.0 ما يصل إلى 3 فيديوهات وبإجمالي وقت تشغيل <= 15 ثانية.

string[]لا[]إصدار Seedance 2.5: حتى 10 فيديوهات، كل منها 2-30 ثانية، والمدة الإجمالية <= 30 ثانية. إصدار Seedance 2.0: حتى 3 فيديوهات، والمدة الإجمالية <= 15 ثانية.reference-to-video[]
input.audio_urls

ملفات صوتية مرجعية يمكن الوصول إليها عاماً لنمط تحويل المراجع إلى فيديو فقط. يقبل Seedance 2.5 ما يصل إلى 10 ملفات صوتية، مدة كل منها 2-30 ثانية وبإجمالي وقت تشغيل <= 30 ثانية، ويسمح بالمراجع الصوتية فقط. بينما يقبل Seedance 2.0 ما يصل إلى 3 ملفات وبإجمالي وقت تشغيل <= 15 ثانية.

string[]لا[]إصدار Seedance 2.5: حتى 10 ملفات صوتية، كل منها 2-30 ثانية، والمدة الإجمالية <= 30 ثانية. إصدار Seedance 2.0: حتى 3 ملفات، والمدة الإجمالية <= 15 ثانية.reference-to-video[]
input.duration

طول الفيديو الناتج بالثواني.

intلا5إصدار Seedance 2.5: 4-30 ثانية. إصدار Seedance 2.0: 4-15 ثانية.الكل5
input.aspect_ratio

نسبة أبعاد الفيديو الناتج. يتيح خيار adaptive للنظام استنتاج أفضل نسبة أبعاد تلقائياً. يدعم نمط تحويل الصورة إلى فيديو في Seedance 2.5 خيار adaptive فقط.

stringلاadaptive16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptiveالكل16:9
input.resolution

فئة دقة الفيديو الناتج.

stringلا720pإصدار Seedance 2.5: 480p | 720p. إصدار Seedance 2.0: 480p | 720p | 1080p | 4k (حسب الإصدار الفرعي).الكل720p
input.generate_audio

ما إذا كان يجب على النموذج توليد صوت عندما يكون ذلك مدعوماً.

booleanلاtruetrue | falseالكلtrue
input.watermark

ما إذا كان سيتم إضافة علامة مائية.

booleanلاfalsetrue | falseالكلfalse
input.web_search

ما إذا كان سيُسمح بتعزيز النتائج بالبحث عبر الويب عندما يكون ذلك مدعوماً.

booleanلاfalsetrue | falseالكلfalse
input.return_last_frame

ما إذا كان سيتم إرجاع رابط الإطار الأخير عند توفره.

booleanلاfalsetrue | falseالكلfalse
input.seed

قيمة عشوائية محددة (Seed) لإصدارات Seedance 2.0 لضمان ثبات النتائج. لا يدعم Seedance 2.5 هذا الحقل؛ يرجى حذفه.

intلا-1-1 أو من 0 إلى 4294967295الكل-1

تختلف التكلفة بالرصيد حسب الدقة، والمدة، والنموذج، وما إذا كان نمط تحويل المراجع إلى فيديو يتضمن مراجع فيديو. قيمة الرصيد التي يتم إرجاعها في استجابة الإنشاء هي المبلغ الفعلي المحجوز لتلك المهمة.

عرض أسعار الرصيد

الاستجابة

هذه هي استجابة النجاح الواردة من الطلب POST /v1/videos/generations. تعني هذه الاستجابة أنه تم قبول المهمة وحجز الرصيد المطلوب. استخدم معرف المهمة (taskId) المسترجع للاستعلام الدوري عبر GET /v1/tasks/:id أو لمطابقة إشعار الاكتمال أو الفشل.

استجابة النجاح للطلب POST /v1/videos/generations

{
  "taskId": "3f2aK9mR...",
  "credits": 100
}

جلب حالة المهمة

استخدم الطلب GET /v1/tasks/:id لجلب الحالة الحالية للمهمة. يرجى ألا يتجاوز معدل الاستعلام الدوري مرة واحدة كل 10 ثوانٍ. بالنسبة لأنظمة التشغيل الفعلي، يفضل استخدام خطافات الويب.

curl https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
  -H "Authorization: Bearer sk_live_xxx"

استجابة مهمة مكتملة

{
  "id": "3f2aK9mR...",
  "status": "completed",
  "created_at": 1781234567,
  "model": "seedance-2-5",
  "billing_status": "charged",
  "credits": 100,
  "failed_reason": null,
  "data": {
    "results": ["https://cdn.seevio.ai/.../x.mp4"],
    "video_expires_at": "2026-06-13T10:00:00Z",
    "last_frame_url": null,
    "processing_time": 48
  }
}

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

{
  "id": "3f2aK9mR...",
  "status": "failed",
  "created_at": 1781234567,
  "model": "seedance-2-5",
  "billing_status": "refunded",
  "credits": 100,
  "failed_reason": "provider_failed"
}
القيمةالمعنى
status=queuedتم قبول المهمة وبانتظار الإرسال أو المعالجة.
status=generatingيقوم المزود بمعالجة عملية الإنشاء حالياً.
status=completedاكتمل إنشاء الفيديو ويحتوي حقل data.results على رابط النتيجة.
status=failedفشل إنشاء الفيديو أو انتهت المهلة المحددة له.
billing_status=reservedيتم حجز الرصيد أثناء تشغيل المهمة.
billing_status=chargedنجحت المهمة وتمت تسوية الرصيد المحجوز.
billing_status=refundedفشلت المهمة أو انتهت مهلتها وتمت إعادة الرصيد المحجوز.
billing_status=refund_failedفشلت عملية استرداد الرصيد وتتطلب معالجة يدوية.

بعد مرور تاريخ video_expires_at، يصبح حقل data.results فارغاً. يرجى تنزيل الملف وحفظه قبل انتهاء فترة الصلاحية.

خطافات الويب

عند تفعيل callback_url، يقوم Seedance باستدعاء نقطة النهاية الخاصة بك عند اكتمال المهمة أو فشلها، ويرسل بيانات JSON تصف النتيجة النهائية. إذا أرجعت نقطة النهاية الخاصة بك استجابة بخلاف عائلة 2xx أو لم تستجب خلال 15 ثانية، فستتم إعادة المحاولة حتى 5 مرات. تستخدم عمليات إعادة المحاولة نفس معرف المهمة (task id)، لذا يرجى إزالة التكرار بناءً على المعرف. أرجع استجابة برمز الحالة 200 بمجرد تسجيل بيانات الاستدعاء بأمان.

إشعار اكتمال المهمة

{
  "id": "3f2aK9mR...",
  "status": "completed",
  "created_at": 1781234567,
  "model": "seedance-2-5",
  "data": {
    "results": ["https://cdn.seevio.ai/.../x.mp4"],
    "video_expires_at": "2026-06-13T10:00:00Z",
    "last_frame_url": null,
    "processing_time": 48
  }
}

إشعار فشل المهمة

{
  "id": "3f2aK9mR...",
  "status": "failed",
  "created_at": 1781234567,
  "model": "seedance-2-5",
  "data": {
    "failed_reason": "provider_failed",
    "credits_refunded": 100
  }
}
export async function POST(request: Request) {
  const callbackData = await request.json();

  if (callbackData.status === "completed") {
    const videoUrl = callbackData.data.results[0];
    // Save the video URL or update your own task record here.
  }

  if (callbackData.status === "failed") {
    const errorMessage = callbackData.data.failed_reason;
    // Mark your own task record as failed here.
  }

  return new Response(null, { status: 200 });
}

تحقق من بنية بيانات الاستدعاء، وأزل التكرار حسب المعرف، وحدّث سجل المهمة في نظامك، ثم استجب بسرعة.

يجب أن يعمل رابط callback_url عبر بروتوكول HTTPS وألا يشير إلى نطاقات شبكات خاصة، أو محلية (Loopback)، أو عناوين Link-local.

الأخطاء

ترجع الطلبات POST /v1/videos/generations و GET /v1/tasks/:id هيكل الخطأ هذا عندما يفشل طلب واجهة برمجة التطبيقات نفسه، مثل معلمات غير صالحة، أو مفتاح واجهة غير صالح، أو رصيد غير كافٍ، أو تجاوز حدود معدل الطلبات، أو عدم العثور على المهمة. تتضمن بعض الأخطاء حقولاً إضافية مثل required أو available أو retry_after حسب الحالة.

{
  "error": {
    "code": "insufficient_credits",
    "message": "Not enough credits for this task.",
    "required": 100,
    "available": 12
  }
}
الرمزHTTPالمعنىإعادة المحاولة؟
invalid_request400معلمات مفقودة أو غير صالحة.لا، قم بتصحيح الطلب أولاً.
invalid_api_key401مفتاح واجهة برمجة التطبيقات مفقود، أو غير صالح، أو تم إلغاؤه.لا، استخدم مفتاحاً صالحاً.
insufficient_credits402رصيدك غير كافٍ. لم يتم قبول المهمة أو خصم تكلفتها.بعد إعادة شحن الرصيد.
forbidden403يفتقر مفتاح واجهة برمجة التطبيقات إلى الصلاحيات المطلوبة.لا.
not_found404المهمة غير موجودة أو لا تنتمي لمالك المفتاح المستخدم.لا.
rate_limited429تم تجاوز حد معدل الطلبات المسموح به.نعم، اتبع ترويسة Retry-After.
internal_error500خطأ داخلي في الخادم.نعم، أعد المحاولة لاحقاً.

حدود معدل الطلبات

تُطبق حدود معدل الطلبات لكل مفتاح واجهة برمجة تطبيقات بناءً على نافذة زمنية منزلقة. يبلغ الحد الافتراضي لإنشاء الفيديو 100 طلباً في الدقيقة، بينما تكون حدود الاستعلام عن الحالة أكثر مرونة. تحتوي استجابات HTTP 429 على ترويسة Retry-After.

الإنشاء

100/دقيقة

الاستعلام عن الحالة

أكثر مرونة

ترويسة 429

Retry-After

الفوترة والرصيد

تعتمد واجهة برمجة التطبيقات آلية الحجز عند الإرسال، والخصم عند النجاح، والاسترداد عند الفشل. تعرض صفحات الاستخدام في لوحة التحكم سجل الرصيد لواجهة برمجة التطبيقات، وسجلات المهام، وإحصاءات الاستخدام المعتمدة على الوقت.

محجوز

يتم التحقق من الرصيد وحجزه فور قبول المهمة.

مخصوم

تتم تسوية الرصيد المحجوز للمهام المكتملة بنجاح.

مسترد

تُرجع المهام الفاشلة أو التي انتهت مهلتها الرصيد المحجوز تلقائياً.

متابعة الاستخدام في لوحة التحكم

اعرض سجلات واجهة برمجة التطبيقات، والمخطط الزمني للمهام، وسجل الرصيد، ومقاييس الاستخدام المعتمدة على الوقت.

سجلات واجهة برمجة التطبيقات