دۆکیومێنتی Vito API

دوایین نوێکردنەوە: ٢٦ی حوزەیرانی ٢٠٢٦
01

Giştî

Vito API dihêle ku sepana te bi hevsengiya Vito ya bikarhênerekî ji nav Discord re bixebite — wê bixwîne, jê pere bistîne, an jê re kredî vegerîne. Bikarhêner her standina perê beriya ku tu Vito biguhere bi PIN-a xwe li vetox.io piştrast dike, û encam ji sepana te re tê agahdarkirin. Vito dirava virtual a hundirê ekosîstema Vetox e; API bikar bîne da ku ezmûnên li ser bingeha Vito ava bikî — vekirina naverok, taybetmendî, feyde an xelatan. Tu kirîn an firotina bi pereyê rastîn pêk nayê.

Ev API-yeke REST e ku bi kilîleke veşartî tê pejirandin. Hemû xalên dawî JOSN vedigerînin û li jêr /v1 hatine guhertoyandin.

URL-a bingehînhttps://api.vetox.io/public/vito/v1
02

Balans û veqetandin

Mifteya APIya te bi hesabê te yê Vetox ve girêdayî ye. Her kêşan ji bo te tê veqetandin: dema bernameya te Vito ji bikarhênerek kêm dike, ew Vito li balansa te tê zêdekirin (piştî kêmkirina xerca platformê), tu carî nayê şewitandin. Dema bernameya te Vito li bikarhênerek zêde dike, ji balansa te tê dabînkirin.

Vito her dem di navbera balansan de digere — tu carî ji pere an bo pereyê rastîn na. Ji bikarhêner tevahiya mîqdara ku tu daxwaz dikî tê standin; tu piştî xerca platformê mîqdarê werdigirî; kredî û xelat ji balansa te bi riya /add têne dabînkirin.

Xerca platformê — heman tabloya veguhastina Vito ya hundirê bernameyê, li gor asta endamtiya te: 7% (Silver / Gold), 6% (Platinum), 5% (Diamond). Kêşanên 5 Vito an kêmtir bê xerc in. Krediyên bi riya /add tu carî xerc li wan nayê barkirin.
03

Pêdivî

Gihîştina Vito API ji bo her projeyekê tê dayîn. Beriya ku tu wê gazî bikî pêdivî bi te heye:

  • Endamtiyeke bikarhênerî ya çalak (asta Silver an bilindtir). Eger endamtiya xwedî biqede API bixweber tê cemidandin, û dema ku ji nû ve abone bibe vedigere.
  • Sepanek pêşvebirî ya pejirandî. Yekê ji vê rûpelê bişîne; tîma Vetox wê bi destan dinirxîne.
  • Mercên Pêşvebirê API yên pejirandî — dema ku tu serlêdana pêşvebiriya xwe dişînî tê pejirandin.
  • Qadên ku projeya te pêdivî pê hene. Ji aliyê tîma Vetox ve li gor sepana te tê dayîn.

Qadên berdest

balance:read
Xwendina hevsengiya Vito ya bikarhênerekî.
deduct:create
Çêkirina kêmkirinekê — ji hevsengiya Vito ya bikarhênerekî pere standin.
credit:create
Vito li bikarhênerek zêde bike — xelat an krediyan ji balansa xwe dabîn bike.
transfer:create
Çêkirina veguhastinekê di navbera du bikarhêneran de.
transactions:read
Lîstekirin û xwendina danûstandinên projeya te.
04

Pejirandin

Her daxwazê bi kilîla API ya veşartî di sernavê Authorization de wek tokena Bearer pejirandinê bike. Kilîl pêşgira vito_live_ hene.

http
Authorization: Bearer vito_live_xxxxxxxxxxxxxxxx

Du qatên vebijarkî projeya te bêtir diparêzin:

  • Lîsteya destûrê ya IP — daxwazan bi IP-ên taybet ên serverê sînor bike (li tabê Mîheng wê mîheng bike).
  • Sînorên rêjeyê — banî daxwazan ji bo her projeyê yên ku bi asta endamtiya te re mezin dibin.
05

Kilîlên API — hilanîn, zivirandin û ewlehî

Kilîla te dema ku sepana te tê pejirandin tê çêkirin. Ew tenê carekê tê nîşandan — wê ji tabê Kilîlên API nîşan bide û tavilê hilîne.

Vetox kilîla te tu carî bi awayekî xwendinbar hilnayne (tenê heşek bi xwê). Wê wek veşartiyekê li aliyê serverê hilîne — guhêrbarek hawîrdorê an rêveberek veşartiyan — tu carî di koda muşteriyê, depoya git an gerokê de.

Wê ji tabê Kilîlên API bizivirîne. Kilîla berê di heyama lêborînê ya 24 saetan de berdewam dixebite da ku tu ya nû bê rawestan belav bikî, paşê radiweste.

Bi kilîlê re wek şîfreyekê tevbigere — her kesê ku wê bigire dikare ji bikarhênerên te pere bistîne. Eger derkeve, tavilê wê bizivirîne û danûstandinên xwe yên dawî binirxîne.
06

Herikîna piştrastkirina standina perê

Her standina perê di nav piştrastkirinekê re derbas dibe ku bikarhêner bi PIN-a xwe pejirandinê dike — kilîla te bi tena serê xwe tu carî Vito naguhêze:

  1. 1Sepana te POST /deduct bi bikarhêner, mîqdar, guildId-a jêderkê û hûrgiliyên tiştî gazî dike.
  2. 2Vito piştrastkirineke li benda (10 xulek derbasdar) çêdike û confirmUrl vedigerîne. Eger guildId hat dayîn, peyamek rasterast a bi hûrgiliyan û bişkokeke ber bi rûpela piştrastkirinê re jî ji bikarhêner re tê şandin.
  3. 3Bikarhêner confirmUrl li vetox.io vedike û standina perê bi PIN-a berîka xwe pejirandinê dike.
  4. 4Vito Vito kêm dike, danûstandinê tomar dike û — eger te webhook mîheng kiribe — bûyereke îmzekirî ya confirmation.completed ji URL-a callback-a te re dişîne.
  5. 5Sepana te îmzeyê piştrast dike û çalakiya xwe temam dike (mînak, naverokê vedike).
PIN tenê li vetox.io tên nivîsandin — tu carî di sepana te an di Discord de na. Eger bikarhêner tu carî piştrast neke, daxwaz piştî 10 xulekan diqede û tu bûyera confirmation.expired werdigirî.
07

Parametreyên daxwazê (/deduct)

POST/v1/deduct

Xala dawî ya kêmkirinê van qadên laş qebûl dike:

discordId
Nasnameya bikarhênerê Discord ya bikarhêner — snowflake-yeke 17–20 reqemî. Pêwîst.
amount
Mîqdara Vito ku were standin — hejmareke tam a erênî. Pêwîst.
guildId
Servera Discord ku standina perê jê derdikeve (snowflake). Pêwîst — divê her standina perê ji serverekî taybet were, ku peyama rasterast ji bikarhêner re jî çalak dike.
reason
Danasîneke kurt a xwendinbar (≤ 256 tîp), ku ji bikarhêner re tê nîşandan û di webhook de tê dubarekirin.
merchantRef
Rêzika referansê ya te bi xwe (≤ 128 tîp). Wê bikar bîne da ku webhook bi tomarên xwe re biguncînî.
product
Pênaserê tiştî — { type, name, description?, imageUrl? }. Li rûpela piştrastkirinê û peyama rasterast ji bikarhêner re tê nîşandan, û di her webhook de tê dubarekirin.
product.imageUrl
Wêneyê berhemê yê vebijarkî — divê URL-eke https:// be.
metadata
Heta 10 cotên kilîl/nirx ên rêzikî, ku wek xwe di webhook de tên derbaskirin.

* qada pêwîst.

Daxwaza mînak
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" }
}
Bersiva mînak
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

Zêdekirina Vito — kredî (/add)

POST/v1/add

POST /add Vito ji balansa te bo bikarhênerek dide — ji bo xelat an krediyan. Heman qadan wek /deduct werdigire ji bilî guildId û product. Berevajî kêşanek, ew lezgîn e û hewceyî PINa bikarhêner nake — mifteya APIya te desthilatiya te ye — loma bersiv jixwe veguhastina temamkirî nîşan dide. Bikarhêner tevahiya mîqdarê werdigire; tu xerca platformê nayê sepandin.

Pêdiviya bi scope-a credit:create û Vitoyê têrê di balansa te de heye — wekî din bang 402 INSUFFICIENT_OWNER_FUNDS vedigerîne.
Daxwaza mînak
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" }
}
Bersiva mînak
json
{
  "success": true,
  "data": {
    "transactionId": "txn_91b2",
    "toDiscordId": "123456789012345678",
    "amount": 250,
    "ownerBalance": 48250,
    "recipientBalance": 1250,
    "status": "completed"
  },
  "requestId": "req_def456",
  "timestamp": 1735689300000
}
09

Webhook û piştrastkirina îmzeyê

Li tabê Mîheng yek an çend URL-ên callback ên https zêde bike. Vito her car ku piştrastkirinek digihîje rewşeke dawî, POST-eke îmzekirî ji her URL-a mîhengkirî re radigihîne, heta 5 caran bi paşvekişîna ekponansiyel ji nû ve hewl dide.

Webhook tenê dema ku projeya te hem URL-eke callback a mîhengkirî hem jî veşartiyeke îmzeyê hebe çalak dibin. Veşartiya îmzeyê ya xwe (whsec_…) carekê ji tabê Kilîlên API nîşan bide.

Piştrastkirina îmzeyê

Her radigihandin sernavekî X-Vito-Signature yê bi şêwaza ts=<unix>;h1=<hex> hildigire. HMAC-ê li ser "<ts>:<rawBody>" bi veşartiya îmzeyê ya xwe ji nû ve hesab bike û di demeke sabît de bide ber hev. Her dem beriya analîzkirina JSON, li hember laşê xav ê daxwazê piştrast bike.

http
signature = HMAC_SHA256(signingSecret, "<ts>:<rawBody>")
header    = X-Vito-Signature: ts=<unix-seconds>;h1=<hex-signature>
Piştrastkerê referans (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

Bûyerên webhook û bar

Vito yek ji çar cureyên bûyeran dişîne. Hemû heman şêwaza barê parve dikin; data.status encamê nîşan dide.

confirmation.completed
Bikarhêner piştrast kir û Vito hat kêmkirin. Çalakiya xwe temam bike. transactionId hildigire.
confirmation.failed
Standina perê nehat temamkirin (mînak, hevsengiya têra nake an çewtiyeke navxweyî). failureReason hildigire.
confirmation.expired
Bikarhêner di 10 xulekan de piştrast nekir. Tu Vito neguherî.
confirmation.cancelled
Bikarhêner daxwaz betal kir. Tu Vito neguherî.
credit.completed
Krediyek /add ya ku ji aliyê xwedî ve hatiye dabînkirin hate veqetandin. Wergir û transactionId di nav xwe de digire, û yekser tê şandin — tu gava piştrastkirinê tune.
Barê mînak (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

Kodên çewtiyê

Çewtî rewşeke ne-2xx bi laşeke JSON ku error.code-ya asta jor hildigire vedigerînin. Rewşên gelemperî:

400VITO_VALIDATION_ERROR
Qadeke daxwazê kêm e an xelet hatiye çêkirin (mînak, guildId-yeke nederbasdar).
401invalid key
Kilîla API ya winda, xelet an nenas.
403OWNER_MEMBERSHIP_INACTIVE
Endamtiya xwediyê projeyê qediyaye — API cemidî ye heta ku ew ji nû ve abone bibe.
403scope / IP
Kilîlê qada pêwîst tune, an IP-ya daxwazê ne di lîsteya destûrê de ye.
404not found
Bikarhêner, danûstandin an çavkanî tune.
402insufficient balance
Bikarhêner têra standina perê Vito tune.
402INSUFFICIENT_OWNER_FUNDS
Balansa te ya (xwedî) pir kêm e ku krediyek /add dabîn bike.
429rate limited
Te sînorê rêjeyê yê projeyê derbas kir — bisekine û ji nû ve hewl bide.
Şêwaza bersiva çewtiyê
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

Mînakên entegrasyonê

Daxwazeke standina perê çêbike:

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

Hevsengiya bikarhênerekî kontrol bike:

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

Ceribandin bi entegrasyona demoyê

Entegrasyoneke demoyê ya serbixwe tê pêşkêşkirin da ku tu tevahiya herikînê ji destpêkê heta dawiyê bêyî nivîsandina koda biceribînî. Daxwaz → piştrastkirin → PIN → webhook → temamkirin derbas dike.

  1. 1Peldanka entegrasyona demoyê veke û kilîla Vito API, tokeneke botê ya Discord û nasnameya servera (guild) ceribandinê ya xwe li config.json zêde bike.
  2. 2npm install && npm start bimeşîne, paşê http://localhost:4000 veke.
  3. 3Bikarhênerekî bi nasnameya Discord bigere, tiştekî hilbijêre û standina perê dest pê bike — demo /deduct gazî dike û confirmUrl nîşan dide.
  4. 4PIN-ê li vetox.io pejirandinê bike; demo temamiyê tespît dike (bi webhook eger mîhengkirî be, wekî din bi pirsîn) û çalakiya mînak temam dike.
Wergirtina webhook callback-eke https ya giştî û veşartiyeke îmzeyê dixwaze; bêyî wan demo vedigere pirsîna danûstandinên te, ji ber vê yekê bêyî mîhengkirinê dixebite.
14

Şêwazên çêtirîn, sînor û ewlehî

Ewlehî

  • Kilîla API û veşartiya îmzeyê ya xwe tenê li aliyê serverê bihêle; eger yek ji wan derkeve tavilê wê bizivirîne.
  • Her dem îmzeya webhook li hember laşê xav piştrast bike û radigihandinên ji ~5 xulekan kevntir red bike (parastina dijî dubarekirinê).
  • Çalakiya xwe tenê li ser confirmation.completed temam bike — tu carî li ser bersiva /deduct na (di wê demê de standina perê hîn ne qet'î ye).
  • Lîsteya destûrê ya IP bikar bîne û tenê qadên ku bi rastî pêdivî bi wan heye bixwaze.

Sînor

  • Piştrastkirin piştî 10 xulekan diqedin; daxwazên nepiştrastkirî wek terikandî bihesibîne.
  • Sînorên rêjeyê ji bo her projeyê ne û bi asta endamtiya xwedî re mezin dibin.
  • amount divê hejmareke tam a erênî be; metadata bi 10 kilîlan sînorkirî ye.
Idempotency-Key hewldanên dubare ji holê radikeWebhook 5× bi paşvekişînê ji nû ve hewl didin2xx-ê zû piştrast bike, bi awayekî nehevdem pêk bîne