Erlaube geprüften Apps, dein Vito mit PIN-Bestätigung zu belasten, und verwalte Zahlungsanfragen auf deiner Käufe-Seite.
Erfordert eine Silver-Mitgliedschaft oder höher — sowohl für die Bewerbung als auch für jeden authentifizierten Aufruf. Läuft die Mitgliedschaft des Schlüsselinhabers aus, wird das Projekt eingefroren, bis er sie erneuert.
Eine REST-API, mit der deine Anwendung das Vito-Guthaben eines Nutzers aus Discord heraus verwendet — lesen, belasten, gutschreiben oder zwischen Nutzern bewegen. Alle Endpunkte liefern JSON und sind unter /v1 versioniert.
Vito bewegt sich nie zu oder von echtem Geld. Es wandert ausschließlich zwischen Vetox-Guthaben.
Jeder Endpunkt liegt unter https://api.vetox.io/public/vito.Die auf dieser Seite genannten Pfade — /v1/deduct, /v1/balance/:discordId und die übrigen — sind relativ zu diesem Präfix, das dir das SDK selbst voranstellt. Rufst du einen direkt auf, nimm die vollständige URL:
https://api.vetox.io/public/vito/v1/deduct
https://api.vetox.io/v1/deduct ist keine Route und liefert 404.
Du baust mit Node.js? Baue REST-Aufrufe nicht selbst — nutze das offizielle Paket @vetox-bot/vito. Es deckt alle neun Endpunkte samt Webhook-Prüfung ab und übernimmt Idempotenz und Retries für dich. Siehe Offizielles Node.js-SDK weiter unten.
Dein Schlüssel und dein Signing Secret werden genau einmal angezeigt. Nach der Genehmigung hast du ein 7-Tage-Fenster, um sie im Tab „API Keys“ aufzudecken. Vetox speichert nur einen Hash und kann sie nicht erneut anzeigen — verpasst du das Fenster, musst du rotieren.
Halte ihn ausschließlich serverseitig — wer ihn besitzt, kann deine Nutzer belasten
Rotiere im Tab „API Keys“. Der vorherige Schlüssel funktioniert weitere 24 Stunden als Karenzzeit, damit du ohne Ausfall deployen kannst
Das Webhook-Signing-Secret rotiert separat, mit eigener 24-Stunden-Überlappung
Das offizielle Paket @vetox-bot/vito kapselt alle neun Endpunkte sowie die Webhook-Prüfung. Es übernimmt den Idempotency-Key-Header, Retries mit exponentiellem Backoff, Timeouts und die Klassifizierung von Fehlern für dich.
Erfordert Node.js 20 oder neuer. Das Paket hat keinerlei Laufzeitabhängigkeiten — es nutzt das eingebaute fetch und node:crypto — und liefert ESM und CommonJS zusammen mit vollständigen TypeScript-Definitionen.
import { VitoClient } from '@vetox-bot/vito';const vito = new VitoClient({ apiKey: process.env.VITO_API_KEY });
Lässt du apiKey weg, liest das SDK VITO_API_KEY aus der Umgebung. Das Schlüsselformat wird bereits beim Erzeugen geprüft, sodass ein fehlerhafter Schlüssel sofort scheitert, statt dich einen Roundtrip und ein 401 zu kosten.
Der Schlüssel bewegt Geld — halte ihn immer serverseitig, niemals in einem Client-Bundle oder im Browser. console.log(vito) gibt [redacted] statt des Schlüssels aus, und das SDK verweigert jede baseUrl mit http:// für einen nicht-lokalen Host, damit der Schlüssel nicht im Klartext übertragen wird.
Jede Methode liefert direkt das ausgepackte data-Feld — du entpackst success oder data nie selbst. Zusätzlich nimmt jede Methode Optionen pro Aufruf entgegen: { timeoutMs, maxRetries, signal, headers }, und die schreibenden Methoden zusätzlich { idempotencyKey }.
const wallet = await vito.balance.retrieve('123456789012345678');if (!wallet.hasPin) { // Noch keine Wallet-PIN, also kann keine Belastung bestätigt werden.}
Vermerke die Bestellung hier nur als ausstehend. Die Belastung ist noch nicht erfolgt — liefere erst beim Webhook confirmation.completed aus, nicht bei dieser Antwort.
const credit = await vito.payments.credit( { discordId: '123456789012345678', amount: 250, reason: 'Erstattung für order_10423', merchantRef: 'refund_10423', }, // Leitest du den Key aus deinem eigenen Datensatz ab, ist ein erneuter Lauf aus // einer Job-Queue sicher: eine Wiederholung liefert das Originalergebnis, // statt ein zweites Mal auszuzahlen. { idempotencyKey: 'refund_10423' },);console.log(credit.transactionId, credit.ownerBalance, credit.recipientBalance);
const since = Date.now() - 24 * 60 * 60 * 1000;// Ein async Generator, der Seiten bei Bedarf holt — keine manuelle Blätterschleife.for await (const tx of vito.transactions.iterate({ limit: 100 })) { if (tx.date < since) break; // neueste zuerst // tx.type ist die Richtung relativ zu tx.discordId: 1 = eingehend, 0 = ausgehend.}
Das SDK sendet bei jeder Schreiboperation (deduct, credit, transfer) einen Idempotency-Key-Header. Übergibst du keinen, erzeugt es ihn einmal pro Aufruf und sendet exakt denselben Key bei jedem Retry erneut, sodass ein Retry den Vorgang niemals zweimal buchen kann.Übergib einen eigenen Key, wenn derselbe logische Vorgang aus einem neuen Prozess wiederholt werden kann — Job-Runner, erneute Zustellung aus einer Queue oder ein geplanter Lauf:
Netzwerkfehler, Timeouts, 408, 429, 5xx und 409 VITO_IDEMPOTENCY_IN_PROGRESS
Wird nie wiederholt
409 VITO_IDEMPOTENCY_CONFLICT, alle übrigen 4xx und auth.rotateKey()
auth.rotateKey() ist bewusst ausgenommen — ein Retry erzeugt dort einen zweiten Schlüssel und entwertet den, den der erste Versuch zurückgegeben hat.
Ist Retry-After länger als maxRetryDelayMs (dein Stundenkontingent ist also wirklich aufgebraucht), wirft das SDK sofort VitoRateLimitError, statt dein Anfrage-Budget zu verschlafen.
import { Webhooks, VitoSignatureVerificationError } from '@vetox-bot/vito';try { const event = Webhooks.constructEvent({ payload: rawRequestBody, // der Raw Body — siehe Warnung unten signature: req.header('x-vito-signature') ?? '', secret: process.env.VITO_WEBHOOK_SECRET, }); if (event.eventType === 'confirmation.completed') { // Der Typ von data wird anhand von eventType automatisch eingegrenzt. await fulfil(event.data.merchantRef); }} catch (error) { if (error instanceof VitoSignatureVerificationError) { // Auslieferung mit 400 ablehnen — gefälscht, veraltet oder neu serialisiert. }}
constructEvent prüft das 5-Minuten-Replay-Fenster, vergleicht in konstanter Zeit gegen jedeh1-Signatur im Header — funktioniert damit automatisch während der 24-stündigen Rotationsüberlappung — parst anschließend die Payload und gibt das typisierte Event zurück.In einem Next.js-Route-Handler (App Router) nutzt du die Variante, die den Raw Body selbst liest:
Die Signatur deckt die rohen Bytes ab. Hänge in Express express.raw({ type: 'application/json' }) an die Webhook-Route — express.json() verbraucht den Body, und danach scheitert jede Prüfung. Rufe in Next.js nicht request.json() vor constructEventFromRequest auf.
Die Zustellung erfolgt mindestens einmal. Dedupliziere über event.eventId, bevor du irgendeinen Seiteneffekt ausführst.
Dein Schlüssel allein kann das Vito eines Nutzers nicht bewegen. Jede Belastung erfordert die Freigabe des Nutzers mit seiner Wallet-PIN, auf vetox.io — niemals in deiner App und niemals in Discord.
1
Deine App ruft POST /v1/deduct auf
Mit dem Nutzer, dem Betrag, der auslösenden guildId und den Artikeldetails.
2
Vito liefert eine confirmUrl
Eine ausstehende Bestätigung, 10 Minuten gültig. Der Nutzer erhält zusätzlich eine DM.
3
Der Nutzer bestätigt mit seiner PIN
Auf vetox.io.
4
Vito bucht und benachrichtigt
Das Guthaben wird belastet, die Transaktion gespeichert und ein signierter Webhook gesendet, sofern konfiguriert.
5
Deine App prüft und schließt ab
Signatur prüfen, dann den Inhalt freischalten oder den Artikel ausliefern.
Schließe deine Aktion ausschließlich bei confirmation.completed ab — niemals bei der Antwort von /deduct. Zu diesem Zeitpunkt ist die Belastung noch nicht endgültig.
POST /v1/add schreibt einem Nutzer Vito aus deinem eigenen Guthaben gut — für Belohnungen oder Erstattungen. Dieselben Felder wie /deduct, außer guildId und product.
Anders als eine Belastung hat eine Gutschrift keinen Bestätigungsschritt — sie wird sofort gebucht. Erfordert den Scope credit:create und ausreichendes Guthaben, sonst antwortet der Aufruf mit 402 VITO_INSUFFICIENT_OWNER_FUNDS.
Jede Belastung wird an dich ausgezahlt, abzüglich der Plattformgebühr — nach demselben Schema wie In-App-Vito-Transfers, basierend auf deiner Mitgliedschaftsstufe:
Deine Mitgliedschaft
Gebühr
Normal, Silver, Gold
7 %
Platinum
6 %
Diamond
5 %
Beträge von 5 Vito oder weniger sind gebührenfrei, und Gutschriften über /v1/add sind immer gebührenfrei.
Trage im Tab „Settings“ eine oder mehrere https-Callback-URLs ein. Vito sendet ein signiertes POST, sobald eine Bestätigung einen Endzustand erreicht.
Webhooks werden nur ausgeliefert, wenn dein Projekt sowohl eine Callback-URL als auch ein Signing Secret hat. Decke das Secret (whsec_…) einmalig im Tab „API Keys“ auf.
Jede Auslieferung trägt einen X-Vito-Signature-Header:
X-Vito-Signature: ts=<unix>;h1=<hex>
Zwei weitere Header begleiten jede Auslieferung — nutze X-Vito-Event-Id als Deduplizierungsschlüssel, denn ein Retry sendet dieselbe ID erneut:
Header
Enthält
X-Vito-Event-Id
Stabile ID für dieses Event — über Retries hinweg identisch
X-Vito-Event-Type
z. B. confirmation.completed
Während einer Signing-Secret-Rotation enthält der Header mehr als eine Signatur, die neueste zuerst:
X-Vito-Signature: ts=<unix>;h1=<neu>;h1=<alt>
Akzeptiere die Auslieferung, wenn irgendeinh1 passt. Ein Verifier, der nur den ersten liest, lehnt jeden Webhook ab, bis er das neue Secret ausgerollt hat — was den Sinn der 24-Stunden-Überlappung zunichtemacht.
Unter Node.js: Webhooks.constructEvent aus @vetox-bot/vito erledigt all das für dich — das Replay-Fenster, den Abgleich mit jederh1-Signatur und den Vergleich in konstanter Zeit — und liefert das typisierte Event zurück. Der Code unten ist für eine eigene Implementierung oder eine andere Sprache.
Berechne den HMAC über <ts>:<rawBody> mit deinem Signing Secret neu und vergleiche in konstanter Zeit.
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) ); });}
Prüfe gegen den Raw Body, bevor JSON-Parsing oder Middleware ihn umschreibt.
Zusätzlich gilt ein Limit pro IP in Höhe der halben Minutenquote, mindestens jedoch 30.
Unter Last scheitern Schreib-Endpunkte geschlossen — eine Belastung wird abgelehnt, statt ein Double-Spend zu riskieren. Lesende Endpunkte scheitern offen. Behandle eine abgelehnte Schreiboperation als „nicht passiert“ und wiederhole sie.
Sende einen Idempotency-Key-Header, um Retries sicher zu deduplizieren.
Die Mitgliedschaft des Inhabers ist abgelaufen. Sie wird bei jedem Aufruf erneut geprüft.
Ich habe meinen Schlüssel verloren
Er lässt sich nicht wiederherstellen — gespeichert wird nur ein Hash. Rotiere für einen neuen.
Webhook-Signaturen scheitern nach der Rotation
Akzeptiere während der 24-stündigen Überlappung beide Secrets.
Eine Belastung wird nie abgeschlossen
Der Nutzer hat sie nicht freigegeben. Bestätigungen verfallen nach 10 Minuten.
Es kommen keine Webhooks an
Ein Projekt braucht Callback-URL und Signing Secret. Mit nur einem von beiden wird nichts ausgeliefert.
Es kam weniger Vito an, als ich belastet habe
Das ist die Abrechnungsgebühr. Nutze Beträge von 5 Vito oder weniger, um sie zu vermeiden, oder kalkuliere sie ein.
402 VITO_INSUFFICIENT_OWNER_FUNDS
/v1/add wird aus deinem eigenen Guthaben finanziert, nicht aus dem Nichts erzeugt. Lade auf.
Vito
Guthaben, PIN und Gebühren.
Zahlungsanfragen
Was der Nutzer sieht, wenn du ihn belastest.
@vetox-bot/vito auf npm
Das offizielle Node.js-Paket — eine Installation, volle Integration.
{"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.3966","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},"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":"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}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"de/members/vito-api","slug":"/de/members/vito-api","pageMetadata":{"title":"Vito-API und Käufe","sidebarTitle":"Vito-API","description":"Erlaube geprüften Apps, dein Vito mit PIN-Bestätigung zu belasten, und verwalte Zahlungsanfragen auf deiner Käufe-Seite.","icon":"code","keywords":["vito api","purchases","payment requests","developer","api key","merchant"],"href":"/de/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: \"Erlaube geprüften Apps, dein Vito mit PIN-Bestätigung zu belasten, und verwalte Zahlungsanfragen auf deiner Käufe-Seite.\"\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:[`Erfordert eine `,_jsx(_components.strong,{children:`Silver`}),`-Mitgliedschaft oder höher — sowohl für die Bewerbung als auch für jeden authentifizierten Aufruf. Läuft die Mitgliedschaft des Schlüsselinhabers aus, wird das Projekt eingefroren, bis er sie erneuert.`]})}),`\n`,_jsxs(_components.p,{children:[`Eine REST-API, mit der deine Anwendung das `,_jsx(_components.a,{href:`/de/members/vito`,children:`Vito`}),`-Guthaben eines Nutzers aus Discord heraus verwendet — lesen, belasten, gutschreiben oder zwischen Nutzern bewegen. Alle Endpunkte liefern JSON und sind unter `,_jsx(_components.code,{children:`/v1`}),` versioniert.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Vito bewegt sich nie zu oder von echtem Geld.`}),` Es wandert ausschließlich zwischen Vetox-Guthaben.`]})}),`\n`,_jsxs(Warning,{children:[_jsx(_components.p,{children:_jsxs(_components.strong,{children:[`Jeder Endpunkt liegt unter `,_jsx(_components.code,{children:`https://api.vetox.io/public/vito`}),`.`]})}),_jsxs(_components.p,{children:[`Die auf dieser Seite genannten Pfade — `,_jsx(_components.code,{children:`/v1/deduct`}),`, `,_jsx(_components.code,{children:`/v1/balance/:discordId`}),` und die übrigen — sind relativ zu diesem Präfix, das dir das SDK selbst voranstellt. Rufst du einen direkt auf, nimm die vollständige 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`}),` ist keine Route und liefert 404.`]})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Du baust mit Node.js? Baue REST-Aufrufe nicht selbst — nutze das offizielle Paket `,_jsx(_components.a,{href:`https://www.npmjs.com/package/@vetox-bot/vito`,children:_jsx(_components.strong,{children:_jsx(_components.code,{children:`@vetox-bot/vito`})})}),`. Es deckt alle neun Endpunkte samt Webhook-Prüfung ab und übernimmt Idempotenz und Retries für dich. Siehe `,_jsx(_components.strong,{children:`Offizielles Node.js-SDK`}),` weiter unten.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`zugang-erhalten`,children:`Zugang erhalten`}),`\n`,_jsxs(_components.p,{children:[`Der Zugang wird `,_jsx(_components.strong,{children:`pro Projekt`}),` vergeben. Du brauchst alle vier:`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Eine aktive Mitgliedschaft, Silver oder höher`,children:_jsx(_components.p,{children:`Wird bei jedem Aufruf geprüft, nicht nur bei der Genehmigung.`})}),_jsx(Step,{title:`Eine genehmigte Entwicklerbewerbung`,children:_jsx(_components.p,{children:`Wird auf der Vito-API-Seite im Dashboard eingereicht und vom Vetox-Team manuell geprüft.`})}),_jsx(Step,{title:`Akzeptierte API-Entwicklerbedingungen`,children:_jsx(_components.p,{children:`Werden beim Einreichen der Bewerbung bestätigt.`})}),_jsx(Step,{title:`Die Scopes, die dein Projekt benötigt`,children:_jsx(_components.p,{children:`Werden vom Vetox-Team anhand deiner Beschreibung vergeben.`})})]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Sei konkret, was du baust und wie du den Schlüssel speicherst. Vage Bewerbungen sind die, die abgelehnt werden.`})}),`\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:`Erlaubt`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`balance:read`})}),_jsx(_components.td,{children:`Das Vito-Guthaben eines Nutzers lesen`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`deduct:create`})}),_jsx(_components.td,{children:`Das Guthaben eines Nutzers belasten`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`credit:create`})}),_jsx(_components.td,{children:`Einem Nutzer Vito gutschreiben, finanziert aus deinem eigenen Guthaben`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`transfer:create`})}),_jsx(_components.td,{children:`Vito zwischen zwei Nutzern bewegen`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`transactions:read`})}),_jsx(_components.td,{children:`Transaktionen deines Projekts auflisten und lesen`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`authentifizierung`,children:`Authentifizierung`}),`\n`,_jsx(_components.p,{children:`Sende deinen geheimen Schlüssel 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:`Zwei optionale Ebenen härten ein Projekt zusätzlich ab:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`IP-Allowlist`}),` — Aufrufe auf bestimmte Server-IPs beschränken`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Rate-Limits`}),` — Obergrenzen pro Projekt, die mit der Mitgliedschaftsstufe des Inhabers steigen`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`schlüssel-rotation-und-speicherung`,children:`Schlüssel, Rotation und Speicherung`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Dein Schlüssel und dein Signing Secret werden genau einmal angezeigt.`}),` Nach der Genehmigung hast du ein `,_jsx(_components.strong,{children:`7-Tage-Fenster`}),`, um sie im Tab „API Keys“ aufzudecken. Vetox speichert nur einen Hash und kann sie nicht erneut anzeigen — verpasst du das Fenster, musst du rotieren.`]})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Halte ihn `,_jsx(_components.strong,{children:`ausschließlich serverseitig`}),` — wer ihn besitzt, kann deine Nutzer belasten`]}),`\n`,_jsxs(_components.li,{children:[`Rotiere im Tab „API Keys“. Der vorherige Schlüssel funktioniert weitere `,_jsx(_components.strong,{children:`24 Stunden`}),` als Karenzzeit, damit du ohne Ausfall deployen kannst`]}),`\n`,_jsx(_components.li,{children:`Das Webhook-Signing-Secret rotiert separat, mit eigener 24-Stunden-Überlappung`}),`\n`,_jsx(_components.li,{children:`Bei einem Leak sofort rotieren`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`offizielles-node-js-sdk`,children:`Offizielles Node.js-SDK`}),`\n`,_jsxs(_components.p,{children:[`Das offizielle Paket `,_jsx(_components.a,{href:`https://www.npmjs.com/package/@vetox-bot/vito`,children:_jsx(_components.strong,{children:_jsx(_components.code,{children:`@vetox-bot/vito`})})}),` kapselt alle neun Endpunkte sowie die Webhook-Prüfung. Es übernimmt den `,_jsx(_components.code,{children:`Idempotency-Key`}),`-Header, Retries mit exponentiellem Backoff, Timeouts und die Klassifizierung von Fehlern für dich.`]}),`\n`,_jsx(Heading,{level:`3`,id:`installation`,children:`Installation`}),`\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:[`Erfordert `,_jsx(_components.strong,{children:`Node.js 20 oder neuer`}),`. Das Paket hat `,_jsx(_components.strong,{children:`keinerlei Laufzeitabhängigkeiten`}),` — es nutzt das eingebaute `,_jsx(_components.code,{children:`fetch`}),` und `,_jsx(_components.code,{children:`node:crypto`}),` — und liefert ESM und CommonJS zusammen mit vollständigen TypeScript-Definitionen.`]}),`\n`,_jsx(Heading,{level:`3`,id:`initialisierung`,children:`Initialisierung`}),`\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:[`Lässt du `,_jsx(_components.code,{children:`apiKey`}),` weg, liest das SDK `,_jsx(_components.code,{children:`VITO_API_KEY`}),` aus der Umgebung. Das Schlüsselformat wird bereits beim Erzeugen geprüft, sodass ein fehlerhafter Schlüssel sofort scheitert, statt dich einen Roundtrip und ein 401 zu kosten.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Der Schlüssel bewegt Geld — halte ihn immer serverseitig, niemals in einem Client-Bundle oder im Browser. `,_jsx(_components.code,{children:`console.log(vito)`}),` gibt `,_jsx(_components.code,{children:`[redacted]`}),` statt des Schlüssels aus, und das SDK verweigert jede `,_jsx(_components.code,{children:`baseUrl`}),` mit `,_jsx(_components.code,{children:`http://`}),` für einen nicht-lokalen Host, damit der Schlüssel nicht im Klartext übertragen wird.`]})}),`\n`,_jsx(Heading,{level:`4`,id:`client-optionen`,children:`Client-Optionen`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Option`}),_jsx(_components.th,{children:`Standard`}),_jsx(_components.th,{children:`Wirkung`})]})}),_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:[`Projektschlüssel (`,_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:`API-Wurzel`})]}),_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:`Timeout pro Anfrage`})]}),_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:`Retries bei vorübergehenden Fehlern`})]}),_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:`Erste Backoff-Wartezeit; verdoppelt sich je Retry`})]}),_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:[`Backoff-Obergrenze und Abbruchschwelle für `,_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:`Eigene Implementierung über Proxy oder Agent`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`onResponse`})}),_jsx(_components.td,{children:`—`}),_jsxs(_components.td,{children:[`Wird nach jeder Antwort aufgerufen, mit `,_jsx(_components.code,{children:`requestId`}),`, Rate-Limit-Kontingent und Dauer`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`onRetry`})}),_jsx(_components.td,{children:`—`}),_jsx(_components.td,{children:`Wird vor jedem Retry aufgerufen`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`verfügbare-methoden`,children:`Verfügbare Methoden`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Methode`}),_jsx(_components.th,{children:`Endpunkt`}),_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:`beliebig`})]}),_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:`beliebig`})]}),_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 Seitennavigation`}),_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 Seitennavigation`}),_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 Prüfung)`}),_jsx(_components.td,{children:`—`})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Jede Methode liefert direkt das ausgepackte `,_jsx(_components.code,{children:`data`}),`-Feld — du entpackst `,_jsx(_components.code,{children:`success`}),` oder `,_jsx(_components.code,{children:`data`}),` nie selbst. Zusätzlich nimmt jede Methode Optionen pro Aufruf entgegen: `,_jsx(_components.code,{children:`{ timeoutMs, maxRetries, signal, headers }`}),`, und die schreibenden Methoden zusätzlich `,_jsx(_components.code,{children:`{ idempotencyKey }`}),`.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`anwendungsbeispiele`,children:`Anwendungsbeispiele`}),`\n`,_jsx(Heading,{level:`4`,id:`schlüssel-beim-start-prüfen`,children:`Schlüssel beim Start prüfen`}),`\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:`guthaben-lesen`,children:`Guthaben lesen`}),`\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:` // Noch keine Wallet-PIN, also kann keine Belastung bestätigt werden.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`4`,id:`einen-nutzer-belasten-artikel-verkaufen`,children:`Einen Nutzer belasten (Artikel verkaufen)`}),`\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:` 'Legendäres Schwert'`}),_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:` 'Legendäres Schwert'`}),_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:` 'Verursacht 120 Schaden.'`}),_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:`// hierhin den Nutzer schicken`})]}),`\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, in 10 Minuten`})]}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Vermerke die Bestellung hier nur als `,_jsx(_components.strong,{children:`ausstehend`}),`. Die Belastung ist noch nicht erfolgt — liefere erst beim Webhook `,_jsx(_components.code,{children:`confirmation.completed`}),` aus, nicht bei dieser Antwort.`]})}),`\n`,_jsx(Heading,{level:`4`,id:`einem-nutzer-gutschreiben`,children:`Einem Nutzer gutschreiben`}),`\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:` 'Erstattung für 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:` // Leitest du den Key aus deinem eigenen Datensatz ab, ist ein erneuter Lauf aus`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // einer Job-Queue sicher: eine Wiederholung liefert das Originalergebnis,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // statt ein zweites Mal auszuzahlen.`})}),`\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:`transaktionen-durchblättern`,children:`Transaktionen durchblättern`}),`\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:`// Ein async Generator, der Seiten bei Bedarf holt — keine manuelle Blätterschleife.`})}),`\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:`// neueste zuerst`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // tx.type ist die Richtung relativ zu tx.discordId: 1 = eingehend, 0 = ausgehend.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`idempotenz-und-retries`,children:`Idempotenz und Retries`}),`\n`,_jsxs(_components.p,{children:[`Das SDK sendet bei `,_jsx(_components.strong,{children:`jeder Schreiboperation`}),` (`,_jsx(_components.code,{children:`deduct`}),`, `,_jsx(_components.code,{children:`credit`}),`, `,_jsx(_components.code,{children:`transfer`}),`) einen `,_jsx(_components.code,{children:`Idempotency-Key`}),`-Header. Übergibst du keinen, erzeugt es ihn `,_jsx(_components.strong,{children:`einmal pro Aufruf und sendet exakt denselben Key bei jedem Retry erneut`}),`, sodass ein Retry den Vorgang niemals zweimal buchen kann.`]}),`\n`,_jsxs(_components.p,{children:[`Übergib einen eigenen Key, wenn derselbe logische Vorgang aus einem `,_jsx(_components.strong,{children:`neuen Prozess`}),` wiederholt werden kann — Job-Runner, erneute Zustellung aus einer Queue oder ein geplanter Lauf:`]}),`\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:`Verhalten`}),_jsx(_components.th,{children:`Fälle`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Wird automatisch wiederholt`}),_jsxs(_components.td,{children:[`Netzwerkfehler, Timeouts, `,_jsx(_components.code,{children:`408`}),`, `,_jsx(_components.code,{children:`429`}),`, `,_jsx(_components.code,{children:`5xx`}),` und `,_jsx(_components.code,{children:`409 VITO_IDEMPOTENCY_IN_PROGRESS`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Wird nie wiederholt`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`409 VITO_IDEMPOTENCY_CONFLICT`}),`, alle übrigen `,_jsx(_components.code,{children:`4xx`}),` und `,_jsx(_components.code,{children:`auth.rotateKey()`})]})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`auth.rotateKey()`}),` ist bewusst ausgenommen — ein Retry erzeugt dort einen zweiten Schlüssel und entwertet den, den der erste Versuch zurückgegeben hat.`]})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Ist `,_jsx(_components.code,{children:`Retry-After`}),` länger als `,_jsx(_components.code,{children:`maxRetryDelayMs`}),` (dein Stundenkontingent ist also wirklich aufgebraucht), wirft das SDK sofort `,_jsx(_components.code,{children:`VitoRateLimitError`}),`, statt dein Anfrage-Budget zu verschlafen.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`webhooks-mit-dem-sdk-prüfen`,children:`Webhooks mit dem SDK prüfen`}),`\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:`// der Raw Body — siehe Warnung unten`})]}),`\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:` // Der Typ von data wird anhand von eventType automatisch eingegrenzt.`})}),`\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:` // Auslieferung mit 400 ablehnen — gefälscht, veraltet oder neu serialisiert.`})}),`\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`}),` prüft das 5-Minuten-Replay-Fenster, vergleicht in konstanter Zeit gegen `,_jsx(_components.strong,{children:`jede`}),` `,_jsx(_components.code,{children:`h1`}),`-Signatur im Header — funktioniert damit automatisch während der 24-stündigen Rotationsüberlappung — parst anschließend die Payload und gibt das typisierte Event zurück.`]}),`\n`,_jsx(_components.p,{children:`In einem Next.js-Route-Handler (App Router) nutzt du die Variante, die den Raw Body selbst liest:`}),`\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:`// die Prüfung nutzt 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:[`Die Signatur deckt die `,_jsx(_components.strong,{children:`rohen Bytes`}),` ab. Hänge in Express `,_jsx(_components.code,{children:`express.raw({ type: 'application/json' })`}),` an die Webhook-Route — `,_jsx(_components.code,{children:`express.json()`}),` verbraucht den Body, und danach scheitert jede Prüfung. Rufe in Next.js nicht `,_jsx(_components.code,{children:`request.json()`}),` vor `,_jsx(_components.code,{children:`constructEventFromRequest`}),` auf.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Die Zustellung erfolgt `,_jsx(_components.strong,{children:`mindestens einmal`}),`. Dedupliziere über `,_jsx(_components.code,{children:`event.eventId`}),`, bevor du irgendeinen Seiteneffekt ausführst.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`fehlerbehandlung`,children:`Fehlerbehandlung`}),`\n`,_jsxs(_components.p,{children:[`Alles, was das SDK wirft, erbt von `,_jsx(_components.code,{children:`VitoError`}),` und trägt `,_jsx(_components.code,{children:`code`}),`, `,_jsx(_components.code,{children:`status`}),`, `,_jsx(_components.code,{children:`type`}),`, `,_jsx(_components.code,{children:`requestId`}),` und `,_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:`Wann`})]})}),_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:[`Argumente `,_jsx(_components.strong,{children:`vor`}),` dem Absenden einer Anfrage abgelehnt`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VitoConfigurationError`})}),_jsx(_components.td,{children:`—`}),_jsxs(_components.td,{children:[`Fehlender oder fehlerhafter Schlüssel, oder unbrauchbare `,_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:`Die API hat Body oder Parameter abgelehnt`})]}),_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:`Ungültiger oder widerrufener Schlüssel`})]}),_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:`Die Wallet deckt den Betrag nicht (Nutzer oder Inhaber)`})]}),_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:`Fehlender Scope, IP, Bedingungen, Einfrieren, unerlaubter Server oder abgelaufene Mitgliedschaft`})]}),_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:`Nutzer, Transaktion oder Bestätigung nicht gefunden`})]}),_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:`Idempotenzkonflikt oder eine noch laufende Anfrage`})]}),_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:`Das Bestätigungsfenster ist abgelaufen`})]}),_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:[`Rate-Limit erreicht — enthält `,_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:`Fehler auf unserer Seite`})]}),_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`}),` oder `,_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:`Signaturprüfung eines Webhooks fehlgeschlagen`})]})]})]}),`\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:[`Logge immer die `,_jsx(_components.code,{children:`requestId`}),` — genau die braucht der Support, um einen konkreten Aufruf nachzuverfolgen.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`einen-aufruf-abbrechen`,children:`Einen Aufruf abbrechen`}),`\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:[`Ein Abbruch stoppt auch einen anstehenden Retry und wirft `,_jsx(_components.code,{children:`VitoConnectionError`}),` mit dem Code `,_jsx(_components.code,{children:`VITO_SDK_ABORTED`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`einen-nutzer-belasten`,children:`Einen Nutzer belasten`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Dein Schlüssel allein kann das Vito eines Nutzers nicht bewegen.`}),` Jede Belastung erfordert die Freigabe des Nutzers mit seiner Wallet-PIN, auf `,_jsx(_components.code,{children:`vetox.io`}),` — niemals in deiner App und niemals in Discord.`]})}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Deine App ruft POST /v1/deduct auf`,children:_jsxs(_components.p,{children:[`Mit dem Nutzer, dem Betrag, der auslösenden `,_jsx(_components.code,{children:`guildId`}),` und den Artikeldetails.`]})}),_jsx(Step,{title:`Vito liefert eine confirmUrl`,children:_jsxs(_components.p,{children:[`Eine ausstehende Bestätigung, `,_jsx(_components.strong,{children:`10 Minuten`}),` gültig. Der Nutzer erhält zusätzlich eine DM.`]})}),_jsx(Step,{title:`Der Nutzer bestätigt mit seiner PIN`,children:_jsxs(_components.p,{children:[`Auf `,_jsx(_components.code,{children:`vetox.io`}),`.`]})}),_jsx(Step,{title:`Vito bucht und benachrichtigt`,children:_jsx(_components.p,{children:`Das Guthaben wird belastet, die Transaktion gespeichert und ein signierter Webhook gesendet, sofern konfiguriert.`})}),_jsx(Step,{title:`Deine App prüft und schließt ab`,children:_jsx(_components.p,{children:`Signatur prüfen, dann den Inhalt freischalten oder den Artikel ausliefern.`})})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Schließe deine Aktion ausschließlich bei `,_jsx(_components.code,{children:`confirmation.completed`}),` ab`]}),` — niemals bei der Antwort von `,_jsx(_components.code,{children:`/deduct`}),`. Zu diesem Zeitpunkt ist die Belastung noch nicht endgültig.`]})}),`\n`,_jsxs(Heading,{level:`3`,id:`request-parameter-—-/v1/deduct`,children:[`Request-Parameter — `,_jsx(_components.code,{children:`/v1/deduct`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Feld`}),_jsx(_components.th,{children:`Erforderlich`}),_jsx(_components.th,{children:`Hinweise`})]})}),_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:`Die Discord-ID des Nutzers — ein Snowflake mit 17–20 Ziffern`})]}),_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:`Positive Ganzzahl`})]}),_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:`Der Discord-Server, von dem die Belastung ausgeht. Jede Belastung muss von einem Server kommen`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reason`})}),_jsx(_components.td,{children:`Nein`}),_jsx(_components.td,{children:`Bis zu 256 Zeichen. Wird dem Nutzer angezeigt und im Webhook zurückgegeben`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`merchantRef`})}),_jsx(_components.td,{children:`Nein`}),_jsx(_components.td,{children:`Deine eigene Referenz, bis zu 128 Zeichen. Damit ordnest du den Webhook deinen Datensätzen zu`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`product`})}),_jsx(_components.td,{children:`Nein`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`{ type, name, description?, imageUrl? }`}),` — erscheint auf der Bestätigungsseite und in der DM`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`imageUrl`})}),_jsx(_components.td,{children:`Nein`}),_jsxs(_components.td,{children:[`Muss `,_jsx(_components.code,{children:`https://`}),` sein`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`metadata`})}),_jsx(_components.td,{children:`Nein`}),_jsxs(_components.td,{children:[`Bis zu `,_jsx(_components.strong,{children:`10`}),` String-Schlüssel/Wert-Paare, unverändert durchgereicht`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`einem-nutzer-gutschreiben-2`,children:`Einem Nutzer gutschreiben`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`POST /v1/add`}),` schreibt einem Nutzer Vito `,_jsx(_components.strong,{children:`aus deinem eigenen Guthaben`}),` gut — für Belohnungen oder Erstattungen. Dieselben Felder wie `,_jsx(_components.code,{children:`/deduct`}),`, außer `,_jsx(_components.code,{children:`guildId`}),` und `,_jsx(_components.code,{children:`product`}),`.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Anders als eine Belastung hat eine Gutschrift `,_jsx(_components.strong,{children:`keinen Bestätigungsschritt`}),` — sie wird sofort gebucht. Erfordert den Scope `,_jsx(_components.code,{children:`credit:create`}),` und ausreichendes Guthaben, sonst antwortet der Aufruf mit `,_jsxs(_components.strong,{children:[`402 `,_jsx(_components.code,{children:`VITO_INSUFFICIENT_OWNER_FUNDS`})]}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`gebühren`,children:`Gebühren`}),`\n`,_jsxs(_components.p,{children:[`Jede Belastung wird an dich ausgezahlt, abzüglich der Plattformgebühr — nach demselben Schema wie In-App-Vito-Transfers, basierend auf `,_jsx(_components.strong,{children:`deiner`}),` Mitgliedschaftsstufe:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Deine Mitgliedschaft`}),_jsx(_components.th,{children:`Gebühr`})]})}),_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:[`Beträge von `,_jsx(_components.strong,{children:`5 Vito oder weniger sind gebührenfrei`}),`, und Gutschriften über `,_jsx(_components.code,{children:`/v1/add`}),` sind immer gebührenfrei.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`webhooks`,children:`Webhooks`}),`\n`,_jsxs(_components.p,{children:[`Trage im Tab „Settings“ eine oder mehrere `,_jsx(_components.code,{children:`https`}),`-Callback-URLs ein. Vito sendet ein signiertes `,_jsx(_components.code,{children:`POST`}),`, sobald eine Bestätigung einen Endzustand erreicht.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Webhooks werden nur ausgeliefert, wenn dein Projekt `,_jsx(_components.strong,{children:`sowohl`}),` eine Callback-URL `,_jsx(_components.strong,{children:`als auch`}),` ein Signing Secret hat. Decke das Secret (`,_jsx(_components.code,{children:`whsec_…`}),`) einmalig im Tab „API Keys“ auf.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`signatur-prüfen`,children:`Signatur prüfen`}),`\n`,_jsxs(_components.p,{children:[`Jede Auslieferung trägt einen `,_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:[`Zwei weitere Header begleiten jede Auslieferung — nutze `,_jsx(_components.code,{children:`X-Vito-Event-Id`}),` als Deduplizierungsschlüssel, denn ein Retry sendet dieselbe ID erneut:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Header`}),_jsx(_components.th,{children:`Enthält`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`X-Vito-Event-Id`})}),_jsx(_components.td,{children:`Stabile ID für dieses Event — über Retries hinweg identisch`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`X-Vito-Event-Type`})}),_jsxs(_components.td,{children:[`z. B. `,_jsx(_components.code,{children:`confirmation.completed`})]})]})]})]}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Während einer Signing-Secret-Rotation enthält der Header mehr als eine Signatur`}),`, die neueste zuerst:`]}),_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=\u003cneu>;h1=\u003calt>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsxs(_components.p,{children:[`Akzeptiere die Auslieferung, wenn `,_jsx(_components.strong,{children:`irgendein`}),` `,_jsx(_components.code,{children:`h1`}),` passt. Ein Verifier, der nur den ersten liest, lehnt jeden Webhook ab, bis er das neue Secret ausgerollt hat — was den Sinn der 24-Stunden-Überlappung zunichtemacht.`]})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Unter Node.js: `,_jsx(_components.code,{children:`Webhooks.constructEvent`}),` aus `,_jsx(_components.a,{href:`https://www.npmjs.com/package/@vetox-bot/vito`,children:_jsx(_components.code,{children:`@vetox-bot/vito`})}),` erledigt all das für dich — das Replay-Fenster, den Abgleich mit `,_jsx(_components.strong,{children:`jeder`}),` `,_jsx(_components.code,{children:`h1`}),`-Signatur und den Vergleich in konstanter Zeit — und liefert das typisierte Event zurück. Der Code unten ist für eine eigene Implementierung oder eine andere Sprache.`]})}),`\n`,_jsxs(_components.p,{children:[`Berechne den HMAC über `,_jsx(_components.code,{children:`\u003cts>:\u003crawBody>`}),` mit deinem Signing Secret neu und vergleiche in konstanter Zeit.`]}),`\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:[`Prüfe gegen den `,_jsx(_components.strong,{children:`Raw Body`}),`, bevor JSON-Parsing oder Middleware ihn umschreibt.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`events`,children:`Events`}),`\n`,_jsxs(_components.p,{children:[`Fünf Event-Typen, alle mit derselben Payload-Struktur. `,_jsx(_components.code,{children:`data.status`}),` trägt das Ergebnis.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Event`}),_jsx(_components.th,{children:`Bedeutung`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`confirmation.completed`})}),_jsxs(_components.td,{children:[`Bestätigt und belastet. Enthält `,_jsx(_components.code,{children:`transactionId`}),`. `,_jsx(_components.strong,{children:`Hier deine Aktion abschließen`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`confirmation.failed`})}),_jsxs(_components.td,{children:[`Nicht abschließbar — zu wenig Guthaben oder interner Fehler. Enthält `,_jsx(_components.code,{children:`failureReason`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`confirmation.expired`})}),_jsx(_components.td,{children:`Nicht innerhalb von 10 Minuten bestätigt. Kein Vito bewegt`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`confirmation.cancelled`})}),_jsx(_components.td,{children:`Vom Nutzer abgebrochen. Kein Vito bewegt`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`credit.completed`})}),_jsxs(_components.td,{children:[`Eine vom Inhaber finanzierte `,_jsx(_components.code,{children:`/add`}),`-Gutschrift wurde gebucht. Sofort ausgelöst — ohne Bestätigungsschritt`]})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Webhooks werden `,_jsx(_components.strong,{children:`5-mal mit Backoff`}),` wiederholt. Bestätige schnell mit 2xx und erledige deine Auslieferung asynchron.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`fehlercodes`,children:`Fehlercodes`}),`\n`,_jsxs(_components.p,{children:[`Jede Antwort ist in einen Envelope verpackt. Ein Erfolg trägt `,_jsx(_components.code,{children:`data`}),`, ein Fehler `,_jsx(_components.code,{children:`error`}),` — nie beides:`]}),`\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:[`Jeder Code beginnt mit `,_jsx(_components.code,{children:`VITO_`}),`.`]}),` Vergleiche den vollständigen String — ein blankes `,_jsx(_components.code,{children:`RATE_LIMITED`}),` oder `,_jsx(_components.code,{children:`FORBIDDEN`}),` erscheint nie auf der Leitung.`]})}),`\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:`Bedeutung`})]})}),_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:`Ein Feld fehlt oder ist fehlerhaft`})]}),_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`}),` ist keine positive Ganzzahl`]})]}),_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:`Über deinem Limit pro Transaktion`})]}),_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:`Dieser Aufruf würde dein Tageslimit sprengen`})]}),_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:`Sender und Empfänger sind derselbe Nutzer`})]}),_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:`Fehlender, fehlerhafter, widerrufener oder unbekannter Schlüssel`})]}),_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:`Der Nutzer kann die Belastung nicht decken`})]}),_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:`Dein`}),` Guthaben reicht nicht für ein `,_jsx(_components.code,{children:`/add`})]})]}),_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:`Dem Schlüssel fehlt der nötige 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:`Die aufrufende IP steht nicht auf der 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:`Die Mitgliedschaft des Inhabers ist abgelaufen — eingefroren bis zur Erneuerung`})]}),_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`}),` steht nicht auf der Server-Allowlist des Projekts`]})]}),_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:`Entwicklerbedingungen nicht akzeptiert oder eine neuere Version steht aus`})]}),_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:`Eingefroren — meist eine abgelaufene Mitgliedschaft des Inhabers`})]}),_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:`Vom Vetox-Team gesperrt`})]}),_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:`Vom Vetox-Team gebannt`})]}),_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:`Der Nutzer ist von Vito-Vorgängen ausgeschlossen`})]}),_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:`Die Wallet des Nutzers ist nach fehlgeschlagenen PIN-Versuchen gesperrt`})]}),_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:`Kein Vito-Konto für diese 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:`Unbekanntes Bestätigungs-Token`})]}),_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:[`Gleicher `,_jsx(_components.code,{children:`Idempotency-Key`}),`, anderer 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:`Eine identische Anfrage läuft noch — kurz darauf erneut versuchen`})]}),_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:`Diese Bestätigung hat bereits einen Endzustand erreicht`})]}),_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:`Eine Rotation läuft bereits`})]}),_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:`Das 10-Minuten-Fenster ist abgelaufen`})]}),_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:`Zurückfahren und erneut versuchen`})]}),_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:`Unerwarteter Fehler auf unserer Seite`})]})]})]}),`\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:`Mitgliedschaft des Inhabers`}),_jsx(_components.th,{children:`Pro Minute`}),_jsx(_components.th,{children:`Pro Stunde`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Keine`}),_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 oder 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 oder Diamond`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`600`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`15.000`})]})]})]}),`\n`,_jsx(_components.p,{children:`Zusätzlich gilt ein Limit pro IP in Höhe der halben Minutenquote, mindestens jedoch 30.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Unter Last `,_jsx(_components.strong,{children:`scheitern Schreib-Endpunkte geschlossen`}),` — eine Belastung wird abgelehnt, statt ein Double-Spend zu riskieren. Lesende Endpunkte scheitern offen. Behandle eine abgelehnte Schreiboperation als „nicht passiert“ und wiederhole sie.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Sende einen `,_jsx(_components.code,{children:`Idempotency-Key`}),`-Header, um Retries sicher zu deduplizieren.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`endpunkte`,children:`Endpunkte`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Endpunkt`}),_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:`beliebig`}),_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:`beliebig`}),_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`}),` und `,_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:`grenzwerte`,children:`Grenzwerte`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Bestätigungen verfallen nach `,_jsx(_components.strong,{children:`10 Minuten`}),` — behandle unbestätigte Anfragen als abgebrochen`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`amount`}),` muss eine positive Ganzzahl sein`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`metadata`}),` ist auf 10 Schlüssel begrenzt`]}),`\n`,_jsx(_components.li,{children:`Limits pro Transaktion und pro Tag legt das Vetox-Team fest; sie erscheinen schreibgeschützt im Tab „Settings“`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`sicherheits-checkliste`,children:`Sicherheits-Checkliste`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Secrets serverseitig halten`,icon:`lock`,id:`secrets-serverseitig-halten`,children:_jsx(_components.p,{children:`API-Schlüssel und Signing Secret gehören niemals in Client-Code. Bei einem Leak sofort rotieren.`})}),_jsx(Accordion,{title:`Jeden Webhook prüfen`,icon:`signature`,id:`jeden-webhook-pruefen`,children:_jsx(_components.p,{children:`Signatur gegen den Raw Body prüfen und Auslieferungen älter als ~5 Minuten ablehnen.`})}),_jsx(Accordion,{title:`Nur bei completed abschließen`,icon:`circle-check`,id:`nur-bei-completed-abschliessen`,children:_jsxs(_components.p,{children:[`Niemals auf die `,_jsx(_components.code,{children:`/deduct`}),`-Antwort hin ausliefern — die Belastung ist erst mit `,_jsx(_components.code,{children:`confirmation.completed`}),` endgültig.`]})}),_jsx(Accordion,{title:`Least Privilege`,icon:`key`,id:`least-privilege`,children:_jsx(_components.p,{children:`Fordere nur die Scopes an, die du wirklich nutzt, und aktiviere die IP-Allowlist.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`fehlerbehebung`,children:`Fehlerbehebung`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Jeder Aufruf liefert „nicht autorisiert“`,id:`jeder-aufruf-liefert-nicht-autorisiert`,children:_jsx(_components.p,{children:`Die Mitgliedschaft des Inhabers ist abgelaufen. Sie wird bei jedem Aufruf erneut geprüft.`})}),_jsx(Accordion,{title:`Ich habe meinen Schlüssel verloren`,id:`ich-habe-meinen-schluessel-verloren`,children:_jsx(_components.p,{children:`Er lässt sich nicht wiederherstellen — gespeichert wird nur ein Hash. Rotiere für einen neuen.`})}),_jsx(Accordion,{title:`Webhook-Signaturen scheitern nach der Rotation`,id:`webhook-signaturen-scheitern-nach-der-rotation`,children:_jsx(_components.p,{children:`Akzeptiere während der 24-stündigen Überlappung beide Secrets.`})}),_jsx(Accordion,{title:`Eine Belastung wird nie abgeschlossen`,id:`eine-belastung-wird-nie-abgeschlossen`,children:_jsx(_components.p,{children:`Der Nutzer hat sie nicht freigegeben. Bestätigungen verfallen nach 10 Minuten.`})}),_jsx(Accordion,{title:`Es kommen keine Webhooks an`,id:`es-kommen-keine-webhooks-an`,children:_jsx(_components.p,{children:`Ein Projekt braucht Callback-URL und Signing Secret. Mit nur einem von beiden wird nichts ausgeliefert.`})}),_jsx(Accordion,{title:`Es kam weniger Vito an, als ich belastet habe`,id:`es-kam-weniger-vito-an-als-ich-belastet-habe`,children:_jsx(_components.p,{children:`Das ist die Abrechnungsgebühr. Nutze Beträge von 5 Vito oder weniger, um sie zu vermeiden, oder kalkuliere sie ein.`})}),_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`}),` wird aus deinem eigenen Guthaben finanziert, nicht aus dem Nichts erzeugt. Lade auf.`]})})]}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Vito`,icon:`coins`,href:`/de/members/vito`,children:_jsx(_components.p,{children:`Guthaben, PIN und Gebühren.`})}),_jsx(Card,{title:`Zahlungsanfragen`,icon:`receipt`,href:`/de/account/payment-requests`,children:_jsx(_components.p,{children:`Was der Nutzer sieht, wenn du ihn belastest.`})}),_jsx(Card,{title:`@vetox-bot/vito auf npm`,icon:`npm`,href:`https://www.npmjs.com/package/@vetox-bot/vito`,children:_jsx(_components.p,{children:`Das offizielle Node.js-Paket — eine Installation, volle Integration.`})})]})]})}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 und Käufe","sidebarTitle":"Vito-API","description":"Erlaube geprüften Apps, dein Vito mit PIN-Bestätigung zu belasten, und verwalte Zahlungsanfragen auf deiner Käufe-Seite.","icon":"code","keywords":["vito api","purchases","payment requests","developer","api key","merchant"],"href":"/de/members/vito-api"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Zugang erhalten","slug":"zugang-erhalten","depth":2,"children":[{"title":"Scopes","slug":"scopes","depth":3,"children":[]}]},{"title":"Authentifizierung","slug":"authentifizierung","depth":2,"children":[{"title":"Schlüssel, Rotation und Speicherung","slug":"schlüssel-rotation-und-speicherung","depth":3,"children":[]}]},{"title":"Offizielles Node.js-SDK","slug":"offizielles-node-js-sdk","depth":2,"children":[{"title":"Installation","slug":"installation","depth":3,"children":[]},{"title":"Initialisierung","slug":"initialisierung","depth":3,"children":[]},{"title":"Client-Optionen","slug":"client-optionen","depth":4,"children":[]},{"title":"Verfügbare Methoden","slug":"verfügbare-methoden","depth":3,"children":[]},{"title":"Anwendungsbeispiele","slug":"anwendungsbeispiele","depth":3,"children":[]},{"title":"Schlüssel beim Start prüfen","slug":"schlüssel-beim-start-prüfen","depth":4,"children":[]},{"title":"Guthaben lesen","slug":"guthaben-lesen","depth":4,"children":[]},{"title":"Einen Nutzer belasten (Artikel verkaufen)","slug":"einen-nutzer-belasten-artikel-verkaufen","depth":4,"children":[]},{"title":"Einem Nutzer gutschreiben","slug":"einem-nutzer-gutschreiben","depth":4,"children":[]},{"title":"Transaktionen durchblättern","slug":"transaktionen-durchblättern","depth":4,"children":[]},{"title":"Idempotenz und Retries","slug":"idempotenz-und-retries","depth":3,"children":[]},{"title":"Webhooks mit dem SDK prüfen","slug":"webhooks-mit-dem-sdk-prüfen","depth":3,"children":[]},{"title":"Fehlerbehandlung","slug":"fehlerbehandlung","depth":3,"children":[]},{"title":"Einen Aufruf abbrechen","slug":"einen-aufruf-abbrechen","depth":3,"children":[]}]},{"title":"Einen Nutzer belasten","slug":"einen-nutzer-belasten","depth":2,"children":[{"title":"Request-Parameter — /v1/deduct","slug":"request-parameter-—-/v1/deduct","depth":3,"children":[]}]},{"title":"Einem Nutzer gutschreiben","slug":"einem-nutzer-gutschreiben-2","depth":2,"children":[]},{"title":"Gebühren","slug":"gebühren","depth":2,"children":[]},{"title":"Webhooks","slug":"webhooks","depth":2,"children":[{"title":"Signatur prüfen","slug":"signatur-prüfen","depth":3,"children":[]},{"title":"Events","slug":"events","depth":3,"children":[]}]},{"title":"Fehlercodes","slug":"fehlercodes","depth":2,"children":[]},{"title":"Rate-Limits","slug":"rate-limits","depth":2,"children":[]},{"title":"Endpunkte","slug":"endpunkte","depth":2,"children":[]},{"title":"Grenzwerte","slug":"grenzwerte","depth":2,"children":[]},{"title":"Sicherheits-Checkliste","slug":"sicherheits-checkliste","depth":2,"children":[]},{"title":"Fehlerbehebung","slug":"fehlerbehebung","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"vetox-ec2a2bcb","siteName":"Vetox","title":"Vito-API und Käufe - 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":0},"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":1},"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.404Z","originalFileLocation":"de/members/vito-api.mdx","locale":"de"},"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=\"Erlaube geprüften Apps, dein Vito mit PIN-Bestätigung zu belasten, und verwalte Zahlungsanfragen auf deiner Käufe-Seite.\">\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 und Käufe - Vetox\">\u003cmeta data-mint-head property=\"og:description\" content=\"Erlaube geprüften Apps, dein Vito mit PIN-Bestätigung zu belasten, und verwalte Zahlungsanfragen auf deiner Käufe-Seite.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Vetox\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.vetox.io/de/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 und Käufe - Vetox\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Erlaube geprüften Apps, dein Vito mit PIN-Bestätigung zu belasten, und verwalte Zahlungsanfragen auf deiner Käufe-Seite.\">\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/de/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=\"/de/members/vito-api.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"de\" href=\"https://docs.vetox.io/de/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=\"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=\"nl\" href=\"https://docs.vetox.io/nl/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/de/members/vito-api#webpage\",\"url\":\"https://docs.vetox.io/de/members/vito-api\",\"name\":\"Vito-API und Käufe\",\"description\":\"Erlaube geprüften Apps, dein Vito mit PIN-Bestätigung zu belasten, und verwalte Zahlungsanfragen auf deiner Käufe-Seite.\",\"dateModified\":\"2026-09-09T05:22:47.404Z\",\"isPartOf\":{\"@id\":\"https://docs.vetox.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.vetox.io/de/members/vito-api#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.vetox.io/de/members/vito-api#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Vito\",\"item\":\"https://docs.vetox.io/de/members/vito\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vito-API und Käufe\",\"item\":\"https://docs.vetox.io/de/members/vito-api\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.vetox.io/de/members/vito-api#article\",\"headline\":\"Vito-API und Käufe\",\"name\":\"Vito-API und Käufe\",\"description\":\"Erlaube geprüften Apps, dein Vito mit PIN-Bestätigung zu belasten, und verwalte Zahlungsanfragen auf deiner Käufe-Seite.\",\"url\":\"https://docs.vetox.io/de/members/vito-api\",\"mainEntityOfPage\":{\"@id\":\"https://docs.vetox.io/de/members/vito-api#webpage\"},\"image\":\"https://vetox.io/brand/vetox-header-04.png\",\"dateModified\":\"2026-09-09T05:22:47.404Z\",\"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","tabs":[{"tab":"Dokumentation","pages":[{"title":"Dokumentation","href":"/de"}]},{"tab":"Server-Dashboard","pages":[{"title":"Server-Dashboard","href":"/de/server-management/overview"}]},{"tab":"Dein Konto","groups":[{"group":"Hauptbereich","icon":"house","pages":[{"title":"Übersicht","sidebarTitle":"Übersicht","icon":"house","href":"/de/account/overview"},{"title":"Mein Battle Pass","sidebarTitle":"Mein Battle Pass","icon":"medal","href":"/de/account/my-battle-pass"},{"title":"Tägliche Belohnung","sidebarTitle":"Tägliche Belohnung","icon":"calendar-check","href":"/de/members/daily-reward"},{"title":"Öffentliches Profil","sidebarTitle":"Öffentliches Profil","icon":"id-card","href":"/de/members/profile"},{"title":"Mitgliedschaftsseite","sidebarTitle":"Mitgliedschaft","icon":"user","href":"/de/account/membership-page"},{"title":"Premium und Bots verwalten","sidebarTitle":"Bots verwalten","icon":"robot","href":"/de/account/manage-bots"},{"title":"Reputation","sidebarTitle":"Reputation","icon":"thumbs-up","href":"/de/members/reputation"},{"title":"Abstimmen","sidebarTitle":"Abstimmen","icon":"thumbs-up","href":"/de/members/voting"}]},{"group":"Dienstprogramme","icon":"palette","pages":[{"title":"Profil-Anpassung","sidebarTitle":"Profil-Anpassung","icon":"image","href":"/de/members/profile-customization"},{"title":"Rang-Anpassung","sidebarTitle":"Rang-Anpassung","icon":"gauge","href":"/de/members/rank-customization"},{"title":"Namens-Anpassung","sidebarTitle":"Namens-Anpassung","icon":"font","href":"/de/members/name-customization"},{"title":"Abzeichen","sidebarTitle":"Abzeichen","icon":"certificate","href":"/de/members/badges"},{"title":"Meine Backups","icon":"box-archive","sidebarTitle":"Meine Backups","href":"/de/members/my-backups"}]},{"group":"Vito","icon":"coins","pages":[{"title":"Vito","sidebarTitle":"Vito","icon":"coins","href":"/de/members/vito"},{"title":"Vito-Transaktionen","sidebarTitle":"Vito-Transaktionen","icon":"receipt","href":"/de/account/vito-transactions"},{"title":"Zahlungsanfragen","sidebarTitle":"Zahlungsanfragen","description":"Überprüfe, genehmige oder storniere Vito-Abbuchungen, die von verbundenen Apps angefordert werden — und das 10-Minuten-Fenster, in dem sie laufen.","icon":"file-invoice","href":"/de/account/payment-requests"},{"title":"Vito-API und Käufe","sidebarTitle":"Vito-API","icon":"code","href":"/de/members/vito-api"}]},{"group":"Bestenliste","icon":"ranking-star","pages":[{"title":"Bestenlisten","sidebarTitle":"Bestenlisten","description":"Globale Ranglisten für Vito, XP und Reputation — die Top 100 pro Kategorie, zweimal täglich aktualisiert.","icon":"ranking-star","href":"/de/members/leaderboards"},{"title":"Reichste Benutzer","sidebarTitle":"Reichste Benutzer","icon":"coins","href":"/de/account/richest-users"},{"title":"Tastaturmakler","sidebarTitle":"Tastaturmakler","icon":"chart-line","href":"/de/account/keyboard-brokers"},{"title":"Am beliebtesten","sidebarTitle":"Am beliebtesten","icon":"thumbs-up","href":"/de/account/most-liked"}]}]},{"tab":"Befehle","pages":[{"title":"Befehle","href":"/de/commands/overview"}]},{"tab":"Hilfe","pages":[{"title":"Hilfe","href":"/de/help/faq"}]}]},{"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","pages":[{"title":"nl","href":"/nl/members/vito-api"}]},{"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 und Käufe - Vetox","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":[],"chunks":[]}