Laat goedgekeurde apps je Vito afboeken met pincode-bevestiging, en beheer betalingsverzoeken vanaf je Aankopen-pagina.
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/public/vito/v1/deduct
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.
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
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.
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.
import { VitoClient } from '@vetox-bot/vito';const vito = new VitoClient({ apiKey: process.env.VITO_API_KEY });
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.
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 }.
const wallet = await vito.balance.retrieve('123456789012345678');if (!wallet.hasPin) { // Nog geen wallet-pincode, dus deze gebruiker kan geen afschrijving bevestigen.}
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.
const credit = await vito.payments.credit( { discordId: '123456789012345678', amount: 250, reason: 'Terugbetaling voor order_10423', merchantRef: 'refund_10423', }, // De sleutel afleiden uit je eigen administratie maakt het veilig om dit opnieuw // te draaien vanuit een taakwachtrij: een herhaling geeft het oorspronkelijke // resultaat terug in plaats van twee keer uit te betalen. { idempotencyKey: 'refund_10423' },);console.log(credit.transactionId, credit.ownerBalance, credit.recipientBalance);
const since = Date.now() - 24 * 60 * 60 * 1000;// Een async generator die pagina's op aanvraag ophaalt — geen handmatige bladerlus.for await (const tx of vito.transactions.iterate({ limit: 100 })) { if (tx.date < since) break; // nieuwste eerst // tx.type is de richting ten opzichte van tx.discordId: 1 = in, 0 = uit.}
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:
Netwerkfouten, time-outs, 408, 429, 5xx en 409 VITO_IDEMPOTENCY_IN_PROGRESS
Wordt nooit opnieuw geprobeerd
409 VITO_IDEMPOTENCY_CONFLICT, alle overige 4xx en auth.rotateKey()
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.
import { Webhooks, VitoSignatureVerificationError } from '@vetox-bot/vito';try { const event = Webhooks.constructEvent({ payload: rawRequestBody, // de ruwe body — zie de waarschuwing hieronder signature: req.header('x-vito-signature') ?? '', secret: process.env.VITO_WEBHOOK_SECRET, }); if (event.eventType === 'confirmation.completed') { // Het type van data wordt automatisch versmald op basis van eventType. await fulfil(event.data.merchantRef); }} catch (error) { if (error instanceof VitoSignatureVerificationError) { // Weiger de aflevering met een 400: vervalst, verlopen of hergeserialiseerd. }}
constructEvent controleert het replay-venster van 5 minuten, vergelijkt in constante tijd met elkeh1-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:
export const runtime = 'nodejs'; // de verificatie gebruikt node:cryptoexport async function POST(request: Request) { const event = await Webhooks.constructEventFromRequest(request, { secret: process.env.VITO_WEBHOOK_SECRET, }); return Response.json({ received: true });}
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.
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.
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.
Elke afschrijving wordt aan jou uitbetaald minus de platformkosten — hetzelfde schema als Vito-overboekingen in de app, op basis van jouw lidmaatschapsniveau:
Jouw lidmaatschap
Kosten
Normal, Silver, Gold
7%
Platinum
6%
Diamond
5%
Bedragen van 5 Vito of minder zijn kosteloos, en bijschrijvingen via /v1/add zijn dat altijd.
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.
Elke aflevering draagt een X-Vito-Signature-header:
X-Vito-Signature: ts=<unix>;h1=<hex>
Twee andere headers vergezellen elke aflevering — gebruik X-Vito-Event-Id als deduplicatiesleutel, want een nieuwe poging stuurt hetzelfde id opnieuw:
Header
Bevat
X-Vito-Event-Id
Stabiel id voor deze gebeurtenis — identiek over alle pogingen
X-Vito-Event-Type
Bijvoorbeeld confirmation.completed
Tijdens een rotatie van het signing secret bevat de header meer dan één handtekening, de nieuwste eerst:
X-Vito-Signature: ts=<unix>;h1=<nieuw>;h1=<oud>
Accepteer de aflevering als een willekeurigeh1 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 elkeh1 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.
const crypto = require('crypto');function verify(rawBody, header, secret) { const parts = header.split(';'); const ts = parts.find(p => p.startsWith('ts='))?.slice(3); const sigs = parts.filter(p => p.startsWith('h1=')).map(p => p.slice(3)); if (!ts || sigs.length === 0) return false; // Reject anything older than ~5 minutes — replay protection. if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false; const expected = Buffer.from( crypto.createHmac('sha256', secret).update(`${ts}:${rawBody}`).digest('hex'), ); // Any matching signature is valid — a rotation emits several. return sigs.some(sig => { const actual = Buffer.from(sig); // timingSafeEqual throws when the lengths differ, so check first. return ( actual.length === expected.length && crypto.timingSafeEqual(actual, expected) ); });}
Verifieer tegen de ruwe body, vóór JSON-parsing of middleware die hem herschrijft.
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.
Het lidmaatschap van de houder is verlopen. Het wordt bij elke aanroep opnieuw gecontroleerd.
Ik ben mijn sleutel kwijt
Die is niet terug te halen — er wordt alleen een hash bewaard. Roteer voor een nieuwe.
Webhook-handtekeningen falen na rotatie
Accepteer beide secrets tijdens de overlap van 24 uur.
Een afschrijving wordt nooit afgerond
De gebruiker heeft niet goedgekeurd. Bevestigingen verlopen na 10 minuten.
Er komen geen webhooks binnen
Een project heeft zowel een callback-URL als een signing secret nodig. Met maar één van beide wordt er niets afgeleverd.
Er kwam minder Vito binnen dan ik afschreef
Dat zijn de verrekeningskosten. Gebruik bedragen van 5 Vito of minder om ze te vermijden, of reken ze door.
402 VITO_INSUFFICIENT_OWNER_FUNDS
/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.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Vetox","description":"Official documentation for Vetox — the all-in-one Discord bot for moderation, automation, leveling, tickets, giveaways, notifications and more. Trusted by over 1,000,000 servers.","colors":{"primary":"#0086FF","light":"#4DA9FF","dark":"#0067CC"},"logo":{"light":"https://vetox.io/logo.svg","dark":"https://vetox.io/logo.svg","href":"https://vetox.io"},"favicon":"https://vetox.io/logo.svg","appearance":{"default":"dark"},"navbar":{"links":[{"href":"https://vetox.io/commands","label":"Commands"},{"href":"https://discord.gg/vetox","label":"Support"}],"primary":{"type":"button","label":"Add to Discord","href":"https://discord.com/oauth2/authorize?client_id=707333425685856316\u0026permissions=8\u0026integration_type=0\u0026scope=bot"}},"footer":{"socials":{"x":"https://x.com/VetoxBot","discord":"https://discord.gg/vetox","website":"https://vetox.io"},"links":[{"header":"Product","items":[{"label":"Commands","href":"https://vetox.io/commands"},{"label":"Server Premium","href":"https://vetox.io/pricing/premium"},{"label":"Membership","href":"https://vetox.io/pricing/membership"},{"label":"Profile","href":"https://vetox.io/dashboard/overview"}]},{"header":"Support","items":[{"label":"Support Server","href":"https://discord.gg/vetox"},{"label":"Report Issue","href":"https://discord.gg/vetox"},{"label":"Contact Us","href":"https://vetox.io/contact"},{"label":"About Us","href":"https://vetox.io/about"}]},{"header":"Vito API","items":[{"label":"Documentation","href":"https://docs.vetox.io/en/members/vito-api"},{"label":"Terms","href":"https://vetox.io/vito-api-terms"}]},{"header":"Policies","items":[{"label":"Privacy Policy","href":"https://vetox.io/policy"},{"label":"Terms of Services","href":"https://vetox.io/tos"},{"label":"Refund Terms","href":"https://vetox.io/refunds"}]}]},"search":{"prompt":"Search Vetox documentation..."},"seo":{"metatags":{"og:image":"https://vetox.io/brand/vetox-header-04.png","twitter:image":"https://vetox.io/brand/vetox-header-04.png"},"indexing":"navigable"},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"languages":[{"language":"en","href":"en"},{"language":"ar","href":"ar"},{"language":"zh-CN","href":"zh-CN"},{"language":"fr","href":"fr"},{"language":"de","href":"de"},{"language":"ja","href":"ja"},{"language":"ru","href":"ru"},{"language":"es","href":"es"},{"language":"tr","href":"tr"},{"language":"nl","href":"nl"},{"language":"pt","href":"pt"},{"language":"it","href":"it"},{"language":"pl","href":"pl"},{"language":"id","href":"id"},{"language":"hi","href":"hi"},{"language":"ko","href":"ko"},{"language":"vi","href":"vi"},{"language":"uk","href":"uk"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"vetox-ec2a2bcb","hasAudioNarration":false,"actualSubdomain":"vetox-ec2a2bcb","customDomains":["docs.vetox.io"],"gitSource":{"type":"github","owner":"iryodev","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ac502d78f50001bddeb2024","collectionId":"31530db3-a223-4486-9cd7-7a855d38e78e","liveDeploymentHistoryId":"6ac502d78f50001bddeb2024","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ac502d78f50001bddeb2024","clientVersion":"0.0.3990","searchFilterCounts":[{"language":"ar","tag":"لوحة تحكم الخادم","count":52},{"language":"de","tag":"Server-Dashboard","count":52},{"language":"en","tag":"Server Dashboard","count":52},{"language":"es","tag":"Panel del servidor","count":52},{"language":"fr","tag":"Tableau de bord serveur","count":52},{"language":"hi","tag":"सर्वर डैशबोर्ड","count":52},{"language":"id","tag":"Dasbor Server","count":52},{"language":"it","tag":"Pannello del server","count":52},{"language":"ja","tag":"サーバーダッシュボード","count":52},{"language":"ko","tag":"서버 대시보드","count":52},{"language":"nl","tag":"Serverdashboard","count":52},{"language":"pl","tag":"Panel serwera","count":52},{"language":"pt","tag":"Painel do servidor","count":52},{"language":"ru","tag":"Панель сервера","count":52},{"language":"tr","tag":"Sunucu Paneli","count":52},{"language":"uk","tag":"Панель сервера","count":52},{"language":"vi","tag":"Bảng điều khiển máy chủ","count":52},{"language":"zh-CN","tag":"服务器控制台","count":52},{"language":"ar","tag":"حسابك","count":21},{"language":"de","tag":"Dein Konto","count":21},{"language":"en","tag":"Your Account","count":21},{"language":"es","tag":"Tu cuenta","count":21},{"language":"fr","tag":"Votre compte","count":21},{"language":"hi","tag":"आपका खाता","count":21},{"language":"id","tag":"Akun Anda","count":21},{"language":"it","tag":"Il tuo account","count":21},{"language":"ja","tag":"アカウント","count":21},{"language":"ko","tag":"내 계정","count":21},{"language":"nl","tag":"Jouw account","count":21},{"language":"pl","tag":"Twoje konto","count":21},{"language":"pt","tag":"Sua conta","count":21},{"language":"ru","tag":"Ваш аккаунт","count":21},{"language":"tr","tag":"Hesabınız","count":21},{"language":"uk","tag":"Ваш обліковий запис","count":21},{"language":"vi","tag":"Tài khoản của bạn","count":21},{"language":"zh-CN","tag":"你的账户","count":21},{"language":"ar","tag":"التوثيق","count":11},{"language":"de","tag":"Dokumentation","count":11},{"language":"en","tag":"Documentation","count":11},{"language":"es","tag":"Documentación","count":11},{"language":"fr","tag":"Documentation","count":11},{"language":"hi","tag":"दस्तावेज़","count":11},{"language":"id","tag":"Dokumentasi","count":11},{"language":"it","tag":"Documentazione","count":11},{"language":"ja","tag":"ドキュメント","count":11},{"language":"ko","tag":"문서","count":11},{"language":"nl","tag":"Documentatie","count":11},{"language":"pl","tag":"Dokumentacja","count":11},{"language":"pt","tag":"Documentação","count":11},{"language":"ru","tag":"Документация","count":11},{"language":"tr","tag":"Dokümantasyon","count":11},{"language":"uk","tag":"Документація","count":11},{"language":"vi","tag":"Tài liệu","count":11},{"language":"zh-CN","tag":"文档","count":11},{"language":"ar","tag":"المجتمع","count":9},{"language":"ar","tag":"الإشعارات","count":9},{"language":"de","tag":"Community","count":9},{"language":"de","tag":"Benachrichtigungen","count":9},{"language":"en","tag":"Community","count":9},{"language":"en","tag":"Notifications","count":9},{"language":"es","tag":"Comunidad","count":9},{"language":"es","tag":"Notificaciones","count":9},{"language":"fr","tag":"Communauté","count":9},{"language":"fr","tag":"Notifications","count":9},{"language":"hi","tag":"समुदाय","count":9},{"language":"hi","tag":"सूचनाएँ","count":9},{"language":"id","tag":"Komunitas","count":9},{"language":"id","tag":"Notifikasi","count":9},{"language":"it","tag":"Comunità","count":9},{"language":"it","tag":"Notifiche","count":9},{"language":"ja","tag":"コミュニティ","count":9},{"language":"ja","tag":"通知","count":9},{"language":"ko","tag":"커뮤니티","count":9},{"language":"ko","tag":"알림","count":9},{"language":"nl","tag":"Community","count":9},{"language":"nl","tag":"Meldingen","count":9},{"language":"pl","tag":"Społeczność","count":9},{"language":"pl","tag":"Powiadomienia","count":9},{"language":"pt","tag":"Comunidade","count":9},{"language":"pt","tag":"Notificações","count":9},{"language":"ru","tag":"Сообщество","count":9},{"language":"ru","tag":"Уведомления","count":9},{"language":"tr","tag":"Topluluk","count":9},{"language":"tr","tag":"Bildirimler","count":9},{"language":"uk","tag":"Спільнота","count":9},{"language":"uk","tag":"Сповіщення","count":9},{"language":"vi","tag":"Cộng đồng","count":9},{"language":"vi","tag":"Thông báo","count":9},{"language":"zh-CN","tag":"社区","count":9},{"language":"zh-CN","tag":"通知","count":9},{"language":"ar","tag":"الرئيسية","count":8},{"language":"ar","tag":"الإدارة","count":8},{"language":"de","tag":"Hauptbereich","count":8},{"language":"de","tag":"Verwaltung","count":8},{"language":"en","tag":"Main","count":8},{"language":"en","tag":"Administration","count":8},{"language":"es","tag":"Principal","count":8},{"language":"es","tag":"Administración","count":8},{"language":"fr","tag":"Principal","count":8},{"language":"fr","tag":"Administration","count":8},{"language":"hi","tag":"मुख्य","count":8},{"language":"hi","tag":"प्रशासन","count":8},{"language":"id","tag":"Utama","count":8},{"language":"id","tag":"Administrasi","count":8},{"language":"it","tag":"Principale","count":8},{"language":"it","tag":"Amministrazione","count":8},{"language":"ja","tag":"メイン","count":8},{"language":"ja","tag":"管理","count":8},{"language":"ko","tag":"메인","count":8},{"language":"ko","tag":"관리","count":8},{"language":"nl","tag":"Hoofd","count":8},{"language":"nl","tag":"Beheer","count":8},{"language":"pl","tag":"Główne","count":8},{"language":"pl","tag":"Administracja","count":8},{"language":"pt","tag":"Principal","count":8},{"language":"pt","tag":"Administração","count":8},{"language":"ru","tag":"Основное","count":8},{"language":"ru","tag":"Администрирование","count":8},{"language":"tr","tag":"Ana","count":8},{"language":"tr","tag":"Yönetim","count":8},{"language":"uk","tag":"Головне","count":8},{"language":"uk","tag":"Адміністрування","count":8},{"language":"vi","tag":"Chính","count":8},{"language":"vi","tag":"Quản trị","count":8},{"language":"zh-CN","tag":"主要","count":8},{"language":"zh-CN","tag":"管理","count":8},{"language":"ar","tag":"الأوامر","count":7},{"language":"de","tag":"Befehle","count":7},{"language":"en","tag":"Commands","count":7},{"language":"es","tag":"Comandos","count":7},{"language":"fr","tag":"Commandes","count":7},{"language":"hi","tag":"कमांड","count":7},{"language":"id","tag":"Perintah","count":7},{"language":"it","tag":"Comandi","count":7},{"language":"ja","tag":"コマンド","count":7},{"language":"ko","tag":"명령어","count":7},{"language":"nl","tag":"Commando's","count":7},{"language":"pl","tag":"Polecenia","count":7},{"language":"pt","tag":"Comandos","count":7},{"language":"ru","tag":"Команды","count":7},{"language":"tr","tag":"Komutlar","count":7},{"language":"uk","tag":"Команди","count":7},{"language":"vi","tag":"Lệnh","count":7},{"language":"zh-CN","tag":"命令","count":7},{"language":"ar","tag":"بريميوم","count":6},{"language":"ar","tag":"التواصل","count":6},{"language":"de","tag":"Premium","count":6},{"language":"de","tag":"Kommunikation","count":6},{"language":"en","tag":"Premium","count":6},{"language":"en","tag":"Communication","count":6},{"language":"es","tag":"Premium","count":6},{"language":"es","tag":"Comunicación","count":6},{"language":"fr","tag":"Premium","count":6},{"language":"fr","tag":"Communication","count":6},{"language":"hi","tag":"प्रीमियम","count":6},{"language":"hi","tag":"संचार","count":6},{"language":"id","tag":"Premium","count":6},{"language":"id","tag":"Komunikasi","count":6},{"language":"it","tag":"Premium","count":6},{"language":"it","tag":"Comunicazione","count":6},{"language":"ja","tag":"プレミアム","count":6},{"language":"ja","tag":"コミュニケーション","count":6},{"language":"ko","tag":"프리미엄","count":6},{"language":"ko","tag":"커뮤니케이션","count":6},{"language":"nl","tag":"Premium","count":6},{"language":"nl","tag":"Communicatie","count":6},{"language":"pl","tag":"Premium","count":6},{"language":"pl","tag":"Komunikacja","count":6},{"language":"pt","tag":"Premium","count":6},{"language":"pt","tag":"Comunicação","count":6},{"language":"ru","tag":"Премиум","count":6},{"language":"ru","tag":"Общение","count":6},{"language":"tr","tag":"Premium","count":6},{"language":"tr","tag":"İletişim","count":6},{"language":"uk","tag":"Преміум","count":6},{"language":"uk","tag":"Комунікація","count":6},{"language":"vi","tag":"Premium","count":6},{"language":"vi","tag":"Giao tiếp","count":6},{"language":"zh-CN","tag":"高级版","count":6},{"language":"zh-CN","tag":"沟通","count":6}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"nl/members/vito-api","slug":"/nl/members/vito-api","pageMetadata":{"title":"Vito API en aankopen","sidebarTitle":"Vito API","description":"Laat goedgekeurde apps je Vito afboeken met pincode-bevestiging, en beheer betalingsverzoeken vanaf je Aankopen-pagina.","icon":"code","keywords":["vito api","purchases","payment requests","developer","api key","merchant"],"href":"/nl/members/vito-api"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Laat goedgekeurde apps je Vito afboeken met pincode-bevestiging, en beheer betalingsverzoeken vanaf je Aankopen-pagina.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,CodeBlock,Heading,Info,Note,Step,Steps,Table,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Info,{children:_jsxs(_components.p,{children:[`Vereist een `,_jsx(_components.strong,{children:`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.`]})}),`\n`,_jsxs(_components.p,{children:[`Een REST-API waarmee je applicatie vanuit Discord met het `,_jsx(_components.a,{href:`/nl/members/vito`,children:`Vito`}),`-saldo van een gebruiker werkt: uitlezen, afschrijven, bijschrijven of tussen gebruikers verplaatsen. Alle endpoints geven JSON terug en zijn geversioneerd onder `,_jsx(_components.code,{children:`/v1`}),`.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Vito wordt nooit omgezet in echt geld, en komt er ook nooit uit voort.`}),` Het beweegt uitsluitend tussen Vetox-saldi.`]})}),`\n`,_jsxs(Warning,{children:[_jsx(_components.p,{children:_jsxs(_components.strong,{children:[`Elk endpoint zit onder `,_jsx(_components.code,{children:`https://api.vetox.io/public/vito`}),`.`]})}),_jsxs(_components.p,{children:[`De paden op deze pagina — `,_jsx(_components.code,{children:`/v1/deduct`}),`, `,_jsx(_components.code,{children:`/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:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`https://api.vetox.io/public/vito/v1/deduct`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsxs(_components.p,{children:[_jsx(_components.code,{children:`https://api.vetox.io/v1/deduct`}),` is geen route en geeft 404.`]})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Bouw je met Node.js? Schrijf de REST-aanroepen niet zelf — gebruik het officiële pakket `,_jsx(_components.a,{href:`https://www.npmjs.com/package/@vetox-bot/vito`,children:_jsx(_components.strong,{children:_jsx(_components.code,{children:`@vetox-bot/vito`})})}),`. Het dekt alle negen endpoints plus de webhookverificatie, en regelt idempotentie en nieuwe pogingen voor je. Zie `,_jsx(_components.strong,{children:`Officiële Node.js-SDK`}),` hieronder.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`toegang-krijgen`,children:`Toegang krijgen`}),`\n`,_jsxs(_components.p,{children:[`Toegang wordt `,_jsx(_components.strong,{children:`per project`}),` verleend. Je hebt alle vier nodig:`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Een actief lidmaatschap, Silver of hoger`,children:_jsx(_components.p,{children:`Wordt bij elke aanroep gecontroleerd, niet alleen bij goedkeuring.`})}),_jsx(Step,{title:`Een goedgekeurde ontwikkelaarsaanvraag`,children:_jsx(_components.p,{children:`Ingediend via de Vito API-pagina in je dashboard. Wordt handmatig beoordeeld door het Vetox-team.`})}),_jsx(Step,{title:`Geaccepteerde API-ontwikkelaarsvoorwaarden`,children:_jsx(_components.p,{children:`Worden bevestigd bij het indienen van de aanvraag.`})}),_jsx(Step,{title:`De scopes die je project nodig heeft`,children:_jsx(_components.p,{children:`Worden door het Vetox-team toegekend op basis van je beschrijving.`})})]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Wees concreet over wat je bouwt en hoe je de sleutel opslaat. Het zijn de vage aanvragen die worden afgewezen.`})}),`\n`,_jsx(Heading,{level:`3`,id:`scopes`,children:`Scopes`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Staat toe`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`balance:read`})}),_jsx(_components.td,{children:`Het Vito-saldo van een gebruiker uitlezen`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`deduct:create`})}),_jsx(_components.td,{children:`Het saldo van een gebruiker afschrijven`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`credit:create`})}),_jsx(_components.td,{children:`Vito bijschrijven bij een gebruiker, gefinancierd uit je eigen saldo`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`transfer:create`})}),_jsx(_components.td,{children:`Vito verplaatsen tussen twee gebruikers`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`transactions:read`})}),_jsx(_components.td,{children:`Transacties van je project opvragen en lezen`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`authenticatie`,children:`Authenticatie`}),`\n`,_jsx(_components.p,{children:`Stuur je geheime sleutel mee als Bearer-token:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`Authorization:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Bearer`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` vito_live_xxxxxxxxxxxxxxxx`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Twee optionele lagen maken een project extra robuust:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`IP-allowlist`}),` — beperk aanroepen tot specifieke server-IP’s`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Rate limits`}),` — plafonds per project die meeschalen met het lidmaatschapsniveau van de houder`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`sleutels-rotatie-en-opslag`,children:`Sleutels, rotatie en opslag`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Je sleutel en signing secret worden precies één keer getoond.`}),` Na goedkeuring heb je een `,_jsx(_components.strong,{children:`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.`]})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Houd hem `,_jsx(_components.strong,{children:`uitsluitend serverzijdig`}),` — wie hem heeft, kan je gebruikers afschrijven`]}),`\n`,_jsxs(_components.li,{children:[`Roteer via het tabblad met API-sleutels. De vorige sleutel blijft nog `,_jsx(_components.strong,{children:`24 uur`}),` werken als overgangsperiode, zodat je zonder downtime kunt uitrollen`]}),`\n`,_jsx(_components.li,{children:`Het webhook-signing-secret roteert apart, met een eigen overlap van 24 uur`}),`\n`,_jsx(_components.li,{children:`Bij een lek: onmiddellijk roteren`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`officiële-node-js-sdk`,children:`Officiële Node.js-SDK`}),`\n`,_jsxs(_components.p,{children:[`Het officiële pakket `,_jsx(_components.a,{href:`https://www.npmjs.com/package/@vetox-bot/vito`,children:_jsx(_components.strong,{children:_jsx(_components.code,{children:`@vetox-bot/vito`})})}),` omhult alle negen endpoints plus de webhookverificatie. Het regelt de `,_jsx(_components.code,{children:`Idempotency-Key`}),`-header, nieuwe pogingen met exponentiële backoff, time-outs en de classificatie van fouten voor je.`]}),`\n`,_jsx(Heading,{level:`3`,id:`installatie`,children:`Installatie`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npm`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` @vetox-bot/vito`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Vereist `,_jsx(_components.strong,{children:`Node.js 20 of nieuwer`}),`. Het pakket heeft `,_jsx(_components.strong,{children:`geen enkele runtime-afhankelijkheid`}),` — het gebruikt de ingebouwde `,_jsx(_components.code,{children:`fetch`}),` en `,_jsx(_components.code,{children:`node:crypto`}),` — en wordt geleverd in zowel ESM als CommonJS, met volledige TypeScript-definities.`]}),`\n`,_jsx(Heading,{level:`3`,id:`initialisatie`,children:`Initialisatie`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`VitoClient`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '@vetox-bot/vito'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` vito`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` VitoClient`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`apiKey:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` process`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`env`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`VITO_API_KEY`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` });`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Laat je `,_jsx(_components.code,{children:`apiKey`}),` weg, dan leest de SDK `,_jsx(_components.code,{children:`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.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`De sleutel verplaatst geld — houd hem altijd serverzijdig, nooit in een clientbundel of in de browser. `,_jsx(_components.code,{children:`console.log(vito)`}),` toont `,_jsx(_components.code,{children:`[redacted]`}),` in plaats van de sleutel, en de SDK weigert elke `,_jsx(_components.code,{children:`baseUrl`}),` met `,_jsx(_components.code,{children:`http://`}),` naar een niet-lokale host, zodat de sleutel niet onversleuteld over de lijn gaat.`]})}),`\n`,_jsx(Heading,{level:`4`,id:`clientopties`,children:`Clientopties`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Optie`}),_jsx(_components.th,{children:`Standaard`}),_jsx(_components.th,{children:`Wat het doet`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`apiKey`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`process.env.VITO_API_KEY`})}),_jsxs(_components.td,{children:[`Projectsleutel (`,_jsx(_components.code,{children:`vito_live_…`}),`)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`baseUrl`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://api.vetox.io`})}),_jsx(_components.td,{children:`Hoofdadres van de API`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`timeoutMs`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`15000`})}),_jsx(_components.td,{children:`Time-out per verzoek`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`maxRetries`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`2`})}),_jsx(_components.td,{children:`Nieuwe pogingen bij tijdelijke storingen`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`retryBaseDelayMs`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`500`})}),_jsx(_components.td,{children:`Eerste backoff-wachttijd; verdubbelt per poging`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`maxRetryDelayMs`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`8000`})}),_jsxs(_components.td,{children:[`Bovengrens van de backoff en afkapgrens voor `,_jsx(_components.code,{children:`Retry-After`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`fetch`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`globalThis.fetch`})}),_jsx(_components.td,{children:`Je eigen implementatie via proxy of agent`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`onResponse`})}),_jsx(_components.td,{children:`—`}),_jsxs(_components.td,{children:[`Wordt na elk antwoord aangeroepen, met `,_jsx(_components.code,{children:`requestId`}),`, rate-limit-quotum en duur`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`onRetry`})}),_jsx(_components.td,{children:`—`}),_jsx(_components.td,{children:`Wordt vóór elke nieuwe poging aangeroepen`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`beschikbare-methoden`,children:`Beschikbare methoden`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Methode`}),_jsx(_components.th,{children:`Endpoint`}),_jsx(_components.th,{children:`Scope`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.auth.verify()`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`GET /v1/auth/verify`})}),_jsx(_components.td,{children:`elke`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.auth.rotateKey()`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`POST /v1/auth/rotate-key`})}),_jsx(_components.td,{children:`elke`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.balance.retrieve(discordId)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`GET /v1/balance/:discordId`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`balance:read`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.payments.deduct(params)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`POST /v1/deduct`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`deduct:create`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.payments.credit(params)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`POST /v1/add`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`credit:create`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.payments.transfer(params)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`POST /v1/transfer`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`transfer:create`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.transactions.list({ page, limit })`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`GET /v1/transactions`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`transactions:read`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.transactions.iterate({ limit, maxPages })`})}),_jsx(_components.td,{children:`automatische paginering`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`transactions:read`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.transactions.retrieve(id)`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`GET /v1/transactions/:id`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`transactions:read`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.webhookEvents.list({ page, limit })`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`GET /v1/webhooks/events`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`transactions:read`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.webhookEvents.iterate({ limit, maxPages })`})}),_jsx(_components.td,{children:`automatische paginering`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`transactions:read`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Webhooks.constructEvent(…)`})}),_jsx(_components.td,{children:`— (lokale verificatie)`}),_jsx(_components.td,{children:`—`})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Elke methode geeft het uitgepakte `,_jsx(_components.code,{children:`data`}),`-veld rechtstreeks terug — je hoeft `,_jsx(_components.code,{children:`success`}),` of `,_jsx(_components.code,{children:`data`}),` nooit zelf uit te pakken. Alle methoden accepteren daarnaast opties per aanroep: `,_jsx(_components.code,{children:`{ timeoutMs, maxRetries, signal, headers }`}),`, en de schrijfmethoden bovendien `,_jsx(_components.code,{children:`{ idempotencyKey }`}),`.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`gebruiksvoorbeelden`,children:`Gebruiksvoorbeelden`}),`\n`,_jsx(Heading,{level:`4`,id:`de-sleutel-controleren-bij-het-opstarten`,children:`De sleutel controleren bij het opstarten`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` project`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` vito`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`auth`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`verify`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`project`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`status`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`); `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// \"active\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`project`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`scopes`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`); `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// [\"balance:read\", \"deduct:create\", …]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`project`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`rateLimit`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`); `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// { tier, requestsPerMinute, requestsPerHour }`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`4`,id:`een-saldo-uitlezen`,children:`Een saldo uitlezen`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` wallet`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` vito`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`balance`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`retrieve`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'123456789012345678'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`!`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`wallet`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`hasPin`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Nog geen wallet-pincode, dus deze gebruiker kan geen afschrijving bevestigen.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`4`,id:`een-gebruiker-afschrijven-een-artikel-verkopen`,children:`Een gebruiker afschrijven (een artikel verkopen)`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`17`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`17`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` confirmation`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` vito`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`payments`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`deduct`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` discordId:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '123456789012345678'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` guildId:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '987654321098765432'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` amount:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 250`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` reason:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Legendarisch zwaard'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` merchantRef:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'order_10423'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` metadata:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`sku:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'sword-legendary'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` product:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` type:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'virtual_item'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` name:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Legendarisch zwaard'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` description:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Doet 120 schade.'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` imageUrl:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'https://cdn.example.com/sword.png'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`confirmation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`confirmUrl`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`); `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// stuur de gebruiker hierheen`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`confirmation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`expiresAt`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`); `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// unix ms, over 10 minuten`})]}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Leg de bestelling hier alleen vast als `,_jsx(_components.strong,{children:`openstaand`}),`. De afschrijving heeft nog niet plaatsgevonden — lever pas bij de webhook `,_jsx(_components.code,{children:`confirmation.completed`}),`, niet bij dit antwoord.`]})}),`\n`,_jsx(Heading,{level:`4`,id:`een-gebruiker-bijschrijven`,children:`Een gebruiker bijschrijven`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`14`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`14`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` credit`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` vito`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`payments`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`credit`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` discordId:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '123456789012345678'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` amount:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 250`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` reason:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Terugbetaling voor order_10423'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` merchantRef:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'refund_10423'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // De sleutel afleiden uit je eigen administratie maakt het veilig om dit opnieuw`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // te draaien vanuit een taakwachtrij: een herhaling geeft het oorspronkelijke`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // resultaat terug in plaats van twee keer uit te betalen.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`idempotencyKey:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'refund_10423'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`credit`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`transactionId`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`credit`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ownerBalance`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`credit`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`recipientBalance`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`4`,id:`door-transacties-bladeren`,children:`Door transacties bladeren`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` since`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`-`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 24`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Een async generator die pagina's op aanvraag ophaalt — geen handmatige bladerlus.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`for`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` tx`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` of`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` vito`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`transactions`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`iterate`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`limit:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 100`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` })) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`tx`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`date`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` since`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`break`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`; `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// nieuwste eerst`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // tx.type is de richting ten opzichte van tx.discordId: 1 = in, 0 = uit.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`idempotentie-en-nieuwe-pogingen`,children:`Idempotentie en nieuwe pogingen`}),`\n`,_jsxs(_components.p,{children:[`De SDK stuurt bij `,_jsx(_components.strong,{children:`elke schrijfactie`}),` (`,_jsx(_components.code,{children:`deduct`}),`, `,_jsx(_components.code,{children:`credit`}),`, `,_jsx(_components.code,{children:`transfer`}),`) een `,_jsx(_components.code,{children:`Idempotency-Key`}),`-header mee. Geef je er geen op, dan genereert hij de sleutel `,_jsx(_components.strong,{children:`éé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.`]}),`\n`,_jsxs(_components.p,{children:[`Geef je eigen sleutel mee wanneer dezelfde logische bewerking opnieuw kan worden gestart vanuit een `,_jsx(_components.strong,{children:`nieuw proces`}),` — een taakrunner, een herlevering uit een wachtrij of een geplande run:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` vito`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`payments`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`credit`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`params`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`idempotencyKey:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\" `refund_\"}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`orderId`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` });`})]}),`\n`]})})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Gedrag`}),_jsx(_components.th,{children:`Gevallen`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Wordt automatisch opnieuw geprobeerd`}),_jsxs(_components.td,{children:[`Netwerkfouten, time-outs, `,_jsx(_components.code,{children:`408`}),`, `,_jsx(_components.code,{children:`429`}),`, `,_jsx(_components.code,{children:`5xx`}),` en `,_jsx(_components.code,{children:`409 VITO_IDEMPOTENCY_IN_PROGRESS`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Wordt nooit opnieuw geprobeerd`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`409 VITO_IDEMPOTENCY_CONFLICT`}),`, alle overige `,_jsx(_components.code,{children:`4xx`}),` en `,_jsx(_components.code,{children:`auth.rotateKey()`})]})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`auth.rotateKey()`}),` is bewust uitgesloten — een nieuwe poging maakt daar een tweede sleutel aan en maakt de sleutel uit de eerste poging ongeldig.`]})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Is `,_jsx(_components.code,{children:`Retry-After`}),` langer dan `,_jsx(_components.code,{children:`maxRetryDelayMs`}),` (je uurquotum is dus werkelijk op), dan gooit de SDK direct `,_jsx(_components.code,{children:`VitoRateLimitError`}),` in plaats van je hele verzoekbudget te verslapen.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`webhooks-verifiëren-met-de-sdk`,children:`Webhooks verifiëren met de SDK`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`18`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`18`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Webhooks`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`VitoSignatureVerificationError`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '@vetox-bot/vito'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`try`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` event`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` Webhooks`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`constructEvent`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` payload:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` rawRequestBody`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// de ruwe body — zie de waarschuwing hieronder`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` signature:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` req`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`header`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'x-vito-signature'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`??`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ''`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` secret:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` process`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`env`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`VITO_WEBHOOK_SECRET`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` });`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`event`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`eventType`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ===`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'confirmation.completed'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Het type van data wordt automatisch versmald op basis van eventType.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` fulfil`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`event`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`data`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`merchantRef`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`} `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`catch`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`error`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` instanceof`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` VitoSignatureVerificationError`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Weiger de aflevering met een 400: vervalst, verlopen of hergeserialiseerd.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`constructEvent`}),` controleert het replay-venster van 5 minuten, vergelijkt in constante tijd met `,_jsx(_components.strong,{children:`elke`}),` `,_jsx(_components.code,{children:`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.`]}),`\n`,_jsx(_components.p,{children:`Gebruik in een Next.js-routehandler (App Router) de variant die de ruwe body zelf leest:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`9`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`9`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`export`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` runtime`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'nodejs'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`; `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// de verificatie gebruikt node:crypto`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`export`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` async`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` POST`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`request`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Request`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` event`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` Webhooks`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`constructEventFromRequest`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`request`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` secret:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` process`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`env`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`VITO_WEBHOOK_SECRET`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` });`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` Response`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`json`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`received:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` });`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`De handtekening dekt de `,_jsx(_components.strong,{children:`ruwe bytes`}),`. Koppel in Express `,_jsx(_components.code,{children:`express.raw({ type: 'application/json' })`}),` aan de webhookroute — `,_jsx(_components.code,{children:`express.json()`}),` verbruikt de body en daarna faalt elke verificatie. Roep in Next.js `,_jsx(_components.code,{children:`request.json()`}),` niet aan vóór `,_jsx(_components.code,{children:`constructEventFromRequest`}),`.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Aflevering gebeurt `,_jsx(_components.strong,{children:`minstens één keer`}),`. Dedupliceer op `,_jsx(_components.code,{children:`event.eventId`}),` voordat je een neveneffect uitvoert.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`foutafhandeling`,children:`Foutafhandeling`}),`\n`,_jsxs(_components.p,{children:[`Alles wat de SDK gooit erft van `,_jsx(_components.code,{children:`VitoError`}),` en draagt `,_jsx(_components.code,{children:`code`}),`, `,_jsx(_components.code,{children:`status`}),`, `,_jsx(_components.code,{children:`type`}),`, `,_jsx(_components.code,{children:`requestId`}),` en `,_jsx(_components.code,{children:`retryable`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Klasse`}),_jsx(_components.th,{children:`Status`}),_jsx(_components.th,{children:`Wanneer`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VitoInvalidRequestError`})}),_jsx(_components.td,{children:`—`}),_jsxs(_components.td,{children:[`Argumenten geweigerd `,_jsx(_components.strong,{children:`voordat`}),` er een verzoek uitging`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VitoConfigurationError`})}),_jsx(_components.td,{children:`—`}),_jsxs(_components.td,{children:[`Ontbrekende of misvormde sleutel, of onbruikbare `,_jsx(_components.code,{children:`baseUrl`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VitoValidationError`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`400`}),_jsx(_components.td,{children:`De API weigerde de body of de parameters`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VitoAuthenticationError`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`401`}),_jsx(_components.td,{children:`Ongeldige of ingetrokken sleutel`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VitoInsufficientFundsError`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`402`}),_jsx(_components.td,{children:`De wallet dekt het bedrag niet (gebruiker of houder)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VitoPermissionError`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`Ontbrekende scope, IP, voorwaarden, bevriezing, niet-toegestane server of verlopen lidmaatschap`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VitoNotFoundError`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`404`}),_jsx(_components.td,{children:`Gebruiker, transactie of bevestiging bestaat niet`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VitoConflictError`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`409`}),_jsx(_components.td,{children:`Idempotentieconflict, of een verzoek dat nog loopt`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VitoGoneError`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`410`}),_jsx(_components.td,{children:`Het bevestigingsvenster is verstreken`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VitoRateLimitError`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`429`}),_jsxs(_components.td,{children:[`Limiet bereikt — bevat `,_jsx(_components.code,{children:`retryAfterSeconds`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VitoServerError`})}),_jsx(_components.td,{children:`5xx`}),_jsx(_components.td,{children:`Storing aan onze kant`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VitoConnectionError`})}),_jsx(_components.td,{children:`—`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`VITO_SDK_TIMEOUT`}),`, `,_jsx(_components.code,{children:`VITO_SDK_CONNECTION`}),` of `,_jsx(_components.code,{children:`VITO_SDK_ABORTED`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VitoSignatureVerificationError`})}),_jsx(_components.td,{children:`—`}),_jsx(_components.td,{children:`Handtekeningverificatie van een webhook mislukt`})]})]})]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`12`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`12`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`isVitoError`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`VitoInsufficientFundsError`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '@vetox-bot/vito'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`try`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` vito`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`payments`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`deduct`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`params`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`} `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`catch`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`error`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` instanceof`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` VitoInsufficientFundsError`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`return`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` notEnoughVito`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`isVitoError`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` logger`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`code:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`code`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`requestId:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`requestId`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` });`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` throw`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Log altijd de `,_jsx(_components.code,{children:`requestId`}),` — dat is wat support nodig heeft om een specifieke aanroep te traceren.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`een-aanroep-annuleren`,children:`Een aanroep annuleren`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` controller`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` AbortController`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`setTimeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`=>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` controller`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`abort`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(), `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`2000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` vito`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`balance`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`retrieve`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`id`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`signal:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` controller`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`signal`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` });`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Annuleren stopt ook een wachtende nieuwe poging en gooit `,_jsx(_components.code,{children:`VitoConnectionError`}),` met de code `,_jsx(_components.code,{children:`VITO_SDK_ABORTED`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`een-gebruiker-afschrijven`,children:`Een gebruiker afschrijven`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`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 `,_jsx(_components.code,{children:`vetox.io`}),` — nooit in je app en nooit in Discord.`]})}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Je app roept POST /v1/deduct aan`,children:_jsxs(_components.p,{children:[`Met de gebruiker, het bedrag, de `,_jsx(_components.code,{children:`guildId`}),` van herkomst en de artikelgegevens.`]})}),_jsx(Step,{title:`Vito geeft een confirmUrl terug`,children:_jsxs(_components.p,{children:[`Een openstaande bevestiging, `,_jsx(_components.strong,{children:`10 minuten`}),` geldig. De gebruiker krijgt ook een DM.`]})}),_jsx(Step,{title:`De gebruiker keurt goed met zijn pincode`,children:_jsxs(_components.p,{children:[`Op `,_jsx(_components.code,{children:`vetox.io`}),`.`]})}),_jsx(Step,{title:`Vito verrekent en meldt`,children:_jsx(_components.p,{children:`Het saldo wordt afgeschreven, de transactie vastgelegd en er wordt een ondertekende webhook verstuurd als je er een hebt ingesteld.`})}),_jsx(Step,{title:`Je app verifieert en rondt af`,children:_jsx(_components.p,{children:`Controleer de handtekening en ontgrendel dan de content of lever het artikel.`})})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Rond je actie uitsluitend af bij `,_jsx(_components.code,{children:`confirmation.completed`})]}),` — nooit op basis van het antwoord van `,_jsx(_components.code,{children:`/deduct`}),`. Op dat moment staat de afschrijving nog niet vast.`]})}),`\n`,_jsxs(Heading,{level:`3`,id:`requestparameters-—-/v1/deduct`,children:[`Requestparameters — `,_jsx(_components.code,{children:`/v1/deduct`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Veld`}),_jsx(_components.th,{children:`Verplicht`}),_jsx(_components.th,{children:`Toelichting`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`discordId`})}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Ja`})}),_jsx(_components.td,{children:`De Discord-ID van de gebruiker — een snowflake van 17 tot 20 cijfers`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`amount`})}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Ja`})}),_jsx(_components.td,{children:`Positief geheel getal`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`guildId`})}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Ja`})}),_jsx(_components.td,{children:`De Discord-server waar de afschrijving vandaan komt. Elke afschrijving moet van een server komen`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reason`})}),_jsx(_components.td,{children:`Nee`}),_jsx(_components.td,{children:`Maximaal 256 tekens. Wordt aan de gebruiker getoond en meegegeven in de webhook`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`merchantRef`})}),_jsx(_components.td,{children:`Nee`}),_jsx(_components.td,{children:`Je eigen referentie, maximaal 128 tekens. Handig om de webhook aan je administratie te koppelen`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`product`})}),_jsx(_components.td,{children:`Nee`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`{ type, name, description?, imageUrl? }`}),` — verschijnt op de bevestigingspagina en in de DM`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`imageUrl`})}),_jsx(_components.td,{children:`Nee`}),_jsxs(_components.td,{children:[`Moet `,_jsx(_components.code,{children:`https://`}),` zijn`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`metadata`})}),_jsx(_components.td,{children:`Nee`}),_jsxs(_components.td,{children:[`Maximaal `,_jsx(_components.strong,{children:`10`}),` sleutel/waarde-paren als tekst, ongewijzigd doorgegeven`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`een-gebruiker-bijschrijven-2`,children:`Een gebruiker bijschrijven`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`POST /v1/add`}),` schrijft Vito bij een gebruiker bij `,_jsx(_components.strong,{children:`uit je eigen saldo`}),` — voor beloningen of terugbetalingen. Dezelfde velden als `,_jsx(_components.code,{children:`/deduct`}),`, behalve `,_jsx(_components.code,{children:`guildId`}),` en `,_jsx(_components.code,{children:`product`}),`.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Anders dan een afschrijving heeft een bijschrijving `,_jsx(_components.strong,{children:`geen bevestigingsstap`}),`: die wordt direct verrekend. Vereist de scope `,_jsx(_components.code,{children:`credit:create`}),` en voldoende saldo, anders geeft de aanroep `,_jsxs(_components.strong,{children:[`402 `,_jsx(_components.code,{children:`VITO_INSUFFICIENT_OWNER_FUNDS`})]}),` terug.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`kosten`,children:`Kosten`}),`\n`,_jsxs(_components.p,{children:[`Elke afschrijving wordt aan jou uitbetaald minus de platformkosten — hetzelfde schema als Vito-overboekingen in de app, op basis van `,_jsx(_components.strong,{children:`jouw`}),` lidmaatschapsniveau:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Jouw lidmaatschap`}),_jsx(_components.th,{children:`Kosten`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Normal, Silver, Gold`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`7%`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Platinum`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`6%`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Diamond`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`5%`})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Bedragen van `,_jsx(_components.strong,{children:`5 Vito of minder zijn kosteloos`}),`, en bijschrijvingen via `,_jsx(_components.code,{children:`/v1/add`}),` zijn dat altijd.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`webhooks`,children:`Webhooks`}),`\n`,_jsxs(_components.p,{children:[`Voeg op het tabblad met instellingen een of meer `,_jsx(_components.code,{children:`https`}),`-callback-URL’s toe. Vito stuurt een ondertekende `,_jsx(_components.code,{children:`POST`}),` zodra een bevestiging een eindtoestand bereikt.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Webhooks worden alleen verstuurd als je project `,_jsx(_components.strong,{children:`zowel`}),` een callback-URL `,_jsx(_components.strong,{children:`als`}),` een signing secret heeft. Onthul het secret (`,_jsx(_components.code,{children:`whsec_…`}),`) eenmalig op het tabblad met API-sleutels.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`de-handtekening-verifiëren`,children:`De handtekening verifiëren`}),`\n`,_jsxs(_components.p,{children:[`Elke aflevering draagt een `,_jsx(_components.code,{children:`X-Vito-Signature`}),`-header:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`X-Vito-Signature: ts=\u003cunix>;h1=\u003chex>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Twee andere headers vergezellen elke aflevering — gebruik `,_jsx(_components.code,{children:`X-Vito-Event-Id`}),` als deduplicatiesleutel, want een nieuwe poging stuurt hetzelfde id opnieuw:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Header`}),_jsx(_components.th,{children:`Bevat`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`X-Vito-Event-Id`})}),_jsx(_components.td,{children:`Stabiel id voor deze gebeurtenis — identiek over alle pogingen`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`X-Vito-Event-Type`})}),_jsxs(_components.td,{children:[`Bijvoorbeeld `,_jsx(_components.code,{children:`confirmation.completed`})]})]})]})]}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Tijdens een rotatie van het signing secret bevat de header meer dan één handtekening`}),`, de nieuwste eerst:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`X-Vito-Signature: ts=\u003cunix>;h1=\u003cnieuw>;h1=\u003coud>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsxs(_components.p,{children:[`Accepteer de aflevering als `,_jsx(_components.strong,{children:`een willekeurige`}),` `,_jsx(_components.code,{children:`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.`]})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Op Node.js: `,_jsx(_components.code,{children:`Webhooks.constructEvent`}),` uit `,_jsx(_components.a,{href:`https://www.npmjs.com/package/@vetox-bot/vito`,children:_jsx(_components.code,{children:`@vetox-bot/vito`})}),` doet dit allemaal voor je — het replay-venster, het matchen met `,_jsx(_components.strong,{children:`elke`}),` `,_jsx(_components.code,{children:`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.`]})}),`\n`,_jsxs(_components.p,{children:[`Herbereken de HMAC over `,_jsx(_components.code,{children:`\u003cts>:\u003crawBody>`}),` met je signing secret en vergelijk in constante tijd.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`24`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`24`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` crypto`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` require`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'crypto'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` verify`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`rawBody`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`header`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`secret`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` parts`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` header`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`split`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`';'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` ts`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` parts`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`find`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`p`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` =>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` p`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`startsWith`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'ts='`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`))?.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`slice`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`3`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` sigs`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` parts`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`filter`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`p`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` =>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` p`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`startsWith`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'h1='`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`map`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`p`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` =>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` p`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`slice`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`3`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`!`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ts`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ||`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` sigs`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:`length`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ===`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`return`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Reject anything older than ~5 minutes — replay protection.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Math`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`abs`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`/`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` -`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Number`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ts`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 300`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`return`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` expected`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` Buffer`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` crypto`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`createHmac`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'sha256'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`secret`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`update`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`\"}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`ts`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`rawBody`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`digest`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'hex'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` );`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Any matching signature is valid — a rotation emits several.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` sigs`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`some`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`sig`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` =>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` actual`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` Buffer`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`sig`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // timingSafeEqual throws when the lengths differ, so check first.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` actual`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:`length`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ===`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` expected`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:`length`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` \u0026\u0026`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` crypto`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`timingSafeEqual`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`actual`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`expected`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` );`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` });`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Verifieer tegen de `,_jsx(_components.strong,{children:`ruwe body`}),`, vóór JSON-parsing of middleware die hem herschrijft.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`gebeurtenissen`,children:`Gebeurtenissen`}),`\n`,_jsxs(_components.p,{children:[`Vijf gebeurtenistypen, allemaal met dezelfde payloadstructuur. `,_jsx(_components.code,{children:`data.status`}),` bevat de uitkomst.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Gebeurtenis`}),_jsx(_components.th,{children:`Betekenis`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`confirmation.completed`})}),_jsxs(_components.td,{children:[`Goedgekeurd en afgeschreven. Bevat `,_jsx(_components.code,{children:`transactionId`}),`. `,_jsx(_components.strong,{children:`Rond hier je actie af`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`confirmation.failed`})}),_jsxs(_components.td,{children:[`Kon niet worden afgerond — te weinig saldo of een interne fout. Bevat `,_jsx(_components.code,{children:`failureReason`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`confirmation.expired`})}),_jsx(_components.td,{children:`Niet binnen 10 minuten bevestigd. Er is geen Vito verplaatst`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`confirmation.cancelled`})}),_jsx(_components.td,{children:`De gebruiker heeft geannuleerd. Er is geen Vito verplaatst`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`credit.completed`})}),_jsxs(_components.td,{children:[`Een door de houder gefinancierde `,_jsx(_components.code,{children:`/add`}),` is verrekend. Vuurt direct — zonder bevestigingsstap`]})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Webhooks worden `,_jsx(_components.strong,{children:`5 keer met backoff`}),` opnieuw geprobeerd. Bevestig snel met een 2xx en doe je afhandeling asynchroon.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`foutcodes`,children:`Foutcodes`}),`\n`,_jsxs(_components.p,{children:[`Elk antwoord zit in een envelope. Een succes bevat `,_jsx(_components.code,{children:`data`}),`, een fout bevat `,_jsx(_components.code,{children:`error`}),` — nooit allebei:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`10`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`10`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"success\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Forbidden\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"API key lacks the required scope for this operation.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"VITO_INSUFFICIENT_SCOPE\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"requestId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"…\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"timestamp\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1735161600000`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Elke code begint met `,_jsx(_components.code,{children:`VITO_`}),`.`]}),` Vergelijk de volledige string — een kale `,_jsx(_components.code,{children:`RATE_LIMITED`}),` of `,_jsx(_components.code,{children:`FORBIDDEN`}),` komt nooit over de lijn.`]})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Code`}),_jsx(_components.th,{children:`Status`}),_jsx(_components.th,{children:`Betekenis`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_VALIDATION_ERROR`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`400`}),_jsx(_components.td,{children:`Een veld ontbreekt of is misvormd`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_INVALID_AMOUNT`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`400`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`amount`}),` is geen positief geheel getal`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_AMOUNT_LIMIT_EXCEEDED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`400`}),_jsx(_components.td,{children:`Boven je limiet per transactie`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_DAILY_VOLUME_EXCEEDED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`400`}),_jsx(_components.td,{children:`Deze aanroep zou je daglimiet overschrijden`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_SELF_TRANSFER`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`400`}),_jsx(_components.td,{children:`Afzender en ontvanger zijn dezelfde gebruiker`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_INVALID_API_KEY`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`401`}),_jsx(_components.td,{children:`Ontbrekende, misvormde, ingetrokken of onbekende sleutel`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_INSUFFICIENT_FUNDS`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`402`}),_jsx(_components.td,{children:`De gebruiker heeft te weinig saldo`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_INSUFFICIENT_OWNER_FUNDS`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`402`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Jouw`}),` saldo is te laag om een `,_jsx(_components.code,{children:`/add`}),` te financieren`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_INSUFFICIENT_SCOPE`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`De sleutel mist de vereiste scope`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_IP_NOT_ALLOWED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`Het aanroepende IP staat niet op de allowlist`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_OWNER_MEMBERSHIP_INACTIVE`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`Het lidmaatschap van de houder is verlopen — bevroren tot verlenging`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_GUILD_NOT_ALLOWED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`guildId`}),` staat niet op de serverlijst van het project`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_TOS_NOT_ACCEPTED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`Ontwikkelaarsvoorwaarden niet geaccepteerd, of er staat een nieuwere versie open`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_PROJECT_FROZEN`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`Bevroren — meestal een verlopen lidmaatschap van de houder`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_PROJECT_SUSPENDED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`Geschorst door het Vetox-team`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_PROJECT_BANNED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`Verbannen door het Vetox-team`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_USER_BLACKLISTED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`De gebruiker is uitgesloten van Vito-verrichtingen`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_ACCOUNT_LOCKED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`403`}),_jsx(_components.td,{children:`De wallet van de gebruiker is vergrendeld na mislukte pinpogingen`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_USER_NOT_FOUND`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`404`}),_jsx(_components.td,{children:`Geen Vito-account voor die Discord-ID`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_CONFIRMATION_NOT_FOUND`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`404`}),_jsx(_components.td,{children:`Onbekend bevestigingstoken`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_IDEMPOTENCY_CONFLICT`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`409`}),_jsxs(_components.td,{children:[`Dezelfde `,_jsx(_components.code,{children:`Idempotency-Key`}),`, andere body`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_IDEMPOTENCY_IN_PROGRESS`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`409`}),_jsx(_components.td,{children:`Een identiek verzoek loopt nog — probeer het zo opnieuw`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_CONFIRMATION_ALREADY_PROCESSED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`409`}),_jsx(_components.td,{children:`Die bevestiging heeft al een eindtoestand bereikt`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_KEY_ROTATION_IN_PROGRESS`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`409`}),_jsx(_components.td,{children:`Er loopt al een rotatie`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_CONFIRMATION_EXPIRED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`410`}),_jsx(_components.td,{children:`Het venster van 10 minuten is verstreken`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_RATE_LIMITED`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`429`}),_jsx(_components.td,{children:`Rustig aan en opnieuw proberen`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VITO_INTERNAL_ERROR`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:`500`}),_jsx(_components.td,{children:`Onverwachte fout aan onze kant`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`rate-limits`,children:`Rate limits`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Lidmaatschap van de houder`}),_jsx(_components.th,{children:`Per minuut`}),_jsx(_components.th,{children:`Per uur`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Geen`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`60`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`1.000`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Silver of Gold`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`180`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`5.000`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Platinum of Diamond`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`600`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`15.000`})]})]})]}),`\n`,_jsx(_components.p,{children:`Er geldt ook een limiet per IP van de helft van je minuutquotum, met een ondergrens van 30.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Onder belasting `,_jsx(_components.strong,{children:`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.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Stuur een `,_jsx(_components.code,{children:`Idempotency-Key`}),`-header mee om herhaalde pogingen veilig te dedupliceren.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`endpoints`,children:`Endpoints`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Endpoint`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`SDK-methode`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GET /v1/auth/verify`})}),_jsx(_components.td,{children:`elke`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.auth.verify()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`POST /v1/auth/rotate-key`})}),_jsx(_components.td,{children:`elke`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.auth.rotateKey()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GET /v1/balance/:discordId`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`balance:read`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.balance.retrieve(id)`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`POST /v1/deduct`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`deduct:create`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.payments.deduct(params)`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`POST /v1/add`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`credit:create`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.payments.credit(params)`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`POST /v1/transfer`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`transfer:create`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.payments.transfer(params)`})})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`GET /v1/transactions`}),` en `,_jsx(_components.code,{children:`/:id`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`transactions:read`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`vito.transactions.list()`}),` / `,_jsx(_components.code,{children:`.retrieve(id)`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GET /v1/webhooks/events`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`transactions:read`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.webhookEvents.list()`})})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`limieten`,children:`Limieten`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Bevestigingen verlopen na `,_jsx(_components.strong,{children:`10 minuten`}),` — beschouw niet-bevestigde verzoeken als afgebroken`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`amount`}),` moet een positief geheel getal zijn`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`metadata`}),` is beperkt tot 10 sleutels`]}),`\n`,_jsx(_components.li,{children:`Limieten per transactie en per dag worden door het Vetox-team ingesteld en staan alleen-lezen op het tabblad met instellingen`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`beveiligingschecklist`,children:`Beveiligingschecklist`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Houd secrets serverzijdig`,icon:`lock`,id:`houd-secrets-serverzijdig`,children:_jsx(_components.p,{children:`De API-sleutel en het signing secret horen nooit in clientcode. Roteer meteen als er een lekt.`})}),_jsx(Accordion,{title:`Verifieer elke webhook`,icon:`signature`,id:`verifieer-elke-webhook`,children:_jsx(_components.p,{children:`Controleer de handtekening tegen de ruwe body en weiger afleveringen ouder dan ~5 minuten.`})}),_jsx(Accordion,{title:`Verreken alleen bij completed`,icon:`circle-check`,id:`verreken-alleen-bij-completed`,children:_jsxs(_components.p,{children:[`Lever nooit op basis van het `,_jsx(_components.code,{children:`/deduct`}),`-antwoord — de afschrijving staat pas vast bij `,_jsx(_components.code,{children:`confirmation.completed`}),`.`]})}),_jsx(Accordion,{title:`Minimale rechten`,icon:`key`,id:`minimale-rechten`,children:_jsx(_components.p,{children:`Vraag alleen de scopes aan die je echt gebruikt, en zet de IP-allowlist aan.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`problemen-oplossen`,children:`Problemen oplossen`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Elke aanroep geeft niet-geautoriseerd`,id:`elke-aanroep-geeft-niet-geautoriseerd`,children:_jsx(_components.p,{children:`Het lidmaatschap van de houder is verlopen. Het wordt bij elke aanroep opnieuw gecontroleerd.`})}),_jsx(Accordion,{title:`Ik ben mijn sleutel kwijt`,id:`ik-ben-mijn-sleutel-kwijt`,children:_jsx(_components.p,{children:`Die is niet terug te halen — er wordt alleen een hash bewaard. Roteer voor een nieuwe.`})}),_jsx(Accordion,{title:`Webhook-handtekeningen falen na rotatie`,id:`webhook-handtekeningen-falen-na-rotatie`,children:_jsx(_components.p,{children:`Accepteer beide secrets tijdens de overlap van 24 uur.`})}),_jsx(Accordion,{title:`Een afschrijving wordt nooit afgerond`,id:`een-afschrijving-wordt-nooit-afgerond`,children:_jsx(_components.p,{children:`De gebruiker heeft niet goedgekeurd. Bevestigingen verlopen na 10 minuten.`})}),_jsx(Accordion,{title:`Er komen geen webhooks binnen`,id:`er-komen-geen-webhooks-binnen`,children:_jsx(_components.p,{children:`Een project heeft zowel een callback-URL als een signing secret nodig. Met maar één van beide wordt er niets afgeleverd.`})}),_jsx(Accordion,{title:`Er kwam minder Vito binnen dan ik afschreef`,id:`er-kwam-minder-vito-binnen-dan-ik-afschreef`,children:_jsx(_components.p,{children:`Dat zijn de verrekeningskosten. Gebruik bedragen van 5 Vito of minder om ze te vermijden, of reken ze door.`})}),_jsx(Accordion,{title:`402 VITO_INSUFFICIENT_OWNER_FUNDS`,id:`402-vito-insufficient-owner-funds`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`/v1/add`}),` wordt uit je eigen saldo gefinancierd, niet uit het niets gemaakt. Vul aan.`]})})]}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Vito`,icon:`coins`,href:`/nl/members/vito`,children:_jsx(_components.p,{children:`Saldi, de pincode en kosten.`})}),_jsx(Card,{title:`Betaalverzoeken`,icon:`receipt`,href:`/nl/account/payment-requests`,children:_jsx(_components.p,{children:`Wat de gebruiker ziet wanneer je hem afschrijft.`})}),_jsx(Card,{title:`@vetox-bot/vito op npm`,icon:`npm`,href:`https://www.npmjs.com/package/@vetox-bot/vito`,children:_jsx(_components.p,{children:`Het officiële Node.js-pakket — één installatie, volledige integratie.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Vito API en aankopen","sidebarTitle":"Vito API","description":"Laat goedgekeurde apps je Vito afboeken met pincode-bevestiging, en beheer betalingsverzoeken vanaf je Aankopen-pagina.","icon":"code","keywords":["vito api","purchases","payment requests","developer","api key","merchant"],"href":"/nl/members/vito-api"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Toegang krijgen","slug":"toegang-krijgen","depth":2,"children":[{"title":"Scopes","slug":"scopes","depth":3,"children":[]}]},{"title":"Authenticatie","slug":"authenticatie","depth":2,"children":[{"title":"Sleutels, rotatie en opslag","slug":"sleutels-rotatie-en-opslag","depth":3,"children":[]}]},{"title":"Officiële Node.js-SDK","slug":"officiële-node-js-sdk","depth":2,"children":[{"title":"Installatie","slug":"installatie","depth":3,"children":[]},{"title":"Initialisatie","slug":"initialisatie","depth":3,"children":[]},{"title":"Clientopties","slug":"clientopties","depth":4,"children":[]},{"title":"Beschikbare methoden","slug":"beschikbare-methoden","depth":3,"children":[]},{"title":"Gebruiksvoorbeelden","slug":"gebruiksvoorbeelden","depth":3,"children":[]},{"title":"De sleutel controleren bij het opstarten","slug":"de-sleutel-controleren-bij-het-opstarten","depth":4,"children":[]},{"title":"Een saldo uitlezen","slug":"een-saldo-uitlezen","depth":4,"children":[]},{"title":"Een gebruiker afschrijven (een artikel verkopen)","slug":"een-gebruiker-afschrijven-een-artikel-verkopen","depth":4,"children":[]},{"title":"Een gebruiker bijschrijven","slug":"een-gebruiker-bijschrijven","depth":4,"children":[]},{"title":"Door transacties bladeren","slug":"door-transacties-bladeren","depth":4,"children":[]},{"title":"Idempotentie en nieuwe pogingen","slug":"idempotentie-en-nieuwe-pogingen","depth":3,"children":[]},{"title":"Webhooks verifiëren met de SDK","slug":"webhooks-verifiëren-met-de-sdk","depth":3,"children":[]},{"title":"Foutafhandeling","slug":"foutafhandeling","depth":3,"children":[]},{"title":"Een aanroep annuleren","slug":"een-aanroep-annuleren","depth":3,"children":[]}]},{"title":"Een gebruiker afschrijven","slug":"een-gebruiker-afschrijven","depth":2,"children":[{"title":"Requestparameters — /v1/deduct","slug":"requestparameters-—-/v1/deduct","depth":3,"children":[]}]},{"title":"Een gebruiker bijschrijven","slug":"een-gebruiker-bijschrijven-2","depth":2,"children":[]},{"title":"Kosten","slug":"kosten","depth":2,"children":[]},{"title":"Webhooks","slug":"webhooks","depth":2,"children":[{"title":"De handtekening verifiëren","slug":"de-handtekening-verifiëren","depth":3,"children":[]},{"title":"Gebeurtenissen","slug":"gebeurtenissen","depth":3,"children":[]}]},{"title":"Foutcodes","slug":"foutcodes","depth":2,"children":[]},{"title":"Rate limits","slug":"rate-limits","depth":2,"children":[]},{"title":"Endpoints","slug":"endpoints","depth":2,"children":[]},{"title":"Limieten","slug":"limieten","depth":2,"children":[]},{"title":"Beveiligingschecklist","slug":"beveiligingschecklist","depth":2,"children":[]},{"title":"Problemen oplossen","slug":"problemen-oplossen","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"vetox-ec2a2bcb","siteName":"Vetox","title":"Vito API en aankopen - Vetox","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/en/members/vito-api","matchLevel":1},"ar":{"href":"/ar/members/vito-api","matchLevel":1},"zh-CN":{"href":"/zh-CN/members/vito-api","matchLevel":1},"fr":{"href":"/fr/members/vito-api","matchLevel":1},"de":{"href":"/de/members/vito-api","matchLevel":1},"ja":{"href":"/ja/members/vito-api","matchLevel":1},"ru":{"href":"/ru/members/vito-api","matchLevel":1},"es":{"href":"/es/members/vito-api","matchLevel":1},"tr":{"href":"/tr/members/vito-api","matchLevel":1},"nl":{"href":"/nl/members/vito-api","matchLevel":0},"pt":{"href":"/pt/members/vito-api","matchLevel":1},"it":{"href":"/it/members/vito-api","matchLevel":1},"pl":{"href":"/pl/members/vito-api","matchLevel":1},"id":{"href":"/id/members/vito-api","matchLevel":1},"hi":{"href":"/hi/members/vito-api","matchLevel":1},"ko":{"href":"/ko/members/vito-api","matchLevel":1},"vi":{"href":"/vi/members/vito-api","matchLevel":1},"uk":{"href":"/uk/members/vito-api","matchLevel":1}}},"lastModified":"2026-09-09T05:22:47.392Z","originalFileLocation":"nl/members/vito-api.mdx","locale":"nl"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Laat goedgekeurde apps je Vito afboeken met pincode-bevestiging, en beheer betalingsverzoeken vanaf je Aankopen-pagina.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Vetox\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/svg+xml\" sizes=\"180x180\" href=\"https://vetox.io/logo.svg\">\u003clink data-mint-head rel=\"icon\" type=\"image/svg+xml\" sizes=\"32x32\" href=\"https://vetox.io/logo.svg\">\u003clink data-mint-head rel=\"icon\" type=\"image/svg+xml\" sizes=\"16x16\" href=\"https://vetox.io/logo.svg\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/svg+xml\" href=\"https://vetox.io/logo.svg\">\u003cmeta data-mint-head property=\"og:title\" content=\"Vito API en aankopen - Vetox\">\u003cmeta data-mint-head property=\"og:description\" content=\"Laat goedgekeurde apps je Vito afboeken met pincode-bevestiging, en beheer betalingsverzoeken vanaf je Aankopen-pagina.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Vetox\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.vetox.io/nl/members/vito-api\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://vetox.io/brand/vetox-header-04.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Vito API en aankopen - Vetox\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Laat goedgekeurde apps je Vito afboeken met pincode-bevestiging, en beheer betalingsverzoeken vanaf je Aankopen-pagina.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://vetox.io/brand/vetox-header-04.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/vetox-ec2a2bcb/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Vetox\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0086FF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.vetox.io/nl/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/nl/members/vito-api.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"nl\" href=\"https://docs.vetox.io/nl/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.vetox.io/en/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ar\" href=\"https://docs.vetox.io/ar/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh-CN\" href=\"https://docs.vetox.io/zh-CN/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"fr\" href=\"https://docs.vetox.io/fr/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"de\" href=\"https://docs.vetox.io/de/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://docs.vetox.io/ja/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ru\" href=\"https://docs.vetox.io/ru/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://docs.vetox.io/es/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"tr\" href=\"https://docs.vetox.io/tr/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"pt\" href=\"https://docs.vetox.io/pt/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"it\" href=\"https://docs.vetox.io/it/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"pl\" href=\"https://docs.vetox.io/pl/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"id\" href=\"https://docs.vetox.io/id/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"hi\" href=\"https://docs.vetox.io/hi/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://docs.vetox.io/ko/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"vi\" href=\"https://docs.vetox.io/vi/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"uk\" href=\"https://docs.vetox.io/uk/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.vetox.io/en/members/vito-api\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.vetox.io/#organization\",\"name\":\"Vetox\",\"url\":\"https://docs.vetox.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://vetox.io/logo.svg\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.vetox.io#website\",\"name\":\"Vetox\",\"url\":\"https://docs.vetox.io\",\"publisher\":{\"@id\":\"https://docs.vetox.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.vetox.io/nl/members/vito-api#webpage\",\"url\":\"https://docs.vetox.io/nl/members/vito-api\",\"name\":\"Vito API en aankopen\",\"description\":\"Laat goedgekeurde apps je Vito afboeken met pincode-bevestiging, en beheer betalingsverzoeken vanaf je Aankopen-pagina.\",\"dateModified\":\"2026-09-09T05:22:47.392Z\",\"isPartOf\":{\"@id\":\"https://docs.vetox.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.vetox.io/nl/members/vito-api#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.vetox.io/nl/members/vito-api#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Vito\",\"item\":\"https://docs.vetox.io/nl/members/vito\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vito API en aankopen\",\"item\":\"https://docs.vetox.io/nl/members/vito-api\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.vetox.io/nl/members/vito-api#article\",\"headline\":\"Vito API en aankopen\",\"name\":\"Vito API en aankopen\",\"description\":\"Laat goedgekeurde apps je Vito afboeken met pincode-bevestiging, en beheer betalingsverzoeken vanaf je Aankopen-pagina.\",\"url\":\"https://docs.vetox.io/nl/members/vito-api\",\"mainEntityOfPage\":{\"@id\":\"https://docs.vetox.io/nl/members/vito-api#webpage\"},\"image\":\"https://vetox.io/brand/vetox-header-04.png\",\"dateModified\":\"2026-09-09T05:22:47.392Z\",\"keywords\":\"vito api, purchases, payment requests, developer, api key, merchant\",\"publisher\":{\"@id\":\"https://docs.vetox.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.vetox.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Vetox\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Vetox","nav":{"global":null,"languages":[{"language":"en","pages":[{"title":"en","href":"/en/members/vito-api"}]},{"language":"ar","pages":[{"title":"ar","href":"/ar/members/vito-api"}]},{"language":"zh-CN","pages":[{"title":"zh-CN","href":"/zh-CN/members/vito-api"}]},{"language":"fr","pages":[{"title":"fr","href":"/fr/members/vito-api"}]},{"language":"de","pages":[{"title":"de","href":"/de/members/vito-api"}]},{"language":"ja","pages":[{"title":"ja","href":"/ja/members/vito-api"}]},{"language":"ru","pages":[{"title":"ru","href":"/ru/members/vito-api"}]},{"language":"es","pages":[{"title":"es","href":"/es/members/vito-api"}]},{"language":"tr","pages":[{"title":"tr","href":"/tr/members/vito-api"}]},{"language":"nl","tabs":[{"tab":"Documentatie","pages":[{"title":"Documentatie","href":"/nl"}]},{"tab":"Serverdashboard","pages":[{"title":"Serverdashboard","href":"/nl/server-management/overview"}]},{"tab":"Jouw account","groups":[{"group":"Hoofd","icon":"house","pages":[{"title":"Overzicht","sidebarTitle":"Overzicht","icon":"house","href":"/nl/account/overview"},{"title":"Mijn Battle Pass","sidebarTitle":"Mijn Battle Pass","icon":"medal","href":"/nl/account/my-battle-pass"},{"title":"Dagelijkse beloning","sidebarTitle":"Dagelijkse beloning","icon":"calendar-check","href":"/nl/members/daily-reward"},{"title":"Openbaar profiel","sidebarTitle":"Openbaar profiel","icon":"id-card","href":"/nl/members/profile"},{"title":"Lidmaatschapspagina","sidebarTitle":"Lidmaatschap","icon":"user","href":"/nl/account/membership-page"},{"title":"Premium en bots beheren","sidebarTitle":"Bots beheren","icon":"robot","href":"/nl/account/manage-bots"},{"title":"Reputatie","sidebarTitle":"Reputatie","icon":"thumbs-up","href":"/nl/members/reputation"},{"title":"Stemmen","sidebarTitle":"Stemmen","icon":"thumbs-up","href":"/nl/members/voting"}]},{"group":"Hulpprogramma's","icon":"palette","pages":[{"title":"Profielaanpassing","sidebarTitle":"Profielaanpassing","icon":"image","href":"/nl/members/profile-customization"},{"title":"Rangkaart-aanpassing","sidebarTitle":"Rangkaart-aanpassing","icon":"gauge","href":"/nl/members/rank-customization"},{"title":"Naam-aanpassingen","sidebarTitle":"Naam-aanpassingen","icon":"font","href":"/nl/members/name-customization"},{"title":"Badges","sidebarTitle":"Badges","icon":"certificate","href":"/nl/members/badges"},{"title":"Mijn back-ups","icon":"box-archive","sidebarTitle":"Mijn back-ups","href":"/nl/members/my-backups"}]},{"group":"Vito","icon":"coins","pages":[{"title":"Vito","sidebarTitle":"Vito","icon":"coins","href":"/nl/members/vito"},{"title":"Vito-transacties","sidebarTitle":"Vito-transacties","icon":"receipt","href":"/nl/account/vito-transactions"},{"title":"Betalingsverzoeken","sidebarTitle":"Betalingsverzoeken","description":"Bekijk, keur goed of annuleer Vito-afboekingen aangevraagd door verbonden apps — en het venster van 10 minuten waarbinnen ze lopen.","icon":"file-invoice","href":"/nl/account/payment-requests"},{"title":"Vito API en aankopen","sidebarTitle":"Vito API","icon":"code","href":"/nl/members/vito-api"}]},{"group":"Ranglijst","icon":"ranking-star","pages":[{"title":"Ranglijsten","sidebarTitle":"Ranglijsten","description":"Wereldwijde ranglijsten voor Vito, XP en reputatie — de top 100 in elk, twee keer per dag ververst.","icon":"ranking-star","href":"/nl/members/leaderboards"},{"title":"Rijkste gebruikers","sidebarTitle":"Rijkste gebruikers","icon":"coins","href":"/nl/account/richest-users"},{"title":"Toetsenbordmakelaars","sidebarTitle":"Toetsenbordmakelaars","icon":"chart-line","href":"/nl/account/keyboard-brokers"},{"title":"Meest leuk gevonden","sidebarTitle":"Meest leuk gevonden","icon":"thumbs-up","href":"/nl/account/most-liked"}]}]},{"tab":"Commando's","pages":[{"title":"Commando's","href":"/nl/commands/overview"}]},{"tab":"Help","pages":[{"title":"Help","href":"/nl/help/faq"}]}]},{"language":"pt","pages":[{"title":"pt","href":"/pt/members/vito-api"}]},{"language":"it","pages":[{"title":"it","href":"/it/members/vito-api"}]},{"language":"pl","pages":[{"title":"pl","href":"/pl/members/vito-api"}]},{"language":"id","pages":[{"title":"id","href":"/id/members/vito-api"}]},{"language":"hi","pages":[{"title":"hi","href":"/hi/members/vito-api"}]},{"language":"ko","pages":[{"title":"ko","href":"/ko/members/vito-api"}]},{"language":"vi","pages":[{"title":"vi","href":"/vi/members/vito-api"}]},{"language":"uk","pages":[{"title":"uk","href":"/uk/members/vito-api"}]}]},"title":"Vito API en aankopen - Vetox","buildId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","deploymentId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","dynamics":[],"chunks":[]}