Autorisez les applications approuvées à prélever vos Vito avec confirmation par PIN, et gérez les demandes de paiement depuis votre page Achats.
Nécessite un abonnement Silver ou supérieur — à la fois pour postuler et pour chaque appel authentifié. Si l’abonnement du détenteur de la clé expire, le projet est gelé jusqu’à son renouvellement.
Une API REST qui permet à votre application de manipuler le solde Vito d’un utilisateur depuis Discord : le lire, le débiter, le créditer ou le déplacer entre utilisateurs. Tous les endpoints renvoient du JSON et sont versionnés sous /v1.
Les Vito ne se convertissent jamais en argent réel, ni l’inverse. Ils circulent uniquement entre les soldes Vetox.
Tous les endpoints se trouvent sous https://api.vetox.io/public/vito.Les chemins écrits dans cette page — /v1/deduct, /v1/balance/:discordId et les autres — sont relatifs à ce préfixe, que le SDK ajoute pour vous. Si vous appelez directement, utilisez l’URL complète :
https://api.vetox.io/public/vito/v1/deduct
https://api.vetox.io/v1/deduct n’est pas une route et renvoie 404.
Vous développez en Node.js ? N’écrivez pas les appels REST à la main — utilisez le paquet officiel @vetox-bot/vito. Il couvre les neuf endpoints ainsi que la vérification des webhooks, et gère pour vous l’idempotence et les nouvelles tentatives. Voir SDK Node.js officiel ci-dessous.
Votre clé et votre secret de signature ne sont affichés qu’une seule fois. Après l’approbation, vous disposez d’une fenêtre de 7 jours pour les révéler depuis l’onglet des clés API. Vetox n’en conserve qu’un hachage et ne peut pas les réafficher — si vous manquez la fenêtre, il faut effectuer une rotation.
Gardez-la uniquement côté serveur — quiconque la détient peut débiter vos utilisateurs
Effectuez la rotation depuis l’onglet des clés API. La clé précédente reste valable pendant un délai de grâce de 24 heures, ce qui permet de déployer sans interruption
Le secret de signature des webhooks se renouvelle séparément, avec son propre chevauchement de 24 heures
En cas de fuite, effectuez immédiatement une rotation
Le paquet officiel @vetox-bot/vito encapsule les neuf endpoints ainsi que la vérification des webhooks. Il gère pour vous l’en-tête Idempotency-Key, les nouvelles tentatives avec temporisation croissante, les délais d’attente et la classification des erreurs.
Nécessite Node.js 20 ou plus récent. Le paquet n’a aucune dépendance d’exécution — il utilise le fetch intégré et node:crypto — et est livré en ESM et en CommonJS, avec des définitions TypeScript complètes.
import { VitoClient } from '@vetox-bot/vito';const vito = new VitoClient({ apiKey: process.env.VITO_API_KEY });
Si vous omettez apiKey, le SDK lit VITO_API_KEY dans l’environnement. Le format de la clé est validé à la construction : une clé mal formée échoue immédiatement au lieu de vous coûter un aller-retour réseau et un 401.
La clé déplace de l’argent — gardez-la toujours côté serveur, jamais dans un bundle client ni dans un navigateur. console.log(vito) affiche [redacted] à la place de la clé, et le SDK refuse toute baseUrl en http:// pour un hôte non local, afin que la clé ne circule pas en clair.
Chaque méthode renvoie directement le champ data déjà déballé — vous n’avez jamais à extraire success ni data vous-même. Toutes acceptent en plus des options par appel : { timeoutMs, maxRetries, signal, headers }, et les méthodes d’écriture acceptent également { idempotencyKey }.
const wallet = await vito.balance.retrieve('123456789012345678');if (!wallet.hasPin) { // Pas encore de code PIN de portefeuille : aucun débit ne peut être confirmé.}
Enregistrez la commande comme en attente, rien de plus. Le débit n’a pas encore eu lieu : livrez sur le webhook confirmation.completed, pas sur cette réponse.
const credit = await vito.payments.credit( { discordId: '123456789012345678', amount: 250, reason: 'Remboursement de la commande order_10423', merchantRef: 'refund_10423', }, // Dériver la clé de votre propre enregistrement rend l'opération rejouable depuis // une file de tâches : une répétition renvoie le résultat d'origine au lieu de // payer une seconde fois. { idempotencyKey: 'refund_10423' },);console.log(credit.transactionId, credit.ownerBalance, credit.recipientBalance);
const since = Date.now() - 24 * 60 * 60 * 1000;// Un générateur asynchrone qui récupère les pages à la demande — sans boucle manuelle.for await (const tx of vito.transactions.iterate({ limit: 100 })) { if (tx.date < since) break; // les plus récentes d'abord // tx.type est le sens par rapport à tx.discordId : 1 = entrée, 0 = sortie.}
Le SDK envoie un en-tête Idempotency-Key sur chaque écriture (deduct, credit, transfer). Si vous n’en fournissez pas, il la génère une seule fois par appel et rejoue exactement la même clé à chaque nouvelle tentative : une nouvelle tentative ne peut donc jamais régler l’opération deux fois.Fournissez votre propre clé lorsque la même opération logique peut être relancée depuis un nouveau processus — un exécuteur de tâches, une relivraison de file d’attente ou un balayage planifié :
Pannes réseau, délais dépassés, 408, 429, 5xx et 409 VITO_IDEMPOTENCY_IN_PROGRESS
Jamais réessayé
409 VITO_IDEMPOTENCY_CONFLICT, toutes les autres erreurs 4xx et auth.rotateKey()
auth.rotateKey() est exclu délibérément — une nouvelle tentative y génère une seconde clé et invalide celle renvoyée par la première.
Si Retry-After dépasse maxRetryDelayMs (votre quota horaire est réellement épuisé), le SDK lève immédiatement VitoRateLimitError au lieu de dormir pendant tout votre budget de requête.
import { Webhooks, VitoSignatureVerificationError } from '@vetox-bot/vito';try { const event = Webhooks.constructEvent({ payload: rawRequestBody, // le corps brut — voir l'avertissement ci-dessous signature: req.header('x-vito-signature') ?? '', secret: process.env.VITO_WEBHOOK_SECRET, }); if (event.eventType === 'confirmation.completed') { // Le type de data est affiné automatiquement selon eventType. await fulfil(event.data.merchantRef); }} catch (error) { if (error instanceof VitoSignatureVerificationError) { // Rejetez la livraison avec un 400 : falsifiée, périmée ou corps ré-encodé. }}
constructEvent contrôle la fenêtre de rejeu de 5 minutes, compare en temps constant avec chaque signature h1 de l’en-tête — il fonctionne donc automatiquement pendant le chevauchement de 24 heures d’une rotation — puis analyse la charge utile et renvoie l’événement typé.Dans un gestionnaire de route Next.js (App Router), utilisez la variante qui lit elle-même le corps brut :
La signature couvre les octets bruts. Avec Express, montez express.raw({ type: 'application/json' }) sur la route du webhook — express.json() consomme le corps et toute vérification échoue ensuite. Avec Next.js, n’appelez pas request.json() avant constructEventFromRequest.
La livraison se fait au moins une fois. Dédupliquez sur event.eventId avant d’exécuter le moindre effet de bord.
Votre clé seule ne peut pas déplacer les Vito d’un utilisateur. Chaque débit exige que l’utilisateur l’approuve avec le code PIN de son portefeuille, sur vetox.io — jamais dans votre application ni dans Discord.
1
Votre application appelle POST /v1/deduct
Avec l’utilisateur, le montant, le guildId d’origine et les détails de l’article.
2
Vito renvoie une confirmUrl
Une confirmation en attente, valable 10 minutes. L’utilisateur reçoit également un MP.
3
L'utilisateur approuve avec son code PIN
Sur vetox.io.
4
Vito règle et notifie
Le solde est débité, la transaction enregistrée, et un webhook signé est envoyé si vous en avez configuré un.
5
Votre application vérifie et finalise
Vérifiez la signature, puis débloquez le contenu ou livrez l’article.
Ne finalisez votre action que sur confirmation.completed — jamais sur la réponse de /deduct. À ce stade, le débit n’est pas définitif.
POST /v1/add crédite des Vito à un utilisateur depuis votre propre solde — pour des récompenses ou des remboursements. Mêmes champs que /deduct, sauf guildId et product.
Contrairement à un débit, un crédit n’a pas d’étape de confirmation : il est réglé immédiatement. Nécessite le scope credit:create et un solde suffisant, sinon l’appel renvoie 402 VITO_INSUFFICIENT_OWNER_FUNDS.
Chaque débit vous est reversé après déduction des frais de la plateforme — selon le même barème que les transferts Vito dans l’application, en fonction de votre niveau d’abonnement :
Votre abonnement
Frais
Normal, Silver, Gold
7 %
Platinum
6 %
Diamond
5 %
Les montants de 5 Vito ou moins sont sans frais, et les crédits via /v1/add le sont toujours.
Ajoutez une ou plusieurs URL de rappel https dans l’onglet des paramètres. Vito envoie un POST signé dès qu’une confirmation atteint un état final.
Les webhooks ne partent que si votre projet possède à la fois une URL de rappel et un secret de signature. Révélez le secret (whsec_…) une seule fois depuis l’onglet des clés API.
Chaque livraison porte un en-tête X-Vito-Signature :
X-Vito-Signature: ts=<unix>;h1=<hex>
Deux autres en-têtes accompagnent chaque livraison — utilisez X-Vito-Event-Id comme clé de déduplication, car une nouvelle tentative renvoie le même identifiant :
En-tête
Contient
X-Vito-Event-Id
Identifiant stable de cet événement — identique d’une tentative à l’autre
X-Vito-Event-Type
Par exemple confirmation.completed
Pendant une rotation du secret de signature, l’en-tête porte plusieurs signatures, la plus récente en premier :
Acceptez la livraison si l’un quelconque des h1 correspond. Un vérificateur qui ne lit que le premier rejettera tous les webhooks tant qu’il n’aura pas déployé le nouveau secret — ce qui annule tout l’intérêt du chevauchement de 24 heures.
Sous Node.js : Webhooks.constructEvent de @vetox-bot/vito fait tout cela pour vous — la fenêtre de rejeu, la comparaison avec chaque signature h1 et le contrôle en temps constant — et renvoie l’événement typé. Le code ci-dessous sert à une implémentation manuelle ou à un autre langage.
Recalculez le HMAC sur <ts>:<rawBody> avec votre secret de signature et comparez en temps constant.
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) ); });}
Vérifiez sur le corps brut, avant tout parsing JSON ou middleware susceptible de le réécrire.
Il existe aussi une limite par IP égale à la moitié de votre quota par minute, avec un plancher de 30.
En charge, les endpoints d’écriture échouent en mode fermé — un débit est rejeté plutôt que de risquer une double dépense. Les lectures échouent en mode ouvert. Traitez une écriture rejetée comme « n’a pas eu lieu » et réessayez.
Envoyez un en-tête Idempotency-Key pour dédupliquer les nouvelles tentatives en toute sécurité.
La clé API et le secret de signature n’ont jamais leur place dans du code client. En cas de fuite de l’un ou l’autre, effectuez immédiatement une rotation.
Vérifiez chaque webhook
Contrôlez la signature sur le corps brut et rejetez les livraisons datant de plus de ~5 minutes.
Ne réglez que sur completed
Ne livrez jamais sur la seule réponse de /deduct — le débit n’est définitif qu’avec confirmation.completed.
Moindre privilège
Ne demandez que les scopes réellement utilisés et activez la liste d’IP autorisées.
L’abonnement du détenteur a expiré. Il est revérifié à chaque appel.
J'ai perdu ma clé
Elle est irrécupérable — seul un hachage est stocké. Effectuez une rotation pour en obtenir une nouvelle.
Les signatures de webhook échouent après une rotation
Acceptez les deux secrets pendant le chevauchement de 24 heures.
Un débit ne se finalise jamais
L’utilisateur ne l’a pas approuvé. Les confirmations expirent au bout de 10 minutes.
Aucun webhook n'arrive
Un projet a besoin d’une URL de rappel et d’un secret de signature. Avec un seul des deux, rien n’est livré.
J'ai reçu moins de Vito que ce que j'ai débité
Ce sont les frais de règlement. Utilisez des montants de 5 Vito ou moins pour les éviter, ou intégrez-les à votre prix.
402 VITO_INSUFFICIENT_OWNER_FUNDS
/v1/add est financé sur votre propre solde, il n’est pas créé à partir de rien. Rechargez.
Vito
Soldes, code PIN et frais.
Demandes de paiement
Ce que voit l’utilisateur quand vous le débitez.
@vetox-bot/vito sur npm
Le paquet Node.js officiel — une installation, une intégration complète.
{"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":"fr/members/vito-api","slug":"/fr/members/vito-api","pageMetadata":{"title":"Vito API et achats","sidebarTitle":"Vito API","description":"Autorisez les applications approuvées à prélever vos Vito avec confirmation par PIN, et gérez les demandes de paiement depuis votre page Achats.","icon":"code","keywords":["vito api","purchases","payment requests","developer","api key","merchant"],"href":"/fr/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: \"Autorisez les applications approuvées à prélever vos Vito avec confirmation par PIN, et gérez les demandes de paiement depuis votre page Achats.\"\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:[`Nécessite un abonnement `,_jsx(_components.strong,{children:`Silver`}),` ou supérieur — à la fois pour postuler et pour chaque appel authentifié. Si l’abonnement du détenteur de la clé expire, le projet est gelé jusqu’à son renouvellement.`]})}),`\n`,_jsxs(_components.p,{children:[`Une API REST qui permet à votre application de manipuler le solde `,_jsx(_components.a,{href:`/fr/members/vito`,children:`Vito`}),` d’un utilisateur depuis Discord : le lire, le débiter, le créditer ou le déplacer entre utilisateurs. Tous les endpoints renvoient du JSON et sont versionnés sous `,_jsx(_components.code,{children:`/v1`}),`.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Les Vito ne se convertissent jamais en argent réel, ni l’inverse.`}),` Ils circulent uniquement entre les soldes Vetox.`]})}),`\n`,_jsxs(Warning,{children:[_jsx(_components.p,{children:_jsxs(_components.strong,{children:[`Tous les endpoints se trouvent sous `,_jsx(_components.code,{children:`https://api.vetox.io/public/vito`}),`.`]})}),_jsxs(_components.p,{children:[`Les chemins écrits dans cette page — `,_jsx(_components.code,{children:`/v1/deduct`}),`, `,_jsx(_components.code,{children:`/v1/balance/:discordId`}),` et les autres — sont relatifs à ce préfixe, que le SDK ajoute pour vous. Si vous appelez directement, utilisez l’URL complète :`]}),_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`}),` n’est pas une route et renvoie 404.`]})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Vous développez en Node.js ? N’écrivez pas les appels REST à la main — utilisez le paquet officiel `,_jsx(_components.a,{href:`https://www.npmjs.com/package/@vetox-bot/vito`,children:_jsx(_components.strong,{children:_jsx(_components.code,{children:`@vetox-bot/vito`})})}),`. Il couvre les neuf endpoints ainsi que la vérification des webhooks, et gère pour vous l’idempotence et les nouvelles tentatives. Voir `,_jsx(_components.strong,{children:`SDK Node.js officiel`}),` ci-dessous.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`obtenir-l’accès`,children:`Obtenir l’accès`}),`\n`,_jsxs(_components.p,{children:[`L’accès est accordé `,_jsx(_components.strong,{children:`par projet`}),`. Les quatre conditions sont requises :`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Un abonnement actif, Silver ou supérieur`,children:_jsx(_components.p,{children:`Vérifié à chaque appel, pas seulement à l’approbation.`})}),_jsx(Step,{title:`Une demande de développeur approuvée`,children:_jsx(_components.p,{children:`Soumise depuis la page Vito API de votre tableau de bord. Examinée manuellement par l’équipe Vetox.`})}),_jsx(Step,{title:`Les conditions développeur de l'API acceptées`,children:_jsx(_components.p,{children:`Validées au moment de soumettre la demande.`})}),_jsx(Step,{title:`Les scopes dont votre projet a besoin`,children:_jsx(_components.p,{children:`Accordés par l’équipe Vetox selon ce que vous avez décrit.`})})]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Soyez précis sur ce que vous construisez et sur la façon dont vous stockerez la clé. Ce sont les demandes vagues qui sont refusées.`})}),`\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:`Autorise`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`balance:read`})}),_jsx(_components.td,{children:`Lire le solde Vito d’un utilisateur`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`deduct:create`})}),_jsx(_components.td,{children:`Débiter le solde d’un utilisateur`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`credit:create`})}),_jsx(_components.td,{children:`Créditer des Vito à un utilisateur, financés sur votre propre solde`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`transfer:create`})}),_jsx(_components.td,{children:`Déplacer des Vito entre deux utilisateurs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`transactions:read`})}),_jsx(_components.td,{children:`Lister et lire les transactions de votre projet`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`authentification`,children:`Authentification`}),`\n`,_jsx(_components.p,{children:`Envoyez votre clé secrète comme jeton Bearer :`}),`\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:`Deux couches facultatives renforcent encore un projet :`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Liste d’IP autorisées`}),` — restreindre les appels à des IP de serveur précises`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Limites de débit`}),` — plafonds par projet qui augmentent avec le niveau d’abonnement du détenteur`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`clés-rotation-et-stockage`,children:`Clés, rotation et stockage`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Votre clé et votre secret de signature ne sont affichés qu’une seule fois.`}),` Après l’approbation, vous disposez d’une `,_jsx(_components.strong,{children:`fenêtre de 7 jours`}),` pour les révéler depuis l’onglet des clés API. Vetox n’en conserve qu’un hachage et ne peut pas les réafficher — si vous manquez la fenêtre, il faut effectuer une rotation.`]})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Gardez-la `,_jsx(_components.strong,{children:`uniquement côté serveur`}),` — quiconque la détient peut débiter vos utilisateurs`]}),`\n`,_jsxs(_components.li,{children:[`Effectuez la rotation depuis l’onglet des clés API. La clé précédente reste valable pendant un `,_jsx(_components.strong,{children:`délai de grâce de 24 heures`}),`, ce qui permet de déployer sans interruption`]}),`\n`,_jsx(_components.li,{children:`Le secret de signature des webhooks se renouvelle séparément, avec son propre chevauchement de 24 heures`}),`\n`,_jsx(_components.li,{children:`En cas de fuite, effectuez immédiatement une rotation`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`sdk-node-js-officiel`,children:`SDK Node.js officiel`}),`\n`,_jsxs(_components.p,{children:[`Le paquet officiel `,_jsx(_components.a,{href:`https://www.npmjs.com/package/@vetox-bot/vito`,children:_jsx(_components.strong,{children:_jsx(_components.code,{children:`@vetox-bot/vito`})})}),` encapsule les neuf endpoints ainsi que la vérification des webhooks. Il gère pour vous l’en-tête `,_jsx(_components.code,{children:`Idempotency-Key`}),`, les nouvelles tentatives avec temporisation croissante, les délais d’attente et la classification des erreurs.`]}),`\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:[`Nécessite `,_jsx(_components.strong,{children:`Node.js 20 ou plus récent`}),`. Le paquet n’a `,_jsx(_components.strong,{children:`aucune dépendance d’exécution`}),` — il utilise le `,_jsx(_components.code,{children:`fetch`}),` intégré et `,_jsx(_components.code,{children:`node:crypto`}),` — et est livré en ESM et en CommonJS, avec des définitions TypeScript complètes.`]}),`\n`,_jsx(Heading,{level:`3`,id:`initialisation`,children:`Initialisation`}),`\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:[`Si vous omettez `,_jsx(_components.code,{children:`apiKey`}),`, le SDK lit `,_jsx(_components.code,{children:`VITO_API_KEY`}),` dans l’environnement. Le format de la clé est validé à la construction : une clé mal formée échoue immédiatement au lieu de vous coûter un aller-retour réseau et un 401.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`La clé déplace de l’argent — gardez-la toujours côté serveur, jamais dans un bundle client ni dans un navigateur. `,_jsx(_components.code,{children:`console.log(vito)`}),` affiche `,_jsx(_components.code,{children:`[redacted]`}),` à la place de la clé, et le SDK refuse toute `,_jsx(_components.code,{children:`baseUrl`}),` en `,_jsx(_components.code,{children:`http://`}),` pour un hôte non local, afin que la clé ne circule pas en clair.`]})}),`\n`,_jsx(Heading,{level:`4`,id:`options-du-client`,children:`Options du client`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Option`}),_jsx(_components.th,{children:`Par défaut`}),_jsx(_components.th,{children:`Rôle`})]})}),_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:[`Clé du projet (`,_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:`Racine de l’API`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`timeoutMs`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`15000`})}),_jsx(_components.td,{children:`Délai d’attente par requête`})]}),_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:`Nouvelles tentatives en cas de panne passagère`})]}),_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:`Premier délai de temporisation ; doublé à chaque tentative`})]}),_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:[`Plafond de temporisation et seuil de coupure pour `,_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:`Votre propre implémentation via proxy ou agent`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`onResponse`})}),_jsx(_components.td,{children:`—`}),_jsxs(_components.td,{children:[`Appelé après chaque réponse, avec `,_jsx(_components.code,{children:`requestId`}),`, le quota de limite de débit et la durée`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`onRetry`})}),_jsx(_components.td,{children:`—`}),_jsx(_components.td,{children:`Appelé avant chaque nouvelle tentative`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`méthodes-disponibles`,children:`Méthodes disponibles`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Méthode`}),_jsx(_components.th,{children:`Endpoint`}),_jsx(_components.th,{children:`Scope`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vito.auth.verify()`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`GET /v1/auth/verify`})}),_jsx(_components.td,{children:`tous`})]}),_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:`tous`})]}),_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:`pagination automatique`}),_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:`pagination automatique`}),_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:`— (vérification locale)`}),_jsx(_components.td,{children:`—`})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Chaque méthode renvoie directement le champ `,_jsx(_components.code,{children:`data`}),` déjà déballé — vous n’avez jamais à extraire `,_jsx(_components.code,{children:`success`}),` ni `,_jsx(_components.code,{children:`data`}),` vous-même. Toutes acceptent en plus des options par appel : `,_jsx(_components.code,{children:`{ timeoutMs, maxRetries, signal, headers }`}),`, et les méthodes d’écriture acceptent également `,_jsx(_components.code,{children:`{ idempotencyKey }`}),`.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`exemples-d’utilisation`,children:`Exemples d’utilisation`}),`\n`,_jsx(Heading,{level:`4`,id:`vérifier-la-clé-au-démarrage`,children:`Vérifier la clé au démarrage`}),`\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:`lire-un-solde`,children:`Lire un solde`}),`\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:` // Pas encore de code PIN de portefeuille : aucun débit ne peut être confirmé.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`4`,id:`débiter-un-utilisateur-vendre-un-article`,children:`Débiter un utilisateur (vendre un article)`}),`\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:` 'Épée légendaire'`}),_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:` 'Épée légendaire'`}),_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:` 'Inflige 120 points de dégâts.'`}),_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:`// envoyez l'utilisateur ici`})]}),`\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, dans 10 minutes`})]}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Enregistrez la commande comme `,_jsx(_components.strong,{children:`en attente`}),`, rien de plus. Le débit n’a pas encore eu lieu : livrez sur le webhook `,_jsx(_components.code,{children:`confirmation.completed`}),`, pas sur cette réponse.`]})}),`\n`,_jsx(Heading,{level:`4`,id:`créditer-un-utilisateur`,children:`Créditer un utilisateur`}),`\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:` 'Remboursement de la commande 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:` // Dériver la clé de votre propre enregistrement rend l'opération rejouable depuis`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // une file de tâches : une répétition renvoie le résultat d'origine au lieu de`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // payer une seconde fois.`})}),`\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:`parcourir-les-transactions`,children:`Parcourir les transactions`}),`\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:`// Un générateur asynchrone qui récupère les pages à la demande — sans boucle manuelle.`})}),`\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:`// les plus récentes d'abord`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // tx.type est le sens par rapport à tx.discordId : 1 = entrée, 0 = sortie.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`idempotence-et-nouvelles-tentatives`,children:`Idempotence et nouvelles tentatives`}),`\n`,_jsxs(_components.p,{children:[`Le SDK envoie un en-tête `,_jsx(_components.code,{children:`Idempotency-Key`}),` sur `,_jsx(_components.strong,{children:`chaque écriture`}),` (`,_jsx(_components.code,{children:`deduct`}),`, `,_jsx(_components.code,{children:`credit`}),`, `,_jsx(_components.code,{children:`transfer`}),`). Si vous n’en fournissez pas, il la génère `,_jsx(_components.strong,{children:`une seule fois par appel et rejoue exactement la même clé à chaque nouvelle tentative`}),` : une nouvelle tentative ne peut donc jamais régler l’opération deux fois.`]}),`\n`,_jsxs(_components.p,{children:[`Fournissez votre propre clé lorsque la même opération logique peut être relancée depuis un `,_jsx(_components.strong,{children:`nouveau processus`}),` — un exécuteur de tâches, une relivraison de file d’attente ou un balayage planifié :`]}),`\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:`Comportement`}),_jsx(_components.th,{children:`Cas`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Réessayé automatiquement`}),_jsxs(_components.td,{children:[`Pannes réseau, délais dépassés, `,_jsx(_components.code,{children:`408`}),`, `,_jsx(_components.code,{children:`429`}),`, `,_jsx(_components.code,{children:`5xx`}),` et `,_jsx(_components.code,{children:`409 VITO_IDEMPOTENCY_IN_PROGRESS`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Jamais réessayé`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`409 VITO_IDEMPOTENCY_CONFLICT`}),`, toutes les autres erreurs `,_jsx(_components.code,{children:`4xx`}),` et `,_jsx(_components.code,{children:`auth.rotateKey()`})]})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`auth.rotateKey()`}),` est exclu délibérément — une nouvelle tentative y génère une seconde clé et invalide celle renvoyée par la première.`]})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Si `,_jsx(_components.code,{children:`Retry-After`}),` dépasse `,_jsx(_components.code,{children:`maxRetryDelayMs`}),` (votre quota horaire est réellement épuisé), le SDK lève immédiatement `,_jsx(_components.code,{children:`VitoRateLimitError`}),` au lieu de dormir pendant tout votre budget de requête.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`vérifier-les-webhooks-avec-le-sdk`,children:`Vérifier les webhooks avec le SDK`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`18`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`18`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Webhooks`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`VitoSignatureVerificationError`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '@vetox-bot/vito'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`try`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` event`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` Webhooks`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`constructEvent`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` payload:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` rawRequestBody`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// le corps brut — voir l'avertissement ci-dessous`})]}),`\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:` // Le type de data est affiné automatiquement selon eventType.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` fulfil`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`event`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`data`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`merchantRef`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`} `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`catch`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`error`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` instanceof`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` VitoSignatureVerificationError`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Rejetez la livraison avec un 400 : falsifiée, périmée ou corps ré-encodé.`})}),`\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`}),` contrôle la fenêtre de rejeu de 5 minutes, compare en temps constant avec `,_jsx(_components.strong,{children:`chaque`}),` signature `,_jsx(_components.code,{children:`h1`}),` de l’en-tête — il fonctionne donc automatiquement pendant le chevauchement de 24 heures d’une rotation — puis analyse la charge utile et renvoie l’événement typé.`]}),`\n`,_jsx(_components.p,{children:`Dans un gestionnaire de route Next.js (App Router), utilisez la variante qui lit elle-même le corps brut :`}),`\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:`// la vérification utilise 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:[`La signature couvre les `,_jsx(_components.strong,{children:`octets bruts`}),`. Avec Express, montez `,_jsx(_components.code,{children:`express.raw({ type: 'application/json' })`}),` sur la route du webhook — `,_jsx(_components.code,{children:`express.json()`}),` consomme le corps et toute vérification échoue ensuite. Avec Next.js, n’appelez pas `,_jsx(_components.code,{children:`request.json()`}),` avant `,_jsx(_components.code,{children:`constructEventFromRequest`}),`.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`La livraison se fait `,_jsx(_components.strong,{children:`au moins une fois`}),`. Dédupliquez sur `,_jsx(_components.code,{children:`event.eventId`}),` avant d’exécuter le moindre effet de bord.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`gestion-des-erreurs`,children:`Gestion des erreurs`}),`\n`,_jsxs(_components.p,{children:[`Tout ce que lève le SDK hérite de `,_jsx(_components.code,{children:`VitoError`}),` et porte `,_jsx(_components.code,{children:`code`}),`, `,_jsx(_components.code,{children:`status`}),`, `,_jsx(_components.code,{children:`type`}),`, `,_jsx(_components.code,{children:`requestId`}),` et `,_jsx(_components.code,{children:`retryable`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Classe`}),_jsx(_components.th,{children:`Statut`}),_jsx(_components.th,{children:`Quand`})]})}),_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:[`Arguments rejetés `,_jsx(_components.strong,{children:`avant`}),` l’envoi de la moindre requête`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`VitoConfigurationError`})}),_jsx(_components.td,{children:`—`}),_jsxs(_components.td,{children:[`Clé absente ou mal formée, ou `,_jsx(_components.code,{children:`baseUrl`}),` inutilisable`]})]}),_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:`L’API a rejeté le corps ou les paramètres`})]}),_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:`Clé invalide ou révoquée`})]}),_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:`Le portefeuille ne couvre pas le montant (utilisateur ou détenteur)`})]}),_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:`Scope manquant, IP, conditions, gel, serveur non autorisé ou abonnement expiré`})]}),_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:`Utilisateur, transaction ou confirmation introuvable`})]}),_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:`Conflit d’idempotence, ou requête encore en cours`})]}),_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:`La fenêtre de confirmation est écoulée`})]}),_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:[`Limite atteinte — porte `,_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:`Défaillance de notre côté`})]}),_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`}),` ou `,_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:`Échec de la vérification de signature d’un webhook`})]})]})]}),`\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:[`Journalisez toujours le `,_jsx(_components.code,{children:`requestId`}),` — c’est ce dont le support a besoin pour retrouver un appel précis.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`annuler-un-appel`,children:`Annuler un appel`}),`\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:[`L’annulation interrompt aussi toute nouvelle tentative en attente et lève `,_jsx(_components.code,{children:`VitoConnectionError`}),` avec le code `,_jsx(_components.code,{children:`VITO_SDK_ABORTED`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`débiter-un-utilisateur`,children:`Débiter un utilisateur`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Votre clé seule ne peut pas déplacer les Vito d’un utilisateur.`}),` Chaque débit exige que l’utilisateur l’approuve avec le code PIN de son portefeuille, sur `,_jsx(_components.code,{children:`vetox.io`}),` — jamais dans votre application ni dans Discord.`]})}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Votre application appelle POST /v1/deduct`,children:_jsxs(_components.p,{children:[`Avec l’utilisateur, le montant, le `,_jsx(_components.code,{children:`guildId`}),` d’origine et les détails de l’article.`]})}),_jsx(Step,{title:`Vito renvoie une confirmUrl`,children:_jsxs(_components.p,{children:[`Une confirmation en attente, valable `,_jsx(_components.strong,{children:`10 minutes`}),`. L’utilisateur reçoit également un MP.`]})}),_jsx(Step,{title:`L'utilisateur approuve avec son code PIN`,children:_jsxs(_components.p,{children:[`Sur `,_jsx(_components.code,{children:`vetox.io`}),`.`]})}),_jsx(Step,{title:`Vito règle et notifie`,children:_jsx(_components.p,{children:`Le solde est débité, la transaction enregistrée, et un webhook signé est envoyé si vous en avez configuré un.`})}),_jsx(Step,{title:`Votre application vérifie et finalise`,children:_jsx(_components.p,{children:`Vérifiez la signature, puis débloquez le contenu ou livrez l’article.`})})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Ne finalisez votre action que sur `,_jsx(_components.code,{children:`confirmation.completed`})]}),` — jamais sur la réponse de `,_jsx(_components.code,{children:`/deduct`}),`. À ce stade, le débit n’est pas définitif.`]})}),`\n`,_jsxs(Heading,{level:`3`,id:`paramètres-de-la-requête-—-/v1/deduct`,children:[`Paramètres de la requête — `,_jsx(_components.code,{children:`/v1/deduct`})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Champ`}),_jsx(_components.th,{children:`Requis`}),_jsx(_components.th,{children:`Notes`})]})}),_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:`Oui`})}),_jsx(_components.td,{children:`L’identifiant Discord de l’utilisateur — un snowflake de 17 à 20 chiffres`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`amount`})}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Oui`})}),_jsx(_components.td,{children:`Entier positif`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`guildId`})}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Oui`})}),_jsx(_components.td,{children:`Le serveur Discord d’où provient le débit. Tout débit doit provenir d’un serveur`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reason`})}),_jsx(_components.td,{children:`Non`}),_jsx(_components.td,{children:`Jusqu’à 256 caractères. Affiché à l’utilisateur et renvoyé dans le webhook`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`merchantRef`})}),_jsx(_components.td,{children:`Non`}),_jsx(_components.td,{children:`Votre propre référence, jusqu’à 128 caractères. Sert à rapprocher le webhook de vos enregistrements`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`product`})}),_jsx(_components.td,{children:`Non`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`{ type, name, description?, imageUrl? }`}),` — affiché sur la page de confirmation et dans le MP`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`imageUrl`})}),_jsx(_components.td,{children:`Non`}),_jsxs(_components.td,{children:[`Doit être en `,_jsx(_components.code,{children:`https://`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`metadata`})}),_jsx(_components.td,{children:`Non`}),_jsxs(_components.td,{children:[`Jusqu’à `,_jsx(_components.strong,{children:`10`}),` paires clé/valeur textuelles, transmises telles quelles`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`créditer-un-utilisateur-2`,children:`Créditer un utilisateur`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`POST /v1/add`}),` crédite des Vito à un utilisateur `,_jsx(_components.strong,{children:`depuis votre propre solde`}),` — pour des récompenses ou des remboursements. Mêmes champs que `,_jsx(_components.code,{children:`/deduct`}),`, sauf `,_jsx(_components.code,{children:`guildId`}),` et `,_jsx(_components.code,{children:`product`}),`.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Contrairement à un débit, un crédit `,_jsx(_components.strong,{children:`n’a pas d’étape de confirmation`}),` : il est réglé immédiatement. Nécessite le scope `,_jsx(_components.code,{children:`credit:create`}),` et un solde suffisant, sinon l’appel renvoie `,_jsxs(_components.strong,{children:[`402 `,_jsx(_components.code,{children:`VITO_INSUFFICIENT_OWNER_FUNDS`})]}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`frais`,children:`Frais`}),`\n`,_jsxs(_components.p,{children:[`Chaque débit vous est reversé après déduction des frais de la plateforme — selon le même barème que les transferts Vito dans l’application, en fonction de `,_jsx(_components.strong,{children:`votre`}),` niveau d’abonnement :`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Votre abonnement`}),_jsx(_components.th,{children:`Frais`})]})}),_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:[`Les montants de `,_jsx(_components.strong,{children:`5 Vito ou moins sont sans frais`}),`, et les crédits via `,_jsx(_components.code,{children:`/v1/add`}),` le sont toujours.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`webhooks`,children:`Webhooks`}),`\n`,_jsxs(_components.p,{children:[`Ajoutez une ou plusieurs URL de rappel `,_jsx(_components.code,{children:`https`}),` dans l’onglet des paramètres. Vito envoie un `,_jsx(_components.code,{children:`POST`}),` signé dès qu’une confirmation atteint un état final.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Les webhooks ne partent que si votre projet possède `,_jsx(_components.strong,{children:`à la fois`}),` une URL de rappel `,_jsx(_components.strong,{children:`et`}),` un secret de signature. Révélez le secret (`,_jsx(_components.code,{children:`whsec_…`}),`) une seule fois depuis l’onglet des clés API.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`vérifier-la-signature`,children:`Vérifier la signature`}),`\n`,_jsxs(_components.p,{children:[`Chaque livraison porte un en-tête `,_jsx(_components.code,{children:`X-Vito-Signature`}),` :`]}),`\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:[`Deux autres en-têtes accompagnent chaque livraison — utilisez `,_jsx(_components.code,{children:`X-Vito-Event-Id`}),` comme clé de déduplication, car une nouvelle tentative renvoie le même identifiant :`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`En-tête`}),_jsx(_components.th,{children:`Contient`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`X-Vito-Event-Id`})}),_jsx(_components.td,{children:`Identifiant stable de cet événement — identique d’une tentative à l’autre`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`X-Vito-Event-Type`})}),_jsxs(_components.td,{children:[`Par exemple `,_jsx(_components.code,{children:`confirmation.completed`})]})]})]})]}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Pendant une rotation du secret de signature, l’en-tête porte plusieurs signatures`}),`, la plus récente en premier :`]}),_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=\u003cnouvelle>;h1=\u003cancienne>`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsxs(_components.p,{children:[`Acceptez la livraison si `,_jsx(_components.strong,{children:`l’un quelconque`}),` des `,_jsx(_components.code,{children:`h1`}),` correspond. Un vérificateur qui ne lit que le premier rejettera tous les webhooks tant qu’il n’aura pas déployé le nouveau secret — ce qui annule tout l’intérêt du chevauchement de 24 heures.`]})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Sous Node.js : `,_jsx(_components.code,{children:`Webhooks.constructEvent`}),` de `,_jsx(_components.a,{href:`https://www.npmjs.com/package/@vetox-bot/vito`,children:_jsx(_components.code,{children:`@vetox-bot/vito`})}),` fait tout cela pour vous — la fenêtre de rejeu, la comparaison avec `,_jsx(_components.strong,{children:`chaque`}),` signature `,_jsx(_components.code,{children:`h1`}),` et le contrôle en temps constant — et renvoie l’événement typé. Le code ci-dessous sert à une implémentation manuelle ou à un autre langage.`]})}),`\n`,_jsxs(_components.p,{children:[`Recalculez le HMAC sur `,_jsx(_components.code,{children:`\u003cts>:\u003crawBody>`}),` avec votre secret de signature et comparez en temps constant.`]}),`\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:[`Vérifiez sur le `,_jsx(_components.strong,{children:`corps brut`}),`, avant tout parsing JSON ou middleware susceptible de le réécrire.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`événements`,children:`Événements`}),`\n`,_jsxs(_components.p,{children:[`Cinq types d’événements, partageant tous la même structure de charge utile. `,_jsx(_components.code,{children:`data.status`}),` porte le résultat.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Événement`}),_jsx(_components.th,{children:`Signification`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`confirmation.completed`})}),_jsxs(_components.td,{children:[`Approuvé et débité. Contient `,_jsx(_components.code,{children:`transactionId`}),`. `,_jsx(_components.strong,{children:`Finalisez votre action ici`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`confirmation.failed`})}),_jsxs(_components.td,{children:[`Impossible à finaliser — solde insuffisant ou erreur interne. Contient `,_jsx(_components.code,{children:`failureReason`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`confirmation.expired`})}),_jsx(_components.td,{children:`Non confirmé dans les 10 minutes. Aucun Vito déplacé`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`confirmation.cancelled`})}),_jsx(_components.td,{children:`Annulé par l’utilisateur. Aucun Vito déplacé`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`credit.completed`})}),_jsxs(_components.td,{children:[`Un `,_jsx(_components.code,{children:`/add`}),` financé par le détenteur a été réglé. Émis immédiatement — sans étape de confirmation`]})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Les webhooks sont réessayés `,_jsx(_components.strong,{children:`5 fois avec temporisation croissante`}),`. Répondez rapidement en 2xx et effectuez votre livraison de manière asynchrone.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`codes-d’erreur`,children:`Codes d’erreur`}),`\n`,_jsxs(_components.p,{children:[`Chaque réponse est encapsulée. Un succès porte `,_jsx(_components.code,{children:`data`}),`, un échec porte `,_jsx(_components.code,{children:`error`}),`, jamais les deux :`]}),`\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:[`Tous les codes sont préfixés par `,_jsx(_components.code,{children:`VITO_`}),`.`]}),` Comparez la chaîne complète — un `,_jsx(_components.code,{children:`RATE_LIMITED`}),` ou `,_jsx(_components.code,{children:`FORBIDDEN`}),` isolé n’apparaît jamais dans les réponses.`]})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Code`}),_jsx(_components.th,{children:`Statut`}),_jsx(_components.th,{children:`Signification`})]})}),_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:`Un champ est manquant ou mal formé`})]}),_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`}),` n’est pas un entier positif`]})]}),_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:`Au-delà de votre plafond par transaction`})]}),_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:`Cet appel dépasserait votre plafond de volume quotidien`})]}),_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:`L’expéditeur et le destinataire sont le même utilisateur`})]}),_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:`Clé absente, mal formée, révoquée ou inconnue`})]}),_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:`L’utilisateur ne peut pas couvrir le débit`})]}),_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:`Votre`}),` solde est trop faible pour financer un `,_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:`La clé n’a pas le scope requis par cet endpoint`})]}),_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:`L’IP appelante n’est pas dans la liste autorisée`})]}),_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:`L’abonnement du détenteur a expiré — gelé jusqu’au renouvellement`})]}),_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`}),` ne figure pas dans la liste des serveurs autorisés du projet`]})]}),_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:`Conditions développeur non acceptées, ou une version plus récente est en attente`})]}),_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:`Gelé — le plus souvent un abonnement du détenteur expiré`})]}),_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:`Suspendu par l’équipe Vetox`})]}),_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:`Banni par l’équipe Vetox`})]}),_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:`L’utilisateur est exclu des opérations Vito`})]}),_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:`Le portefeuille de l’utilisateur est verrouillé après des échecs de PIN`})]}),_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:`Aucun compte Vito pour cet identifiant Discord`})]}),_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:`Jeton de confirmation inconnu`})]}),_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:[`Même `,_jsx(_components.code,{children:`Idempotency-Key`}),`, corps différent`]})]}),_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:`Une requête identique est encore en cours — réessayez sous peu`})]}),_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:`Cette confirmation a déjà atteint un état final`})]}),_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:`Une rotation est déjà en cours`})]}),_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:`La fenêtre de 10 minutes est écoulée`})]}),_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:`Ralentissez et réessayez`})]}),_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:`Défaillance inattendue de notre côté`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`limites-de-débit`,children:`Limites de débit`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Abonnement du détenteur`}),_jsx(_components.th,{children:`Par minute`}),_jsx(_components.th,{children:`Par heure`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Aucun`}),_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 ou 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 ou Diamond`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`600`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`15 000`})]})]})]}),`\n`,_jsx(_components.p,{children:`Il existe aussi une limite par IP égale à la moitié de votre quota par minute, avec un plancher de 30.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`En charge, `,_jsx(_components.strong,{children:`les endpoints d’écriture échouent en mode fermé`}),` — un débit est rejeté plutôt que de risquer une double dépense. Les lectures échouent en mode ouvert. Traitez une écriture rejetée comme « n’a pas eu lieu » et réessayez.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Envoyez un en-tête `,_jsx(_components.code,{children:`Idempotency-Key`}),` pour dédupliquer les nouvelles tentatives en toute sécurité.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`endpoints`,children:`Endpoints`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Endpoint`}),_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Méthode du SDK`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GET /v1/auth/verify`})}),_jsx(_components.td,{children:`tous`}),_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:`tous`}),_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`}),` et `,_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:`limites`,children:`Limites`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Les confirmations expirent au bout de `,_jsx(_components.strong,{children:`10 minutes`}),` — considérez les demandes non confirmées comme abandonnées`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`amount`}),` doit être un entier positif`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`metadata`}),` est plafonné à 10 clés`]}),`\n`,_jsx(_components.li,{children:`Les plafonds par transaction et quotidiens sont fixés par l’équipe Vetox et affichés en lecture seule dans l’onglet des paramètres`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`check-list-de-sécurité`,children:`Check-list de sécurité`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Gardez les secrets côté serveur`,icon:`lock`,id:`gardez-les-secrets-cote-serveur`,children:_jsx(_components.p,{children:`La clé API et le secret de signature n’ont jamais leur place dans du code client. En cas de fuite de l’un ou l’autre, effectuez immédiatement une rotation.`})}),_jsx(Accordion,{title:`Vérifiez chaque webhook`,icon:`signature`,id:`verifiez-chaque-webhook`,children:_jsx(_components.p,{children:`Contrôlez la signature sur le corps brut et rejetez les livraisons datant de plus de ~5 minutes.`})}),_jsx(Accordion,{title:`Ne réglez que sur completed`,icon:`circle-check`,id:`ne-reglez-que-sur-completed`,children:_jsxs(_components.p,{children:[`Ne livrez jamais sur la seule réponse de `,_jsx(_components.code,{children:`/deduct`}),` — le débit n’est définitif qu’avec `,_jsx(_components.code,{children:`confirmation.completed`}),`.`]})}),_jsx(Accordion,{title:`Moindre privilège`,icon:`key`,id:`moindre-privilege`,children:_jsx(_components.p,{children:`Ne demandez que les scopes réellement utilisés et activez la liste d’IP autorisées.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`dépannage`,children:`Dépannage`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Tous les appels renvoient non autorisé`,id:`tous-les-appels-renvoient-non-autorise`,children:_jsx(_components.p,{children:`L’abonnement du détenteur a expiré. Il est revérifié à chaque appel.`})}),_jsx(Accordion,{title:`J'ai perdu ma clé`,id:`j-ai-perdu-ma-cle`,children:_jsx(_components.p,{children:`Elle est irrécupérable — seul un hachage est stocké. Effectuez une rotation pour en obtenir une nouvelle.`})}),_jsx(Accordion,{title:`Les signatures de webhook échouent après une rotation`,id:`les-signatures-de-webhook-echouent-apres-une-rotation`,children:_jsx(_components.p,{children:`Acceptez les deux secrets pendant le chevauchement de 24 heures.`})}),_jsx(Accordion,{title:`Un débit ne se finalise jamais`,id:`un-debit-ne-se-finalise-jamais`,children:_jsx(_components.p,{children:`L’utilisateur ne l’a pas approuvé. Les confirmations expirent au bout de 10 minutes.`})}),_jsx(Accordion,{title:`Aucun webhook n'arrive`,id:`aucun-webhook-n-arrive`,children:_jsx(_components.p,{children:`Un projet a besoin d’une URL de rappel et d’un secret de signature. Avec un seul des deux, rien n’est livré.`})}),_jsx(Accordion,{title:`J'ai reçu moins de Vito que ce que j'ai débité`,id:`j-ai-recu-moins-de-vito-que-ce-que-j-ai-debite`,children:_jsx(_components.p,{children:`Ce sont les frais de règlement. Utilisez des montants de 5 Vito ou moins pour les éviter, ou intégrez-les à votre prix.`})}),_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`}),` est financé sur votre propre solde, il n’est pas créé à partir de rien. Rechargez.`]})})]}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Vito`,icon:`coins`,href:`/fr/members/vito`,children:_jsx(_components.p,{children:`Soldes, code PIN et frais.`})}),_jsx(Card,{title:`Demandes de paiement`,icon:`receipt`,href:`/fr/account/payment-requests`,children:_jsx(_components.p,{children:`Ce que voit l’utilisateur quand vous le débitez.`})}),_jsx(Card,{title:`@vetox-bot/vito sur npm`,icon:`npm`,href:`https://www.npmjs.com/package/@vetox-bot/vito`,children:_jsx(_components.p,{children:`Le paquet Node.js officiel — une installation, une intégration complète.`})})]})]})}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 et achats","sidebarTitle":"Vito API","description":"Autorisez les applications approuvées à prélever vos Vito avec confirmation par PIN, et gérez les demandes de paiement depuis votre page Achats.","icon":"code","keywords":["vito api","purchases","payment requests","developer","api key","merchant"],"href":"/fr/members/vito-api"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Obtenir l’accès","slug":"obtenir-l’accès","depth":2,"children":[{"title":"Scopes","slug":"scopes","depth":3,"children":[]}]},{"title":"Authentification","slug":"authentification","depth":2,"children":[{"title":"Clés, rotation et stockage","slug":"clés-rotation-et-stockage","depth":3,"children":[]}]},{"title":"SDK Node.js officiel","slug":"sdk-node-js-officiel","depth":2,"children":[{"title":"Installation","slug":"installation","depth":3,"children":[]},{"title":"Initialisation","slug":"initialisation","depth":3,"children":[]},{"title":"Options du client","slug":"options-du-client","depth":4,"children":[]},{"title":"Méthodes disponibles","slug":"méthodes-disponibles","depth":3,"children":[]},{"title":"Exemples d’utilisation","slug":"exemples-d’utilisation","depth":3,"children":[]},{"title":"Vérifier la clé au démarrage","slug":"vérifier-la-clé-au-démarrage","depth":4,"children":[]},{"title":"Lire un solde","slug":"lire-un-solde","depth":4,"children":[]},{"title":"Débiter un utilisateur (vendre un article)","slug":"débiter-un-utilisateur-vendre-un-article","depth":4,"children":[]},{"title":"Créditer un utilisateur","slug":"créditer-un-utilisateur","depth":4,"children":[]},{"title":"Parcourir les transactions","slug":"parcourir-les-transactions","depth":4,"children":[]},{"title":"Idempotence et nouvelles tentatives","slug":"idempotence-et-nouvelles-tentatives","depth":3,"children":[]},{"title":"Vérifier les webhooks avec le SDK","slug":"vérifier-les-webhooks-avec-le-sdk","depth":3,"children":[]},{"title":"Gestion des erreurs","slug":"gestion-des-erreurs","depth":3,"children":[]},{"title":"Annuler un appel","slug":"annuler-un-appel","depth":3,"children":[]}]},{"title":"Débiter un utilisateur","slug":"débiter-un-utilisateur","depth":2,"children":[{"title":"Paramètres de la requête — /v1/deduct","slug":"paramètres-de-la-requête-—-/v1/deduct","depth":3,"children":[]}]},{"title":"Créditer un utilisateur","slug":"créditer-un-utilisateur-2","depth":2,"children":[]},{"title":"Frais","slug":"frais","depth":2,"children":[]},{"title":"Webhooks","slug":"webhooks","depth":2,"children":[{"title":"Vérifier la signature","slug":"vérifier-la-signature","depth":3,"children":[]},{"title":"Événements","slug":"événements","depth":3,"children":[]}]},{"title":"Codes d’erreur","slug":"codes-d’erreur","depth":2,"children":[]},{"title":"Limites de débit","slug":"limites-de-débit","depth":2,"children":[]},{"title":"Endpoints","slug":"endpoints","depth":2,"children":[]},{"title":"Limites","slug":"limites","depth":2,"children":[]},{"title":"Check-list de sécurité","slug":"check-list-de-sécurité","depth":2,"children":[]},{"title":"Dépannage","slug":"dépannage","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"vetox-ec2a2bcb","siteName":"Vetox","title":"Vito API et achats - 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":0},"de":{"href":"/de/members/vito-api","matchLevel":1},"ja":{"href":"/ja/members/vito-api","matchLevel":1},"ru":{"href":"/ru/members/vito-api","matchLevel":1},"es":{"href":"/es/members/vito-api","matchLevel":1},"tr":{"href":"/tr/members/vito-api","matchLevel":1},"nl":{"href":"/nl/members/vito-api","matchLevel":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.402Z","originalFileLocation":"fr/members/vito-api.mdx","locale":"fr"},"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=\"Autorisez les applications approuvées à prélever vos Vito avec confirmation par PIN, et gérez les demandes de paiement depuis votre page Achats.\">\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 et achats - Vetox\">\u003cmeta data-mint-head property=\"og:description\" content=\"Autorisez les applications approuvées à prélever vos Vito avec confirmation par PIN, et gérez les demandes de paiement depuis votre page Achats.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Vetox\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.vetox.io/fr/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 et achats - Vetox\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Autorisez les applications approuvées à prélever vos Vito avec confirmation par PIN, et gérez les demandes de paiement depuis votre page Achats.\">\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/fr/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=\"/fr/members/vito-api.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"fr\" href=\"https://docs.vetox.io/fr/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=\"de\" href=\"https://docs.vetox.io/de/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://docs.vetox.io/ja/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ru\" href=\"https://docs.vetox.io/ru/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://docs.vetox.io/es/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"tr\" href=\"https://docs.vetox.io/tr/members/vito-api\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"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/fr/members/vito-api#webpage\",\"url\":\"https://docs.vetox.io/fr/members/vito-api\",\"name\":\"Vito API et achats\",\"description\":\"Autorisez les applications approuvées à prélever vos Vito avec confirmation par PIN, et gérez les demandes de paiement depuis votre page Achats.\",\"dateModified\":\"2026-09-09T05:22:47.402Z\",\"isPartOf\":{\"@id\":\"https://docs.vetox.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.vetox.io/fr/members/vito-api#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.vetox.io/fr/members/vito-api#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Vito\",\"item\":\"https://docs.vetox.io/fr/members/vito\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vito API et achats\",\"item\":\"https://docs.vetox.io/fr/members/vito-api\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.vetox.io/fr/members/vito-api#article\",\"headline\":\"Vito API et achats\",\"name\":\"Vito API et achats\",\"description\":\"Autorisez les applications approuvées à prélever vos Vito avec confirmation par PIN, et gérez les demandes de paiement depuis votre page Achats.\",\"url\":\"https://docs.vetox.io/fr/members/vito-api\",\"mainEntityOfPage\":{\"@id\":\"https://docs.vetox.io/fr/members/vito-api#webpage\"},\"image\":\"https://vetox.io/brand/vetox-header-04.png\",\"dateModified\":\"2026-09-09T05:22:47.402Z\",\"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","tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/fr"}]},{"tab":"Tableau de bord serveur","pages":[{"title":"Tableau de bord serveur","href":"/fr/server-management/overview"}]},{"tab":"Votre compte","groups":[{"group":"Principal","icon":"house","pages":[{"title":"Aperçu","sidebarTitle":"Aperçu","icon":"house","href":"/fr/account/overview"},{"title":"Mon Battle Pass","sidebarTitle":"Mon Battle Pass","icon":"medal","href":"/fr/account/my-battle-pass"},{"title":"Récompense quotidienne","sidebarTitle":"Récompense quotidienne","icon":"calendar-check","href":"/fr/members/daily-reward"},{"title":"Profil public","sidebarTitle":"Profil public","icon":"id-card","href":"/fr/members/profile"},{"title":"Page d'Abonnement","sidebarTitle":"Abonnement","icon":"user","href":"/fr/account/membership-page"},{"title":"Premium et Gestion des Bots","sidebarTitle":"Gestion des Bots","icon":"robot","href":"/fr/account/manage-bots"},{"title":"Réputation","sidebarTitle":"Réputation","icon":"thumbs-up","href":"/fr/members/reputation"},{"title":"Vote","sidebarTitle":"Vote","icon":"thumbs-up","href":"/fr/members/voting"}]},{"group":"Utilitaires","icon":"palette","pages":[{"title":"Personnalisation du profil","sidebarTitle":"Personnalisation du profil","icon":"image","href":"/fr/members/profile-customization"},{"title":"Personnalisation du rank","sidebarTitle":"Personnalisation du rank","icon":"gauge","href":"/fr/members/rank-customization"},{"title":"Personnalisation du nom","sidebarTitle":"Personnalisation du nom","icon":"font","href":"/fr/members/name-customization"},{"title":"Badges","sidebarTitle":"Badges","icon":"certificate","href":"/fr/members/badges"},{"title":"Mes sauvegardes","icon":"box-archive","sidebarTitle":"Mes sauvegardes","href":"/fr/members/my-backups"}]},{"group":"Vito","icon":"coins","pages":[{"title":"Vito","sidebarTitle":"Vito","icon":"coins","href":"/fr/members/vito"},{"title":"Transactions Vito","sidebarTitle":"Transactions Vito","icon":"receipt","href":"/fr/account/vito-transactions"},{"title":"Demandes de paiement","sidebarTitle":"Demandes de paiement","description":"Examinez, approuvez ou annulez les prélèvements de Vito demandés par des applications connectées — et la fenêtre de 10 minutes pendant laquelle ils s'exécutent.","icon":"file-invoice","href":"/fr/account/payment-requests"},{"title":"Vito API et achats","sidebarTitle":"Vito API","icon":"code","href":"/fr/members/vito-api"}]},{"group":"Classement","icon":"ranking-star","pages":[{"title":"Classements","sidebarTitle":"Classements","description":"Classements globaux pour Vito, XP et réputation — les 100 premiers dans chacun, rafraîchis deux fois par jour.","icon":"ranking-star","href":"/fr/members/leaderboards"},{"title":"Utilisateurs les plus riches","sidebarTitle":"Utilisateurs les plus riches","icon":"coins","href":"/fr/account/richest-users"},{"title":"Brokers au clavier","sidebarTitle":"Brokers au clavier","icon":"chart-line","href":"/fr/account/keyboard-brokers"},{"title":"Les plus aimés","sidebarTitle":"Les plus aimés","icon":"thumbs-up","href":"/fr/account/most-liked"}]}]},{"tab":"Commandes","pages":[{"title":"Commandes","href":"/fr/commands/overview"}]},{"tab":"Aide","pages":[{"title":"Aide","href":"/fr/help/faq"}]}]},{"language":"de","pages":[{"title":"de","href":"/de/members/vito-api"}]},{"language":"ja","pages":[{"title":"ja","href":"/ja/members/vito-api"}]},{"language":"ru","pages":[{"title":"ru","href":"/ru/members/vito-api"}]},{"language":"es","pages":[{"title":"es","href":"/es/members/vito-api"}]},{"language":"tr","pages":[{"title":"tr","href":"/tr/members/vito-api"}]},{"language":"nl","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 et achats - Vetox","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":[],"chunks":[]}