【موصى به】 واجهة الملف الصوتي الشخصي

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

✅ نوصي بهذا المسار للتكاملات الجديدة. بحسب تقييمات فعلية من مستخدمين كثيرين، الأغاني المولَّدة عبر هذا المسار تحافظ على الصوت الأصلي بدرجة عالية: تصبح الأصوات في الملف النهائي أقرب إلى الشخص في النموذج الذي رفعته، لذلك هو المسار الذي نوصي به للعملاء حالياً.

للمقارنة: واجهة استنساخ الصوت والتوليد بصوت محدد السابقة ما زالت تعمل، لكن القائمة تضع عليها وسم «غير موصى به» ولم تعد موصى بها للتكاملات الجديدة.

ملاحظة: هذا المستند يشرح فقط نقاط النهاية التي تستدعيها. معالجة المواد وجدولة المهام وفحص المحتوى يقوم بها الخادم تلقائياً؛ العميل لا ينفذها.


0. البدء في خمس دقائق

أربع خطوات تكفي لتحويل نموذج صوتي واحد إلى أغنيتين جاهزتين.

① إنشاء الصوت   POST /api/music/voice-profile/create      → احصل على voice_id (status=ready)
② عمل كوفر      POST /api/music/voice-profile/cover       → احصل فوراً على song_id اثنين
③ المتابعة      POST /api/music/query                     → استعلم حتى status=completed
④ التنزيل       GET  /api/music/download?song_id=…&kind=mp3

أصغر مثال عامل (curl):

API_KEY="sk-مفتاحك"
BASE="https://www.suno-api.io"

# ① إنشاء الصوت (ارفع نموذجاً صوتياً؛ يُفضَّل 10 ثوانٍ أو أكثر، أقل من 10 ميجابايت)
curl -sS -X POST "$BASE/api/music/voice-profile/create" \
  -H "Authorization: Bearer $API_KEY" \
  -F "file=@./my-voice.mp3" \
  -F "title=صوتي" \
  -F "source_kind=upload"
# → {"success":true,"message":"","data":{"voice_id":"vp_2026…","status":"ready", …}}

# ② اعمل كوفر لأغنية بهذا الصوت (song_clip_id = معرّف clip للأغنية المطلوب كوفرها)
curl -sS -X POST "$BASE/api/music/voice-profile/cover" \
  -H "Authorization: Bearer $API_KEY" \
  -H "X-Create-Ui-Client-Request-Id: cover-$(date +%s)" \
  -H "Content-Type: application/json" \
  -d '{
        "model": "suno-v6",
        "voice_id": "vp_2026…",
        "song_clip_id": "5b773e9a-…",
        "lyrics": "[Verse 1]\nنص الكلمات…",
        "style_requirements": "فولك بطيء، جيتار أكوستيك",
        "audio_weight": 0.85,
        "max_mode": false
      }'
# → {"code":200,"message":"success","data":{"resolved_scene":"cover","clips":[{…},{…}]}}

# ③ الاستعلام (أرسل عدة معرّفات مرة واحدة، مفصولة بفواصل)
curl -sS -X POST "$BASE/api/music/query" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"suno-v6","song_ids":"id1,id2"}'

# ④ نزّل mp3 بعد الانتهاء (الملف متاح فقط عند status=completed)
curl -sS -L "$BASE/api/music/download?song_id=id1&kind=mp3" \
  -H "Authorization: Bearer $API_KEY" -o song1.mp3

1. الأعراف المشتركة

1.1 النطاق والبيئة

البيئة Base URL الاستخدام
الإنتاج https://www.suno-api.io حركة العملاء الفعلية

كل المسارات أدناه نسبية بالنسبة إلى Base URL؛ مثلاً العنوان الكامل لـ POST /api/music/voice-profile/create هو https://www.suno-api.io/api/music/voice-profile/create.

1.2 المصادقة

كل نقاط النهاية تستخدم الترويسة نفسها، وقيمتها مفتاح API الذي أنشأته في لوحة التحكم:

Authorization: Bearer sk-xxxxxxxx

1.3 صيغ جسم الطلب

1.4 غلافا الاستجابة (على العميل معرفة هذين فقط)

نقاط نهاية «إدارة الأصوات» (create / create-from-clip / list / detail / delete) تستخدم غلاف الأعمال:

{ "success": true, "message": "", "data": { } }
{ "success": false, "message": "voice_id is required" }

«الكوفر بالصوت» يمر عبر قناة التوليد ويستخدم غلاف التوليد: النجاح code/message/data، والفشل كائن error:

{ "code": 200, "message": "success", "data": { } }
{ "error": { "message": "voice not found: vp_xxx", "type": "bad_response_status_code", "param": "", "code": "bad_response_status_code" } }

كيف تقرر: انظر أولاً إلى رمز حالة HTTP، ثم success === false، وأخيراً code !== 200 أو وجود error. فشل العمل لا يضمن أن يكون HTTP غير 200 (نقاط إدارة الأصوات ترد HTTP 200 حتى عند الخطأ)، لذلك لا تعتمد على رمز الحالة وحده.

1.5 منع التكرار (idempotency)

إنشاء الصوت (بما في ذلك «الإنشاء من صوت موجود») تكراره آمن فعلاً: تحت المفتاح نفسه، إعادة إرسال client_request_id نفسه تنشئ صوتاً واحداً فقط، والمحاولة الثانية تعيد نتيجة الأولى مباشرة (success=true، وvoice_id نفسه). الطريقة المقصودة أن يولّد العميل معرّفاً بنفسه (مثل UUID) ويعيد استخدام القيمة نفسها عند إعادة المحاولة بعد انتهاء المهلة.

إرسال الكوفر لا يزيل التكرار على مستوى الطلب (فهو توليد مدفوع)، لذا انتبه لأمرين:

  1. معرّف الإرسال يوضع في الترويسة X-Create-Ui-Client-Request-Id: <معرّف إرسالك>. يُكتب في سجل المهمة على الخادم لتسهيل الفحص لاحقاً؛ لكنه لا يمنع خصماً مكرراً.
  2. انتهاء المهلة ≠ فشل: قد يكون الطلب قُبل فعلاً ويجري التوليد. قبل إعادة المحاولة افحص بـ GET /api/music/songs?p=1&page_size=20 (معاملات الترقيم p / page_size، والصيغة المتوافقة ps تعمل أيضاً) هل ظهرت أغنية جديدة بـ generation_type=voice_profile_cover، وأعد الإرسال فقط إن لم تظهر.

جسم create وcreate-from-clip يقبل أيضاً الحقل client_request_id (انظر §3 و§4).

1.6 نظرة عامة على الفوترة

الإجراء نقطة النهاية السعر ملاحظات
إنشاء صوت (عادي) POST /api/music/voice-profile/create مجاني رفع النموذج لا يستهلك رصيد Suno
إنشاء صوت (من صوت موجود) POST /api/music/voice-profile/create-from-clip مجاني الخادم يسجّل مرجعاً للمادة فقط، دون رفع جديد
الاستنساخ المعزّز نفسه، enhanced=true بسعر «الرفع المعزّز» (افتراضياً 10 يوان لكل طلب) غير متزامن؛ يُرد المبلغ تلقائياً عند الفشل
الكوفر بالصوت POST /api/music/voice-profile/cover 1.2 يوان لكل طلب؛ و2.4 يوان عند max_mode=true الطلب الواحد يُنتج أغنيتين
الاستعلام / القائمة / التفاصيل / الحذف — مجاني
التنزيل (تأخذ الرابط المباشر بنفسك) audio_url في الاستجابة مجاني تشغيل العنوان الصادر
التنزيل (تحويل إلى wav / كلمات إلخ) POST /api/music/free2 0.2 يوان لكل أغنية ناجحة انظر §8

يمكن قراءة الأسعار في أي وقت من نقطة نهاية عامة، فلا تكتبها ثابتة (انظر §9):

curl -sS https://www.suno-api.io/api/pricing/catalog | jq '.data.catalog.meta'
# {
#   "generation_price": "0.6",
#   "voice_generation_price": "1.2",      ← السعر الأساسي للكوفر بالصوت
#   "max_mode_factor": "2",
#   "enhanced_upload_price": "10",        ← سعر الاستنساخ المعزّز
#   "voice_auto_verify_price": "5",
#   "voice_long_term_clone_price": "5"
# }

الكوفر يعمل بنمط خصم مسبق + إعادة المبلغ عند الفشل:

1.7 قاموس الحالات

status الخاصة بالصوت:

القيمة المعنى صالح للكوفر
ready جاهز ✅
processing يظهر مع الاستنساخ المعزّز فقط (enhanced=true)؛ قيد المعالجة ❌ (انتظر ready)
failed فشل الإنشاء؛ راجع error_message؛ والاستنساخ المعزّز قد أُعيد مبلغه ❌

status الخاصة بالأغنية (القيمة التي تعيدها نقاط الاستعلام):

القيمة المعنى قابل للتنزيل
submitted / queued / processing قيد التوليد (قد يكون هناك بث معاينة) ❌
completed انتهى ✅
failed فشل؛ أُعيد المبلغ ❌

2. نظرة عامة على نقاط النهاية

# الطريقة المسار الوظيفة الفوترة
1 POST /api/music/voice-profile/create إنشاء صوت (رفع / رابط / base64) مجاني (عدا enhanced=true)
2 POST /api/music/voice-profile/create-from-clip إنشاء صوت من صوت موجود لديك مجاني
3 GET /api/music/voice-profile/list قائمة الأصوات مجاني
4 GET /api/music/voice-profile/{voice_id} تفاصيل الصوت (مع تقدّم الاستنساخ المعزّز) مجاني
5 POST /api/music/voice-profile/delete حذف صوت مجاني
6 POST /api/music/voice-profile/cover كوفر بالصوت / غناء أغنية جديدة 1.2 يوان (MAX 2.4)
7 POST /api/music/query استعلام حالة الأغاني دفعة واحدة مجاني
8 GET /api/music/songs/{song_id} تفاصيل أغنية واحدة مجاني
9 GET /api/music/download تنزيل الملف النهائي مجاني (mp3/رابط تشغيل)
10 POST /api/music/free2 تحويل إلى wav / كلمات إلخ 0.2 يوان لكل أغنية ناجحة
11 POST /api/music/free2/cached جلب عنوان تنزيل مؤرشف مسبقاً مجاني
12 GET /api/music/songs قائمة أعمالي، مع ترقيم مجاني

3. إنشاء صوت

POST /api/music/voice-profile/create

سجّل مقطعاً صوتياً غنائياً كـ«صوت» واحصل على voice_id. بالنسبة للمنصة، الصوت ليس إلا «ملف صوتي + معرّف clip له في المكتبة»، لذلك بعد نجاح الإنشاء يبقى ملف الصوت المصدر محفوظاً بشكل دائم (لاستخدامه في الكوفرات اللاحقة).

3.1 ثلاث صيغ للإدخال (اختر واحدة)

الصيغة أ: رفع ملف multipart (موصى بها)

Content-Type: multipart/form-data

file=<بيانات الصوت الثنائية>   # إلزامي
title=<اسم الصوت>              # اختياري؛ إن كان فارغاً يُستخدم اسم الملف دون الامتداد
file_name=<اسم الملف الأصلي>
source_file_name=<اسم الملف الأصلي>
source_kind=upload|record      # اختياري، علامة المصدر (رفع / تسجيل)؛ الافتراضي upload
enhanced=false|true            # اختياري، true = الاستنساخ المعزّز (انظر §3.5)
client_request_id=<مفتاح منع التكرار>   # اختياري
voice_id=<معرّف خاص>           # اختياري، نادر الاستخدام
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
  -H "Authorization: Bearer $API_KEY" \
  -F "file=@./my-voice.mp3;type=audio/mpeg" \
  -F "file_name=my-voice.mp3" \
  -F "source_file_name=my-voice.mp3" \
  -F "title=صوتي" \
  -F "source_kind=upload"

الصيغة ب: JSON + رابط صوت عام

curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "file_url": "https://your-cdn.example.com/voice/my-voice.mp3",
        "file_name": "my-voice.mp3",
        "title": "صوتي"
      }'

الصيغة ج: JSON + base64

{
  "file_base64": "data:audio/mpeg;base64,//uQxAAA…",
  "file_name": "my-voice.mp3",
  "title": "صوتي"
}

3.2 متطلبات الصوت

البند المتطلب ملاحظات
الحجم ≤ 10 ميجابايت عند التجاوز تقطع البوابة الجسم وتظهر النتيجة كأنها «مرفوضة من Suno»؛ اضغط أو اقتطع أولاً
المدة 6 ثوانٍ على الأقل؛ يُفضَّل 10–60 ثانية أقل من 6 ثوانٍ ترفضه المنصة: Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds.
الصيغة mp3 / wav / m4a / aac / flac / ogg يُحدَّد من امتداد الملف
المحتوى صوت غنائي نظيف؛ تجنّب الكوفرات النهائية أو الأغاني الأصلية بموسيقى مصاحبة الصوت الشبيه جداً بتسجيل موجود في المكتبة يُرفض: This audio matches an existing recording in our catalog. (مقيس)

3.3 الاستجابة

{
  "success": true,
  "message": "",
  "data": {
    "voice_id": "vp_20260926080618509168500DXXrxe",
    "clip_id": "91cc5935-389f-4193-b56b-cc796c15562d",
    "song_id": "91cc5935-389f-4193-b56b-cc796c15562d",
    "account_id": "acc_1790085275308",
    "title": "صوتي",
    "source_file_name": "my-voice.mp3",
    "audio_url": "https://suno-api-p-1437223057.cos.ap-guangzhou.myqcloud.com/create-ui/voice-source/2026/09/26/xxx.mp3",
    "image_url": "https://cdn2.suno.ai/image_91cc5935-389f-4193-b56b-cc796c15562d.jpeg",
    "duration_s": 29.18,
    "enhanced": false,
    "source_kind": "upload",
    "status": "ready",
    "client_request_id": "",
    "created_at": 1790409978,
    "updated_at": 1790409998
  }
}

شرح الحقول (create / list / detail تشترك في المجموعة نفسها):

الحقل النوع ملاحظات
voice_id string معرّف الصوت؛ تستخدمه الكوفرات لاحقاً
clip_id / song_id string معرّف clip لهذا الصوت على جانب Suno (القيمتان متطابقتان)؛ للفحص
account_id string معرّف الحساب المستضيف (للفحص؛ لا يهم العميل)
title string اسم الصوت
source_file_name string اسم الملف الأصلي
audio_url string رابط مباشر طويل الأمد لملف الصوت المصدر، يصلح للمعاينة؛ محفوظ بشكل دائم
image_url string غلاف الصوت (الذي تولّده Suno للصوت الغنائي)؛ وعند عدم وجود غلاف لا يظهر هذا المفتاح إطلاقاً
duration_s number طول نموذج الصوت بالثواني
enhanced bool هل أُنشئ بالاستنساخ المعزّز
source_kind string upload / record / clip (من صوت موجود)
status string ready / processing / failed
error_message string سبب الفشل؛ يظهر فقط عند failed
task_id number رقم المهمة الأساسية للاستنساخ المعزّز؛ قيمة فقط عند enhanced=true
pre_consumed_quota number المبلغ المخصوم مسبقاً (فقط عند الاستنساخ المعزّز)
created_at / updated_at number ثوانٍ Unix

created_at / updated_at طوابع زمنية بمستوى الثانية (10 أرقام)، لا بالميلي ثانية.

3.4 أخطاء شائعة

HTTP message السبب والمعالجة
200 one of file_path, file_base64, or file_url is required لم يُرفَق محتوى صوتي
200 Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. النموذج قصير جداً؛ استخدم ≥6 ثوانٍ (يُفضَّل ≥10)
200 This audio matches an existing recording in our catalog. النموذج شبيه جداً بتسجيل موجود في المكتبة؛ استخدم صوتاً جافاً نظيفاً آخر
200 upload succeeded without clip or account identity ردّ المنصة غير طبيعي؛ أعد المحاولة
200 audio file exceeds 30 MB limit تجاوز حدّ الخادم (للعملاء التزم بـ10 ميجابايت)
401 invalid token مفتاح API خاطئ

3.5 الاستنساخ المعزّز (enhanced=true)

لحالات «النموذج الصوتي نفسه يحمل كلمات محمية بحقوق النشر / يلزم رفع معزّز». السعر سعر الرفع المعزّز (افتراضياً 10 يوان لكل طلب، ويُرد تلقائياً عند الفشل):

curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
  -H "Authorization: Bearer $API_KEY" \
  -F "file=@./my-voice.mp3" -F "title=صوتي" -F "enhanced=true"

4. إنشاء صوت من ملف صوتي موجود

إن لم ترغب في الرفع مرة أخرى: انسخ مباشرة ملفاً صوتياً رفعته سابقاً أو ولّدته سابقاً إلى صوت. مجاني ومنع تكراره آمن.

POST /api/music/voice-profile/create-from-clip
Content-Type: application/json

{
  "source_song_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
  "title": "Xu Qing Qiang",
  "client_request_id": "vp-clip-1789…"
}

الاستجابة كل حقول §3.3 مع حقلي قراءة فقط:

الحقل ملاحظات
reused true = هذا الملف كان صوتك سابقاً ويُستخدم من جديد
source_type مصدر الصوت: generate / custom_generate / voice_generate / upload_source / enhanced_upload
{
  "success": true,
  "data": {
    "voice_id": "vp_20260926081712557959800Z5gvlt",
    "clip_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
    "title": "Xu Qing Qiang",
    "status": "ready",
    "enhanced": true,
    "reused": true,
    "source_type": "enhanced_upload"
  }
}

الأخطاء (message كما تُعاد؛ يُفضَّل عرضها أو ترجمتها):

message المعنى
source audio not found المقطع غير موجود أو ليس ملكك
source audio is invalid ذلك الصوت ما زال قيد التوليد / ناتج وسيط ولا يصلح بعد
source_song_id is required لم يُرسل source_song_id

5. القائمة / التفاصيل / الحذف

5.1 القائمة

GET /api/music/voice-profile/list
GET /api/music/voice-profile/list?include_deleted=true
{
  "success": true,
  "message": "",
  "data": {
    "items": [ { "voice_id": "vp_…", "title": "صوتي", "status": "ready", "audio_url": "…", "image_url": "…" } ],
    "total": 1
  }
}

الحقول مطابقة تماماً §3.3. لا تُعاد الأصوات المحذوفة افتراضياً.

5.2 التفاصيل

GET /api/music/voice-profile/{voice_id}

تعيد كائن صوت واحداً (data هو الكائن نفسه لا مصفوفة). وأثناء عمل الاستنساخ المعزّز تُضاف:

الحقل ملاحظات
progress_percent عدد صحيح من 0 إلى 100
progress_stage معرّف المرحلة، مثل media_preparing
progress_message نص التقدّم المعروض للمستخدم

5.3 الحذف

POST /api/music/voice-profile/delete
Content-Type: application/json

{ "voice_id": "vp_2026…" }
{ "success": true, "message": "", "data": { "voice_id": "vp_2026…", "status": "deleted" } }

6. الكوفر بالصوت (نقطة النهاية المحورية)

POST /api/music/voice-profile/cover
Content-Type: application/json

إرسال واحد يولّد أغنيتين (مثل التوليد العادي).

6.1 سيناريوهان

السيناريو الشرط الشرح
أ. كوفر أغنية محددة أُرسل song_clip_id يغني تلك الأغنية بصوتك (اللحن / الإيقاع / المقاطع كما الأصل؛ والصوت يصبح صوتك)
ب. غناء أغنية جديدة بالصوت لم يُرسل song_clip_id يُعطى الصوت + كلمات (اختياري) + متطلبات الأسلوب؛ فيؤلّف النموذج لحناً جديداً بالأسلوب ذاته ويغنيه

يعكس resolved_scene في الاستجابة قيمة cover أو sing، فتعرف أي مسار سُلك.

6.2 حقول الطلب

الحقل النوع إلزامي الافتراضي ملاحظات
model string نعم — اسم النموذج للعميل، انظر §6.5. دونه يعيد model is required (HTTP 500)
voice_id string أحدهما — معرّف الصوت (vp_…)؛ يجب أن يكون status=ready
voice_clip_id string أحدهما — يمكن استخدام معرّف clip للصوت؛ وعند إرسال الاثنين يُعتمد voice_id
song_clip_id string لا فارغ معرّف clip (song_id) للأغنية المطلوب كوفرها. عدم الإرسال = السيناريو ب
lyrics string لا فارغ الكلمات كاملة، تُرسل حرفاً بحرف دون إعادة كتابة أو قطع؛ ≤ 3000 حرف
cover_requirements string لا فارغ متطلبات الكوفر بلغة طبيعية، مثل «نطق أوضح». تُدمج في prompt ثابت
style_requirements string لا فارغ متطلبات الأسلوب، مثل «فولك بطيء، جيتار أكوستيك»
title string لا فارغ عنوان الأغنيتين في مساحة العمل (يؤثر على song_title في الاستعلامات اللاحقة)
negative_tags string لا فارغ أساليب مستبعدة، مثل إلكتروني, راب؛ ≤ 1000 حرف
vocal_gender string لا فارغ m / f (ويقبل male / female)؛ فارغ = غير محدد
duration number لا فارغ المدة المرغوبة بالثواني، عدد صحيح من 1 إلى 480؛ فارغ = المنصة تقرر. الحد العملي الأدنى للمنصة نحو 30 ثانية: القيم الأصغر أنتجت في القياسات أغنيات بنحو 30 ثانية
audio_weight number لا 0.85 Audio Influence، كسر عشري من 0 إلى 1. الأعلى يقرب من نموذج الصوت
style_weight number لا فارغ تأثير الأسلوب، كسر عشري من 0 إلى 1
weirdness_constraint number لا فارغ الإبداعية، كسر عشري من 0 إلى 1 (إن كانت الواجهة بالنسبة المئوية فاقسم على 100)
variety number لا فارغ التنوّع، عدد صحيح من 0 إلى 4 (ليس نسبة مئوية)، مدعوم في سلسلة v6 فقط
max_mode boolean لا false Max Mode، السعر ×2
client_request_id string لا فارغ معرّف الإرسال، يُكتب في سجل المهمة على الخادم للفحص (لا يمنع التكرار)

يُفضَّل إرسال الترويسة X-Create-Ui-Client-Request-Id: <المعرّف نفسه> أيضاً: فهي وحدها تُكتب في سجل المهمة على الخادم وتكون مفتاحاً أساسياً للفحص لاحقاً (انظر §1.5).

تنبيه على الوحدات: audio_weight / style_weight / weirdness_constraint كسور من 0 إلى 1، وvariety عدد صحيح من 0 إلى 4، وduration بالـثواني. الخلط بينها يؤدي إلى الرفض أو نتائج غريبة.

الكلمات اختيارية في السيناريو ب (النموذج يتولى الأمر)، لكن أرسل lyrics دائماً عندما تريد غناء محتوى معين.

6.3 الاستجابة

{
  "code": 200,
  "message": "success",
  "data": {
    "voice_id": "vp_20260926081712557959800Z5gvlt",
    "voice_clip_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
    "song_clip_id": "5b773e9a-a035-4134-a4a4-29c9961d3ccb",
    "resolved_scene": "cover",
    "model": "suno-v6",
    "audio_weight": 0.85,
    "clips": [
      {
        "song_id": "0f2a…",
        "status": "processing",
        "song_title": "",
        "model_version": "suno-v6",
        "audio_url": "",
        "play_url": "https://media.suno-api.io/play/0f2a…?expires=…&signature=…",
        "lyrics": "",
        "description": "[مهمة] هذا كوفر. … (الجزء البنيوي الثابت من الخادم + متطلبات الكوفر / الأسلوب التي أدخلتها)"
      },
      {
        "song_id": "7c91…",
        "status": "processing",
        "model_version": "suno-v6",
        "audio_url": ""
      }
    ],
    "source_updates": []
  }
}

النقاط المهمة:

  1. حدّد النواتج النهائية عبر clips[].song_id (هذه النقطة لا تعيد الحقل id).
  2. تحصل فوراً على قيمتَي song_id، وstatus ما زال processing (يعني القبول فقط) وaudio_url فارغاً؛ ولا بد من الاستعلام حتى completed قبل التنزيل. أما play_url فهو بث المعاينة من المنصة، وقد يظهر من مرحلة الإرسال وسينتهي.
  3. description هو الـ prompt الذي يرسله الخادم في النهاية (الجزء البنيوي الثابت + ما أدخلته في cover_requirements / style_requirements)؛ ومفيد جداً عند تحليل النواتج.
  4. source_updates نتيجة معالجة المواد على الخادم، ويمكن للعميل تجاهلها.
  5. title الذي ترسله يُكتب في سجل المهمة على الخادم ويظهر كـ song_title في الاستعلامات اللاحقة؛ وكون clips[].song_title فارغاً في ردّ الإرسال أمر طبيعي.

6.4 الأخطاء

{ "error": { "message": "هذا الصوت غير موجود أو تم حذفه (voice_id=vp_xxx)…", "type": "new_api_error", "param": "", "code": "invalid_request" } }
HTTP message السبب
500 model is required الجسم بلا model (حقل إلزامي لاختيار القناة)
400 voice_id is required and must be a ready voice لم يُرسل voice_id، أو أُرسلت قيمة حجز مؤقت / صوت غير جاهز
400 هذا الصوت غير موجود أو تم حذفه (voice_id=vp_xxx)… الصوت محذوف أو غير موجود أو لا يخص الحساب الحالي. استخدم صوتاً آخر متاحاً أو أنشئ صوتاً جديداً
400 هذا الصوت تم حذفه (voice_id=vp_xxx)… عند تمرير المادة مباشرة بـ voice_clip_id، يكون صوت تلك المادة قد حُذف؛ والمعالجة كما سبق
400 voice is not ready yet (status=processing) الصوت ما زال قيد الإنشاء؛ انتظر ready وأعد المحاولة
400 song_clip_id must be a real completed clip song_clip_id حجز مؤقت / غير منتهٍ
400 song_clip_id must differ from the voice clip لا يمكن أن يكون هدف الكوفر هو نموذج الصوت نفسه
400 audio_weight must be a number between 0 and 1 وحدة المنزلق خاطئة (أُرسلت نسبة مئوية)
400 duration must be an integer between 1 and 480 seconds المدة ليست عدداً صحيحاً من 1 إلى 480
400 vocal_gender must be one of m, f, male, female قيمة جنس غير صالحة
400 variety must be an integer between 0 and 4 / variety is only supported on v6 models قيمة التنوّع غير صالحة أو النموذج غير مدعوم

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

6.5 النماذج المتاحة (أسماء العملاء)

اسم النموذج ملاحظات
suno-v6 الافتراضي، موصى به
suno-v6-wild أكثر انطلاقاً
suno-v6-mini خفيف

استخدم أسماء النماذج المخصّصة للعملاء (الواردة أعلاه). أما chirp-* فهي أسماء داخلية للمنصة ولا تُستخدم مباشرة.


7. متابعة التقدّم

7.1 استعلام دفعة واحدة (موصى به)

POST /api/music/query
Content-Type: application/json

{ "model": "suno-v6", "song_ids": "id1,id2" }
[
  {
    "song_id": "0f2a…",
    "song_title": "نمران",
    "status": "completed",
    "audio_url": "https://suno-api-hk-1437223057.cos.ap-hongkong.myqcloud.com/assets/0f2a…-mp3.mp3",
    "cover_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
    "duration": 115.15,
    "model_version": "suno-v6",
    "generation_type": "voice_profile_cover",
    "play_url": "https://media.suno-api.io/play/…?expires=…&signature=…",
    "lyrics": "[Verse 1]…",
    "prompt": "[Verse 1]…",
    "description": "[مهمة] هذا كوفر. … (prompt الخادم النهائي)",
    "style_tags": "…",
    "created_at": "2026-09-25T18:19:09.918Z",
    "video_url": ""
  }
]
الحقل ملاحظات
status انظر §1.7؛ ولا يُعدّ المنتهي إلا completed
audio_url رابط مباشر mp3؛ يُملأ بعد completed فقط
cover_url عنوان الغلاف
duration المدة الفعلية بالثواني
generation_type الأغاني من كوفر بالصوت تكون دائماً voice_profile_cover
play_url عنوان معاينة موقّع (ينتهي)
song_title عنوان المهمة (أي title الذي أرسلته؛ وإن لم ترسل يضع الخادم قيمة افتراضية)
lyrics / prompt الكلمات النهائية / النص الأصلي
description الـ prompt النهائي الذي يرسله الخادم (مع الجزء البنيوي الثابت)
style_tags وصف الأسلوب النهائي
created_at سلسلة ISO 8601 (لاحظ اختلافها عن ثواني Unix في نقطة التفاصيل)

توصية الاستعلام: كل 5–10 ثوانٍ، بمهلة إجمالية 10–15 دقيقة (أبطأ حساب «بارد» في القياسات استغرق نحو 4.5 دقيقة؛ وقليل جداً أكثر). لا تحكم على الانتهاء من فراغ audio_url، بل من status.

ملاحظة توافق: هذه النقطة تعرّف الأغاني بـ song_id؛ وقد ظهر الحقل id في بعض الاستجابات المبكرة، لذا row.song_id || row.id هي القراءة الآمنة.

7.2 تفاصيل أغنية واحدة

GET /api/music/songs/{song_id}
{
  "success": true,
  "data": {
    "song_id": "0f2a…",
    "title": "نمران",
    "status": "completed",
    "generation_type": "voice_profile_cover",
    "model": "suno-v6",
    "duration": 115.15,
    "audio_url": "https://…/assets/0f2a…-mp3.mp3",
    "image_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
    "wav_url": "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=wav",
    "video_url": "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=video",
    "created_at": 1790411012,
    "completed_at": 1790411500,
    "parameters": {
      "prompt": "[Verse 1]…",
      "style_tags": "…",
      "title": "نمران",
      "model": "suno-v6",
      "generation_type": "voice_profile_cover",
      "source_song_id": "5b773e9a-…"
    },
    "parameter_retention": {
      "core_parameters_available": true,
      "extended_parameters_available": false,
      "sources": ["suno_tasks"],
      "unavailable_fields": ["negative_tags", "vocal_gender", "style_weight", "weirdness_constraint"]
    }
  }
}

7.3 أعمالي

GET /api/music/songs?p=1&page_size=20
GET /api/music/songs?status=completed&q=كلمة مفتاحية

معاملات الترقيم: p (رقم الصفحة من 1) / page_size (عدد العناصر في الصفحة؛ والصيغة المتوافقة ps). واختياري status وq (كلمة مفتاحية في العنوان). الترتيب الافتراضي بحسب زمن الإنشاء تنازلياً.

{
  "success": true,
  "data": {
    "page": 1,
    "page_size": 20,
    "total": 42,
    "items": [
      {
        "song_id": "0f2a…",
        "title": "نمران",
        "status": "completed",
        "generation_type": "voice_profile_cover",
        "model": "suno-v6",
        "duration": 115.15,
        "audio_url": "https://…/assets/0f2a…-mp3.mp3",
        "image_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
        "created_at": 1790411012,
        "completed_at": 1790411500
      }
    ]
  }
}

بواسطة generation_type=voice_profile_cover تميّز «الأغاني الناتجة من كوفر بالصوت» عن بقية نتائج التوليد.


8. تنزيل النواتج

8.1 أخذ mp3 مباشرة (موصى به، مجاني)

كل الطرق الثلاث تعمل؛ اختر واحدة:

  1. استخدم audio_url من نتيجة الاستعلام (رابط مباشر إلى تخزين الكائنات، الأسهل).
  2. GET /api/music/download?song_id=<id>&kind=mp3 → يعيد بث بايتات الصوت مباشرة (واسم الملف موجود في Content-Disposition).
  3. POST /api/music/download-url (للحصول على عنوان مؤقت موقّع).
curl -sS -L "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=mp3" \
  -H "Authorization: Bearer $API_KEY" -o song.mp3

قيم kind: mp3 (مكافئ لـ song) / playback (تشغيل بثّي) / wav / video / lyrics / timestamped_lyrics. وtimestamped_lyrics (.lrc) متاح حالياً لبعض الأغاني فقط؛ وعند فشله أنشئ الملف بنفسك عبر واجهة الكلمات بمُهر زمني. الاستجابة هي بث بايتات الملف كما هو، وContent-Type وContent-Disposition (اسم الملف) مضبوطان؛ أما wav_url / video_url التي يعيدها GET /api/music/songs/{song_id} فهي المدخل نفسه مع kind=wav|video.

8.2 تحويل إلى wav / كلمات / بيانات وصفية (مدفوع)

POST /api/music/free2
Content-Type: application/json

{ "song_ids": ["0f2a…"], "files": ["mp3", "wav", "lyrics"] }
{
  "success": true,
  "data": {
    "songs": [
      { "song_id": "0f2a…", "files": [ { "type": "mp3", "url": "https://…" }, { "type": "wav", "url": "https://…" } ] }
    ],
    "requested_songs": 1,
    "succeeded_songs": 1,
    "price": 0.2
  }
}

9. استعلام الأسعار

GET /api/pricing/catalog

نقطة نهاية عامة لا تحتاج مصادقة. كل الأسعار التي يحتاج العميل عرضها في data.catalog.meta (سلاسل نصية):

المفتاح المعنى القيمة الحالية
generation_price التوليد العادي 0.6
voice_generation_price السعر الأساسي للكوفر بالصوت 1.2
max_mode_factor مضاعف Max Mode 2
enhanced_upload_price الاستنساخ المعزّز / الرفع المعزّز 10
voice_auto_verify_price التحقق التلقائي من الصوت 5
voice_long_term_clone_price استنساخ الصوت طويل الأمد 5

تُعدَّل الأسعار في لوحة الإدارة، لذا اقرأها مباشرة ولا تكتبها ثابتة في العميل. والخصم الفعلي للكوفر = voice_generation_price × (وإذا كان max_mode صحيحاً يُضاف × max_mode_factor).


10. الحدود والتنبيهات

  1. حجم الرفع: ≤ 10 ميجابايت (الخادم يقبل أكثر، لكن بوابة الدخول تقطع الأجسام الكبيرة عند 10 ميجابايت ثنائية وتظهر كأنها «مرفوضة من Suno»؛ فامنعها من جهتك أولاً).
  2. مدة النموذج: 6 ثوانٍ على الأقل، ويُفضَّل 10–60 ثانية؛ وأقل من ذلك ترفضه المنصة.
  3. محتوى النموذج: صوت غنائي نظيف؛ وتجنّب أي شيء يشبه تسجيلاً موجوداً (مقارنة المكتبة ترفضه).
  4. حدود النصوص: lyrics ≤ 3000 حرف؛ ويُستحسن أن تبقى style_requirements / negative_tags / title ضمن 1000 / 1000 / 100 حرف (متطلبات الأسلوب والكوفر تُدمج في الـ prompt، فأبقِ الإجمالي ضمن 3000 حرف).
  5. لا تُعاد كتابة الكلمات: ما ترسله هو ما يُغنّى (حرفاً بحرف) دون قطع محلي.
  6. كل أغنية تُنتج نسختين؛ لا تفترض نتيجة واحدة.
  7. الملف الصوتي المصدر محفوظ بشكل دائم: حذف الصوت لا يمسح ملف الصوت المصدر؛ وهذا يبقي الكوفرات اللاحقة ممكنة ويجعل الامتثال قابلاً للتتبّع.
  8. يجب أن يكون الصوت ready: الصوت بحالة processing لا يصلح للكوفر.
  9. مهلة الطلب: في حساب «بارد» استغرق أول إرسال في القياسات حتى نحو 4.5 دقيقة، فاضبط مهلة العميل على ≥ 6 دقائق. والكوفر لا يزيل التكرار على مستوى الطلب، لذا بعد انتهاء المهلة تحقق أولاً من عدم ظهور أغنية جديدة (§1.5) ثم قرر الإعادة.
  10. ملكية الصوت: الأصوات تخص منشئها؛ والكوفر يقبل فقط الأصوات الجاهزة وغير المحذوفة. والصوت غير الموجود أو المحذوف أو التابع لحساب آخر يعيد 400: هذا الصوت غير موجود أو تم حذفه (voice_id=…).

11. الأسئلة الشائعة (FAQ)

س1. هل إنشاء الصوت مكلف؟ الإنشاء العادي و«الإنشاء من صوت موجود» مجانيان؛ ولا تُحاسَب إلا الكوفرات (1.2 يوان / MAX 2.4 يوان) والاستنساخ المعزّز (افتراضياً 10 يوان).

س2. هل يمكن استخدام أغنية نهائية بموسيقى مصاحبة كنموذج صوتي؟ غير موصى به. أي شيء يحتوي موسيقى أو يشبه جداً تسجيلاً موجوداً في المكتبة ترفضه المنصة (This audio matches an existing recording in our catalog.). استخدم تسجيلاً غنائياً خالصاً وجافاً.

س3. لماذا يكون audio_url فارغاً بعد إرسال الكوفر؟ الإرسال يعني القبول فقط وstatus ما زال processing. ويظهر عنوان قابل للتشغيل/التنزيل فقط بعد الاستعلام بـ /api/music/query حتى status=completed.

س4. هل أرسل الكلمات في السيناريو ب (بلا song_clip_id)؟ اختياري. أرسل lyrics لغناء محتوى محدد؛ وبدونه يتولى النموذج الأمر لكن بتحكّم أقل.

س5. هل يمكن استخدام ملف رفعه العميل كصوت مباشرة؟ نعم: عبر صيغة file_url في create، أو برفعه كأغنية أولاً ثم استدعاء create-from-clip.

س6. هل يُعاد المال عند الفشل؟ الطلب المرفوض مباشرة (معاملات خاطئة / خطأ من المنصة) لا يُخصم منه بحسب القياسات؛ والمهمة المقبولة التي تفشل في النهاية تعيد المبلغ المخصوم مسبقاً. وعند الفشل النهائي تُعيد المهمة status=failed مع error_message.

س7. بعد حذف الصوت، هل يمكن سماع الأغاني التي أُنتجت به؟ نعم. الحذف يؤثر فقط على إمكانية استخدام ذلك الصوت في كوفرات جديدة.

س8. ما أقصى طول أغنية يمكن كوفرها دفعة واحدة؟ duration يقبل من 1 إلى 480 ثانية؛ وإن لم ترسله تحدده المنصة بحسب الأغنية الأصلية / المادة. وانتبه: أقصر ناتج نهائي للمنصة نحو 30 ثانية؛ فالقيم الأصغر أعطت في القياسات 29.96 / 29.76 ثانية.


الملحق أ: مثال كامل (Node.js، مع الاستعلام والتنزيل)

const BASE = "https://www.suno-api.io";
const KEY = process.env.SUNO_API_KEY;
const H = { Authorization: `Bearer ${KEY}` };

// ① إنشاء الصوت (multipart)
async function createVoice(filePath, title) {
  const fd = new FormData();
  fd.set("file", new Blob([await (await import("node:fs/promises")).readFile(filePath)], { type: "audio/mpeg" }), "my-voice.mp3");
  fd.set("file_name", "my-voice.mp3");
  fd.set("source_file_name", "my-voice.mp3");
  fd.set("title", title);
  fd.set("client_request_id", `vp-create-${Date.now()}`);
  const res = await fetch(`${BASE}/api/music/voice-profile/create`, { method: "POST", headers: H, body: fd });
  const body = await res.json();
  if (!body.success) throw new Error(body.message);
  return body.data; // { voice_id, status, audio_url, ... }
}

// ② الكوفر
async function cover(voiceId, songClipId, lyrics) {
  const submissionId = `vp-cover-${Date.now()}`;
  const res = await fetch(`${BASE}/api/music/voice-profile/cover`, {
    method: "POST",
    headers: { ...H, "Content-Type": "application/json", "X-Create-Ui-Client-Request-Id": submissionId },
    body: JSON.stringify({
      model: "suno-v6",
      voice_id: voiceId,
      song_clip_id: songClipId || "",
      lyrics: lyrics || "",
      style_requirements: "فولك بطيء، جيتار أكوستيك",
      audio_weight: 0.85,
      max_mode: false,
      client_request_id: submissionId,
    }),
  });
  const body = await res.json();
  if (body.error) throw new Error(body.error.message);
  return body.data; // { resolved_scene, clips: [{ song_id, status }] }
}

// ③ الاستعلام حتى الانتهاء (كل 5 ثوانٍ، وبحد أقصى 15 دقيقة)
async function waitUntilCompleted(songIds) {
  const deadline = Date.now() + 15 * 60 * 1000;
  while (Date.now() < deadline) {
    const res = await fetch(`${BASE}/api/music/query`, {
      method: "POST",
      headers: { ...H, "Content-Type": "application/json" },
      body: JSON.stringify({ model: "suno-v6", song_ids: songIds.join(",") }),
    });
    const songs = await res.json(); // مصفوفة مجرّدة
    if (songs.every((s) => s.status === "completed" || s.status === "failed")) return songs;
    await new Promise((r) => setTimeout(r, 5000));
  }
  throw new Error("timeout waiting for cover");
}

// ④ التنزيل
async function download(songId, outPath) {
  const res = await fetch(`${BASE}/api/music/download?song_id=${encodeURIComponent(songId)}&kind=mp3`, { headers: H });
  if (!res.ok) throw new Error(`download failed: ${res.status}`);
  (await import("node:fs/promises")).writeFile(outPath, Buffer.from(await res.arrayBuffer()));
}

const voice = await createVoice("./my-voice.mp3", "صوتي");
const result = await cover(voice.voice_id, "5b773e9a-a035-4134-a4a4-29c9961d3ccb", "[Verse 1]\nكلمات…");
const ids = result.clips.map((c) => c.song_id);
const songs = await waitUntilCompleted(ids);
for (const [i, s] of songs.entries()) {
  if (s.status === "completed") await download(s.song_id, `./out-${i}.mp3`);
}

الملحق ب: سجل التغييرات

التاريخ التغيير
2026-10-15 توضيح معنى الحذف صريحاً (§5.3)؛ والكوفر بـ voice_id «محذوف / غير مخوَّل» يعيد الآن 400 قبل أي خصم مسبق، مع تحديث جدول الأخطاء والأسئلة الشائعة (بالتزامن مع بوابة حذف الأصوات التي صدرت ذلك اليوم)
2026-10-13 إضافة ملاحظة «لماذا نوصي بهذا المسار» في المقدمة: بحسب تقييمات فعلية من مستخدمين كثيرين، الأغاني من هذا المسار تحافظ على الصوت الأصلي أفضل بوضوح
2026-09-26 الإصدار الأول: إنشاء صوت (ثلاث صيغ إدخال) / الإنشاء من ملف صوتي موجود / القائمة والتفاصيل والحذف / الكوفر بالصوت (السيناريوهان أ وب) / استعلام التقدّم / التنزيل / قراءة الأسعار، مع أدلة مقيسة
التاليواجهة تعزيز الأسلوب

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

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

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