واجهة الرفع ثم الغلاف في خطوة واحدة

آخر تحديث 2026-09-18 · فريق Suno-API

وصف نقطة النهاية

الرفع ثم الغلاف في خطوة واحدة يرسل ملف صوت أو رابط صوت ويولّد نسخة غلاف جديدة من ذلك الصوت المصدر.

نقطة النهاية: POST /api/music/upload-cover

الفوترة: مدفوع، وحالياً 0.6 يوان افتراضياً لكل طلب. هذه الواجهة هي «الرفع ثم الكوفر»، وليست رفع صورة غلاف. والمبلغ المخصوم فعلاً يتبع إعداد الأسعار الحالي في لوحة الإدارة.

Max Mode / Variety: تدعم نقطة النهاية هذه المعاملين الاختياريين max_mode و variety (0-4). عند تشغيل max_mode يُحاسَب هذا الطلب بضعف السعر (0.6 → 1.2 يوان لكل طلب)، ولا يضيف variety أي تكلفة. والمعنى وطريقة الإرسال في قسم «المعاملات المتقدمة» من نظرة عامة على الواجهة الجديدة.

أوقات الانتظار والمهلات (مهم): هذه نقطة نهاية متزامنة — لا يُقبل الطلب ويُسلَّم إلى التوليد إلا عند وصول الاستجابة. ووفق القياس، تعود معظم الطلبات في 1-3 ثوانٍ، ونحو 10% تتجاوز 30 ثانية، وأطولها نحو 230 ثانية. اضبط مهلة العميل على 300 ثانية أو أكثر؛ وعدم وصول استجابة لا يعني عدم التوليد، ولا تُعد المحاولة فوراً بعد انتهاء المهلة (فذلك يكرر الطلب ويخصم مرة أخرى). وإن انقطع الاتصال فتحقق لاحقاً عبر GET /api/music/songs. راجع «أوقات الانتظار وإعدادات المهلة» في نظرة عامة على الواجهة الجديدة.

عندما يكون الصوت كبيراً، يُستحسن فصل «الرفع» و«الكوفر» إلى خطوتين (موصى به)

تتطلب هذه الواجهة وضع الصوت كاملاً في جسم الطلب: فكلما كبر الصوت كبر الجسم، وأي اضطراب في الشبكة أو انتهاء للمهلة يقطع النقل في منتصفه، فيعيد الخادم unexpected end of JSON input (رمز HTTP 400، دون خصم).

وعندما يتجاوز الصوت نحو 8 ميجابايت، أو تكون الشبكة غير مستقرة، أو ستُستخدم المادة المصدر نفسها أكثر من مرة، فانتقل إلى الصيغة ذات الخطوتين:

  1. POST /api/music/upload-source يرفع الصوت المصدر أولاً — مجاناً وقابل لإعادة المحاولة في أي وقت — ويعيد clip_id؛
  2. POST /api/music/generate-from-source يبدأ الكوفر بذلك clip_id — جسم الطلب في الخطوة المدفوعة لا يتجاوز نحو 250 بايت.

راجع واجهة رفع الصوت المصدر، وواجهة الكوفر من مقطع مصدر، وقسم «الملفات الكبيرة والطلبات المقتطعة» في نهاية هذه الصفحة.

معاملات الطلب

Headers

المعامل النوع مطلوب ملاحظات
Authorization string نعم Bearer YOUR_API_KEY
Content-Type string نعم application/json

معاملات جسم الطلب

المعامل النوع مطلوب القيمة الافتراضية ملاحظات
model string لا suno-v6 اسم النموذج الموجّه للعميل: suno-v6 أو suno-v6-wild أو suno-v6-mini
file_url string لا - رابط الصوت المصدر
file_base64 string لا - صوت بصيغة Base64
file_name string لا - اسم الملف
prompt string لا - كلمات جديدة أو اتجاه التعديل
style string لا - وسوم الأسلوب
title string لا - العنوان
negativeTags string لا - الأسلوب السلبي
instrumental boolean لا false هل الأغنية بلا كلمات
waitAudio boolean لا false هل يُنتظر اكتمال الصوت
cover_start_s number لا - ثانية بداية المقطع المطلوب تحويله إلى كوفر
cover_end_s number لا - ثانية نهاية المقطع المطلوب تحويله إلى كوفر
audio_weight number لا - مدى الاعتماد على الصوت المرجعي، النطاق 0.0-1.0؛ لا يُرسل إلا عند تقديم صوت مرجعي

وحدة cover_start_s وcover_end_s هي الثانية، ويمكن استخدام الكسور العشرية؛ ويجب أن يكون وقت البداية أصغر من وقت النهاية وألا يتجاوز مدة الصوت المصدر. وعند حذف الحقلين معاً يُستخدم الصوت كاملاً. وتُربط audio_weight بحقل metadata.control_sliders.audio_weight في Suno وتتحكم في مقدار اعتماد النتيجة على الصوت المرجعي؛ وتأخذ 0.0-1.0، ولا يجوز إرسالها إلا إذا كان الطلب يحمل صوتاً مرجعياً صالحاً في file_url أو file_base64. والقيمة 0 صالحة، وحذف الحقل يعني «غير محدد» ويحتفظ بسلوك Suno الافتراضي. ويجب أن تكون instrumental وwaitAudio قيمتين منطقيتين بصيغة JSON لا نصوصاً.

تعيد واجهة الرفع النتيجة افتراضياً بشكل غير متزامن. وعندما تكون clips[].status في الاستجابة pending فإن خلو audio_url أمر طبيعي ولا يعني فشل الرفع أو الكوفر؛ فاحفظ song_id الحقيقي الذي حصلت عليه، واستعلم واجهة البحث عن الأغاني حتى الاكتمال قبل قراءة عنوان الصوت.

مثال الطلب

curl -X POST https://www.suno-api.io/api/music/upload-cover \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "suno-v6",
    "file_url": "https://example.com/source.mp3",
    "file_name": "source.mp3",
    "prompt": "كلمات جديدة أو اتجاه التعديل",
    "style": "Mandopop, acoustic guitar",
    "title": "نسخة الكوفر",
    "negativeTags": "noise, low quality",
    "audio_weight": 0.5,
    "instrumental": false,
    "waitAudio": false,
    "cover_start_s": 0,
    "cover_end_s": 60
  }'

الاستجابة

{
  "code": 200,
  "message": "success",
  "data": {
    "upload": {
      "clip_id": "uploaded_clip_id",
      "status": "complete"
    },
    "clips": [
      {
        "song_id": "new_clip_id",
        "song_title": "نسخة الكوفر",
        "status": "pending"
      }
    ]
  }
}

الملفات الكبيرة والطلبات المقتطعة

الموصى به: فصل الرفع والكوفر إلى خطوتين

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

الخطوة 1 الرفع الخطوة 2 الكوفر
الواجهة POST /api/music/upload-source POST /api/music/generate-from-source
الفوترة مجاني (رفع فقط، دون توليد) 0.6 يوان لكل طلب؛ 1.2 يوان لكل طلب مع Max Mode
جسم الطلب الصوت نفسه (base64 / multipart)، أو رابط فقط عبر file_url نحو 250 بايت (فقط sourceClipId واحد)
يعيد clip_id (معرّف مقطع الصوت المصدر) data.clips[].song_id (النتيجة المولّدة)
إذا فشل أعد المحاولة ببساطة، دون خصم ودون إنشاء مهمة توليد اضبط مهلة العميل على ≥300 ثانية؛ وعند انتهاء المهلة تحقق أولاً عبر /api/music/songs ولا تعد المحاولة فوراً
إعادة استخدام المادة المصدر المقطع clip_id نفسه يصلح أيضاً للتمديد / الاستبدال / الفصل يجب إعادة رفع الصوت في كل مرة

الخلاصة: صوت يتجاوز نحو 8 ميجابايت، أو شبكة غير مستقرة، أو المادة نفسها تُستخدم عدة مرات → استخدم الصيغة ذات الخطوتين؛ وصوت صغير جداً على شبكة مستقرة → هذه الواجهة أسهل.

ما معنى 400 unexpected end of JSON input

معناه أن JSON الذي وصل إلى الخادم غير مكتمل (ليس خطأً في المعاملات، ولا مشكلة في الصلاحيات أو الرصيد). والأسباب الشائعة، مرتبة بحسب الاحتمال:

  1. اقتطاع جسم كبير أثناء النقل: تسجّل طبقة الدخول كلاً من «عدد البايتات التي أعلن العميل أنه سيرسلها» و«عدد البايتات التي وصلت فعلاً». وفي حالة مقيسة: أعلن العميل 14.17 ميجابايت ولم يصل سوى 11.8–12.4 ميجابايت، وتوقفت الطلبات الثلاثة كلها عند نحو 1.6–1.7 ثانية؛ وكان عدد البايتات الناقصة مختلفاً في كل مرة، ما يشير إلى انقطاع في النقل لا إلى حدّ ثابت (فالخادم لا يحدّ حجم جسم الطلب).
  2. عدم تطابق Content-Length مع البايتات المُرسلة فعلاً: ففي Node.js، استخدام .length للنص (وهو عدد محارف UTF-16) كطول يُنتج حساباً خاطئاً بمجرد أن يحتوي المحتوى على اللغة الصينية أو نص متعدد البايتات.
  3. كتابة الجسم كنص بدل Buffer، فيختلف عدد البايتات المكتوبة عن المُعلن.

وتحدث الحالات الثلاث قبل الخصم، فلا يترتب عليها أي تكلفة.

قائمة تحقق ذاتي على جانب العميل

أخطاء شائعة

الخطأ المعنى ما يجب فعله
unexpected end of JSON input جسم الطلب غير مكتمل (مقتطع) نفّذ قائمة التحقق أعلاه، أو انتقل إلى الصيغة ذات الخطوتين
invalid character '-' in numeric literal أُرسل جسم multipart إلى واجهة JSON لا تستخدم multipart مع واجهات JSON، ولا تضبط Content-Type يدوياً
one of file_path, file_base64, file_url, or multipart file is required لم يُرفق أي صوت أضف file_base64 / file_url / file بصيغة multipart
model is required الجسم كان JSON صالحاً لكنه فارغ (مثل {}) أرسل model على الأقل
Invalid request: Invalid request, ... رسالة غلاف لفشل تحليل الجسم اقرأ الشطر الثاني لمعرفة السبب المحدد (وغالباً يكون أحد ما سبق)

واجهات ذات صلة: واجهة رفع الصوت المصدر (الخطوة 1)، وواجهة الكوفر من مقطع مصدر (الخطوة 2).

التاليواجهة الكوفر من مقطع مصدر

احصل على مفتاح API

أنشئ مفتاح API من لوحة التحكم بعد التسجيل. كل عملية توليد تكلف 0.6 يوان وتعيد مقطوعتين، والتنزيلات غير محدودة، ولا حاجة إلى رقم هاتف.

احصل على مفتاح API العودة إلى النظرة العامة