توليد الوسائط
POST /api/media/generate — توليد غير متزامن للصور والفيديو وتحويل النص إلى كلام والموسيقى والرسوم ثلاثية الأبعاد. المعلمات model و prompt و opts. استطلع النتيجة عبر GET /api/media/jobs/{id}.
توليد الوسائط غير المتزامن: الصور والفيديو والتعليق الصوتي (TTS) وتحويل الكلام إلى نص والموسيقى والـ 3D. تنشئ مهمة ثم تتبّع النتيجة. تجد قائمة الطرازات الكاملة في media-models catalog؛ أما الـ webhooks والأخطاء والفوترة ففي webhook section.
معاملات الإنشاء
| المعلمة | النوع | الوصف |
|---|---|---|
modelreq. | string | اسم نموذج وسائط، مثل veo-3.1 أو gpt-image-2 (انظر الكتالوج). |
promptreq. | string | وصف نصي. |
opts | object | خيارات توليد إضافية (حسب النموذج): الدقة والمدة وما إلى ذلك. |
الإنشاء والاستعلام
يُعيد الإنشاء 202 مع { ok: true, jobId, status: "processing" }. استعلم بـ GET /api/media/jobs/{jobId} حتى status: "success"، ثم خُذ resultUrls.
# 1. create a generation job
curl https://getvibeapi.com/api/media/generate \
-H "Authorization: Bearer $GETVIBE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "veo-3.1",
"prompt": "a cat on a skateboard, slow motion"
}'
# → {"ok":true,"jobId":"...","status":"processing"}ok: false دون أي احتساب. وأسعار الموقع إرشادية؛ ويُعاد المبلغ الدقيق في ترويسة x-pv-cost-rub لكل استجابة مقبولة. ولا تتغيّر أجسام البث افتراضيًا؛ أرسل x-pv-cost: 1 لإضافة التكلفة إلى حدث الاستخدام النهائي لذلك البروتوكول.معاملات متقدمة (opts)
إلى جانب model وprompt، يمكنك تمرير خيارات إضافية في opts. وتعتمد المجموعة على النموذج. أما العقد الكامل القابل للقراءة آليًا فهو متاح عبر GET /api/model-capabilities (أو GET /api/model-capabilities/{model} لنموذج محدّد).
| المعلمة | النوع | الوصف |
|---|---|---|
aspect_ratio | string | Aspect ratio: 1:1, 16:9, 9:16, 4:3, 3:4. |
duration | string|number | مدة الفيديو بالثواني (5، 10، 15). |
resolution | string | Resolution: 480p, 720p, 1080p, 4K. |
image_url | string (URL) | الصورة المصدر لـ I2V / تحويل صورة إلى صورة. |
negative_prompt | string | ما يجب استبعاده من التوليد (qwen-image, wan-2-7). |
guidance | number | مقياس التوجيه — مدى الالتزام بالطلب النصي (flux-2، qwen-image، seedance). |
seed | number | Seed للحصول على نتيجة قابلة لإعادة الإنتاج (flux-2). |
stability | number | الثبات 0–1 (hailuo، happyhorse، seedance، TTS). |
camera | string | حركة الكاميرا، مثل "pan left" (kling-3.0، hailuo). |
first_frame_url | string (URL) | First frame for I2V (kling-3.0, wan-2-7). |
last_frame_url | string (URL) | الإطار الأخير لـ I2V (seedance، kling-3.0، wan-2-7). |
reference_image | string (URL) | مرجع النمط/الشخصية (happyhorse). |
similarity_boost | number | تشابه الصوت 0–1 (ElevenLabs TTS). |
speed | number | سرعة الكلام 0.5–2 (ElevenLabs TTS). |
GET /api/model-capabilities/{model}.ملفاتك الخاصة: base64 بدلًا من رابط
خيارات URL (image_url، input_urls، mask_url وما عداها) هي روابط يجلبها المزوّد، لذا تقبل فقط عناوين https:// عامة. ويُرفض أي نص data:image/...;base64,… مضمَّن في أحد تلك الحقول مع 400.
لإرسال ملفك الخاص، استخدم حقل *_base64 المطابق بدلًا من ذلك: تخزّن الخدمة البايتات وتنشرها وتمرّر الرابط الناتج إلى المزوّد. حتى 16 ملفًا لكل طلب في input_base64.
| المعلمة | النوع | الوصف |
|---|---|---|
image_base64 | string | الصورة المصدر. تحل محل image_url. |
mask_base64 | string | قناع Inpainting (صور فقط image/*). يستبدل mask_url. |
input_base64 | string[] | مراجع للتحويل من صورة إلى صورة والمدخلات المتعددة. تحل محل input_urls. |
audio_base64 | string | الصوت المصدر. يحل محل audio_url. |
video_base64 | string | فيديو المصدر. يحل محل video_url. |
data:image/png;base64,… الكاملة بما فيها البادئة — ويُقرأ نوع الملف منها.عقد الطلب: strict, quote_id, max_price_rub
يقبل POST /api/media/generate و POST /api/media/price النص نفسه، لذا يمكنك تسعيره ثم إرساله دون تغيير. لا توجد حقول أخرى على المستوى الأعلى: يُرفض أي حقل غير معروف على كلا النقطتين بالرمز 400 وكود unknown_field مع تسميته (field, fields)، مع strict أو بدونه. تُوضع معلمات التوليد داخل opts.
| المعلمة | النوع | الوصف |
|---|---|---|
modelreq. | string | معرّف نموذج عام أو أحد مساراته (base:alias). |
prompt | string | النص؛ مطلوب فقط عندما تتطلبه عملية النموذج. |
opts | object | خيارات النموذج. المخطط الدقيق: operations[].requestJsonSchema في GET /v1/model-capabilities/{model}. |
strict | boolean | الوضع الصارم (أو الترويسة x-getvibe-strict: 1): يُرفض أي طلب لن يُنفَّذ كما كُتب تمامًا (بسبب إسقاط معلمة، أو تقييد قيمة بالحدود المسموح بها، أو وجود مفتاح خارج نطاق مواصفات النموذج) بالرمز 422 strict_validation_failed وقائمة violations، قبل تقديم أي عرض سعر أو احتساب أي رسوم. لا يُعدّ الحقل الموثَّق الذي يقبله النموذج ويتجاهله (duration في النماذج التي تعتمد طول المصدر) مخالفة: بل يُعاد بوصفه تحذيرًا من نوع param_ignored. |
quote_id | string | mq_… من POST /api/media/price. لا تُنفَّذ المهمة إلا بذلك السعر؛ ويُرفض العرض القديم أو المستخدَم أو المعاد توجيهه بـ 409/422 قبل تشغيل أي شيء. |
max_price_rub | number | الحد الأقصى لهذه المهمة الواحدة بعملة الحساب. إذا كان العرض أعلى: 422 media_max_price_exceeded ولن يُنفَّذ أي شيء. لا تُحتسب على مهمة مقيسة رسوم تتجاوز هذا الحد أبدًا. |
webhook_url | string | رابط https عام يستقبل إشعار إتمام موقّعًا. |
الملفات حسب المعرّف (Files API)
يمكن إرسال أي ملف مصدر بثلاث طرق: كرابط (image_url، audio_url، video_url…)، أو كبايتات مضمَّنة (image_base64، audio_base64، video_base64…)، أو كمعرّف ملفك الخاص من POST /v1/files. حقول المعرّف مدرجة في requestJsonSchema لكل عملية ومقبولة في الوضع الصارم.
| المعلمة | النوع | الوصف |
|---|---|---|
image_file_id | string | بدلًا من image_url. |
audio_file_id | string | بدلًا من audio_url. |
video_file_id | string | بدلًا من video_url. |
mask_file_id | string | بدلًا من mask_url. |
first_frame_file_id / last_frame_file_id | string | Instead of first_frame_url / last_frame_url. |
input_file_ids | string[] | تُضاف إلى input_urls. |
reference_*_file_ids | string[] | Appended to reference_image_urls / reference_audio_urls / reference_video_urls. |
تسعير الفيديو بحسب طول الملف المُدخَل
بالنسبة إلى النماذج التي يتبع طول مخرجاتها مسارًا مرفوعًا — kling-ai-avatar، omnihuman-v2، omnihuman-2-0، omnihuman-v1.5، omnihuman-1-5، volcengine-lipsync (audio)، kling-motion-control، wan-animate، topaz-video-upscale، p-video-edit (video)، lipsync-2-pro، sync-3، react-1 (both inputs) — تقيس /api/media/price وفحص ما قبل التنفيذ max_price_rub على /api/media/generate ذلك الملف من جانب الخادم (link أو data: URI أو base64 أو *_file_id)، وتحتسب السعر وفق الثواني المقاسة. تتضمن الاستجابة sourceSeconds (outputSeconds for lip-sync)، ويذكر estimateReason أنه تم قياس الطول. وإذا تعذّر قراءة الملف، يبقى السعر مستندًا إلى أساسه السابق (ثانية واحدة أو تقدير الكتالوج أو الحد الأقصى للمسار)، ويذكر estimateReason ذلك. وتساوي التكلفة معدل الثانية × عدد الثواني التي تم عرضها فعليًا، على ألا تتجاوز max_price_rub مطلقًا. ويُقبل opts.duration في هذه النماذج ويتم تجاهله مع تحذير param_ignored.
استنساخ الصوت
Create: { name, consent: true, engine, audio_url | audio_base64 } or several recordings samples: [{ audio_url } | { audio_base64 }, …] (engine: "elevenlabs" only). An ElevenLabs voice is used by voice-clone-tts and by the Voice Changer (elevenlabs-voice-changer). Appending recordings to an ElevenLabs voice is free. Every recording is downloaded and measured before the supplier is called: a refusal changes and charges nothing.
| المعلمة | النوع | الوصف |
|---|---|---|
one recording | ≤ 10 MB | wav/mp3, up to 60 s. Larger: 422 voice_sample_too_large / voice_sample_invalid. |
recordings per voice | ≤ 25 | مع احتساب تلك المضافة بالفعل. المزيد: 422 voice_samples_limit. |
voice length | ≤ 300 s | جميع التسجيلات معًا، بما في ذلك المُضافة بالفعل. الأطول: 422 voice_samples_limit؛ والأقصر من الحد الأدنى للمحرك: 422 voice_samples_invalid. |
recordings size | ≤ 50 MB | جميع تسجيلات الطلب الواحد معًا. المزيد: 422 voice_samples_too_large. |
request body | ≤ 70 953 644 B | 50 ميغابايت من التسجيلات بترميز base64 (×4/3) إضافةً إلى JSON. الأحجام الأكبر: 413 payload_too_large (بصيغة JSON، مع max_body_bytes). أرسل المجموعات الطويلة على أجزاء عبر …/samples، أو على هيئة روابط audio_url. |
additions per 24 h | 20 | لكل عميل. المزيد: 429 voice_samples_rate_limited. |
مغيّر الصوت والمحاذاة القسرية
| المعلمة | النوع | الوصف |
|---|---|---|
elevenlabs-voice-changer | model | opts.voice_id (your ElevenLabs voice) + the source recording opts.audio_url | audio_base64 | audio_file_id, up to 5 minutes. Priced on the measured length: 1 minute = 1000 characters. |
forced-alignment | model | prompt is the transcript, opts.audio_url | audio_base64 | audio_file_id the recording. Result: word timings in resultMeta.words and an SRT file in resultUrls. Priced per 1000 characters of text. |
بيئة اختبار: نتيجة إرسال غير معروفة
عندما لا يصل تأكيد البدء من المورّد، تبقى المهمة في الحالة: "submitting" مع stage: "submission_unknown"، وerrorCode: "media_submission_uncertain"، وfailure.advice: "reconcile_first" — واصل الاستعلام عن نفس jobId ولا تنشئ نسخة مكرّرة. لاختبار هذا المسار دون أي تكلفة، أرسل POST /api/media/generate بمفتاح sandbox مع الترويسة x-pv-sandbox-outcome: submission_uncertain. تكون الإجابة 202 عادية مع jobId؛ ويجيب الاستعلام عنه كإرسال غير معروف لمدة 60 ثانية، ثم كمهمة لم تبدأ قط (failure.code: "submission_not_started"، charged: false). لا يُخزَّن شيء ولا يُرسَل إلى أي مورّد ولا يُحتسب أي مبلغ. أما المفتاح العادي مع هذه الترويسة فيحصل على 400 sandbox_outcome_requires_sandbox_key.
تحويل الكلام إلى نص (النسخ)
المسار نفسه المستخدم لبقية عمليات التوليد: ضع اسم طراز STT في model، واترك prompt سلسلة فارغة، ومرّر التسجيل في opts.audio_url. يصل النص المكتوب في resultText عند GET /api/media/jobs/{id}؛ ويبقى resultUrls فارغاً — فالنسخ الكتابي لا ينتج أي ملف.
# speech-to-text: create the job, then read the transcript
curl https://getvibeapi.com/api/media/generate \
-H "Authorization: Bearer $GETVIBE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "whisper-large-v3-turbo",
"prompt": "",
"opts": {
"audio_url": "https://example.com/meeting.mp3",
"language_code": "en"
}
}'
# → {"ok":true,"jobId":"JOB_ID","status":"processing","priceRub":0.03}
curl https://getvibeapi.com/api/media/jobs/JOB_ID \
-H "Authorization: Bearer $GETVIBE_API_KEY"
# → {"status":"success","resultText":"the transcribed text…","resultUrls":[],"priceRub":0.03}النماذج
whisper-large-v3-turbo— 0.00025 دولار لكل دقيقة من الصوت. الأرخص والأسرع، ويدعم 99 لغة.nemotron-asr-multilingual— 0.00025 دولار لكل دقيقة. تعرّف آلي متعدد اللغات من NVIDIA، ويضيف علامات الترقيم من تلقاء نفسه.whisper-large-v3— 0.000563 دولار لكل دقيقة. Whisper كامل: أبطأ من turbo، لكنه أدق مع الصوت المشوّش.universal-2— 0.003125 دولار لكل دقيقة.speech-to-text— 0.01 دولار لكل دقيقة (ElevenLabs Scribe). يدعم تمييز المتحدثين ووسوم الأحداث الصوتية.
المعلمات
| المعلمة | النوع | الوصف |
|---|---|---|
audio_urlreq. | string (URL) | رابط https عام يقدّم الملف مباشرة. تُرفض عمليات إعادة التوجيه وعناوين الشبكات الخاصة. استخدم audio_base64 بدلًا منه إذا لم يكن الملف متاحًا على الإنترنت. |
audio_base64 | string | التسجيل مضمَّنًا كبيانات: data:audio/mpeg;base64,… يحل محل audio_url. |
language_code | string | رمز اللغة (en, ru, …). يُكتشف تلقائيًا عند حذفه. |
duration_minutes | number | طول التسجيل بالدقائق — يُستخدم في تقدير السعر المسبق. أما الفاتورة النهائية فتُحتسب بالقياس (انظر أدناه). |
diarize | boolean | تقسيم المتحدثين (universal-2، تحويل الكلام إلى نص). |
tag_audio_events | boolean | وسم الأحداث الصوتية مثل الضحك أو التصفيق (تحويل الكلام إلى نص). |
keyterms | string[] | قائمة تلميحات بالمصطلحات والأسماء (تحويل الكلام إلى نص؛ +30% على السعر). |
الصيغ والحدود
تُقبل mp3 و wav و m4a/mp4 و flac و ogg/opus و webm. الحد الأقصى لحجم الملف 25 ميغابايت — أي نحو 26 دقيقة من mp3 بمعدل 128 kbps، أو عدة ساعات من الكلام بصيغة opus. وكل ما يتجاوز ذلك يُرفض فورًا برسالة صريحة ولا تُحتسب له فاتورة؛ قسّم التسجيل بدلًا من ذلك.
whisper-large-v3-turbo وwhisper-large-v3 وnemotron-asr-multilingual يُحسب المبلغ النهائي من المدة المقيسة للتسجيل، مأخوذةً من النص المكتوب — لا مما مرّرته في duration_minutes. والحد الأدنى للاحتساب هو كوبيك واحد. ويُعاد المبلغ الدقيق دائمًا باسم priceRub في المهمة المكتملة.خطاف الجاهزية (بدلًا من الاستقصاء الدوري)
لتجنب الاستقصاء الدوري، سجّل عنوانًا واحدًا mediaWebhookUrl في لوحة التحكم. وعند اكتمال المهمة (نجاحًا أو خطأً)، تُجري الخدمة حتى خمس محاولات تسليم لـ POST بجسم JSON:
// POST to your mediaWebhookUrl when a job finishes
{
"jobId": "...",
"status": "success", // or "fail"
"model": "veo-3.1",
"kind": "video", // image | video | audio | music | 3d
"resultUrls": ["https://getvibeapi.com/api/media/file/..."],
"failMsg": null,
"createdAt": "2026-06-17T10:00:00.000Z"
}جلب الملف: /api/media/file/{id}/{idx}
رابط نتيجة التوليد (صورة أو فيديو أو صوت أو نموذج 3D) من resultUrls. استخدمه كما يُعيده هو: يُفتح دون مفتاح API ويعمل في <img> أو <video> أو المتصفح. المزوّد مخفي: يُستنبط العنوان الأعلى من جهة الخادم ولا يراه العميل قط.
| المعلمة | النوع | الوصف |
|---|---|---|
idreq. | string (path) | معرّف المهمة (jobId) من استجابة /api/media/jobs/{id}. |
idxreq. | integer (المسار) | فهرس النتيجة (يبدأ من 0). لنتيجة واحدة — 0. |
query params | كما في resultUrls | لا تبنِ الرابط بنفسك ولا تعدّل المعاملات التي تُعيدها الخدمة. |
download | string (query) | يعيد download=1 الملف كمرفق يتبع اسمه وامتداده نوع المحتوى (.glb لنموذج ثلاثي الأبعاد). وبدونه يُفتح الملف في المتصفح. |
# The signed URL is returned in resultUrls of the /api/media/jobs/{id} response
# or in the webhook body. Opens directly in the browser / <img> — no key needed.
https://getvibeapi.com/api/media/file/JOB_ID/0?sig=HMAC_SIGNATUREresultsExpireAt في /api/media/jobs/{id}). يُنسخ الملف النهائي إلى مساحة التخزين لدينا وتتحوّل resultUrls إلى عنوان دائم بالصيغة https://getvibeapi.com/media/r/…؛ ويظل رابط /api/media/file/… الذي أُعيد سابقًا يعمل أيضًا. ويدعم كلا العنوانين طلبات Range (التنقل داخل الفيديو والصوت). وبعد 7 أيام يُحذف الملف ويُعيد العنوان 410 Gone مع الرمز media_result_expired — نزّل ما تحتاجه قبل ذلك.