Vito API Belgeleri

Son güncelleme: 26 Haziran 2026
01

Genel bakış

Vito API, uygulamanızın Discord içinden bir kullanıcının Vito bakiyesiyle çalışmasını sağlar — onu okumak, ondan tahsilat yapmak veya geri alacak yazmak. Kullanıcı, herhangi bir Vito hareket etmeden önce her tahsilatı vetox.io’da PIN’iyle onaylar ve uygulamanız sonuçtan haberdar edilir. Vito, Vetox ekosistemine ait sanal para birimidir; Vito tabanlı deneyimler oluşturmak için API’yi kullanın — içerik, özellik, ayrıcalık veya ödül kilidini açma. Gerçek parayla hiçbir alım veya satım gerçekleşmez.

Bu, gizli bir anahtarla kimlik doğrulayan bir REST API’dir. Tüm uç noktalar JSON döndürür ve /v1 altında sürümlenir.

Temel URLhttps://api.vetox.io/public/vito/v1
02

Bakiyeler ve mutabakat

API anahtarınız Vetox hesabınıza bağlıdır. Her tahsilat sizin lehinize mutabık kılınır: uygulamanız bir kullanıcıdan Vito düştüğünde, o Vito kendi bakiyenize (platform ücreti düşülerek) eklenir, asla yakılmaz. Uygulamanız bir kullanıcıya Vito eklediğinde, bu sizin bakiyenizden finanse edilir.

Vito her zaman bakiyeler arasında hareket eder — asla gerçek paradan veya gerçek paraya değil. Kullanıcıdan istediğiniz tutarın tamamı tahsil edilir; siz platform ücreti sonrası tutarı alırsınız; alacaklar ve ödüller /add ile bakiyenizden finanse edilir.

Platform ücreti — uygulama içi Vito transferleriyle aynı tarife, üyelik seviyenize göre: %7 (Silver / Gold), %6 (Platinum), %5 (Diamond). 5 Vito veya daha az tahsilatlar ücretsizdir. /add ile alacaklardan asla ücret alınmaz.
03

Gereksinimler

Vito API erişimi proje başına verilir. Onu çağırabilmeniz için şunlara ihtiyacınız var:

  • Etkin bir Kullanıcı Üyeliği (Silver seviyesi veya üzeri). Sahibin üyeliği sona ererse API otomatik olarak dondurulur ve yeniden abone olunduğunda geri yüklenir.
  • Onaylanmış bir geliştirici başvurusu. Bu sayfadan bir tane gönderin; Vetox ekibi manuel olarak inceler.
  • Kabul edilen API Geliştirici Şartları — geliştirici başvurunuzu gönderdiğinizde onaylanır.
  • Projenizin ihtiyaç duyduğu kapsamlar. Başvurunuza göre Vetox ekibi tarafından verilir.

Kullanılabilir kapsamlar

balance:read
Bir kullanıcının Vito bakiyesini okuma.
deduct:create
Bir kesinti oluşturma — bir kullanıcının Vito bakiyesinden tahsilat yapma.
credit:create
Bir kullanıcıya Vito ekle — ödülleri veya alacakları bakiyenizden finanse edin.
transfer:create
İki kullanıcı arasında transfer oluşturma.
transactions:read
Projenizin işlemlerini listeleme ve okuma.
04

Kimlik doğrulama

Her isteği, Authorization başlığında Bearer belirteci olarak gizli API anahtarınızla doğrulayın. Anahtarlar vito_live_ önekini taşır.

http
Authorization: Bearer vito_live_xxxxxxxxxxxxxxxx

İki isteğe bağlı katman projenizi daha da korur:

  • IP izin listesi — istekleri belirli sunucu IP’leriyle kısıtlayın (Ayarlar sekmesinde yapılandırın).
  • Hız sınırları — üyelik seviyenizle ölçeklenen proje başına istek tavanları.
05

API anahtarları — saklama, döndürme ve güvenlik

Anahtarınız başvurunuz onaylandığında oluşturulur. Yalnızca bir kez gösterilir — API anahtarları sekmesinden görüntüleyin ve hemen saklayın.

Vetox anahtarınızı asla okunabilir biçimde saklamaz (yalnızca tuzlu bir karma). Onu sunucu tarafı bir sır olarak — bir ortam değişkeni veya bir sır yöneticisi — saklayın, asla istemci kodunda, bir git deposunda veya bir tarayıcıda değil.

API anahtarları sekmesinden döndürün. Eski anahtar, yenisini kesinti olmadan dağıtmanız için 24 saatlik bir geçiş süresi boyunca çalışmaya devam eder, sonra durur.

Anahtarı bir parola gibi ele alın — ona sahip olan herkes kullanıcılarınızdan ücret alabilir. Sızarsa hemen döndürün ve son işlemlerinizi gözden geçirin.
06

Tahsilat onay akışı

Her tahsilat, kullanıcının PIN’iyle onayladığı bir doğrulamadan geçer — anahtarınız tek başına asla Vito taşımaz:

  1. 1Uygulamanız kullanıcı, tutar, kaynak guildId ve öğe ayrıntılarıyla POST /deduct çağrısı yapar.
  2. 2Vito bekleyen bir doğrulama (10 dakika geçerli) oluşturur ve bir confirmUrl döndürür. Bir guildId verilirse, kullanıcıya ayrıntıları ve doğrulama sayfasına bir düğmeyi içeren bir DM de gönderilir.
  3. 3Kullanıcı vetox.io’da confirmUrl’yi açar ve cüzdan PIN’iyle tahsilatı onaylar.
  4. 4Vito, Vito’yu düşer, işlemi kaydeder ve — bir webhook yapılandırdıysanız — geri çağırma URL’nize imzalı bir confirmation.completed olayı gönderir.
  5. 5Uygulamanız imzayı doğrular ve kendi eylemini tamamlar (örneğin, içeriğin kilidini açar).
PIN’ler yalnızca vetox.io’da girilir — asla uygulamanızda veya Discord’da değil. Kullanıcı hiç onaylamazsa, istek 10 dakika sonra sona erer ve bir confirmation.expired olayı alırsınız.
07

İstek parametreleri (/deduct)

POST/v1/deduct

Kesinti uç noktası aşağıdaki gövde alanlarını kabul eder:

discordId
Kullanıcının Discord kullanıcı kimliği — 17–20 haneli bir snowflake. Zorunlu.
amount
Tahsil edilecek Vito miktarı — pozitif bir tam sayı. Zorunlu.
guildId
Tahsilatın kaynaklandığı Discord sunucusu (snowflake). Zorunlu — her tahsilat belirli bir sunucudan gelmelidir, bu da kullanıcıya DM’yi etkinleştirir.
reason
Kullanıcıya gösterilen ve webhook’ta tekrarlanan kısa, okunabilir bir açıklama (≤ 256 karakter).
merchantRef
Kendi referans dizginiz (≤ 128 karakter). Webhook’u kayıtlarınızla eşleştirmek için kullanın.
product
Öğe tanımlayıcısı — { type, name, description?, imageUrl? }. Kullanıcıya doğrulama sayfasında ve DM’de gösterilir, her webhook’ta tekrarlanır.
product.imageUrl
İsteğe bağlı ürün görseli — bir https:// URL’si olmalıdır.
metadata
Webhook’ta olduğu gibi iletilen en fazla 10 dize anahtar/değer çifti.

* zorunlu alan.

Örnek istek
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" }
}
Örnek yanıt
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 ekleme — alacaklar (/add)

POST/v1/add

POST /add, kendi bakiyenizden bir kullanıcıya Vito yatırır — ödüller veya alacaklar için. guildId ve product hariç /deduct ile aynı alanları alır. Bir tahsilatın aksine anlıktır ve kullanıcı PIN’i gerektirmez — API anahtarınız yetkinizdir — bu nedenle yanıt zaten tamamlanmış aktarımı yansıtır. Kullanıcı tutarın tamamını alır; hiçbir platform ücreti uygulanmaz.

credit:create kapsamını ve kendi bakiyenizde yeterli Vito’yu gerektirir — aksi takdirde çağrı 402 INSUFFICIENT_OWNER_FUNDS döndürür.
Örnek istek
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" }
}
Örnek yanıt
json
{
  "success": true,
  "data": {
    "transactionId": "txn_91b2",
    "toDiscordId": "123456789012345678",
    "amount": 250,
    "ownerBalance": 48250,
    "recipientBalance": 1250,
    "status": "completed"
  },
  "requestId": "req_def456",
  "timestamp": 1735689300000
}
09

Webhook’lar ve imza doğrulama

Ayarlar sekmesinde bir veya daha fazla https geri çağırma URL’si ekleyin. Vito, bir doğrulama nihai bir duruma ulaştığında her yapılandırılmış URL’ye imzalı bir POST teslim eder ve üstel geri çekilmeyle en fazla 5 kez yeniden dener.

Webhook’lar yalnızca projenizin HEM yapılandırılmış bir geri çağırma URL’si HEM de bir imzalama gizli anahtarı olduğunda tetiklenir. İmzalama gizli anahtarınızı (whsec_…) API anahtarları sekmesinden bir kez görüntüleyin.

İmzayı doğrulama

Her teslimat ts=<unix>;h1=<hex> biçiminde bir X-Vito-Signature başlığı taşır. HMAC’yi imzalama gizli anahtarınızla "<ts>:<rawBody>" üzerinde yeniden hesaplayın ve sabit zamanda karşılaştırın. JSON ayrıştırmadan önce her zaman ham istek gövdesine karşı doğrulayın.

http
signature = HMAC_SHA256(signingSecret, "<ts>:<rawBody>")
header    = X-Vito-Signature: ts=<unix-seconds>;h1=<hex-signature>
Referans doğrulayıcı (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 olayları ve yükler

Vito dört olay türünden birini gönderir. Hepsi aynı yük biçimini paylaşır; data.status sonucu yansıtır.

confirmation.completed
Kullanıcı onayladı ve Vito düşüldü. Kendi eyleminizi tamamlayın. transactionId taşır.
confirmation.failed
Tahsilat tamamlanamadı (örneğin, yetersiz bakiye veya bir iç hata). failureReason taşır.
confirmation.expired
Kullanıcı 10 dakika içinde onaylamadı. Vito hareket etmedi.
confirmation.cancelled
Kullanıcı isteği iptal etti. Vito hareket etmedi.
credit.completed
Sahibin finanse ettiği bir /add alacağı mutabık kılındı. Alıcıyı ve transactionId’yi taşır ve anında tetiklenir — onay adımı yoktur.
Örnek yük (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

Hata kodları

Hatalar, üst düzey bir error.code taşıyan bir JSON gövdesiyle 2xx olmayan bir durum döndürür. Yaygın durumlar:

400VITO_VALIDATION_ERROR
Bir istek alanı eksik veya hatalı biçimlendirilmiş (örneğin, geçersiz bir guildId).
401invalid key
Eksik, hatalı biçimlendirilmiş veya bilinmeyen API anahtarı.
403OWNER_MEMBERSHIP_INACTIVE
Proje sahibinin üyeliği sona erdi — sahip yeniden abone olana kadar API donduruldu.
403scope / IP
Anahtar gerekli kapsamdan yoksun veya istek IP’si izin listesinde değil.
404not found
Kullanıcı, işlem veya kaynak mevcut değil.
402insufficient balance
Kullanıcının tahsilat için yeterli Vito’su yok.
402INSUFFICIENT_OWNER_FUNDS
Kendi (sahip) bakiyeniz bir /add alacağını finanse etmek için çok düşük.
429rate limited
Projenizin hız sınırını aştınız — bekleyin ve yeniden deneyin.
Hata yanıtı biçimi
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

Entegrasyon örnekleri

Bir tahsilat isteği oluşturun:

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" }
  }'

Bir kullanıcının bakiyesini kontrol edin:

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

Demo entegrasyonuyla test etme

Tam akışı kod yazmadan baştan sona denemeniz için bağımsız bir demo entegrasyonu sağlanır. İstek → doğrulama → PIN → webhook → tamamlanma adımlarını izler.

  1. 1Demo entegrasyonu klasörünü açın ve Vito API anahtarınızı, bir Discord bot belirtecini ve test sunucusu (guild) kimliğinizi config.json’a ekleyin.
  2. 2npm install && npm start komutunu çalıştırın, ardından http://localhost:4000 adresini açın.
  3. 3Bir kullanıcıyı Discord kimliğiyle arayın, bir öğe seçin ve bir tahsilat başlatın — demo /deduct çağrısı yapar ve confirmUrl’yi gösterir.
  4. 4vetox.io’da PIN’i onaylayın; demo tamamlanmayı algılar (yapılandırıldıysa webhook ile, aksi takdirde yoklama ile) ve örnek eylemi tamamlar.
Webhook’u almak için herkese açık bir https geri çağırması ve bir imzalama gizli anahtarı gerekir; bunlar olmadan demo işlemlerinizi yoklamaya geri döner, böylece kurulum olmadan çalışır.
14

En iyi uygulamalar, sınırlar ve güvenlik

Güvenlik

  • API anahtarınızı ve imzalama gizli anahtarınızı yalnızca sunucu tarafında tutun; biri sızarsa hemen döndürün.
  • Webhook imzasını her zaman ham gövdeye karşı doğrulayın ve ~5 dakikadan eski teslimatları reddedin (yeniden oynatma koruması).
  • Kendi eyleminizi yalnızca confirmation.completed’da tamamlayın — asla /deduct yanıtında değil (o noktada tahsilat henüz kesinleşmemiştir).
  • IP izin listesini kullanın ve yalnızca gerçekten ihtiyaç duyduğunuz kapsamları isteyin.

Sınırlar

  • Doğrulamaların süresi 10 dakika sonra dolar; onaylanmamış istekleri terk edilmiş sayın.
  • Hız sınırları proje başınadır ve sahibin üyelik seviyesiyle ölçeklenir.
  • amount pozitif bir tam sayı olmalıdır; metadata 10 anahtarla sınırlıdır.
Idempotency-Key yeniden denemeleri tekilleştirirWebhook’lar geri çekilmeyle 5× yeniden dener2xx’i hızlı onaylayın, eşzamansız karşılayın