وثائق API
أدِر كل عمليات VDS من اللوحة برمجياً. المسار الأساسي /api/reseller/v1 — جميع الطلبات موقّعة بـ HMAC.
نظرة عامة
توفّر Reseller API إنشاء الخوادم وإدارة الطاقة والوصول للطرفية وتثبيت النظام والتهيئة والجدار الناري والنسخ الاحتياطي وعمليات IP الإضافي عبر REST. وجميع الاستجابات بصيغة JSON.
BASE https://api.vdshost.com/api/reseller/v1
# Tüm istekler şu başlıkları taşır
X-Api-Key: rk_live_xxxxxxxx
X-Timestamp: 1719230400
X-Signature: hmac_sha256(...)
المصادقة (HMAC)
يُوقَّع كل طلب بزوج api_key وapi_secret. ويُولَّد التوقيع من جهة العميل؛ بينما تتحقّق طبقة reseller.api في الخادم من توقيع HMAC والقائمة البيضاء للـ IP وحد المعدّل. وتحمي الطابع الزمني من هجمات إعادة التشغيل.
payload = method + "\n" + path + "\n" + timestamp + "\n" + body
signature = hmac_sha256(api_secret, payload)
# Örnek (curl)
curl -X POST https://api.vdshost.com/api/reseller/v1/vm \
-H "X-Api-Key: KEY" \
-H "X-Timestamp: TS" \
-H "X-Signature: SIG" \
-d '{"product_id":42,"os":"ubuntu-22.04"}'
reseller_api_keys، وتُسجَّل كل الطلبات في reseller_api_logs.
رموز الأخطاء
| الرمز | المعنى |
|---|---|
| 200 / 201 / 202 | نجاح / أُنشئ / في الطابور |
| 400 | جسم الطلب غير صالح |
| 401 | التوقيع غير صالح أو مفقود |
| 403 | الـ IP ليس في القائمة البيضاء / لا صلاحية |
| 409 | اكتُشفت إعادة تشغيل (تكرار الطابع الزمني) |
| 429 | تجاوز حد المعدّل |
الحساب والمنتجات
يُرجِع الرصيد النشط ومستوى الخصم الحالي (TIER) وحالة الحساب.
{
"balance": 3250.00,
"tier": "Gold",
"discount": 28,
"currency": "USD"
}
يسرد منتجات VDS الجاهزة للبيع وأسعار الوحدة للتكوينات المخصّصة.
[
{ "id": 42, "name": "VDS M", "cpu": 4, "ram": 8, "disk": 100, "price": 14.00 }
]
دورة حياة الخادم
يسرد جميع نُسخ VDS المرتبطة بالحساب مع حالاتها.
{ "id": "vm_8f3a21", "status": "running", "ip": "185.x.x.x" }
]
يُرجِع موارد خادم واحد وشبكته وحالته وإحصاءات موارده.
"id": "vm_8f3a21",
"status": "running",
"cpu": 4, "ram": 8, "disk": 100,
"usage": { "cpu": 12.4, "bw": 820.5 }
}
يجهّز VDS جديداً. أرسِل product_id لمنتج جاهز، أو cpu/ram/disk لتكوين مخصّص. ويُحسَب السعر بالخصم وفق الرصيد.
{
"cpu": 4, "ram": 8, "disk": 160,
"os": "ubuntu-22.04", "hostname": "web-01"
}
# Yanıt 201
{ "id": "vm_8f3a21", "status": "provisioning" }
يحدّث موارد CPU أو RAM أو القرص لخادم قائم.
{ "cpu": 8, "ram": 16 }
# → 202 Accepted
يهيّئ الخادم ويعيد تثبيته بنظام التشغيل المختار.
{ "os": "debian-12" }
# → 202 Accepted
يُنهي الخادم نهائياً ويحرّر موارده.
{ "id": "vm_8f3a21", "status": "terminated" }
الطاقة والوصول
تشغيل أو إيقاف أو إعادة تشغيل أو إيقاف قسري. action: start · stop · reboot · force_stop.
{ "action": "reboot" }
# → 200 OK
يُرجِع اسم المستخدم وكلمة المرور الأولية للخادم بأمان.
يعيد تعيين كلمة مرور root/المسؤول للخادم.
{ "password": "yeni-parola" }
يُنشئ رابط طرفية NoVNC/KVM لمرة واحدة يمكن الوصول إليه من المتصفّح.
{ "console_url": "https://console.vdshost.com/...", "expires_in": 120 }
النسخ والأمان
النسخ الاحتياطية
يسرد النسخ الاحتياطية الموجودة للخادم.
يأخذ نسخة فورية.
{ "backup_id": "bk_19c" }
يستعيد النسخة المحدّدة.
{ "backup_id": "bk_19c" }
# → 202 Accepted
يحذف النسخة المحدّدة.
{ "backup_id": "bk_19c" }
# → 200 OK
الجدار الناري
يُرجِع قواعد الجدار الناري المعرّفة على الخادم.
يضيف قاعدة جدار ناري جديدة.
{ "port": 443, "proto": "tcp", "action": "allow" }
يزيل قاعدة الجدار الناري المحدّدة.
التكاملات
يُثبَّت كوحدة خادم. في لوحة الإدارة تضيف خادماً أساسياً (upstream) وتحدّد تعيين ServerConnection: hostname = نطاق VDS Host، username = api_key (مُقنّع)، password = api_secret (مُقنّع). ويُربَط منتجك عبر upstream_product_id وأنظمة التشغيل عبر os_map. ويتدفّق الطلب والتجهيز والطاقة والتهيئة والإنهاء تلقائياً من البداية إلى النهاية.
hostname = api.vdshost.com
username = {api_key} # maskeli
password = {api_secret} # maskeli
module_config = { "upstream_product_id": 42, "os_map": {...} }
تستخدم وحدة خادم WiseCP المنطق الأساسي نفسه المستخدم في WHMCS. وبواسطة UpstreamServerModule + UpstreamApiClient تستدعي المسار الأساسي /api/reseller/v1. ويُحدَّد تعيين المنتج والنظام من إعدادات الوحدة؛ وتُدار دورة حياة VDS بالكامل من واجهة WiseCP.
client.post('vm', body) # oluştur
client.post('vm/{id}/power') # güç
client.post('vm/{id}/reinstall')
client.get('vm/{id}/backups')