Skip to main content
Vereist een Silver-lidmaatschap of hoger — zowel om je aan te melden als voor elke geauthenticeerde aanroep. Verloopt het lidmaatschap van de sleutelhouder, dan wordt het project bevroren tot hij zich opnieuw abonneert.
Een REST-API waarmee je applicatie vanuit Discord met het Vito-saldo van een gebruiker werkt: uitlezen, afschrijven, bijschrijven of tussen gebruikers verplaatsen. Alle endpoints geven JSON terug en zijn geversioneerd onder /v1.
Vito wordt nooit omgezet in echt geld, en komt er ook nooit uit voort. Het beweegt uitsluitend tussen Vetox-saldi.
Elk endpoint zit onder https://api.vetox.io/public/vito.De paden op deze pagina — /v1/deduct, /v1/balance/:discordId en de rest — zijn relatief aan dat voorvoegsel, dat de SDK er voor je voor plakt. Roep je er zelf een aan, gebruik dan de volledige URL:
https://api.vetox.io/v1/deduct is geen route en geeft 404.
Bouw je met Node.js? Schrijf de REST-aanroepen niet zelf — gebruik het officiële pakket @vetox-bot/vito. Het dekt alle negen endpoints plus de webhookverificatie, en regelt idempotentie en nieuwe pogingen voor je. Zie Officiële Node.js-SDK hieronder.

Toegang krijgen

Toegang wordt per project verleend. Je hebt alle vier nodig:
1

Een actief lidmaatschap, Silver of hoger

Wordt bij elke aanroep gecontroleerd, niet alleen bij goedkeuring.
2

Een goedgekeurde ontwikkelaarsaanvraag

Ingediend via de Vito API-pagina in je dashboard. Wordt handmatig beoordeeld door het Vetox-team.
3

Geaccepteerde API-ontwikkelaarsvoorwaarden

Worden bevestigd bij het indienen van de aanvraag.
4

De scopes die je project nodig heeft

Worden door het Vetox-team toegekend op basis van je beschrijving.
Wees concreet over wat je bouwt en hoe je de sleutel opslaat. Het zijn de vage aanvragen die worden afgewezen.

Scopes

Authenticatie

Stuur je geheime sleutel mee als Bearer-token:
Twee optionele lagen maken een project extra robuust:
  • IP-allowlist — beperk aanroepen tot specifieke server-IP’s
  • Rate limits — plafonds per project die meeschalen met het lidmaatschapsniveau van de houder

Sleutels, rotatie en opslag

Je sleutel en signing secret worden precies één keer getoond. Na goedkeuring heb je een venster van 7 dagen om ze te onthullen op het tabblad met API-sleutels. Vetox bewaart alleen een hash en kan ze niet opnieuw tonen — mis je het venster, dan moet je roteren.
  • Houd hem uitsluitend serverzijdig — wie hem heeft, kan je gebruikers afschrijven
  • Roteer via het tabblad met API-sleutels. De vorige sleutel blijft nog 24 uur werken als overgangsperiode, zodat je zonder downtime kunt uitrollen
  • Het webhook-signing-secret roteert apart, met een eigen overlap van 24 uur
  • Bij een lek: onmiddellijk roteren

Officiële Node.js-SDK

Het officiële pakket @vetox-bot/vito omhult alle negen endpoints plus de webhookverificatie. Het regelt de Idempotency-Key-header, nieuwe pogingen met exponentiële backoff, time-outs en de classificatie van fouten voor je.

Installatie

Vereist Node.js 20 of nieuwer. Het pakket heeft geen enkele runtime-afhankelijkheid — het gebruikt de ingebouwde fetch en node:crypto — en wordt geleverd in zowel ESM als CommonJS, met volledige TypeScript-definities.

Initialisatie

Laat je apiKey weg, dan leest de SDK VITO_API_KEY uit de omgeving. Het sleutelformaat wordt bij het aanmaken gecontroleerd, zodat een misvormde sleutel meteen faalt in plaats van je een netwerkronde en een 401 te kosten.
De sleutel verplaatst geld — houd hem altijd serverzijdig, nooit in een clientbundel of in de browser. console.log(vito) toont [redacted] in plaats van de sleutel, en de SDK weigert elke baseUrl met http:// naar een niet-lokale host, zodat de sleutel niet onversleuteld over de lijn gaat.

Clientopties

Beschikbare methoden

Elke methode geeft het uitgepakte data-veld rechtstreeks terug — je hoeft success of data nooit zelf uit te pakken. Alle methoden accepteren daarnaast opties per aanroep: { timeoutMs, maxRetries, signal, headers }, en de schrijfmethoden bovendien { idempotencyKey }.

Gebruiksvoorbeelden

De sleutel controleren bij het opstarten

Een saldo uitlezen

Een gebruiker afschrijven (een artikel verkopen)

Leg de bestelling hier alleen vast als openstaand. De afschrijving heeft nog niet plaatsgevonden — lever pas bij de webhook confirmation.completed, niet bij dit antwoord.

Een gebruiker bijschrijven

Door transacties bladeren

Idempotentie en nieuwe pogingen

De SDK stuurt bij elke schrijfactie (deduct, credit, transfer) een Idempotency-Key-header mee. Geef je er geen op, dan genereert hij de sleutel één keer per aanroep en stuurt exact dezelfde sleutel bij elke nieuwe poging opnieuw, zodat een herhaalde poging de bewerking nooit twee keer kan verrekenen. Geef je eigen sleutel mee wanneer dezelfde logische bewerking opnieuw kan worden gestart vanuit een nieuw proces — een taakrunner, een herlevering uit een wachtrij of een geplande run:
auth.rotateKey() is bewust uitgesloten — een nieuwe poging maakt daar een tweede sleutel aan en maakt de sleutel uit de eerste poging ongeldig.
Is Retry-After langer dan maxRetryDelayMs (je uurquotum is dus werkelijk op), dan gooit de SDK direct VitoRateLimitError in plaats van je hele verzoekbudget te verslapen.

Webhooks verifiëren met de SDK

constructEvent controleert het replay-venster van 5 minuten, vergelijkt in constante tijd met elke h1-handtekening in de header — het werkt dus automatisch tijdens de overlap van 24 uur bij een rotatie — en parseert daarna de payload en geeft de getypeerde gebeurtenis terug. Gebruik in een Next.js-routehandler (App Router) de variant die de ruwe body zelf leest:
De handtekening dekt de ruwe bytes. Koppel in Express express.raw({ type: 'application/json' }) aan de webhookroute — express.json() verbruikt de body en daarna faalt elke verificatie. Roep in Next.js request.json() niet aan vóór constructEventFromRequest.
Aflevering gebeurt minstens één keer. Dedupliceer op event.eventId voordat je een neveneffect uitvoert.

Foutafhandeling

Alles wat de SDK gooit erft van VitoError en draagt code, status, type, requestId en retryable.
Log altijd de requestId — dat is wat support nodig heeft om een specifieke aanroep te traceren.

Een aanroep annuleren

Annuleren stopt ook een wachtende nieuwe poging en gooit VitoConnectionError met de code VITO_SDK_ABORTED.

Een gebruiker afschrijven

Je sleutel alleen kan het Vito van een gebruiker niet verplaatsen. Elke afschrijving vereist dat de gebruiker akkoord gaat met de pincode van zijn wallet, op vetox.io — nooit in je app en nooit in Discord.
1

Je app roept POST /v1/deduct aan

Met de gebruiker, het bedrag, de guildId van herkomst en de artikelgegevens.
2

Vito geeft een confirmUrl terug

Een openstaande bevestiging, 10 minuten geldig. De gebruiker krijgt ook een DM.
3

De gebruiker keurt goed met zijn pincode

Op vetox.io.
4

Vito verrekent en meldt

Het saldo wordt afgeschreven, de transactie vastgelegd en er wordt een ondertekende webhook verstuurd als je er een hebt ingesteld.
5

Je app verifieert en rondt af

Controleer de handtekening en ontgrendel dan de content of lever het artikel.
Rond je actie uitsluitend af bij confirmation.completed — nooit op basis van het antwoord van /deduct. Op dat moment staat de afschrijving nog niet vast.

Requestparameters — /v1/deduct

Een gebruiker bijschrijven

POST /v1/add schrijft Vito bij een gebruiker bij uit je eigen saldo — voor beloningen of terugbetalingen. Dezelfde velden als /deduct, behalve guildId en product.
Anders dan een afschrijving heeft een bijschrijving geen bevestigingsstap: die wordt direct verrekend. Vereist de scope credit:create en voldoende saldo, anders geeft de aanroep 402 VITO_INSUFFICIENT_OWNER_FUNDS terug.

Kosten

Elke afschrijving wordt aan jou uitbetaald minus de platformkosten — hetzelfde schema als Vito-overboekingen in de app, op basis van jouw lidmaatschapsniveau:
Bedragen van 5 Vito of minder zijn kosteloos, en bijschrijvingen via /v1/add zijn dat altijd.

Webhooks

Voeg op het tabblad met instellingen een of meer https-callback-URL’s toe. Vito stuurt een ondertekende POST zodra een bevestiging een eindtoestand bereikt.
Webhooks worden alleen verstuurd als je project zowel een callback-URL als een signing secret heeft. Onthul het secret (whsec_…) eenmalig op het tabblad met API-sleutels.

De handtekening verifiëren

Elke aflevering draagt een X-Vito-Signature-header:
Twee andere headers vergezellen elke aflevering — gebruik X-Vito-Event-Id als deduplicatiesleutel, want een nieuwe poging stuurt hetzelfde id opnieuw:
Tijdens een rotatie van het signing secret bevat de header meer dan één handtekening, de nieuwste eerst:
Accepteer de aflevering als een willekeurige h1 klopt. Een verifier die alleen de eerste leest, wijst elke webhook af totdat het nieuwe secret is uitgerold — precies wat de overlap van 24 uur moest voorkomen.
Op Node.js: Webhooks.constructEvent uit @vetox-bot/vito doet dit allemaal voor je — het replay-venster, het matchen met elke h1 en de vergelijking in constante tijd — en geeft de getypeerde gebeurtenis terug. De code hieronder is voor een eigen implementatie of een andere taal.
Herbereken de HMAC over <ts>:<rawBody> met je signing secret en vergelijk in constante tijd.
Verifieer tegen de ruwe body, vóór JSON-parsing of middleware die hem herschrijft.

Gebeurtenissen

Vijf gebeurtenistypen, allemaal met dezelfde payloadstructuur. data.status bevat de uitkomst.
Webhooks worden 5 keer met backoff opnieuw geprobeerd. Bevestig snel met een 2xx en doe je afhandeling asynchroon.

Foutcodes

Elk antwoord zit in een envelope. Een succes bevat data, een fout bevat error — nooit allebei:
Elke code begint met VITO_. Vergelijk de volledige string — een kale RATE_LIMITED of FORBIDDEN komt nooit over de lijn.

Rate limits

Er geldt ook een limiet per IP van de helft van je minuutquotum, met een ondergrens van 30.
Onder belasting falen schrijf-endpoints gesloten — een afschrijving wordt geweigerd in plaats van dubbele besteding te riskeren. Lees-endpoints falen open. Behandel een geweigerde schrijfactie als “niet gebeurd” en probeer opnieuw.
Stuur een Idempotency-Key-header mee om herhaalde pogingen veilig te dedupliceren.

Endpoints

Limieten

  • Bevestigingen verlopen na 10 minuten — beschouw niet-bevestigde verzoeken als afgebroken
  • amount moet een positief geheel getal zijn
  • metadata is beperkt tot 10 sleutels
  • Limieten per transactie en per dag worden door het Vetox-team ingesteld en staan alleen-lezen op het tabblad met instellingen

Beveiligingschecklist

De API-sleutel en het signing secret horen nooit in clientcode. Roteer meteen als er een lekt.
Controleer de handtekening tegen de ruwe body en weiger afleveringen ouder dan ~5 minuten.
Lever nooit op basis van het /deduct-antwoord — de afschrijving staat pas vast bij confirmation.completed.
Vraag alleen de scopes aan die je echt gebruikt, en zet de IP-allowlist aan.

Problemen oplossen

Het lidmaatschap van de houder is verlopen. Het wordt bij elke aanroep opnieuw gecontroleerd.
Die is niet terug te halen — er wordt alleen een hash bewaard. Roteer voor een nieuwe.
Accepteer beide secrets tijdens de overlap van 24 uur.
De gebruiker heeft niet goedgekeurd. Bevestigingen verlopen na 10 minuten.
Een project heeft zowel een callback-URL als een signing secret nodig. Met maar één van beide wordt er niets afgeleverd.
Dat zijn de verrekeningskosten. Gebruik bedragen van 5 Vito of minder om ze te vermijden, of reken ze door.
/v1/add wordt uit je eigen saldo gefinancierd, niet uit het niets gemaakt. Vul aan.

Vito

Saldi, de pincode en kosten.

Betaalverzoeken

Wat de gebruiker ziet wanneer je hem afschrijft.

@vetox-bot/vito op npm

Het officiële Node.js-pakket — één installatie, volledige integratie.