Vito API दस्तावेज़

अंतिम अद्यतन: 26 जून 2026
01

अवलोकन

Vito API आपके एप्लिकेशन को Discord के भीतर से किसी उपयोगकर्ता के Vito बैलेंस के साथ काम करने देता है — इसे पढ़ना, इससे शुल्क लेना, या इसमें वापस क्रेडिट करना। उपयोगकर्ता किसी भी Vito के हिलने से पहले vetox.io पर अपने PIN से हर शुल्क की पुष्टि करता है, और परिणाम की सूचना आपके ऐप को दी जाती है। Vito, Vetox की इकोसिस्टम-आंतरिक वर्चुअल करेंसी है; Vito-आधारित अनुभव बनाने के लिए API का उपयोग करें — सामग्री, सुविधाएँ, लाभ या पुरस्कार अनलॉक करना। वास्तविक पैसे से कोई खरीद या बिक्री नहीं होती।

यह एक गुप्त कुंजी से प्रमाणित REST API है। सभी एंडपॉइंट JSON लौटाते हैं और /v1 के अंतर्गत संस्करणित हैं।

आधार URLhttps://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 टीम इसकी मैन्युअल समीक्षा करती है।
  • स्वीकृत API डेवलपर शर्तें — आपके डेवलपर आवेदन सबमिट करते समय स्वीकार की जाती हैं।
  • आपके प्रोजेक्ट को आवश्यक स्कोप। ये आपके आवेदन के आधार पर Vetox टीम द्वारा दिए जाते हैं।

उपलब्ध स्कोप

balance:read
किसी उपयोगकर्ता का Vito बैलेंस पढ़ना।
deduct:create
एक कटौती बनाना — किसी उपयोगकर्ता के Vito बैलेंस से शुल्क लेना।
credit:create
किसी उपयोगकर्ता को Vito जोड़ें — अपने बैलेंस से पुरस्कार या क्रेडिट वित्तपोषित करें।
transfer:create
दो उपयोगकर्ताओं के बीच स्थानांतरण बनाना।
transactions:read
अपने प्रोजेक्ट के लेनदेन सूचीबद्ध करना और पढ़ना।
04

प्रमाणीकरण

प्रत्येक अनुरोध को Authorization हेडर में अपनी गुप्त API कुंजी के साथ Bearer टोकन के रूप में प्रमाणित करें। कुंजियों में vito_live_ उपसर्ग होता है।

http
Authorization: Bearer vito_live_xxxxxxxxxxxxxxxx

दो वैकल्पिक परतें आपके प्रोजेक्ट को और सुरक्षित करती हैं:

  • IP अनुमति सूची — अनुरोधों को विशिष्ट सर्वर IP तक सीमित करें (इसे सेटिंग्स टैब में कॉन्फ़िगर करें)।
  • दर सीमाएँ — प्रति-प्रोजेक्ट अनुरोध सीमाएँ जो आपकी सदस्यता स्तर के साथ बढ़ती हैं।
05

API कुंजियाँ — भंडारण, घुमाव और सुरक्षा

आपकी कुंजी आवेदन स्वीकृत होने पर बनाई जाती है। यह केवल एक बार दिखाई जाती है — इसे API कुंजियाँ टैब से दिखाएँ और तुरंत संग्रहीत करें।

Vetox आपकी कुंजी को कभी भी पठनीय रूप में संग्रहीत नहीं करता (केवल एक साल्टेड हैश)। इसे सर्वर-साइड सीक्रेट के रूप में रखें — एक पर्यावरण चर या सीक्रेट मैनेजर — कभी भी क्लाइंट कोड, git रिपॉज़िटरी या ब्राउज़र में नहीं।

इसे API कुंजियाँ टैब से घुमाएँ। पुरानी कुंजी रुकने से पहले 24 घंटे की छूट अवधि तक काम करती रहती है ताकि आप नई कुंजी बिना डाउनटाइम के तैनात कर सकें।

कुंजी को पासवर्ड की तरह मानें — जिसके पास भी यह हो वह आपके उपयोगकर्ताओं से शुल्क ले सकता है। लीक होने पर तुरंत घुमाएँ और अपने हाल के लेनदेन की समीक्षा करें।
06

शुल्क पुष्टि प्रवाह

हर शुल्क एक पुष्टि से गुज़रता है जिसे उपयोगकर्ता PIN से स्वीकृत करता है — अकेले आपकी कुंजी कभी Vito नहीं हिलाती:

  1. 1आपका ऐप उपयोगकर्ता, राशि, स्रोत guildId और आइटम विवरण के साथ POST /deduct कॉल करता है।
  2. 2Vito एक लंबित पुष्टि (10 मिनट के लिए मान्य) बनाता है और एक confirmUrl लौटाता है। यदि guildId दिया गया है, तो उपयोगकर्ता को विवरण और पुष्टि पृष्ठ के बटन के साथ एक DM भी भेजा जाता है।
  3. 3उपयोगकर्ता vetox.io पर confirmUrl खोलता है और अपने वॉलेट PIN से शुल्क को स्वीकृत करता है।
  4. 4Vito, Vito घटाता है, लेनदेन रिकॉर्ड करता है, और — यदि आपने वेबहुक कॉन्फ़िगर किया है — आपके कॉलबैक URL पर एक हस्ताक्षरित confirmation.completed इवेंट भेजता है।
  5. 5आपका ऐप हस्ताक्षर सत्यापित करता है और अपनी क्रिया पूरी करता है (उदाहरण के लिए, सामग्री अनलॉक करता है)।
PIN केवल vetox.io पर दर्ज किए जाते हैं — कभी आपके ऐप या Discord के भीतर नहीं। यदि उपयोगकर्ता कभी पुष्टि नहीं करता, तो अनुरोध 10 मिनट बाद समाप्त हो जाता है और आपको confirmation.expired इवेंट मिलता है।
07

अनुरोध पैरामीटर (/deduct)

POST/v1/deduct

कटौती एंडपॉइंट निम्नलिखित बॉडी फ़ील्ड स्वीकार करता है:

discordId
उपयोगकर्ता की Discord उपयोगकर्ता ID — 17–20 अंकों का snowflake। आवश्यक।
amount
शुल्क के लिए Vito की मात्रा — एक धनात्मक पूर्णांक। आवश्यक।
guildId
वह Discord सर्वर जहाँ से शुल्क उत्पन्न होता है (snowflake)। आवश्यक — प्रत्येक शुल्क एक विशिष्ट सर्वर से आना चाहिए, जो उपयोगकर्ता को DM भी सक्षम करता है।
reason
एक छोटा पठनीय विवरण (≤ 256 वर्ण), उपयोगकर्ता को दिखाया जाता है और वेबहुक में दोहराया जाता है।
merchantRef
आपका अपना संदर्भ स्ट्रिंग (≤ 128 वर्ण)। वेबहुक को अपने रिकॉर्ड से मिलाने के लिए इसका उपयोग करें।
product
आइटम वर्णनकर्ता — { type, name, description?, imageUrl? }। पुष्टि पृष्ठ और DM में उपयोगकर्ता को दिखाया जाता है, और प्रत्येक वेबहुक में दोहराया जाता है।
product.imageUrl
वैकल्पिक उत्पाद छवि — एक https:// URL होनी चाहिए।
metadata
अधिकतम 10 स्ट्रिंग कुंजी/मान जोड़े, वेबहुक में ज्यों के त्यों पास किए जाते हैं।

* आवश्यक फ़ील्ड।

उदाहरण अनुरोध
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 जमा करता है — पुरस्कार या क्रेडिट के लिए। यह guildId और product को छोड़कर /deduct जैसे ही फ़ील्ड लेता है। शुल्क के विपरीत यह तत्काल है और उपयोगकर्ता के 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

वेबहुक और हस्ताक्षर सत्यापन

सेटिंग्स टैब में एक या अधिक https कॉलबैक URL जोड़ें। जब भी कोई पुष्टि अंतिम स्थिति तक पहुँचती है, Vito प्रत्येक कॉन्फ़िगर URL पर एक हस्ताक्षरित POST वितरित करता है, घातीय बैकऑफ़ के साथ 5 बार तक पुनः प्रयास करता है।

वेबहुक केवल तभी ट्रिगर होते हैं जब आपके प्रोजेक्ट के पास एक कॉन्फ़िगर कॉलबैक URL और एक साइनिंग सीक्रेट दोनों हों। अपने साइनिंग सीक्रेट (whsec_…) को API कुंजियाँ टैब से एक बार दिखाएँ।

हस्ताक्षर सत्यापित करना

प्रत्येक डिलीवरी में ts=<unix>;h1=<hex> रूप का एक X-Vito-Signature हेडर होता है। अपने साइनिंग सीक्रेट के साथ "<ts>:<rawBody>" पर HMAC पुनः गणना करें और स्थिर समय में तुलना करें। 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

वेबहुक इवेंट और पेलोड

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

त्रुटि कोड

त्रुटियाँ एक शीर्ष-स्तरीय error.code वाले JSON बॉडी के साथ गैर-2xx स्थिति लौटाती हैं। सामान्य मामले:

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

डेमो एकीकरण के साथ परीक्षण

बिना कोड लिखे पूरे प्रवाह को आद्योपांत आज़माने के लिए एक स्टैंडअलोन डेमो एकीकरण प्रदान किया गया है। यह अनुरोध → पुष्टि → PIN → वेबहुक → पूर्णता से गुज़रता है।

  1. 1डेमो एकीकरण फ़ोल्डर खोलें और अपनी Vito API कुंजी, एक Discord बॉट टोकन और अपना परीक्षण सर्वर (guild) ID config.json में जोड़ें।
  2. 2npm install && npm start चलाएँ, फिर http://localhost:4000 खोलें।
  3. 3Discord ID से एक उपयोगकर्ता खोजें, एक आइटम चुनें और एक शुल्क शुरू करें — डेमो /deduct कॉल करता है और confirmUrl दिखाता है।
  4. 4vetox.io पर PIN स्वीकृत करें; डेमो पूर्णता का पता लगाता है (कॉन्फ़िगर होने पर वेबहुक से, अन्यथा पोलिंग से) और नमूना क्रिया पूरी करता है।
वेबहुक प्राप्त करने के लिए एक सार्वजनिक https कॉलबैक और एक साइनिंग सीक्रेट चाहिए; इनके बिना डेमो आपके लेनदेन की पोलिंग पर लौट आता है, इसलिए यह बिना कॉन्फ़िगरेशन के काम करता है।
14

सर्वोत्तम प्रथाएँ, सीमाएँ और सुरक्षा

सुरक्षा

  • अपनी API कुंजी और साइनिंग सीक्रेट केवल सर्वर-साइड रखें; किसी के लीक होने पर तुरंत घुमाएँ।
  • वेबहुक हस्ताक्षर को हमेशा कच्चे बॉडी के विरुद्ध सत्यापित करें और ~5 मिनट से पुरानी डिलीवरी अस्वीकार करें (रिप्ले सुरक्षा)।
  • अपनी क्रिया केवल confirmation.completed पर पूरी करें — कभी /deduct प्रतिक्रिया पर नहीं (उस समय शुल्क अंतिम नहीं हुआ है)।
  • IP अनुमति सूची का उपयोग करें और केवल वही स्कोप माँगें जिनकी आपको वास्तव में आवश्यकता है।

सीमाएँ

  • पुष्टियाँ 10 मिनट बाद समाप्त हो जाती हैं; अपुष्ट अनुरोधों को परित्यक्त मानें।
  • दर सीमाएँ प्रति-प्रोजेक्ट होती हैं और स्वामी की सदस्यता स्तर के साथ बढ़ती हैं।
  • amount एक धनात्मक पूर्णांक होना चाहिए; metadata 10 कुंजियों तक सीमित है।
Idempotency-Key पुनः प्रयासों को डीडुप्लिकेट करता हैवेबहुक बैकऑफ़ के साथ 5× पुनः प्रयास करते हैं2xx जल्दी स्वीकारें, अतुल्यकालिक रूप से पूरा करें