توثيق Vito API

آخر تحديث: 26 يونيو 2026
01

نظرة عامة

يتيح Vito API لتطبيقك التعامل مع رصيد Vito الخاص بالمستخدم من داخل Discord — قراءته أو تحصيل قيمة منه أو إضافة رصيد إليه. يؤكد المستخدم كل عملية تحصيل برمزه السري على vetox.io قبل تحرّك أي Vito، ويُخطَر تطبيقك بالنتيجة. وVito هي العملة الافتراضية داخل منظومة Vetox؛ استخدم الـ API لبناء تجارب قائمة على Vito — كفتح محتوى أو ميزات أو مزايا أو مكافآت. لا تجري أي عمليات بيع أو شراء بأموال حقيقية.

إنه واجهة REST API تُصادق بمفتاح سري. تُعيد جميع نقاط النهاية JSON ومُصدَّرة تحت /v1.

الرابط الأساسيhttps://api.vetox.io/public/vito/v1
02

الأرصدة والتسوية

مفتاح API الخاص بك مرتبط بحساب Vetox الخاص بك. كل عملية تحصيل تُسوّى لصالحك: عندما يخصم تطبيقك Vito من مستخدم، يُضاف ذلك Vito إلى رصيدك الخاص (مطروحًا منه رسوم المنصة)، ولا يُحرق أبدًا. وعندما يضيف تطبيقك Vito إلى مستخدم، يُموَّل ذلك من رصيدك.

ينتقل Vito دائمًا بين الأرصدة — وليس من أو إلى أموال حقيقية أبدًا. يُحصَّل من المستخدم المبلغ الكامل الذي تطلبه؛ وتستلم أنت المبلغ بعد رسوم المنصة؛ وتُموَّل الأرصدة المضافة والمكافآت من رصيدك عبر /add.

رسوم المنصة — نفس جدول تحويلات Vito داخل التطبيق، بحسب مستوى عضويتك: 7% (Silver / Gold)، و6% (Platinum)، و5% (Diamond). عمليات التحصيل التي تبلغ 5 Vito أو أقل بلا رسوم. الأرصدة المضافة عبر /add لا تُفرض عليها رسوم أبدًا.
03

المتطلبات

يُمنح الوصول إلى Vito API لكل مشروع. قبل أن تستطيع استدعاءه تحتاج إلى:

  • عضوية مستخدم نشطة (المستوى Silver أو أعلى). يتجمد الـ API تلقائيًا إذا انتهت عضوية المالك، ويُستعاد عند إعادة الاشتراك.
  • طلب مطوّر موافق عليه. قدّم طلبًا من هذه الصفحة؛ يراجعه فريق Vetox يدويًا.
  • قبول شروط مطوّري واجهة برمجة التطبيقات — تتم الموافقة عليها عند إرسال طلب المطوّر الخاص بك.
  • الصلاحيات التي يحتاجها مشروعك. يمنحها فريق Vetox بناءً على طلبك.

الصلاحيات المتاحة

balance:read
قراءة رصيد Vito الخاص بمستخدم.
deduct:create
إنشاء خصم — تحصيل قيمة من رصيد Vito الخاص بمستخدم.
credit:create
إضافة Vito إلى مستخدم — تمويل المكافآت أو الأرصدة المضافة من رصيدك.
transfer:create
إنشاء تحويل بين مستخدمَين.
transactions:read
سرد وقراءة معاملات مشروعك.
04

المصادقة

صادق كل طلب بمفتاح API السري في ترويسة Authorization كرمز Bearer. تبدأ المفاتيح بالبادئة vito_live_.

http
Authorization: Bearer vito_live_xxxxxxxxxxxxxxxx

طبقتان اختياريتان تحميان مشروعك أكثر:

  • قائمة IP المسموح بها — اقصر الطلبات على عناوين IP محددة للخادم (كوّنها في تبويب الإعدادات).
  • حدود المعدل — سقوف طلبات لكل مشروع تتناسب مع مستوى عضويتك.
05

مفاتيح API — التخزين والتدوير والأمان

يُنشأ مفتاحك عند الموافقة على طلبك. يُعرض مرة واحدة فقط — اكشفه من تبويب مفاتيح API واحفظه فورًا.

لا يخزّن Vetox مفتاحك بصيغة قابلة للقراءة (مجرد تجزئة مملّحة). احتفظ به كسرّ على الخادم — متغير بيئة أو مدير أسرار — وليس أبدًا في كود العميل أو مستودع git أو المتصفح.

دوّره من تبويب مفاتيح API. يستمر المفتاح السابق بالعمل لفترة سماح مدتها 24 ساعة لتطرح المفتاح الجديد دون توقف، ثم يتوقف.

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

تدفّق تأكيد التحصيل

تمر كل عملية تحصيل عبر تأكيد يوافق عليه المستخدم برمزه السري — مفتاحك وحده لا ينقل Vito أبدًا:

  1. 1يستدعي تطبيقك POST /deduct بالمستخدم والمبلغ ومعرّف الخادم الأصلي وتفاصيل العنصر.
  2. 2ينشئ Vito تأكيدًا معلّقًا (صالحًا لمدة 10 دقائق) ويُعيد confirmUrl. عند تمرير guildId، يُرسَل للمستخدم أيضًا رسالة خاصة بالتفاصيل مع زر إلى صفحة التأكيد.
  3. 3يفتح المستخدم الرابط confirmUrl على vetox.io ويوافق على الخصم برمز محفظته السري.
  4. 4يخصم Vito المبلغ، ويسجّل المعاملة، ويرسل — إذا كان لديك Webhook مكوّن — حدث confirmation.completed موقّعًا إلى رابط الاستدعاء.
  5. 5يتحقق تطبيقك من التوقيع ويُكمل إجراءه (مثلًا، يفتح المحتوى).
تُدخل الرموز السرية فقط على vetox.io — وليس أبدًا داخل تطبيقك أو Discord. إذا لم يؤكد المستخدم، ينتهي الطلب بعد 10 دقائق وتتلقى حدث confirmation.expired.
07

معاملات الطلب (/deduct)

POST/v1/deduct

تقبل نقطة نهاية الخصم حقول الجسم التالية:

discordId
معرّف مستخدم Discord للمستخدم — رقم تعريفي من 17 إلى 20 خانة. مطلوب.
amount
مقدار Vito المطلوب تحصيله — عدد صحيح موجب. مطلوب.
guildId
الخادم الذي تنشأ منه عملية التحصيل (معرّف). مطلوب — يجب أن تأتي كل عملية تحصيل من خادم محدد، وهو ما يفعّل أيضًا رسالة المستخدم.
reason
وصف قصير مقروء (≤ 256 حرفًا)، يُعرض للمستخدم ويُكرَّر في Webhook.
merchantRef
سلسلة مرجعية خاصة بك (≤ 128 حرفًا). استخدمها لمطابقة Webhook بسجلّاتك.
product
واصف العنصر — { type, name, description?, imageUrl? }. يُعرض للمستخدم في صفحة التأكيد والرسالة الخاصة، ويُكرَّر في كل Webhook.
product.imageUrl
صورة منتج اختيارية — يجب أن تكون رابط https://.
metadata
حتى 10 أزواج مفتاح/قيمة نصية، تُمرَّر كما هي في Webhook.

* حقل مطلوب.

مثال طلب
http
POST https://api.vetox.io/public/vito/v1/deduct
Authorization: Bearer vito_live_xxxxxxxxxxxxxxxx
Content-Type: application/json
Idempotency-Key: req_9a1f2b   # optional, dedupes retries for 24h

{
  "discordId": "123456789012345678",
  "amount": 500,
  "guildId": "1470389021162209280",
  "reason": "Unlock premium theme",
  "merchantRef": "ref_1042",
  "product": {
    "type": "feature",
    "name": "Premium theme",
    "description": "Unlocks the premium theme pack",
    "imageUrl": "https://cdn.example.com/theme.png"
  },
  "metadata": { "ref": "1042" }
}
مثال استجابة
json
{
  "success": true,
  "data": {
    "confirmationId": "f3c9...e1",
    "confirmUrl": "https://vetox.io/confirm/vito/f3c9...e1",
    "amount": 500,
    "expiresAt": 1735689600000,
    "status": "pending"
  },
  "requestId": "req_abc123",
  "timestamp": 1735689300000
}
08

إضافة Vito — الأرصدة المضافة (/add)

POST/v1/add

يضيف POST /add رصيد Vito لمستخدم من رصيدك الخاص — للمكافآت أو الأرصدة المضافة. يأخذ نفس حقول /deduct باستثناء guildId وproduct. وعلى عكس التحصيل فهو فوري ولا يحتاج رمز PIN من المستخدم — مفتاح API هو صلاحيتك — لذا تعكس الاستجابة بالفعل التحويل المكتمل. يستلم المستخدم المبلغ الكامل؛ ولا تُطبَّق أي رسوم منصة.

يتطلب الصلاحية credit:create ورصيد Vito كافٍ في حسابك — وإلا يُعيد الطلب 402 INSUFFICIENT_OWNER_FUNDS.
مثال طلب
http
POST https://api.vetox.io/public/vito/v1/add
Authorization: Bearer vito_live_xxxxxxxxxxxxxxxx
Content-Type: application/json
Idempotency-Key: credit_7f3a   # optional, dedupes retries for 24h

{
  "discordId": "123456789012345678",
  "amount": 250,
  "reason": "Event reward",
  "merchantRef": "reward_1042",
  "metadata": { "ref": "1042" }
}
مثال استجابة
json
{
  "success": true,
  "data": {
    "transactionId": "txn_91b2",
    "toDiscordId": "123456789012345678",
    "amount": 250,
    "ownerBalance": 48250,
    "recipientBalance": 1250,
    "status": "completed"
  },
  "requestId": "req_def456",
  "timestamp": 1735689300000
}
09

Webhooks والتحقق من التوقيع

أضف رابط استدعاء https واحدًا أو أكثر في تبويب الإعدادات. يسلّم Vito طلب POST موقّعًا إلى كل رابط مكوّن كلما وصل تأكيد إلى حالة نهائية، مع إعادة المحاولة حتى 5 مرات بتراجع أسي.

تُطلق Webhooks فقط عندما يملك مشروعك رابط استدعاء مكوّنًا وسرًا توقيعيًا معًا. اكشف سرك التوقيعي (…whsec_) مرة واحدة من تبويب مفاتيح API.

التحقق من التوقيع

تحمل كل عملية تسليم ترويسة X-Vito-Signature بالصيغة ts=<unix>;h1=<hex>. أعد حساب HMAC على "<ts>:<rawBody>" بسرك التوقيعي وقارن بوقت ثابت. تحقّق دائمًا من جسم الطلب الخام قبل تحليل JSON.

http
signature = HMAC_SHA256(signingSecret, "<ts>:<rawBody>")
header    = X-Vito-Signature: ts=<unix-seconds>;h1=<hex-signature>
مُتحقِّق مرجعي (Node / Express):
javascript
import crypto from 'crypto';
import express from 'express';

const app = express();
// IMPORTANT: verify against the RAW body, before JSON parsing.
app.post('/webhooks/vito', express.raw({ type: '*/*' }), (req, res) => {
  const sig = req.header('X-Vito-Signature') || '';   // "ts=<unix>;h1=<hmac>[;h1=<hmac>]"
  const pairs = sig.split(';').map(p => p.split('='));
  const ts = pairs.find(([k]) => k === 'ts')?.[1];
  const sigs = pairs.filter(([k]) => k === 'h1').map(([, v]) => v);
  const rawBody = req.body.toString('utf8');

  const expected = crypto
    .createHmac('sha256', process.env.VITO_SIGNING_SECRET)     // whsec_...
    .update(`${ts}:${rawBody}`)
    .digest('hex');
  const expectedBuf = Buffer.from(expected, 'hex');

  // During a 24h secret rotation the header carries TWO h1= values — accept ANY.
  // Length-guard FIRST: crypto.timingSafeEqual throws on a length mismatch.
  const ok = sigs.some(h => {
    const got = Buffer.from(h, 'hex');
    return (
      got.length === expectedBuf.length &&
      crypto.timingSafeEqual(got, expectedBuf)
    );
  });
  // Reject anything older than ~5 minutes to stop replays.
  const fresh = ts && Math.abs(Date.now() / 1000 - Number(ts)) < 300;
  if (!ok || !fresh) return res.status(401).end();

  const event = JSON.parse(rawBody);
  if (event.eventType === 'confirmation.completed') {
    grantPremiumTheme(event.data.merchantRef, event.data.fromDiscordId);
  }
  res.status(200).end();   // ack fast; run your action async if slow
});
10

أحداث Webhook وحمولاتها

يرسل Vito أحد أربعة أنواع أحداث. تشترك كلها في نفس شكل الحمولة؛ ويعكس data.status النتيجة.

confirmation.completed
أكّد المستخدم وتم خصم Vito. أكمل إجراءك. يحمل transactionId.
confirmation.failed
تعذّر إتمام الخصم (مثلًا رصيد غير كافٍ أو خطأ داخلي). يحمل failureReason.
confirmation.expired
لم يؤكد المستخدم خلال 10 دقائق. لم يُنقل أي Vito.
confirmation.cancelled
ألغى المستخدم الطلب. لم يُنقل أي Vito.
credit.completed
تمّت تسوية رصيد /add مموَّل من المالك. يحمل المستلم وtransactionId، ويُطلق فورًا — لا توجد خطوة تأكيد.
مثال حمولة (confirmation.completed)
http
POST https://your-app.com/webhooks/vito
X-Vito-Signature: ts=1735689600;h1=4f8b2c...e9
X-Vito-Event-Id: evt_3a2b1c
X-Vito-Event-Type: confirmation.completed
Content-Type: application/json

{
  "eventId": "evt_3a2b1c",
  "eventType": "confirmation.completed",
  "timestamp": 1735689600000,
  "data": {
    "confirmationId": "f3c9...e1",
    "type": "deduct",
    "fromDiscordId": "123456789012345678",
    "toDiscordId": null,
    "amount": 500,
    "reason": "Unlock premium theme",
    "merchantRef": "ref_1042",
    "product": { "type": "feature", "name": "Premium theme" },
    "status": "completed",
    "transactionId": "txn_77a2",
    "metadata": { "ref": "1042" },
    "failureReason": null
  }
}
11

رموز الأخطاء

تُعيد الأخطاء حالة غير 2xx مع جسم JSON يحمل error.code على المستوى الأعلى. الحالات الشائعة:

400VITO_VALIDATION_ERROR
حقل طلب مفقود أو غير صالح (مثلًا guildId غير صحيح).
401invalid key
مفتاح API مفقود أو غير صالح أو غير معروف.
403OWNER_MEMBERSHIP_INACTIVE
انتهت عضوية مالك المشروع — الـ API مجمّد حتى يعيد الاشتراك.
403scope / IP
يفتقر المفتاح إلى الصلاحية المطلوبة، أو أن IP الطلب ليس في القائمة المسموح بها.
404not found
المستخدم أو المعاملة أو المورد غير موجود.
402insufficient balance
لا يملك المستخدم Vito كافيًا للخصم.
402INSUFFICIENT_OWNER_FUNDS
رصيدك أنت (المالك) منخفض جدًا لتمويل رصيد /add.
429rate limited
تجاوزت حد المعدل لمشروعك — تراجع وأعد المحاولة.
شكل استجابة الخطأ
json
{
  "success": false,
  "error": { "type": "Bad Request", "message": "guildId must be a valid Discord server ID", "code": "VITO_VALIDATION_ERROR" },
  "requestId": "req_abc123",
  "timestamp": 1735689300000
}
12

أمثلة التكامل

أنشئ طلب تحصيل:

POST/v1/deduct
bash
curl -X POST https://api.vetox.io/public/vito/v1/deduct \
  -H "Authorization: Bearer $VITO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "discordId": "123456789012345678",
    "amount": 500,
    "guildId": "1470389021162209280",
    "merchantRef": "ref_1042",
    "product": { "type": "feature", "name": "Premium theme" }
  }'

تحقق من رصيد مستخدم:

GET/v1/balance/:discordId
bash
curl https://api.vetox.io/public/vito/v1/balance/123456789012345678 \
  -H "Authorization: Bearer $VITO_API_KEY"
13

الاختبار باستخدام التكامل التجريبي

يتوفر تكامل تجريبي مستقل لتجربة التدفّق الكامل من البداية للنهاية دون كتابة أي كود. يمر عبر الطلب ← التأكيد ← الرمز السري ← Webhook ← الإتمام.

  1. 1افتح مجلد التكامل التجريبي وأضف مفتاح Vito API ورمز بوت Discord ومعرّف خادم (guild) الاختبار إلى config.json.
  2. 2نفّذ npm install && npm start، ثم افتح http://localhost:4000.
  3. 3ابحث عن مستخدم بمعرّف Discord، اختر عنصرًا، وابدأ عملية تحصيل — يستدعي العرض التجريبي /deduct ويعرض confirmUrl.
  4. 4وافق على الرمز السري على vetox.io؛ يكتشف العرض الإتمام (عبر Webhook إن كان مكوّنًا، وإلا بالاستطلاع) ويُكمل الإجراء التجريبي.
يتطلب استقبال Webhook رابط استدعاء https عامًا وسرًا توقيعيًا؛ بدونهما يلجأ العرض إلى استطلاع معاملاتك، فيعمل دون أي إعداد.
14

أفضل الممارسات والحدود والأمان

الأمان

  • أبقِ مفتاح API والسر التوقيعي على الخادم فقط؛ دوّر أيًا منهما فورًا إذا تسرّب.
  • تحقق دائمًا من توقيع Webhook على الجسم الخام، وارفض عمليات التسليم الأقدم من نحو 5 دقائق (حماية من إعادة التشغيل).
  • أكمل إجراءك فقط عند confirmation.completed — وليس أبدًا عند استجابة /deduct (لم يُحسم التحصيل بعدُ عند تلك النقطة).
  • استخدم قائمة IP المسموح بها واطلب الصلاحيات التي تحتاجها فعلًا فقط.

الحدود

  • تنتهي صلاحية التأكيدات بعد 10 دقائق؛ عامل الطلبات غير المؤكدة على أنها متروكة.
  • حدود المعدل لكل مشروع وتتناسب مع مستوى عضوية المالك.
  • يجب أن يكون amount عددًا صحيحًا موجبًا؛ وتُحدَّد metadata بـ 10 مفاتيح كحد أقصى.
Idempotency-Key يمنع تكرار إعادة المحاولاتتعيد Webhooks المحاولة 5 مرات بتراجعأقرّ بـ 2xx بسرعة وأتمّ بشكل غير متزامن