مرجع API لـ Vitamin

بِع حسابات VPN والخوادم الافتراضية وأدِرها من موقعك أو بوتك أو سكربتك.

عنوان URL الأساسيhttps://apiservice.vitamindata.net/api/v1

تُصدَر المفاتيح من لوحتك. وإن لم تجد هذا القسم، فاطلب من الدعم تفعيل الوصول إلى API لحسابك.

1

أنشئ مفتاح API من لوحتك وأرسله كرمز حامل (bearer) في كل نداء.

2

نادِ Ping للتحقق من المفتاح، ثم اسحب أسعارك عبر ListPlans وGetVPSStorefront.

3

بِع باستخدام FUNDING_AUTO: رصيدك يدفع حين يكفي، وعميلك يحصل على رابط دفع حين لا يكفي.

المصادقة

كل طلب يحمل مفتاحك كرمز حامل (bearer token). لا توجد كوكيز على هذا المضيف ولا رمز CSRF يُجلب — فالمفتاح وحده هو بيانات الاعتماد كاملةً.

Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

تُنشأ المفاتيح من لوحتك تحت قسم API. ويُعرض السر مرة واحدة فقط عند الإنشاء: نحن لا نخزّن سوى بصمته، فإن ضاع فالحل هو تدوير المفتاح — وهو ما يُصدر سرًّا جديدًا ويُبقي القديم عاملًا ليوم واحد، فتستطيع النشر دون انقطاع.

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

مفاتيح الاختبار

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

كيف يبدو الفشل

المفتاح المجهول والمفتاح الذي لا يملك حسابه وصولًا إلى API يجيبان بالرد 401 نفسه حرفيًا: فالجواب لا يؤكد أبدًا ما إذا كان المفتاح موجودًا. والاستثناء هو مفتاح لك تجاوز فترة تداخل التدوير — إذ يقول api key expired، لأنك تعلم أصلًا أن ذلك المفتاح كان حقيقيًا وتحتاج إلى معرفة سبب توقفه. أما الإخفاقات المتكررة من عنوان واحد فتُكبح — انظر حدود المعدل.

الدفع مقابل الأشياء

كل ما تشتريه — حساب VPN، أو تمديد، أو خادم، أو تجديد، أو ترقية — يمرّ عبر عقد واحد. وأنت من يختار كيف يُموَّل:

fundingماذا يحدث
FUNDING_AUTOموصى به. يخصم من رصيدك إن كان الرصيد يغطي المبلغ؛ وإلا فالنداء ينجح أيضًا ويسلّمك رابط دفع. نداء واحد، ولا خطأ يحتاج إلى تفسير.
FUNDING_BALANCEالرصيد فقط. فإن كان الرصيد غير كافٍ يفشل النداء بـ insufficient_balance (ويظل الخطأ حاملًا رابطًا قابلًا للدفع).
FUNDING_INVOICEيعيد رابط دفع دائمًا، حتى لو كان رصيدك كافيًا.

مع FUNDING_AUTO تفرّع على حقل واحد:

{"order": {...}, "paid": true,  "status": "completed"}
{"order": {...}, "status": "payment_required",
 "invoice": {"invoice_id": "inv_9m2r4t",
             "pay_url": "https://pay.example.com/i/inv_9m2r4t",
             "price_usd": "11.90", "expires_at": "1785499200"}}

completed تعني أن المال قُبض وأن التسليم بدأ — استعلم عبر GetOrder حتى تصبح حالته delivered. وpayment_required تعني أن ترسل عميلك إلى pay_url؛ ويبدأ التسليم من تلقاء نفسه عند دفع الفاتورة.

الأسعار أسعارنا دائمًا. ويمكنك إرسال expected_total_usd كضمانة: فإن اختلفت تسعيرتنا الحديثة، تُرفض البيعة بـ price_changed ومعها الإجمالي الجديد، بدل تحصيل مبلغ لم يره عميلك قط.

إعادة المحاولة بأمان

أرسل ترويسة Idempotency-Key في كل نداء ينفق مالًا. فإن لم تصلك الاستجابة أبدًا — مهلة منتهية، أو اتصال منقطع، أو عامل أُعيد نشره — فأعد إرسال الطلب نفسه بالمفتاح نفسه، وستستعيد النتيجة الأصلية بدل خصم ثانٍ.

Idempotency-Key: 8f14e45f-ea6d-4b3a-9c1b-2f0d5a7e91c3

استخدم مفتاحًا جديدًا لكل إجراء يقوم به العميل (وUUID مثالي لذلك). أما إعادة استخدام مفتاح مع جسم مختلف فتُرفض بـ idempotency_conflict — فهذا الاقتران يعني وجود خلل، وتخمين الطلب الذي قصدته سيكون أسوأ من إخبارك به.

حدود المعدل

كل استجابة مُصادَق عليها تخبرك بموقع مفتاحك:

RateLimit-Limit: 6000
RateLimit-Remaining: 5987
RateLimit-Policy: 6000;w=60

الحدّ لكل مفتاح ولكل دقيقة، ويُضبط لحسابك — والافتراضي يناسب متجرًا؛ أما البوت المزدحم فينبغي أن يطلب زيادة بدل أن يبطّئ نفسه عند الافتراضي. وتجاوزه يجيب بـ 429 مع Retry-After.

يظهر 429 أيضًا إذا أخفق عدد كبير من الطلبات القادمة من عنوان واحد في المصادقة. تلك حماية من التخمين العنيف، وليست حصتك أنت: فهي تزول من تلقاء نفسها (والترويسة تقول متى)، ولا يستدعيها مفتاح سليم أبدًا.

سترى كذلك عائلة X-Ratelimit-* في كل استجابة، حتى تلك التي بلا مفتاح. ذلك كابح خشن لكل عنوان أمام API بأكمله، وليس ميزانية مفتاحك — فاضبط إيقاعك على RateLimit-Remaining، وعامل ترويسات X- على أنها شأن غيرك.

الأخطاء

تعود حالات الفشل على هيئة حالة HTTP وجسم JSON. فحقل code في المستوى الأعلى هو فئة النقل؛ وحقل message في المستوى الأعلى يحمل الرمز الآلي الثابت. أما التفصيل الكامل — الرمز الآلي نفسه، وجملة آمنة، وأي إضافات قابلة للتنفيذ — فيأتي داخل details تحت debug:

{"code": "failed_precondition",
 "message": "insufficient_balance",
 "details": [{"type": "neopay.seller.publicapi.v1.ErrorInfo",
              "value": "CgptZXNzYWdl…",
              "debug": {"code": "insufficient_balance",
                        "message": "insufficient balance",
                        "payUrl": "https://pay.example.com/i/inv_9m2r4t",
                        "orderId": "ord_8c3d1e",
                        "totalUsd": "11.90"}}]}

في قناة الأخطاء خصوصيتان تستحقان البرمجة لهما: value هو بروتوبَف بترميز base64 (تجاهله — واقرأ debug)، وداخل debug تأتي الحقول الإضافية بصيغة lowerCamelCase — payUrl وorderId وtotalUsd وretryAfterSeconds — وهو عُرف Connect، على خلاف snake_case في كل مكان آخر. فرّع على message في المستوى الأعلى أو على debug.code؛ ولا تفرّع على الجملة أبدًا.

الرفض قبل تفويض طلبك

الطلب الذي لا يصل إلى معالِج أصلًا — بلا مفتاح أو بمفتاح خاطئ (401)، أو من عنوان مصدر لا يسمح به المفتاح (403)، أو عند تجاوز حدّ المعدل (429)، أو أثناء عطل في المصادقة (503) — يُرفض عند الباب الأمامي، والباب الأمامي يجيب بجسم أقصر: رمز نقل في code وجملة عادية، دون details ودون رمز آلي.

{"code": "unauthenticated", "message": "invalid api key"}

لذلك فرّع على حالة HTTP في هذه الحالات (واحترم Retry-After عند 429)؛ أما الرموز الآلية أدناه فتخصّ النداءات التي وصلت إلى معالِج. والكابح الخشن لكل عنوان أقدم من ذلك ويجيب بـ {"error":"rate_limited"} — بمفتاح error لا code.

الرمزالمعنىما العمل
forbidden_scopeالمفتاح يفتقر إلى النطاق اللازم لهذا النداء، أو أن هذه العملية محجوبة عنه.اطلب من الدعم توسيع صلاحيات المفتاح.
not_foundلا يوجد كائن كهذا لهذا الحساب.تحقّق من المعرّف. والمعرّف العائد لحساب آخر يجيب بالشيء نفسه — عن قصد.
invalid_requestأحد الحقول مشوّه.صحّحه وأعد الإرسال؛ فإعادة المحاولة دون تغيير لن تُجدي.
insufficient_balanceالتمويل من الرصيد وحده لم يكفِ لتغطيته.استخدم payUrl الموجود في التفاصيل، أو انتقل إلى FUNDING_AUTO.
price_changedلم تعد قيمة expected_total_usd مطابقة.أعد التسعير وأكّد الإجمالي الجديد مع عميلك.
idempotency_conflictاستُخدم ذلك المفتاح مع جسم مختلف.استخدم مفتاحًا جديدًا لكل إجراء.
sandbox_unavailableحاول مفتاح sk_test_ إنفاق مال أو مسّ جهاز حقيقي.متوقّع — استخدم مفتاحًا حيًّا لذلك النداء. مفاتيح الاختبار تقرأ ولا تشتري أبدًا.
unpriceableالتكوين الذي طلبته غير قابل للبيع — خطة أو عقدة بلا سعر، أو سلة لا يغطيها أي نموذج.أعد قراءة الواجهة واطلب تسعيرة قبل الشراء؛ فالتسعيرة ترفض السلة نفسها.
upstream_unavailableأحد المستويات التي نعتمد عليها متوقف.أعد المحاولة مع تراجع تدريجي؛ وقد تكون القراءات قديمة قليلًا.
order_failedفشل التسليم بعد الدفع.لا تعد الشراء. استعلم عبر GetOrder؛ فنحن نعالج هذه الحالات تلقائيًا والدعم يراها.
internalشيء تعطّل لدينا ولم نصنّفه.أعد المحاولة مرة واحدة مع تراجع تدريجي؛ فإن تكرر الأمر فاذكر X-Request-Id للدعم.

الأعراف

  • النقل. كل نداء هو POST {base}/{Method} مع جسم JSON — POST /api/v1/CreateVPNOrder. ولا شيء غير ذلك: أي أسلوب HTTP آخر يجيب بـ 405، ولا يوجد ربط بأفعال REST ولا معاملات في المسار.
  • المال سلسلة نصية. "19.99"، وليس 19.99: فرقم JSON يصبح عددًا عشريًا عائمًا في معظم اللغات ولا يستطيع حفظ السنت بدقة.
  • الأعداد الصحيحة ذات 64 بت تصل كسلاسل نصية. كل عدّاد بايتات وكل طابع زمني يونكس هو 64 بت، والسلك يضعه بين علامتي اقتباس — "remaining_bytes": "96636764160". حلّلها كأعداد صحيحة؛ أما في الطلبات فيجوز لك إرسال أي من الشكلين.
  • الصفر يُحذف. الحقل الذي قيمته 0 أو false أو فارغة لا يظهر في الاستجابة إطلاقًا. عامل الغياب على أنه صفر — وتذكّر أن حدًّا يوميًا قيمته 0 يعني بلا حدّ، لا "0 غيغابايت".
  • الأوقات بثواني يونكس، باستثناء نافذة المعاملات التي تأخذ وتُعيد صيغة RFC3339 أو YYYY-MM-DD.
  • البيانات تُقاس بالبايت، لا بالغيغابايت، في كل رقم.
  • المعرّفات مبهمة. acc_… وord_… وvpn_…. لا تحلّل معرّفًا ولا تولّده أبدًا، ولا تفترض أنها متسلسلة.
  • التصفّح يتم بمؤشر مبهم: أعد إرسال next_cursor من الاستجابة السابقة. وإذا جاء next_cursor فارغًا فقد حصلت على كل شيء.
  • تستخدم جداول الحقول رموز أنواع مختصرة. money — سلسلة عشرية دقيقة؛ unix — ثواني يونكس (64 بت، فهي سلسلة)؛ bytes — عدّاد بايتات (64 بت، فهو سلسلة)؛ int64 — أي عدد 64 بت آخر (سلسلة)؛ int — 32 بت، رقم عادي؛ cursor — مقبض تصفّح مبهم؛ enum — قيمة واحدة بالضبط من القيم المذكورة.
  • تظهر حقول جديدة دون سابق إنذار ولا تتغيّر دلالة الحقول القائمة. تجاهل ما لا تعرفه.

البداية

النداء الأول الذي ينبغي إجراؤه: يثبت أن المفتاح يعمل ويخبرك بالحساب الذي يتبعه.

POST

Ping

أي مفتاح
https://apiservice.vitamindata.net/api/v1/Ping

يجيب بمعرّف حسابك، وما إذا كان المفتاح حيًّا أم اختباريًا، وبساعتنا.

الطلب

لا معاملات — أرسل كائنًا فارغًا، {}.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/Ping \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{}'
الاستجابة200 · application/json
account_idstring

حساب المفتاح — دليل على أن المفتاح تحلّل بنجاح.

modeenum

أي نوع من المفاتيح أرسلت.

إحدى القيم التالية:livetest
server_timeunix

ساعتنا — مفيدة لرصد الانحراف قبل أن يكسر التواقيع أو النوافذ.

نموذج استجابة
{
  "account_id": "acc_9f3k2m7q",
  "mode": "live",
  "server_time": "1785412800"
}

الحساب والرصيد

POST

GetAccount

read
https://apiservice.vitamindata.net/api/v1/GetAccount

بريد حسابك وحالته ولغته وما إذا كان العنوان موثّقًا.

الطلب

لا معاملات — أرسل كائنًا فارغًا، {}.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/GetAccount \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{}'
الاستجابة200 · application/json
accountobject

حسابك.

account.account_idstring

المعرّف العام (acc_…).

account.emailstring

عنوان تسجيل الدخول.

account.statusstring

active ما لم يكن الحساب مقيّدًا.

account.localestring

لغة الحساب — تتوطّن بها أسماء البطاقات والإشعارات.

account.email_verifiedbool

تم تأكيد العنوان.

account.created_atunix

متى أُنشئ الحساب.

نموذج استجابة
{
  "account": {
    "account_id": "acc_9f3k2m7q",
    "email": "dev@example.com",
    "status": "active",
    "locale": "en",
    "email_verified": true,
    "created_at": "1769000000"
  }
}
POST

GetBalance

read
https://apiservice.vitamindata.net/api/v1/GetBalance

رصيدك الدفتري وما يمكن للشراء السحب منه فعليًا.

available_usd هو الرقم الذي يجب فحصه قبل الشراء — فهو يستثني كل ما حجزه طلب قيد التنفيذ.

الطلب

لا معاملات — أرسل كائنًا فارغًا، {}.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/GetBalance \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{}'
الاستجابة200 · application/json
balance_usdmoney

الرصيد الدفتري الكامل.

available_usdmoney

الرصيد ناقص الحجوزات — أي ما يمكن للشراء إنفاقه الآن.

as_ofstring

الطابع الزمني الدفتري للأرقام، بصيغة RFC3339.

نموذج استجابة
{
  "balance_usd": "72.60",
  "available_usd": "60.70",
  "as_of": "2026-07-29T12:00:00Z"
}
POST

ListTransactions

read
https://apiservice.vitamindata.net/api/v1/ListTransactions

سجلك المالي، الأحدث أولًا.

الافتراضي هو آخر ثلاثة أشهر. وأي نافذة أوسع من 92 يومًا تُضيَّق، وتخبرك الاستجابة بالنافذة التي طُبّقت فعلًا — فلا تكون الإجابة القصيرة ملتبسة أبدًا.

الطلب
limitintاختياري

حجم الصفحة. الافتراضي 25، والحد الأقصى 100.

cursorcursorاختياري

قيمة next_cursor من الاستجابة السابقة. احذفه للصفحة الأولى.

kindstringاختياري

مرشّح اختياري مفصول بفواصل على قيم kind المذكورة أدناه.

fromstringاختياري

بداية النافذة، بصيغة RFC3339 أو YYYY-MM-DD.

tostringاختياري

نهاية النافذة. وقيمة to بتاريخ فقط تشمل ذلك اليوم كاملًا.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/ListTransactions \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"limit":25,"cursor":"","kind":"topup_credit,invoice_debit_reserved","from":"2026-05-01","to":"2026-07-30"}'
الاستجابة200 · application/json
transactionsarray

أسطر السجل.

transactions[].idstring

معرّف سطر السجل.

transactions[].tsstring

متى، بصيغة RFC3339.

transactions[].kindenum

ما الذي حرّك المال. topup_credit شحن رصيد مدفوع؛ ونوعا invoice_debit_* عمليتا شراء. أما الحجز الداخلي لطلب قيد التنفيذ وتحريره فليسا جزءًا من هذا التدفق.

إحدى القيم التالية:topup_creditexternal_creditinvoice_debit_reservedinvoice_debit_externaloverpay_creditmanual_creditmanual_debitspend_debitspend_refundautomated_correction
transactions[].amount_usdmoney

بإشارة — سالب في عمليات الخصم.

transactions[].balance_after_usdmoney

الرصيد الجاري بعد هذا السطر.

transactions[].ref_invoice_idstring

الفاتورة خلف الحركة — مرّرها إلى GetInvoice للقصة كاملة.

transactions[].descriptionstring

وصف بشري قصير. للعرض فقط؛ ولا تفرّع عليه أبدًا.

next_cursorcursor

أعد إرساله كـ cursor للصفحة التالية. والغياب أو الفراغ = حصلت على كل شيء.

has_morebool

توجد أسطر أخرى بعد هذه الصفحة.

fromstring

النافذة المطبَّقة فعلًا (RFC3339). وإن كانت أضيق مما طلبت ⇐ فقد بلغت سقف 92 يومًا.

tostring

نهاية النافذة المطبَّقة.

نموذج استجابة
{
  "transactions": [
    {"id": "tx_01j9zq", "ts": "2026-07-28T09:14:03Z", "kind": "invoice_debit_reserved",
     "amount_usd": "-11.90", "balance_after_usd": "72.60",
     "ref_invoice_id": "inv_5k8p2q", "description": "order ord_7b2c9d"},
    {"id": "tx_01j8xw", "ts": "2026-07-25T18:40:11Z", "kind": "topup_credit",
     "amount_usd": "50.00", "balance_after_usd": "84.50", "ref_invoice_id": "inv_3d1x8n"}
  ],
  "from": "2026-04-30T00:00:00Z",
  "to": "2026-07-29T23:59:59Z"
}
POST

CreateTopup

buyIdempotency-Key
https://apiservice.vitamindata.net/api/v1/CreateTopup

يُنشئ فاتورة قابلة للدفع تضيف أموالًا إلى رصيدك.

وجّه عميلك (أو نفسك) إلى invoice.pay_url. ويتحرّك الرصيد عند دفعها.

الطلب
amount_usdmoneyمطلوب

كم يُضاف، كسلسلة عشرية.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/CreateTopup \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"amount_usd":"50.00"}'
الاستجابة200 · application/json
invoiceobject

الفاتورة القابلة للدفع.

invoice.invoice_idstring

معرّف الفاتورة لدى البوابة (inv_…).

invoice.statusenum

pending قابلة للدفع. وكل ما بين confirmed وdelivered_redirected يعني أن المال دخل بلا رجعة — فعامِلها كلها على أنها مدفوعة. أما expired فتعني أن الرابط انتهى دون دفع.

إحدى القيم التالية:pendingconfirmedsweepingsweptdeliveringdelivereddelivered_redirectedexpired
invoice.pay_urlstring

صفحة الدفع المستضافة. أرسل عميلك إليها؛ فكل وسيلة دفع (عملات، شبكات، رصيد) تعيش خلفها.

invoice.pay_telegram_urlstring

الفاتورة نفسها، قابلة للدفع داخل Telegram: تفتح بوت مزوّد الدفع نفسه، الذي يعرض المبلغ ويستقبل الدفع هناك. اعرضها إلى جانب pay_url للعملاء الذين يفضّلون عدم مغادرة التطبيق. قد تغيب — فلا يملكها إلا مزوّد دفع لديه بوت مُعدّ، ولذلك لا تجعلها زر الدفع الوحيد لديك.

invoice.price_usdmoney

ما تحصّله الفاتورة.

invoice.expires_atunix

متى تُغلق نافذة الدفع.

نموذج استجابة
{
  "invoice": {
    "invoice_id": "inv_3d1x8n",
    "status": "pending",
    "pay_url": "https://pay.example.com/i/inv_3d1x8n",
    "pay_telegram_url": "https://t.me/VitaminPayBot?start=3d1x8n",
    "price_usd": "50.00",
    "expires_at": "1785499200"
  }
}
POST

GetInvoice

read
https://apiservice.vitamindata.net/api/v1/GetInvoice

دفعة واحدة بكامل تفاصيلها، بما في ذلك ما تُظهره الشبكة.

الحقل ref_invoice_id في سطر السجل هو مفتاح الربط. ولا يمكن قراءة سوى الفواتير التي أنشأها حسابك.

الطلب
invoice_idstringمطلوب

من ref_invoice_id في سطر سجل، أو من طلب، أو من عملية شحن رصيد.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/GetInvoice \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"invoice_id":"inv_5k8p2q"}'
الاستجابة200 · application/json
invoiceobject

الفاتورة نفسها.

invoice.invoice_idstring

معرّف الفاتورة لدى البوابة (inv_…).

invoice.statusenum

pending قابلة للدفع. وكل ما بين confirmed وdelivered_redirected يعني أن المال دخل بلا رجعة — فعامِلها كلها على أنها مدفوعة. أما expired فتعني أن الرابط انتهى دون دفع.

إحدى القيم التالية:pendingconfirmedsweepingsweptdeliveringdelivereddelivered_redirectedexpired
invoice.pay_urlstring

صفحة الدفع المستضافة. أرسل عميلك إليها؛ فكل وسيلة دفع (عملات، شبكات، رصيد) تعيش خلفها.

invoice.pay_telegram_urlstring

الفاتورة نفسها، قابلة للدفع داخل Telegram: تفتح بوت مزوّد الدفع نفسه، الذي يعرض المبلغ ويستقبل الدفع هناك. اعرضها إلى جانب pay_url للعملاء الذين يفضّلون عدم مغادرة التطبيق. قد تغيب — فلا يملكها إلا مزوّد دفع لديه بوت مُعدّ، ولذلك لا تجعلها زر الدفع الوحيد لديك.

invoice.price_usdmoney

ما تحصّله الفاتورة.

invoice.expires_atunix

متى تُغلق نافذة الدفع.

paymentsarray

ما تُظهره الشبكة. تكون فارغة للفاتورة المموّلة من الرصيد (فلا شبكة تدخّلت) وللفاتورة التي لم يدفعها أحد بعد — والقائمة الفارغة ليست خطأ.

payments[].chainstring

الشبكة التي وصلت عبرها الدفعة (tron، bsc، …).

payments[].assetstring

ما الذي دُفع (USDT، …).

payments[].amountmoney

مقدار الأصل، بدقة.

payments[].tx_hashstring

المعاملة على الشبكة — وهي إثبات الدفع لدى عميلك.

payments[].confirmedbool

أنهت الشبكة تأكيدها.

payments[].seen_atunix

متى رصدناها أول مرة.

order_idstring

ما اشترته الفاتورة. يغيب في شحن الرصيد، إذ لا يشتري شيئًا.

نموذج استجابة
{
  "invoice": {
    "invoice_id": "inv_5k8p2q",
    "status": "confirmed",
    "pay_url": "https://pay.example.com/i/inv_5k8p2q",
    "price_usd": "11.90",
    "expires_at": "1785499200"
  },
  "payments": [
    {"chain": "tron", "asset": "USDT", "amount": "11.90",
     "tx_hash": "c4a1f09e2b7d", "confirmed": true, "seen_at": "1785412920"}
  ],
  "order_id": "ord_7b2c9d"
}

الأسعار

لا شيء هنا يُنشئ شيئًا — اطلب تسعيرة كما تشاء قبل أن يلتزم عميلك.

POST

ListPlans

read
https://apiservice.vitamindata.net/api/v1/ListPlans

ما يجوز لك بيعه: حدود المؤشرات، وبطاقات السعر الثابت إن كانت واجهتك تستخدمها.

اعرض ما جاء ممتلئًا منهما. تُشترى البطاقة بوضع bundle_id الخاص بها في السلة؛ أما سلة المؤشرات فتستخدم gb/months/users.

الطلب

لا معاملات — أرسل كائنًا فارغًا، {}.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/ListPlans \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{}'
الاستجابة200 · application/json
model_namestring

نموذج التسعير الخاص بواجهتك.

model_typestring

إصدار محرّكه.

boundsobject

قواعد المُهيِّئ — وكل تسعيرة وكل طلب يعيد التحقق منها على الخادم.

bounds.gb_minint

أصغر حجم بيانات يجوز للسلة طلبه.

bounds.gb_maxint

الأكبر.

bounds.gb_stepint

خطوة المؤشر.

bounds.users_minint

أقل عدد أجهزة متزامنة.

bounds.users_maxint

الأكثر.

bounds.months_minint

أقصر مدة.

bounds.months_maxint

الأطول.

bounds.new_accounts_maxint

أكبر عدد حسابات يمكن لطلب واحد إنشاؤها.

bounds.extend_maxint

أكبر عدد حسابات يمكن لطلب واحد تمديدها.

bounds.default_gbint

قيمة افتراضية معقولة للمؤشر.

bounds.default_usersint

عدد الأجهزة الافتراضي.

bounds.default_monthsint

المدة الافتراضية.

bundlesarray

بطاقات السعر الثابت، حين تكون واجهتك فهرس بطاقات.

bundles[].bundle_idstring

المقبض الذي يوضع في cart.bundle_id.

bundles[].namestring

اسم البطاقة، موطَّنًا سلفًا بلغة الحساب.

bundles[].gbint

البيانات المشمولة.

bundles[].monthsint

مدة الصلاحية.

bundles[].online_usersint

الأجهزة المتزامنة.

bundles[].price_usdmoney

السعر. وهو السعر فعلًا — لا حاجة إلى تسعيرة للبطاقة.

bundles[].highlightbool

البطاقة المميّزة في الواجهة.

bundles[].daily_cap_gbint

الحدّ اليومي بالغيغابايت. الغياب = بلا حدّ.

نموذج استجابة
{
  "model_name": "vpn_dynamic",
  "model_type": "dynamic_v2",
  "bounds": {
    "gb_min": 10, "gb_max": 500, "gb_step": 10,
    "users_min": 1, "users_max": 10,
    "months_min": 1, "months_max": 12,
    "new_accounts_max": 5, "extend_max": 10,
    "default_gb": 100, "default_users": 3, "default_months": 1
  },
  "bundles": [
    {"bundle_id": "card_100_1m", "name": "100 GB · 1 month", "gb": 100, "months": 1,
     "online_users": 3, "price_usd": "11.90", "highlight": true}
  ]
}
POST

Quote

read
https://apiservice.vitamindata.net/api/v1/Quote

السعر النهائي لسلة VPN، مفصّلًا بالبنود. والخصومات مطبّقة سلفًا.

الطلب
cartobjectمطلوب

السلة المراد تسعيرها.

cart.kindenumمطلوب

شراء حسابات جديدة، أو إضافة بيانات ومدة إلى حسابات قائمة.

إحدى القيم التالية:newextend
cart.gbintاختياري

البيانات لكل حساب، بالغيغابايت، ضمن الحدود المأخوذة من ListPlans.

cart.monthsintاختياري

مدة الصلاحية لكل حساب، بالأشهر.

cart.usersintاختياري

الأجهزة المتزامنة لكل حساب.

cart.new_accountsintاختياري

مع kind:"new" فقط: كم حسابًا يُنشأ. وأسماء المستخدمين يولّدها الخادم.

cart.extend_vpn_idsarrayاختياري

مع kind:"extend" فقط: الحسابات المراد تمديدها، بمعرّفاتها العامة.

cart.bundle_idstringاختياري

يشتري بطاقة بسعر ثابت من ListPlans.bundles بدل سلة مُهيَّأة. وعند ضبطه تُتجاهل قيم gb/months/users — وتُطبَّق قيم البطاقة وسعرها.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/Quote \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"cart":{"kind":"new","gb":100,"months":1,"users":3,"new_accounts":2}}'
أشكال أخرى لهذا الطلب
تمديد حسابات تملكها بالفعل
{"cart":{"kind":"extend","gb":50,"months":1,"users":3,"extend_vpn_ids":["vpn_6t2k9p","vpn_1a4b7c"]}}
شراء بطاقة بسعر ثابت بدل سلة مُهيَّأة
{"cart":{"kind":"new","bundle_id":"card_100_1m","new_accounts":1}}
الاستجابة200 · application/json
quoteobject

السعر مفصّلًا بالبنود. لا شيء يُنشأ ولا شيء يُحصَّل.

quote.model_namestring

أي نموذج تسعير أجاب.

quote.model_typestring

إصدار محرّك النموذج.

quote.base_usdmoney

السعر قبل الخصومات والرسوم الإضافية.

quote.total_usdmoney

السعر النهائي — أي ما تحصّله بيعة بهذه السلة.

quote.linesarray

التفصيل بالبنود، بإشارات موجبة وسالبة، ومجموعه يساوي الإجمالي تمامًا.

quote.lines[].codestring

ما هذا السطر (base، أو رمز خصم، أو رسم إضافي…).

quote.lines[].kindstring

فئة السطر، للتجميع في واجهتك.

quote.lines[].amount_usdmoney

بإشارة. الخصومات سالبة، ومجموع الأسطر يساوي total_usd تمامًا.

quote.lines[].pctstring

النسبة المئوية خلف السطر، حين توجد.

quote.cappedbool

بلغ الإجمالي سقف النموذج.

quote.floor_appliedbool

رُفع الإجمالي إلى أرضية النموذج.

quote.clampedenum

يُضبط عندما تُقصر قيمة في السلة إلى داخل الحدود قبل التسعير.

إحدى القيم التالية:minmax
quote.invalidstring

إذا لم يكن فارغًا فالسلة غير قابلة للتسعير — اعرضه ولا تحصّل أبدًا تسعيرة كهذه.

quote.metamap

إضافات النموذج، نص→نص (مثل remaining_days في الترقية).

نموذج استجابة
{
  "quote": {
    "model_name": "vpn_dynamic",
    "model_type": "dynamic_v2",
    "base_usd": "14.00",
    "total_usd": "11.90",
    "lines": [
      {"code": "base", "kind": "base", "amount_usd": "14.00"},
      {"code": "loyalty", "kind": "discount", "amount_usd": "-2.10", "pct": "15"}
    ]
  }
}

بيع VPN

POST

CreateVPNOrder

buyIdempotency-Key
https://apiservice.vitamindata.net/api/v1/CreateVPNOrder

يشتري حسابات VPN جديدة، أو يمدّد حسابات قائمة ("kind":"extend" مع extend_vpn_ids).

انظر الدفع مقابل الأشياء للشكلين اللذين قد تتخذهما الاستجابة.

الطلب
cartobjectمطلوب

ما الذي يُشترى — بالشكل نفسه الذي يسعّره Quote.

cart.kindenumمطلوب

شراء حسابات جديدة، أو إضافة بيانات ومدة إلى حسابات قائمة.

إحدى القيم التالية:newextend
cart.gbintاختياري

البيانات لكل حساب، بالغيغابايت، ضمن الحدود المأخوذة من ListPlans.

cart.monthsintاختياري

مدة الصلاحية لكل حساب، بالأشهر.

cart.usersintاختياري

الأجهزة المتزامنة لكل حساب.

cart.new_accountsintاختياري

مع kind:"new" فقط: كم حسابًا يُنشأ. وأسماء المستخدمين يولّدها الخادم.

cart.extend_vpn_idsarrayاختياري

مع kind:"extend" فقط: الحسابات المراد تمديدها، بمعرّفاتها العامة.

cart.bundle_idstringاختياري

يشتري بطاقة بسعر ثابت من ListPlans.bundles بدل سلة مُهيَّأة. وعند ضبطه تُتجاهل قيم gb/months/users — وتُطبَّق قيم البطاقة وسعرها.

fundingenumمطلوب

كيف يُدفع — انظر الدفع مقابل الأشياء. ولا قيمة افتراضية له: فحذفه يُرفض.

إحدى القيم التالية:FUNDING_AUTOFUNDING_BALANCEFUNDING_INVOICE
expected_total_usdmoneyاختياري

ضمانة تأكيد. إذا ضُبط واختلفت تسعيرتنا الحديثة، تُرفض البيعة بـ price_changed بدل تحصيل مبلغ لم يره عميلك قط.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/CreateVPNOrder \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"cart":{"kind":"new","gb":100,"months":1,"users":3,"new_accounts":1},"funding":"FUNDING_AUTO","expected_total_usd":"11.90"}'
أشكال أخرى لهذا الطلب
تمديد حسابات تملكها سلفًا
{"cart":{"kind":"extend","gb":50,"months":1,"users":3,"extend_vpn_ids":["vpn_6t2k9p"]},"funding":"FUNDING_AUTO"}
شراء بطاقة بسعر ثابت، مدفوعة من الرصيد
{"cart":{"kind":"new","bundle_id":"card_100_1m","new_accounts":1},"funding":"FUNDING_BALANCE"}
الاستجابة200 · application/json
orderobject

الطلب — استعلم عبر GetOrder حتى تصبح حالته delivered.

order.order_idstring

المعرّف العام للطلب (ord_…).

order.productenum

ما الذي اشتُري.

إحدى القيم التالية:vpnvps
order.kindstring

شكل الشراء: new أو extend أو upgrade

order.statusenum

دورة الحياة. delivered هي الغاية؛ وneeds_operator تعني أن المال دخل وأن إنسانًا يكمل التسليم — فلا تعد الشراء؛ وexpired تعني أن الفاتورة انتهت دون دفع.

إحدى القيم التالية:createdinvoicedpaiddeliveringdeliveredneeds_operatorfailedrefund_pendingrefundedexpired
order.fundingenum

الوسيلة التي موّلته فعليًا. وFUNDING_AUTO يُحسم إلى إحداها.

إحدى القيم التالية:invoicebalance
order.total_usdmoney

ما يحصّله الطلب.

order.invoice_idstring

الفاتورة التي خلفه — لكل طلب فاتورة، أيًّا كانت وسيلة تمويله.

order.itemsint

كم استحقاقًا يُنشئه الطلب أو يمدّده.

order.created_atunix

متى قُدّم الطلب.

order.delivered_atunix

متى انتهى التسليم. يغيب قبل ذلك.

order.breakdownobject

التسعيرة التي وافق عليها العميل، حرفيًا — بالشكل نفسه الذي يعيده Quote.

invoiceobject

الفاتورة خلف الطلب: قابلة للدفع عند payment_required، ومسدّدة سلفًا عند completed.

invoice.invoice_idstring

معرّف الفاتورة لدى البوابة (inv_…).

invoice.statusenum

pending قابلة للدفع. وكل ما بين confirmed وdelivered_redirected يعني أن المال دخل بلا رجعة — فعامِلها كلها على أنها مدفوعة. أما expired فتعني أن الرابط انتهى دون دفع.

إحدى القيم التالية:pendingconfirmedsweepingsweptdeliveringdelivereddelivered_redirectedexpired
invoice.pay_urlstring

صفحة الدفع المستضافة. أرسل عميلك إليها؛ فكل وسيلة دفع (عملات، شبكات، رصيد) تعيش خلفها.

invoice.pay_telegram_urlstring

الفاتورة نفسها، قابلة للدفع داخل Telegram: تفتح بوت مزوّد الدفع نفسه، الذي يعرض المبلغ ويستقبل الدفع هناك. اعرضها إلى جانب pay_url للعملاء الذين يفضّلون عدم مغادرة التطبيق. قد تغيب — فلا يملكها إلا مزوّد دفع لديه بوت مُعدّ، ولذلك لا تجعلها زر الدفع الوحيد لديك.

invoice.price_usdmoney

ما تحصّله الفاتورة.

invoice.expires_atunix

متى تُغلق نافذة الدفع.

paidbool

المال محصّل. يغيب (= false) مع payment_required.

statusenum

الحقل الذي تفرّع عليه — انظر الدفع مقابل الأشياء.

إحدى القيم التالية:completedpayment_required
نموذج استجابة
{
  "order": {
    "order_id": "ord_8c3d1e", "product": "vpn", "kind": "new",
    "status": "invoiced", "funding": "invoice", "total_usd": "11.90",
    "invoice_id": "inv_9m2r4t", "items": 1, "created_at": "1785412800"
  },
  "invoice": {
    "invoice_id": "inv_9m2r4t", "status": "pending",
    "pay_url": "https://pay.example.com/i/inv_9m2r4t",
    "pay_telegram_url": "https://t.me/VitaminPayBot?start=9m2r4t",
    "price_usd": "11.90", "expires_at": "1785499200"
  },
  "status": "payment_required"
}
POST

GetOrder

read
https://apiservice.vitamindata.net/api/v1/GetOrder

استعلم عبره بعد الشراء: created ← invoiced ← paid ← delivering ← delivered.

الطلب
order_idstringمطلوب

من الطلب الذي قدّمته.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/GetOrder \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"order_id":"ord_7b2c9d"}'
الاستجابة200 · application/json
orderobject

الطلب، مع تفصيله الكامل.

order.order_idstring

المعرّف العام للطلب (ord_…).

order.productenum

ما الذي اشتُري.

إحدى القيم التالية:vpnvps
order.kindstring

شكل الشراء: new أو extend أو upgrade

order.statusenum

دورة الحياة. delivered هي الغاية؛ وneeds_operator تعني أن المال دخل وأن إنسانًا يكمل التسليم — فلا تعد الشراء؛ وexpired تعني أن الفاتورة انتهت دون دفع.

إحدى القيم التالية:createdinvoicedpaiddeliveringdeliveredneeds_operatorfailedrefund_pendingrefundedexpired
order.fundingenum

الوسيلة التي موّلته فعليًا. وFUNDING_AUTO يُحسم إلى إحداها.

إحدى القيم التالية:invoicebalance
order.total_usdmoney

ما يحصّله الطلب.

order.invoice_idstring

الفاتورة التي خلفه — لكل طلب فاتورة، أيًّا كانت وسيلة تمويله.

order.itemsint

كم استحقاقًا يُنشئه الطلب أو يمدّده.

order.created_atunix

متى قُدّم الطلب.

order.delivered_atunix

متى انتهى التسليم. يغيب قبل ذلك.

order.breakdownobject

التسعيرة التي وافق عليها العميل، حرفيًا — بالشكل نفسه الذي يعيده Quote.

invoiceobject

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

نموذج استجابة
{
  "order": {
    "order_id": "ord_7b2c9d", "product": "vpn", "kind": "new",
    "status": "delivered", "funding": "balance", "total_usd": "11.90",
    "invoice_id": "inv_5k8p2q", "items": 1,
    "created_at": "1785230043", "delivered_at": "1785230103",
    "breakdown": {
    "model_name": "vpn_dynamic",
    "model_type": "dynamic_v2",
    "base_usd": "14.00",
    "total_usd": "11.90",
    "lines": [
      {"code": "base", "kind": "base", "amount_usd": "14.00"},
      {"code": "loyalty", "kind": "discount", "amount_usd": "-2.10", "pct": "15"}
    ]
  }
  }
}
POST

ListOrders

read
https://apiservice.vitamindata.net/api/v1/ListOrders

سجل طلباتك، الأحدث أولًا.

الطلب
limitintاختياري

حجم الصفحة. الافتراضي 25، والحد الأقصى 100.

cursorcursorاختياري

قيمة next_cursor من الاستجابة السابقة. احذفه للصفحة الأولى.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/ListOrders \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"limit":25,"cursor":""}'
الاستجابة200 · application/json
ordersarray

الطلبات.

orders[].order_idstring

المعرّف العام للطلب (ord_…).

orders[].productenum

ما الذي اشتُري.

إحدى القيم التالية:vpnvps
orders[].kindstring

شكل الشراء: new أو extend أو upgrade

orders[].statusenum

دورة الحياة. delivered هي الغاية؛ وneeds_operator تعني أن المال دخل وأن إنسانًا يكمل التسليم — فلا تعد الشراء؛ وexpired تعني أن الفاتورة انتهت دون دفع.

إحدى القيم التالية:createdinvoicedpaiddeliveringdeliveredneeds_operatorfailedrefund_pendingrefundedexpired
orders[].fundingenum

الوسيلة التي موّلته فعليًا. وFUNDING_AUTO يُحسم إلى إحداها.

إحدى القيم التالية:invoicebalance
orders[].total_usdmoney

ما يحصّله الطلب.

orders[].invoice_idstring

الفاتورة التي خلفه — لكل طلب فاتورة، أيًّا كانت وسيلة تمويله.

orders[].itemsint

كم استحقاقًا يُنشئه الطلب أو يمدّده.

orders[].created_atunix

متى قُدّم الطلب.

orders[].delivered_atunix

متى انتهى التسليم. يغيب قبل ذلك.

orders[].breakdownobject

التسعيرة التي وافق عليها العميل، حرفيًا — بالشكل نفسه الذي يعيده Quote.

next_cursorcursor

أعد إرساله كـ cursor للصفحة التالية. والغياب أو الفراغ = حصلت على كل شيء.

نموذج استجابة
{
  "orders": [
    {"order_id": "ord_7b2c9d", "product": "vpn", "kind": "new", "status": "delivered",
     "funding": "balance", "total_usd": "11.90", "invoice_id": "inv_5k8p2q",
     "items": 1, "created_at": "1785230043", "delivered_at": "1785230103"}
  ]
}

إدارة VPN

POST

ListVPN

read
https://apiservice.vitamindata.net/api/v1/ListVPN

كل حساب VPN تملكه، مع البيانات المتبقية وتاريخ الانتهاء.

الطلب
limitintاختياري

حجم الصفحة. الافتراضي 50، والحد الأقصى 200.

cursorcursorاختياري

قيمة next_cursor من الاستجابة السابقة. احذفه للصفحة الأولى.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/ListVPN \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"limit":25,"cursor":""}'
الاستجابة200 · application/json
vpnsarray

حساباتك.

vpns[].vpn_idstring

المعرّف العام الذي يأخذه كل فعل VPN آخر.

vpns[].usernamestring

اسم بيانات الاعتماد الظاهر في التطبيقات.

vpns[].statusstring

حالة الحساب كما تعرضها اللوحة — active ما لم يكن موقوفًا أو منتهيًا.

vpns[].remaining_bytesbytes

البيانات المتبقية في كل حزمه مجتمعةً.

vpns[].total_downloadbytes

إجمالي التنزيل مدى الحياة، كما يبلّغ به مستوى VPN لحظيًا. في ListVPN تكون قيمته دائمًا 0 — لأن القائمة تُخدَم من نموذج القراءة المخزَّن الذي لا يحمل أرقامًا لكل اتجاه. استخدم used_bytes في القائمة، أو GetVPN/GetVPNUsage للتفصيل بين الاتجاهين.

vpns[].total_uploadbytes

إجمالي الرفع مدى الحياة. وينطبق عليه تحفّظ total_download نفسه: 0 في ListVPN.

vpns[].used_bytesbytes

البيانات المستهلكة فعليًا مدى الحياة (تنزيل + رفع). وهذا هو الرقم الذي تحفظه المنظومة لكل VPN، فهو صحيح في كل نقطة نهاية بما فيها ListVPN.

vpns[].expires_atunix

متى ينتهي الحساب.

vpns[].max_onlineint

عدد الأجهزة المتزامنة المسموح بها.

vpns[].daily_limit_bytesbytes

حدّ اليوم. الغياب أو 0 = بلا حدّ يومي.

vpns[].daily_used_bytesbytes

المستهلك من حدّ اليوم.

vpns[].daily_reset_unixunix

متى يُصفَّر العدّاد اليومي.

vpns[].allowed_protocolsint

قناع بتات بروتوكولي تستخدمه تطبيقاتنا. عامله على أنه مبهم.

vpns[].cache_atunix

مدى حداثة الأرقام: فهي قديمة بقدر هذا الطابع الزمني ما لم يكن live مضبوطًا.

vpns[].created_atunix

متى أُنشئ الحساب.

vpns[].livebool

جاءت الأرقام من الشبكة للتو لا من المخزون المؤقت.

next_cursorcursor

أعد إرساله كـ cursor للصفحة التالية. والغياب أو الفراغ = حصلت على كل شيء.

نموذج استجابة
{
  "vpns": [{
    "vpn_id": "vpn_6t2k9p",
    "username": "u482913",
    "status": "active",
    "remaining_bytes": "96636764160",
    "total_download": "10737418240",
    "used_bytes": "11811160064",
    "total_upload": "1073741824",
    "expires_at": "1793188800",
    "max_online": 3,
    "cache_at": "1785412700",
    "created_at": "1785000000"
  }],
  "next_cursor": "vpn_6t2k9p"
}
POST

GetVPN

read
https://apiservice.vitamindata.net/api/v1/GetVPN

حساب واحد بالتفصيل. live:true تعني أن الأرقام جاءت من الشبكة للتو.

الطلب
vpn_idstringمطلوب

المعرّف العام للحساب (vpn_…)، من ListVPN أو من تسليم طلب.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/GetVPN \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"vpn_id":"vpn_6t2k9p"}'
الاستجابة200 · application/json
vpnobject

الحساب.

vpn.vpn_idstring

المعرّف العام الذي يأخذه كل فعل VPN آخر.

vpn.usernamestring

اسم بيانات الاعتماد الظاهر في التطبيقات.

vpn.statusstring

حالة الحساب كما تعرضها اللوحة — active ما لم يكن موقوفًا أو منتهيًا.

vpn.remaining_bytesbytes

البيانات المتبقية في كل حزمه مجتمعةً.

vpn.total_downloadbytes

إجمالي التنزيل مدى الحياة، كما يبلّغ به مستوى VPN لحظيًا. في ListVPN تكون قيمته دائمًا 0 — لأن القائمة تُخدَم من نموذج القراءة المخزَّن الذي لا يحمل أرقامًا لكل اتجاه. استخدم used_bytes في القائمة، أو GetVPN/GetVPNUsage للتفصيل بين الاتجاهين.

vpn.total_uploadbytes

إجمالي الرفع مدى الحياة. وينطبق عليه تحفّظ total_download نفسه: 0 في ListVPN.

vpn.used_bytesbytes

البيانات المستهلكة فعليًا مدى الحياة (تنزيل + رفع). وهذا هو الرقم الذي تحفظه المنظومة لكل VPN، فهو صحيح في كل نقطة نهاية بما فيها ListVPN.

vpn.expires_atunix

متى ينتهي الحساب.

vpn.max_onlineint

عدد الأجهزة المتزامنة المسموح بها.

vpn.daily_limit_bytesbytes

حدّ اليوم. الغياب أو 0 = بلا حدّ يومي.

vpn.daily_used_bytesbytes

المستهلك من حدّ اليوم.

vpn.daily_reset_unixunix

متى يُصفَّر العدّاد اليومي.

vpn.allowed_protocolsint

قناع بتات بروتوكولي تستخدمه تطبيقاتنا. عامله على أنه مبهم.

vpn.cache_atunix

مدى حداثة الأرقام: فهي قديمة بقدر هذا الطابع الزمني ما لم يكن live مضبوطًا.

vpn.created_atunix

متى أُنشئ الحساب.

vpn.livebool

جاءت الأرقام من الشبكة للتو لا من المخزون المؤقت.

livebool

طازج من الشبكة. والغياب = خُدم من نموذج القراءة، وهو قديم بقدر cache_at.

نموذج استجابة
{
  "vpn": {
    "vpn_id": "vpn_6t2k9p",
    "username": "u482913",
    "status": "active",
    "remaining_bytes": "96636764160",
    "total_download": "10737418240",
    "used_bytes": "11811160064",
    "total_upload": "1073741824",
    "expires_at": "1793188800",
    "max_online": 3,
    "cache_at": "1785412700",
    "created_at": "1785000000"
  },
  "live": true
}
POST

GetVPNUsage

read
https://apiservice.vitamindata.net/api/v1/GetVPNUsage

البيانات المستهلكة والمتبقية، مع حدّ اليوم إن وُجد.

الطلب
vpn_idstringمطلوب

المعرّف العام للحساب (vpn_…)، من ListVPN أو من تسليم طلب.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/GetVPNUsage \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"vpn_id":"vpn_6t2k9p"}'
الاستجابة200 · application/json
vpn_idstring

يُعاد كما أُرسل.

remaining_bytesbytes

البيانات المتبقية.

total_downloadbytes

إجمالي التنزيل مدى الحياة.

total_uploadbytes

إجمالي الرفع مدى الحياة.

expires_atunix

متى ينتهي الحساب.

daily_limit_bytesbytes

حدّ اليوم. الغياب = بلا حدّ.

daily_used_bytesbytes

المستهلك من حدّ اليوم.

daily_reset_unixunix

متى يُصفَّر العدّاد اليومي.

cache_atunix

مدى حداثة الأرقام حين لا تكون لحظية.

livebool

طازج من الشبكة للتو.

seriesarray

محجوز لسلسلة الاستهلاك التاريخية — وهو فارغ اليوم.

series[].tunix

بداية الفترة.

series[].rxbytes

المُنزَّل في هذه الفترة.

series[].txbytes

المرفوع في هذه الفترة.

نموذج استجابة
{
  "vpn_id": "vpn_6t2k9p",
  "remaining_bytes": "96636764160",
  "total_download": "10737418240",
  "total_upload": "1073741824",
  "expires_at": "1793188800",
  "daily_limit_bytes": "53687091200",
  "daily_used_bytes": "1273741824",
  "daily_reset_unix": "1785456000",
  "cache_at": "1785412700",
  "live": true
}
POST

ListVPNBundles

read
https://apiservice.vitamindata.net/api/v1/ListVPNBundles

محافظ البيانات خلف حساب واحد، بترتيب استهلاكها.

هكذا تجيب عن سؤال «لماذا نقصت بيانات عميلي المدفوعة وما زالت لديه بيانات مجانية؟» — فـ queue_position 1 هي التي تُستهلك تاليًا. وlive:false تعني أننا لم نتمكن من قراءتها، وهو أمر مختلف عن ألا تكون هناك أي حزمة.

الطلب
vpn_idstringمطلوب

المعرّف العام للحساب (vpn_…)، من ListVPN أو من تسليم طلب.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/ListVPNBundles \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"vpn_id":"vpn_6t2k9p"}'
الاستجابة200 · application/json
bundlesarray

المحافظ، بترتيب الاستهلاك.

bundles[].bundle_idstring

معرّف المحفظة.

bundles[].freebool

مُنحت من الباقة المجانية لا بالشراء.

bundles[].sourceenum

من أين أتت المحفظة.

إحدى القيم التالية:buyextendmigratedfree_tier
bundles[].granted_bytesbytes

حجمها الكامل عند المنح.

bundles[].remaining_bytesbytes

ما تبقّى فيها.

bundles[].granted_atunix

متى مُنحت.

bundles[].expires_atunix

متى تنتهي سواء استُهلكت أم لا.

bundles[].daily_limit_bytesbytes

حدّها اليومي الخاص. الغياب = بلا حدّ.

bundles[].statusenum

مكتوبة بالحروف لا بالأرقام، فلا تضطر أبدًا إلى حفظ أن 2 تعني مستهلكة.

إحدى القيم التالية:activedisabledexhausted
bundles[].queue_positionint

ترتيب يبدأ من 1 بين المحافظ القابلة للاستخدام، حسب ترتيب الاستهلاك — 1 هي التي تُستهلك تاليًا. و0 أو الغياب يعني أنها خارج الطابور (مستهلكة أو منتهية أو معطّلة).

bundles[].plan_gbint

الحجم الذي بيعت به، بالغيغابايت.

bundles[].plan_daysint

مدة الصلاحية التي بيعت بها، بالأيام.

bundles[].invoice_idstring

عملية الشراء التي أتت منها. تغيب في المنحة المجانية.

livebool

الغياب أو false = تعذّر الوصول إلى مستوى الاستحقاقات، فجاءت القائمة فارغة بدل أن تكون خاطئة. فـ«لم نتمكن من قراءتها» و«لا توجد أي منها» جملتان مختلفتان.

نموذج استجابة
{
  "bundles": [
    {"bundle_id": "bnd_2m8x", "source": "buy",
     "granted_bytes": "107374182400", "remaining_bytes": "96636764160",
     "granted_at": "1785000000", "expires_at": "1793188800",
     "status": "active", "queue_position": 1, "plan_gb": 100, "plan_days": 30,
     "invoice_id": "inv_5k8p2q"},
    {"bundle_id": "bnd_9k1f", "free": true, "source": "free_tier",
     "granted_bytes": "5368709120", "remaining_bytes": "5368709120",
     "granted_at": "1784000000", "expires_at": "1793188800",
     "status": "active", "queue_position": 2, "plan_gb": 5, "plan_days": 30}
  ],
  "live": true
}
POST

SetVPNPassword

credentials
https://apiservice.vitamindata.net/api/v1/SetVPNPassword

يغيّر كلمة مرور حساب.

يتطلب نطاق credentials المنفصل — ولا يتضمّنه نطاق manage أبدًا.

الطلب
vpn_idstringمطلوب

المعرّف العام للحساب (vpn_…)، من ListVPN أو من تسليم طلب.

new_passwordstringمطلوب

كلمة المرور المراد ضبطها.

credentialstringاختياري

أي بيانات اعتماد، في الحسابات متعددة الاعتمادات. الفراغ = الاعتماد الأساسي.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/SetVPNPassword \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"vpn_id":"vpn_6t2k9p","new_password":"s3cr3t-Enough","credential":""}'
الاستجابة200 · application/json
usernamestring

بيانات الاعتماد التي طُبّق عليها التغيير.

نموذج استجابة
{"username": "u482913"}
POST

SetVPNState

manage
https://apiservice.vitamindata.net/api/v1/SetVPNState

يوقف حسابًا أو يستأنفه.

الطلب
vpn_idstringمطلوب

المعرّف العام للحساب (vpn_…)، من ListVPN أو من تسليم طلب.

stateenumمطلوب

ما المطلوب فعله.

إحدى القيم التالية:suspendresume
مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/SetVPNState \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"vpn_id":"vpn_6t2k9p","state":"suspend"}'
الاستجابة200 · application/json
statusenum

الحالة التي استقر عليها الحساب.

إحدى القيم التالية:suspendedactive
نموذج استجابة
{"status": "suspended"}
POST

DeleteVPN

manage
https://apiservice.vitamindata.net/api/v1/DeleteVPN

يحذف حسابًا. لا تراجع ولا استرداد.

الطلب
vpn_idstringمطلوب

المعرّف العام للحساب (vpn_…)، من ListVPN أو من تسليم طلب.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/DeleteVPN \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"vpn_id":"vpn_6t2k9p"}'
الاستجابة200 · application/json
statusenum

دائمًا deleted عند النجاح.

إحدى القيم التالية:deleted
نموذج استجابة
{"status": "deleted"}

بيع الخوادم

بيع خادم VPS يخضع لعقد التمويل نفسه الذي يخضع له بيع VPN — والفرق في السلة وحدها.

POST

GetVPSStorefront

read
https://apiservice.vitamindata.net/api/v1/GetVPSStorefront

المواقع، والخطط المسعّرة في كل موقع، وصور الإقلاع.

العقدة التي تحمل available:false نفدت طاقتها — اعرضها ولا تتِح شراءها.

الطلب

لا معاملات — أرسل كائنًا فارغًا، {}.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/GetVPSStorefront \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{}'
الاستجابة200 · application/json
nodesarray

المواقع، ولكل منها خططه المسعّرة.

nodes[].node_idstring

ما يأخذه node_id في السلة.

nodes[].labelstring

الاسم المعروض (Frankfurt).

nodes[].regionstring

رمز إقليمي عام للتجميع.

nodes[].countrystring

رمز الدولة بمعيار ISO، للأعلام.

nodes[].availablebool

الغياب أو false = نفدت الطاقة: اعرضها ولا تتِح شراءها.

nodes[].plansarray

ما يمكن بيعه هنا، مسعّرًا.

nodes[].plans[].plan_codestring

ما يأخذه plan_code في السلة.

nodes[].plans[].namestring

الاسم المعروض.

nodes[].plans[].vcpuint

الأنوية.

nodes[].plans[].ram_mbint

الذاكرة بالميغابايت.

nodes[].plans[].disk_gbint

القرص بالغيغابايت.

nodes[].plans[].traffic_bytesbytes

البيانات الشهرية المشمولة.

nodes[].plans[].price_usd_monthmoney

السعر الشهري في هذه العقدة — فالخطة نفسها قد تكلّف غير ذلك في مكان آخر.

imagesarray

كل ما يمكن الإقلاع منه أو تثبيته.

images[].shastring

المعرّف الوحيد للصورة — تأخذه السلال وعمليات إعادة التثبيت وإرفاق ISO جميعًا.

images[].namestring

الاسم البشري (Debian 13).

images[].kindenum

صورة disk تُجهّز مباشرةً؛ أما iso فهي مثبّت تُقلع منه.

إحدى القيم التالية:diskiso
images[].os_familyenum

لتجميع واجهتك ولأيقوناتها.

إحدى القيم التالية:linuxwindowsmikrotik
images[].min_disk_gbint

إعادة التثبيت على قرص أصغر مرفوضة — وسّع القرص أولًا.

months_minint

أقصر مدة يجوز شراء جهاز جديد بها.

months_maxint

الأطول.

نموذج استجابة
{
  "nodes": [
    {"node_id": "de1", "label": "Frankfurt", "region": "eu", "country": "DE", "available": true,
     "plans": [
       {"plan_code": "s2", "name": "S2", "vcpu": 2, "ram_mb": 4096, "disk_gb": 40,
        "traffic_bytes": "2199023255552", "price_usd_month": "8.00"}
     ]}
  ],
  "images": [
    {"sha": "9a1b8c2d7e6f", "name": "Debian 13", "kind": "disk", "os_family": "linux", "min_disk_gb": 10}
  ],
  "months_min": 1,
  "months_max": 12
}
POST

ListVPSImages

read
https://apiservice.vitamindata.net/api/v1/ListVPSImages

كل صورة يجوز لك إقلاعها أو تثبيتها، حسب sha.

قيمة sha هي ما تأخذه السلة وإعادة التثبيت وإرفاق ISO جميعًا. ولا شيء غيرها يعرّف صورة.

الطلب

لا معاملات — أرسل كائنًا فارغًا، {}.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/ListVPSImages \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{}'
الاستجابة200 · application/json
imagesarray

الفهرس.

images[].shastring

المعرّف الوحيد للصورة — تأخذه السلال وعمليات إعادة التثبيت وإرفاق ISO جميعًا.

images[].namestring

الاسم البشري (Debian 13).

images[].kindenum

صورة disk تُجهّز مباشرةً؛ أما iso فهي مثبّت تُقلع منه.

إحدى القيم التالية:diskiso
images[].os_familyenum

لتجميع واجهتك ولأيقوناتها.

إحدى القيم التالية:linuxwindowsmikrotik
images[].min_disk_gbint

إعادة التثبيت على قرص أصغر مرفوضة — وسّع القرص أولًا.

نموذج استجابة
{
  "images": [
    {"sha": "9a1b8c2d7e6f", "name": "Debian 13", "kind": "disk", "os_family": "linux", "min_disk_gb": 10},
    {"sha": "3f4e5d6c7b8a", "name": "Windows Server 2025 installer", "kind": "iso",
     "os_family": "windows", "min_disk_gb": 40}
  ]
}
POST

QuoteVPS

read
https://apiservice.vitamindata.net/api/v1/QuoteVPS

سعر خادم جديد، مفصّلًا بالبنود.

الطلب
cartobjectمطلوب

الخادم المراد تسعيره.

cart.node_idstringمطلوب

أين يُنشأ الجهاز، من عقد الواجهة.

cart.placementstringمحجوز — لا ترسله

محجوز. في هذا API يقرّر node_id دائمًا مكان إنشاء الخادم — فأرسله، واختر العقدة بنفسك من الواجهة.

إحدى القيم التالية:auto
cart.plan_codestringمطلوب

الخطة، من قائمة أسعار العقدة المختارة — فالخطط والأسعار تختلف من عقدة إلى أخرى.

cart.image_shastringمطلوب

ما الذي يُقلع منه أو يُثبَّت، حسب sha. صور القرص تُجهَّز مباشرةً؛ أما مثبّت ISO فيأتي مرفقًا مع ضبط الجهاز على الإقلاع منه.

cart.namestringمطلوب

اسم مضيف الجهاز / تسميته.

cart.monthsintمطلوب

المدة الابتدائية، ضمن حدود الأشهر في الواجهة.

cart.extra_disk_gbintاختياري

قرص إضافي فوق قرص الخطة، بالغيغابايت.

cart.extra_ipsintاختياري

عناوين IPv4 عامة إضافية.

cart.extra_traffic_tbmoneyاختياري

بيانات شهرية إضافية بالتيرابايت، كسلسلة عشرية ("0.5").

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/QuoteVPS \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"cart":{"node_id":"de1","plan_code":"s2","image_sha":"9a1b8c2d7e6f","months":2,"name":"web-1","extra_disk_gb":20,"extra_ips":1,"extra_traffic_tb":"0.5"}}'
الاستجابة200 · application/json
quoteobject

السعر مفصّلًا بالبنود. لا شيء يُنشأ ولا شيء يُحصَّل.

quote.model_namestring

أي نموذج تسعير أجاب.

quote.model_typestring

إصدار محرّك النموذج.

quote.base_usdmoney

السعر قبل الخصومات والرسوم الإضافية.

quote.total_usdmoney

السعر النهائي — أي ما تحصّله بيعة بهذه السلة.

quote.linesarray

التفصيل بالبنود، بإشارات موجبة وسالبة، ومجموعه يساوي الإجمالي تمامًا.

quote.lines[].codestring

ما هذا السطر (base، أو رمز خصم، أو رسم إضافي…).

quote.lines[].kindstring

فئة السطر، للتجميع في واجهتك.

quote.lines[].amount_usdmoney

بإشارة. الخصومات سالبة، ومجموع الأسطر يساوي total_usd تمامًا.

quote.lines[].pctstring

النسبة المئوية خلف السطر، حين توجد.

quote.cappedbool

بلغ الإجمالي سقف النموذج.

quote.floor_appliedbool

رُفع الإجمالي إلى أرضية النموذج.

quote.clampedenum

يُضبط عندما تُقصر قيمة في السلة إلى داخل الحدود قبل التسعير.

إحدى القيم التالية:minmax
quote.invalidstring

إذا لم يكن فارغًا فالسلة غير قابلة للتسعير — اعرضه ولا تحصّل أبدًا تسعيرة كهذه.

quote.metamap

إضافات النموذج، نص→نص (مثل remaining_days في الترقية).

نموذج استجابة
{
  "quote": {
    "model_name": "vps_plan",
    "model_type": "vps_plan_v1",
    "base_usd": "16.00",
    "total_usd": "16.00",
    "lines": [
      {"code": "plan_s2", "kind": "base", "amount_usd": "16.00"}
    ],
    "meta": {"months": "2"}
  }
}
POST

CreateVPSOrder

buyIdempotency-Key
https://apiservice.vitamindata.net/api/v1/CreateVPSOrder

يشتري خادمًا ويجهّزه.

استعلم عبر GetOrder عن التسليم، ثم عبر GetVPS عن الجهاز.

الطلب
cartobjectمطلوب

ما الذي يُنشأ — بالشكل نفسه الذي يسعّره QuoteVPS.

cart.node_idstringمطلوب

أين يُنشأ الجهاز، من عقد الواجهة.

cart.placementstringمحجوز — لا ترسله

محجوز. في هذا API يقرّر node_id دائمًا مكان إنشاء الخادم — فأرسله، واختر العقدة بنفسك من الواجهة.

إحدى القيم التالية:auto
cart.plan_codestringمطلوب

الخطة، من قائمة أسعار العقدة المختارة — فالخطط والأسعار تختلف من عقدة إلى أخرى.

cart.image_shastringمطلوب

ما الذي يُقلع منه أو يُثبَّت، حسب sha. صور القرص تُجهَّز مباشرةً؛ أما مثبّت ISO فيأتي مرفقًا مع ضبط الجهاز على الإقلاع منه.

cart.namestringمطلوب

اسم مضيف الجهاز / تسميته.

cart.monthsintمطلوب

المدة الابتدائية، ضمن حدود الأشهر في الواجهة.

cart.extra_disk_gbintاختياري

قرص إضافي فوق قرص الخطة، بالغيغابايت.

cart.extra_ipsintاختياري

عناوين IPv4 عامة إضافية.

cart.extra_traffic_tbmoneyاختياري

بيانات شهرية إضافية بالتيرابايت، كسلسلة عشرية ("0.5").

fundingenumمطلوب

كيف يُدفع — انظر الدفع مقابل الأشياء. ولا قيمة افتراضية له: فحذفه يُرفض.

إحدى القيم التالية:FUNDING_AUTOFUNDING_BALANCEFUNDING_INVOICE
expected_total_usdmoneyاختياري

ضمانة تأكيد. إذا ضُبط واختلفت تسعيرتنا الحديثة، تُرفض البيعة بـ price_changed بدل تحصيل مبلغ لم يره عميلك قط.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/CreateVPSOrder \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"cart":{"node_id":"de1","plan_code":"s2","image_sha":"9a1b8c2d7e6f","months":2,"name":"web-1","extra_disk_gb":20,"extra_ips":1,"extra_traffic_tb":"0.5"},"funding":"FUNDING_AUTO","expected_total_usd":"36.00"}'
الاستجابة200 · application/json
orderobject

الطلب — استعلم عبر GetOrder حتى تصبح حالته delivered.

order.order_idstring

المعرّف العام للطلب (ord_…).

order.productenum

ما الذي اشتُري.

إحدى القيم التالية:vpnvps
order.kindstring

شكل الشراء: new أو extend أو upgrade

order.statusenum

دورة الحياة. delivered هي الغاية؛ وneeds_operator تعني أن المال دخل وأن إنسانًا يكمل التسليم — فلا تعد الشراء؛ وexpired تعني أن الفاتورة انتهت دون دفع.

إحدى القيم التالية:createdinvoicedpaiddeliveringdeliveredneeds_operatorfailedrefund_pendingrefundedexpired
order.fundingenum

الوسيلة التي موّلته فعليًا. وFUNDING_AUTO يُحسم إلى إحداها.

إحدى القيم التالية:invoicebalance
order.total_usdmoney

ما يحصّله الطلب.

order.invoice_idstring

الفاتورة التي خلفه — لكل طلب فاتورة، أيًّا كانت وسيلة تمويله.

order.itemsint

كم استحقاقًا يُنشئه الطلب أو يمدّده.

order.created_atunix

متى قُدّم الطلب.

order.delivered_atunix

متى انتهى التسليم. يغيب قبل ذلك.

order.breakdownobject

التسعيرة التي وافق عليها العميل، حرفيًا — بالشكل نفسه الذي يعيده Quote.

invoiceobject

الفاتورة خلف الطلب: قابلة للدفع عند payment_required، ومسدّدة سلفًا عند completed.

invoice.invoice_idstring

معرّف الفاتورة لدى البوابة (inv_…).

invoice.statusenum

pending قابلة للدفع. وكل ما بين confirmed وdelivered_redirected يعني أن المال دخل بلا رجعة — فعامِلها كلها على أنها مدفوعة. أما expired فتعني أن الرابط انتهى دون دفع.

إحدى القيم التالية:pendingconfirmedsweepingsweptdeliveringdelivereddelivered_redirectedexpired
invoice.pay_urlstring

صفحة الدفع المستضافة. أرسل عميلك إليها؛ فكل وسيلة دفع (عملات، شبكات، رصيد) تعيش خلفها.

invoice.pay_telegram_urlstring

الفاتورة نفسها، قابلة للدفع داخل Telegram: تفتح بوت مزوّد الدفع نفسه، الذي يعرض المبلغ ويستقبل الدفع هناك. اعرضها إلى جانب pay_url للعملاء الذين يفضّلون عدم مغادرة التطبيق. قد تغيب — فلا يملكها إلا مزوّد دفع لديه بوت مُعدّ، ولذلك لا تجعلها زر الدفع الوحيد لديك.

invoice.price_usdmoney

ما تحصّله الفاتورة.

invoice.expires_atunix

متى تُغلق نافذة الدفع.

paidbool

المال محصّل. يغيب (= false) مع payment_required.

statusenum

الحقل الذي تفرّع عليه — انظر الدفع مقابل الأشياء.

إحدى القيم التالية:completedpayment_required
نموذج استجابة
{
  "order": {
    "order_id": "ord_2f8k3j", "product": "vps", "kind": "new",
    "status": "invoiced", "funding": "invoice", "total_usd": "16.00",
    "invoice_id": "inv_7h4w9s", "items": 1, "created_at": "1785412800"
  },
  "invoice": {
    "invoice_id": "inv_7h4w9s", "status": "pending",
    "pay_url": "https://pay.example.com/i/inv_7h4w9s",
    "price_usd": "16.00", "expires_at": "1785499200"
  },
  "status": "payment_required"
}
POST

QuoteVPSExtend

read
https://apiservice.vitamindata.net/api/v1/QuoteVPSExtend

كم يكلّف تجديد خادم.

الطلب
vps_idstringمطلوب

معرّف الخادم، من ListVPS.

monthsintمطلوب

كم شهرًا يُضاف. ونطاق months_minmonths_max في الواجهة هو ما ينبغي أن تعرضه واجهتك، لكن التجديد لا يُقصَر إليه — فأرسل رقمًا معقولًا، لأن ما ترسله هو ما يُسعَّر ويُحصَّل.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/QuoteVPSExtend \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"vps_id":"vm_7q3k1n","months":1}'
الاستجابة200 · application/json
quoteobject

السعر مفصّلًا بالبنود. لا شيء يُنشأ ولا شيء يُحصَّل.

quote.model_namestring

أي نموذج تسعير أجاب.

quote.model_typestring

إصدار محرّك النموذج.

quote.base_usdmoney

السعر قبل الخصومات والرسوم الإضافية.

quote.total_usdmoney

السعر النهائي — أي ما تحصّله بيعة بهذه السلة.

quote.linesarray

التفصيل بالبنود، بإشارات موجبة وسالبة، ومجموعه يساوي الإجمالي تمامًا.

quote.lines[].codestring

ما هذا السطر (base، أو رمز خصم، أو رسم إضافي…).

quote.lines[].kindstring

فئة السطر، للتجميع في واجهتك.

quote.lines[].amount_usdmoney

بإشارة. الخصومات سالبة، ومجموع الأسطر يساوي total_usd تمامًا.

quote.lines[].pctstring

النسبة المئوية خلف السطر، حين توجد.

quote.cappedbool

بلغ الإجمالي سقف النموذج.

quote.floor_appliedbool

رُفع الإجمالي إلى أرضية النموذج.

quote.clampedenum

يُضبط عندما تُقصر قيمة في السلة إلى داخل الحدود قبل التسعير.

إحدى القيم التالية:minmax
quote.invalidstring

إذا لم يكن فارغًا فالسلة غير قابلة للتسعير — اعرضه ولا تحصّل أبدًا تسعيرة كهذه.

quote.metamap

إضافات النموذج، نص→نص (مثل remaining_days في الترقية).

نموذج استجابة
{
  "quote": {
    "model_name": "vps_plan",
    "model_type": "vps_plan_v1",
    "base_usd": "16.00",
    "total_usd": "16.00",
    "lines": [
      {"code": "plan_s2", "kind": "base", "amount_usd": "16.00"}
    ],
    "meta": {"months": "2"}
  }
}
POST

ExtendVPS

buyIdempotency-Key
https://apiservice.vitamindata.net/api/v1/ExtendVPS

يجدّد خادمًا.

التجديد المبكر لا يكلّف شيئًا إضافيًا: فتاريخ الانتهاء الجديد يُحسب من التاريخ الحالي، لا من اليوم.

الطلب
vps_idstringمطلوب

معرّف الخادم، من ListVPS.

monthsintمطلوب

كم شهرًا يُضاف. ونطاق months_minmonths_max في الواجهة هو ما ينبغي أن تعرضه واجهتك، لكن التجديد لا يُقصَر إليه — فأرسل رقمًا معقولًا، لأن ما ترسله هو ما يُسعَّر ويُحصَّل.

fundingenumمطلوب

كيف يُدفع — انظر الدفع مقابل الأشياء. ولا قيمة افتراضية له: فحذفه يُرفض.

إحدى القيم التالية:FUNDING_AUTOFUNDING_BALANCEFUNDING_INVOICE
expected_total_usdmoneyاختياري

ضمانة تأكيد. إذا ضُبط واختلفت تسعيرتنا الحديثة، تُرفض البيعة بـ price_changed بدل تحصيل مبلغ لم يره عميلك قط.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/ExtendVPS \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"vps_id":"vm_7q3k1n","months":1,"funding":"FUNDING_AUTO","expected_total_usd":"8.00"}'
الاستجابة200 · application/json
orderobject

الطلب — استعلم عبر GetOrder حتى تصبح حالته delivered.

order.order_idstring

المعرّف العام للطلب (ord_…).

order.productenum

ما الذي اشتُري.

إحدى القيم التالية:vpnvps
order.kindstring

شكل الشراء: new أو extend أو upgrade

order.statusenum

دورة الحياة. delivered هي الغاية؛ وneeds_operator تعني أن المال دخل وأن إنسانًا يكمل التسليم — فلا تعد الشراء؛ وexpired تعني أن الفاتورة انتهت دون دفع.

إحدى القيم التالية:createdinvoicedpaiddeliveringdeliveredneeds_operatorfailedrefund_pendingrefundedexpired
order.fundingenum

الوسيلة التي موّلته فعليًا. وFUNDING_AUTO يُحسم إلى إحداها.

إحدى القيم التالية:invoicebalance
order.total_usdmoney

ما يحصّله الطلب.

order.invoice_idstring

الفاتورة التي خلفه — لكل طلب فاتورة، أيًّا كانت وسيلة تمويله.

order.itemsint

كم استحقاقًا يُنشئه الطلب أو يمدّده.

order.created_atunix

متى قُدّم الطلب.

order.delivered_atunix

متى انتهى التسليم. يغيب قبل ذلك.

order.breakdownobject

التسعيرة التي وافق عليها العميل، حرفيًا — بالشكل نفسه الذي يعيده Quote.

invoiceobject

الفاتورة خلف الطلب: قابلة للدفع عند payment_required، ومسدّدة سلفًا عند completed.

invoice.invoice_idstring

معرّف الفاتورة لدى البوابة (inv_…).

invoice.statusenum

pending قابلة للدفع. وكل ما بين confirmed وdelivered_redirected يعني أن المال دخل بلا رجعة — فعامِلها كلها على أنها مدفوعة. أما expired فتعني أن الرابط انتهى دون دفع.

إحدى القيم التالية:pendingconfirmedsweepingsweptdeliveringdelivereddelivered_redirectedexpired
invoice.pay_urlstring

صفحة الدفع المستضافة. أرسل عميلك إليها؛ فكل وسيلة دفع (عملات، شبكات، رصيد) تعيش خلفها.

invoice.pay_telegram_urlstring

الفاتورة نفسها، قابلة للدفع داخل Telegram: تفتح بوت مزوّد الدفع نفسه، الذي يعرض المبلغ ويستقبل الدفع هناك. اعرضها إلى جانب pay_url للعملاء الذين يفضّلون عدم مغادرة التطبيق. قد تغيب — فلا يملكها إلا مزوّد دفع لديه بوت مُعدّ، ولذلك لا تجعلها زر الدفع الوحيد لديك.

invoice.price_usdmoney

ما تحصّله الفاتورة.

invoice.expires_atunix

متى تُغلق نافذة الدفع.

paidbool

المال محصّل. يغيب (= false) مع payment_required.

statusenum

الحقل الذي تفرّع عليه — انظر الدفع مقابل الأشياء.

إحدى القيم التالية:completedpayment_required
نموذج استجابة
{
  "order": {
    "order_id": "ord_5d1p8m", "product": "vps", "kind": "extend",
    "status": "paid", "funding": "balance", "total_usd": "8.00",
    "invoice_id": "inv_1c6v3z", "items": 1, "created_at": "1785412800"
  },
  "invoice": {
    "invoice_id": "inv_1c6v3z", "status": "confirmed", "price_usd": "8.00"
  },
  "paid": true,
  "status": "completed"
}
POST

QuoteVPSUpgrade

read
https://apiservice.vitamindata.net/api/v1/QuoteVPSUpgrade

كم يكلّف شكل أكبر، محسوبًا بالتناسب على المدة المدفوعة سلفًا.

الطلب
vps_idstringمطلوب

معرّف الخادم، من ListVPS.

specobjectمطلوب

الشكل المستهدف. والحقول المحذوفة أو الصفرية تُبقي قيمها الحالية.

spec.vcpuintاختياري

الأنوية المستهدفة. و0 يُبقي القيمة الحالية.

spec.ram_mbintاختياري

الذاكرة المستهدفة بالميغابايت. و0 يُبقي القيمة الحالية.

spec.disk_gbintاختياري

القرص المستهدف بالغيغابايت. والقرص لا يكبر إلا كِبَرًا — فأي قيمة أصغر تُرفض، لأن تقليص نظام ملفات تحت نظام تشغيل يعني فقدان بيانات.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/QuoteVPSUpgrade \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"vps_id":"vm_7q3k1n","spec":{"vcpu":4,"ram_mb":8192,"disk_gb":80}}'
الاستجابة200 · application/json
quoteobject

السعر مفصّلًا بالبنود. لا شيء يُنشأ ولا شيء يُحصَّل.

quote.model_namestring

أي نموذج تسعير أجاب.

quote.model_typestring

إصدار محرّك النموذج.

quote.base_usdmoney

السعر قبل الخصومات والرسوم الإضافية.

quote.total_usdmoney

السعر النهائي — أي ما تحصّله بيعة بهذه السلة.

quote.linesarray

التفصيل بالبنود، بإشارات موجبة وسالبة، ومجموعه يساوي الإجمالي تمامًا.

quote.lines[].codestring

ما هذا السطر (base، أو رمز خصم، أو رسم إضافي…).

quote.lines[].kindstring

فئة السطر، للتجميع في واجهتك.

quote.lines[].amount_usdmoney

بإشارة. الخصومات سالبة، ومجموع الأسطر يساوي total_usd تمامًا.

quote.lines[].pctstring

النسبة المئوية خلف السطر، حين توجد.

quote.cappedbool

بلغ الإجمالي سقف النموذج.

quote.floor_appliedbool

رُفع الإجمالي إلى أرضية النموذج.

quote.clampedenum

يُضبط عندما تُقصر قيمة في السلة إلى داخل الحدود قبل التسعير.

إحدى القيم التالية:minmax
quote.invalidstring

إذا لم يكن فارغًا فالسلة غير قابلة للتسعير — اعرضه ولا تحصّل أبدًا تسعيرة كهذه.

quote.metamap

إضافات النموذج، نص→نص (مثل remaining_days في الترقية).

restart_requiredbool

تطبيق هذا الشكل يحتاج إلى دورة طاقة — وينبغي أن يعرف العميل ذلك قبل الدفع.

monthly_before_usdmoney

السعر المتكرر اليوم.

monthly_after_usdmoney

السعر المتكرر بعد الترقية — أي ما ستكلّفه التجديدات من الآن فصاعدًا.

نموذج استجابة
{
  "quote": {
    "model_name": "vps_upgrade",
    "model_type": "vps_plan_v1",
    "base_usd": "4.20",
    "total_usd": "4.20",
    "lines": [
      {"code": "prorate_vcpu", "kind": "vps_upgrade", "amount_usd": "2.40"},
      {"code": "prorate_ram", "kind": "vps_upgrade", "amount_usd": "1.80"}
    ],
    "meta": {"remaining_days": "21", "monthly_delta_usd": "6.00", "quote_expires_at": "1785416400"}
  },
  "restart_required": true,
  "monthly_before_usd": "8.00",
  "monthly_after_usd": "14.00"
}
POST

UpgradeVPS

buyIdempotency-Key
https://apiservice.vitamindata.net/api/v1/UpgradeVPS

يدفع ثمن شكل أكبر ويطبّقه. والقرص لا يمكن إلا أن يكبر.

الطلب
vps_idstringمطلوب

معرّف الخادم، من ListVPS.

specobjectمطلوب

الشكل المستهدف — سعّره أولًا؛ فالتسعيرة تخبرك أيضًا بشأن إعادة التشغيل.

spec.vcpuintاختياري

الأنوية المستهدفة. و0 يُبقي القيمة الحالية.

spec.ram_mbintاختياري

الذاكرة المستهدفة بالميغابايت. و0 يُبقي القيمة الحالية.

spec.disk_gbintاختياري

القرص المستهدف بالغيغابايت. والقرص لا يكبر إلا كِبَرًا — فأي قيمة أصغر تُرفض، لأن تقليص نظام ملفات تحت نظام تشغيل يعني فقدان بيانات.

fundingenumمطلوب

كيف يُدفع — انظر الدفع مقابل الأشياء. ولا قيمة افتراضية له: فحذفه يُرفض.

إحدى القيم التالية:FUNDING_AUTOFUNDING_BALANCEFUNDING_INVOICE
expected_total_usdmoneyاختياري

ضمانة تأكيد. إذا ضُبط واختلفت تسعيرتنا الحديثة، تُرفض البيعة بـ price_changed بدل تحصيل مبلغ لم يره عميلك قط.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/UpgradeVPS \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"vps_id":"vm_7q3k1n","spec":{"vcpu":4,"ram_mb":8192,"disk_gb":80},"funding":"FUNDING_AUTO","expected_total_usd":"4.20"}'
الاستجابة200 · application/json
orderobject

الطلب — استعلم عبر GetOrder حتى تصبح حالته delivered.

order.order_idstring

المعرّف العام للطلب (ord_…).

order.productenum

ما الذي اشتُري.

إحدى القيم التالية:vpnvps
order.kindstring

شكل الشراء: new أو extend أو upgrade

order.statusenum

دورة الحياة. delivered هي الغاية؛ وneeds_operator تعني أن المال دخل وأن إنسانًا يكمل التسليم — فلا تعد الشراء؛ وexpired تعني أن الفاتورة انتهت دون دفع.

إحدى القيم التالية:createdinvoicedpaiddeliveringdeliveredneeds_operatorfailedrefund_pendingrefundedexpired
order.fundingenum

الوسيلة التي موّلته فعليًا. وFUNDING_AUTO يُحسم إلى إحداها.

إحدى القيم التالية:invoicebalance
order.total_usdmoney

ما يحصّله الطلب.

order.invoice_idstring

الفاتورة التي خلفه — لكل طلب فاتورة، أيًّا كانت وسيلة تمويله.

order.itemsint

كم استحقاقًا يُنشئه الطلب أو يمدّده.

order.created_atunix

متى قُدّم الطلب.

order.delivered_atunix

متى انتهى التسليم. يغيب قبل ذلك.

order.breakdownobject

التسعيرة التي وافق عليها العميل، حرفيًا — بالشكل نفسه الذي يعيده Quote.

invoiceobject

الفاتورة خلف الطلب: قابلة للدفع عند payment_required، ومسدّدة سلفًا عند completed.

invoice.invoice_idstring

معرّف الفاتورة لدى البوابة (inv_…).

invoice.statusenum

pending قابلة للدفع. وكل ما بين confirmed وdelivered_redirected يعني أن المال دخل بلا رجعة — فعامِلها كلها على أنها مدفوعة. أما expired فتعني أن الرابط انتهى دون دفع.

إحدى القيم التالية:pendingconfirmedsweepingsweptdeliveringdelivereddelivered_redirectedexpired
invoice.pay_urlstring

صفحة الدفع المستضافة. أرسل عميلك إليها؛ فكل وسيلة دفع (عملات، شبكات، رصيد) تعيش خلفها.

invoice.pay_telegram_urlstring

الفاتورة نفسها، قابلة للدفع داخل Telegram: تفتح بوت مزوّد الدفع نفسه، الذي يعرض المبلغ ويستقبل الدفع هناك. اعرضها إلى جانب pay_url للعملاء الذين يفضّلون عدم مغادرة التطبيق. قد تغيب — فلا يملكها إلا مزوّد دفع لديه بوت مُعدّ، ولذلك لا تجعلها زر الدفع الوحيد لديك.

invoice.price_usdmoney

ما تحصّله الفاتورة.

invoice.expires_atunix

متى تُغلق نافذة الدفع.

paidbool

المال محصّل. يغيب (= false) مع payment_required.

statusenum

الحقل الذي تفرّع عليه — انظر الدفع مقابل الأشياء.

إحدى القيم التالية:completedpayment_required
نموذج استجابة
{
  "order": {
    "order_id": "ord_5d1p8m", "product": "vps", "kind": "extend",
    "status": "paid", "funding": "balance", "total_usd": "8.00",
    "invoice_id": "inv_1c6v3z", "items": 1, "created_at": "1785412800"
  },
  "invoice": {
    "invoice_id": "inv_1c6v3z", "status": "confirmed", "price_usd": "8.00"
  },
  "paid": true,
  "status": "completed"
}

إدارة الخوادم

كل فعل هنا يأخذ الخادم عبر id — فاسم الحقل في هذه النداءات هو id حرفيًا، بخلاف أفعال المال التي تستخدم vps_id.

POST

ListVPS

read
https://apiservice.vitamindata.net/api/v1/ListVPS

أجهزتك، مع حالة الطاقة والعناوين.

الطلب
limitintاختياري

حجم الصفحة. الافتراضي 50.

cursorcursorاختياري

قيمة next_cursor من الاستجابة السابقة. احذفه للصفحة الأولى.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/ListVPS \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"limit":50,"cursor":""}'
الاستجابة200 · application/json
vpsarray

أجهزتك.

vps[].idstring

معرّف الخادم — وهو ما يأخذه حقل id في كل فعل إداري وحقل vps_id في كل فعل مالي.

vps[].namestring

اسم مضيفه / تسميته.

vps[].node_idstring

أين يعمل.

vps[].lifecycleenum

0 قيد التجهيز · 1 نشط · 2 موقوف · 3 قيد الحذف · 4 محذوف.

إحدى القيم التالية:01234
vps[].provisionedbool

الجهاز موجود على مضيفه.

vps[].power_desiredenum

ما ينبغي أن تكون عليه الطاقة: 1 يعمل، و0 أو الغياب متوقف. أما الحالة اللحظية ففي GetVPSStats.running.

إحدى القيم التالية:01
vps[].vcpuint

الأنوية.

vps[].mem_mbint

الذاكرة بالميغابايت.

vps[].disk_gbint

القرص بالغيغابايت.

vps[].image_shastring

ما الذي أقلع منه أو ثُبّت منه.

vps[].expires_atunix

متى ينتهي الخادم — جدّده عبر ExtendVPS قبل ذلك.

vps[].created_atunix

متى أُنشئ.

vps[].ipsarray

عناوينه العامة.

vps[].private_ipstring

عنوانه الخاص، إن كانت الخطة تتضمّن واحدًا.

next_cursorcursor

أعد إرساله كـ cursor للصفحة التالية. والغياب أو الفراغ = حصلت على كل شيء.

نموذج استجابة
{
  "vps": [{
    "id": "vm_7q3k1n",
    "name": "web-1",
    "node_id": "de1",
    "lifecycle": 1,
    "provisioned": true,
    "power_desired": 1,
    "vcpu": 2,
    "mem_mb": 4096,
    "disk_gb": 40,
    "image_sha": "9a1b8c2d7e6f",
    "expires_at": "1793188800",
    "created_at": "1785000000",
    "ips": ["203.0.113.10"],
    "private_ip": "10.77.0.10"
  }]
}
POST

GetVPS

read
https://apiservice.vitamindata.net/api/v1/GetVPS

جهاز واحد بالتفصيل.

الطلب
idstringمطلوب

معرّف الخادم، من ListVPS. لاحظ أن اسم الحقل هو id في الأفعال الإدارية — وأفعال المال وحدها تسمّيه vps_id.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/GetVPS \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"id":"vm_7q3k1n"}'
الاستجابة200 · application/json
vpsobject

الجهاز.

vps.idstring

معرّف الخادم — وهو ما يأخذه حقل id في كل فعل إداري وحقل vps_id في كل فعل مالي.

vps.namestring

اسم مضيفه / تسميته.

vps.node_idstring

أين يعمل.

vps.lifecycleenum

0 قيد التجهيز · 1 نشط · 2 موقوف · 3 قيد الحذف · 4 محذوف.

إحدى القيم التالية:01234
vps.provisionedbool

الجهاز موجود على مضيفه.

vps.power_desiredenum

ما ينبغي أن تكون عليه الطاقة: 1 يعمل، و0 أو الغياب متوقف. أما الحالة اللحظية ففي GetVPSStats.running.

إحدى القيم التالية:01
vps.vcpuint

الأنوية.

vps.mem_mbint

الذاكرة بالميغابايت.

vps.disk_gbint

القرص بالغيغابايت.

vps.image_shastring

ما الذي أقلع منه أو ثُبّت منه.

vps.expires_atunix

متى ينتهي الخادم — جدّده عبر ExtendVPS قبل ذلك.

vps.created_atunix

متى أُنشئ.

vps.ipsarray

عناوينه العامة.

vps.private_ipstring

عنوانه الخاص، إن كانت الخطة تتضمّن واحدًا.

livebool

قُرئ من المستوى للتو.

نموذج استجابة
{
  "vps": {
    "id": "vm_7q3k1n",
    "name": "web-1",
    "node_id": "de1",
    "lifecycle": 1,
    "provisioned": true,
    "power_desired": 1,
    "vcpu": 2,
    "mem_mb": 4096,
    "disk_gb": 40,
    "image_sha": "9a1b8c2d7e6f",
    "expires_at": "1793188800",
    "created_at": "1785000000",
    "ips": ["203.0.113.10"],
    "private_ip": "10.77.0.10"
  },
  "live": true
}
POST

GetVPSStats

read
https://apiservice.vitamindata.net/api/v1/GetVPSStats

المعالج والذاكرة والقرص والشبكة لحظيًا.

الطلب
idstringمطلوب

معرّف الخادم، من ListVPS. لاحظ أن اسم الحقل هو id في الأفعال الإدارية — وأفعال المال وحدها تسمّيه vps_id.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/GetVPSStats \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"id":"vm_7q3k1n"}'
الاستجابة200 · application/json
cpu_pctint

حِمل المعالج، بالنسبة المئوية.

mem_used_mbint

الذاكرة المستخدمة، بالميغابايت.

disk_used_mbint

القرص المستخدم، بالميغابايت.

rx_bpsint64

الوارد، بالبت في الثانية.

tx_bpsint64

الصادر، بالبت في الثانية.

runningbool

الجهاز يعمل الآن.

updated_atunix

متى أُخذت عيّنة هذه الأرقام.

نموذج استجابة
{
  "cpu_pct": 12,
  "mem_used_mb": 1536,
  "disk_used_mb": 9216,
  "rx_bps": "1048576",
  "tx_bps": "524288",
  "running": true,
  "updated_at": "1785412790"
}
POST

GetVPSUsage

read
https://apiservice.vitamindata.net/api/v1/GetVPSUsage

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

الطلب
idstringمطلوب

معرّف الخادم، من ListVPS. لاحظ أن اسم الحقل هو id في الأفعال الإدارية — وأفعال المال وحدها تسمّيه vps_id.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/GetVPSUsage \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"id":"vm_7q3k1n"}'
الاستجابة200 · application/json
total_downbytes

إجمالي التنزيل مدى الحياة.

total_upbytes

إجمالي الرفع مدى الحياة.

bundlesarray

حزم البيانات، مع current التي تشير إلى الحزمة التي تُستهلك الآن.

bundles[].idint64

معرّف حزمة البيانات على مستوى الحوسبة.

bundles[].modeint

رمز وضع المحاسبة لدى المستوى. عامله على أنه مبهم.

bundles[].bytes_totalbytes

الحصة الكاملة للحزمة.

bundles[].used_dlbytes

المُنزَّل منها.

bundles[].used_upbytes

المرفوع منها.

bundles[].stateint

رمز الحالة لدى المستوى. عامله على أنه مبهم.

bundles[].currentbool

هذه هي الحزمة التي تُستهلك الآن.

bundles[].expires_atunix

متى تنتهي الحزمة.

نموذج استجابة
{
  "total_down": "53687091200",
  "total_up": "10737418240",
  "bundles": [
    {"id": "41", "mode": 1, "bytes_total": "2199023255552",
     "used_dl": "53687091200", "used_up": "10737418240",
     "state": 1, "current": true, "expires_at": "1793188800"}
  ]
}
POST

VPSPower

manage
https://apiservice.vitamindata.net/api/v1/VPSPower

التحكم بالطاقة.

shutdown يطلب من نظام التشغيل؛ أما force_stop فينزع القابس. والأول أفضل.

الطلب
idstringمطلوب

معرّف الخادم، من ListVPS. لاحظ أن اسم الحقل هو id في الأفعال الإدارية — وأفعال المال وحدها تسمّيه vps_id.

actionenumمطلوب

shutdown وreboot لطيفان؛ أما reset وforce_stop فهما زر الطاقة.

إحدى القيم التالية:startshutdownrebootresetforce_stop
مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/VPSPower \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"id":"vm_7q3k1n","action":"reboot"}'
الاستجابة200 · application/json
okbool

قبِل المستوى الإجراء. راقب GetVPSStats لمعرفة حالة الجهاز الفعلية.

نموذج استجابة
{"ok": true}
POST

ReinstallVPS

manage
https://apiservice.vitamindata.net/api/v1/ReinstallVPS

يمسح القرص ويثبّت صورة جديدة.

مدمّر وغير آمن لإعادة المحاولة — نداء واحد، وإعادة تثبيت واحدة. ويجب أن تناسب الصورة القرص الحالي؛ وسّعه أولًا إن لم تناسبه.

الطلب
idstringمطلوب

معرّف الخادم، من ListVPS. لاحظ أن اسم الحقل هو id في الأفعال الإدارية — وأفعال المال وحدها تسمّيه vps_id.

image_shastringمطلوب

الصورة، حسب sha المأخوذ من ListVPSImages. ولا شيء غير ذلك يسمّي صورة، وأي sha غير معروض يُرفض.

reset_rootboolاختياري

توليد كلمة مرور جذر جديدة أيضًا.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/ReinstallVPS \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"id":"vm_7q3k1n","image_sha":"9a1b8c2d7e6f","reset_root":true}'
الاستجابة200 · application/json
okbool

قبِل المستوى الإجراء. راقب GetVPSStats لمعرفة حالة الجهاز الفعلية.

نموذج استجابة
{"ok": true}
POST

AttachVPSISO

manage
https://apiservice.vitamindata.net/api/v1/AttachVPSISO

يُرفق صورة ISO للمثبّت. اقرنها بترتيب إقلاع 1 للإقلاع منها.

الطلب
idstringمطلوب

معرّف الخادم، من ListVPS. لاحظ أن اسم الحقل هو id في الأفعال الإدارية — وأفعال المال وحدها تسمّيه vps_id.

image_shastringمطلوب

الصورة، حسب sha المأخوذ من ListVPSImages. ولا شيء غير ذلك يسمّي صورة، وأي sha غير معروض يُرفض.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/AttachVPSISO \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"id":"vm_7q3k1n","image_sha":"3f4e5d6c7b8a"}'
الاستجابة200 · application/json
okbool

قبِل المستوى الإجراء. راقب GetVPSStats لمعرفة حالة الجهاز الفعلية.

نموذج استجابة
{"ok": true}
POST

DetachVPSISO

manage
https://apiservice.vitamindata.net/api/v1/DetachVPSISO

يزيل صورة ISO ويعود إلى الإقلاع من القرص.

الطلب
idstringمطلوب

معرّف الخادم، من ListVPS. لاحظ أن اسم الحقل هو id في الأفعال الإدارية — وأفعال المال وحدها تسمّيه vps_id.

مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/DetachVPSISO \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"id":"vm_7q3k1n"}'
الاستجابة200 · application/json
okbool

قبِل المستوى الإجراء. راقب GetVPSStats لمعرفة حالة الجهاز الفعلية.

نموذج استجابة
{"ok": true}
POST

SetVPSBootOrder

manage
https://apiservice.vitamindata.net/api/v1/SetVPSBootOrder

أي جهاز يُقلع أولًا.

الطلب
idstringمطلوب

معرّف الخادم، من ListVPS. لاحظ أن اسم الحقل هو id في الأفعال الإدارية — وأفعال المال وحدها تسمّيه vps_id.

orderenumمطلوب

0 القرص أولًا، 1 محرك الأقراص أولًا.

إحدى القيم التالية:01
مثال على الطلب
curl https://apiservice.vitamindata.net/api/v1/SetVPSBootOrder \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"id":"vm_7q3k1n","order":1}'
الاستجابة200 · application/json
okbool

قبِل المستوى الإجراء. راقب GetVPSStats لمعرفة حالة الجهاز الفعلية.

نموذج استجابة
{"ok": true}