Référence API
L'API serveur prend en charge les comptes, factures, paiement sécurisé, statuts et webhooks. OpenAPI décrit les routes, champs et erreurs. Démarrer un paiement nécessite une passerelle configurée, un commerçant approuvé et des conditions de facture prises en charge.
Sur cette page
URL de base et format#
The base URL is https://kevmi.one. Request and response bodies use JSON. Money values are integer minor units. Account and support dates are Unix timestamps in milliseconds.
Les réponses API utilisent Cache-Control: no-store. Le /openapi.json public peut être mis en cache pendant cinq minutes. Ne placez pas de cookies ni de secrets dans une URL.
curl 'https://kevmi.one/api/config'
curl 'https://kevmi.one/openapi.json'Autorisation des requêtes#
Le compte web utilise un cookie de session HttpOnly. GET /api/auth/me renvoie l'utilisateur actuel et csrfToken. Les mutations exigent X-CSRF-Token et une requête de même origine.
Les clés commerçant Kevmi à portée limitée autorisent /api/v1/payments, /api/v1/payment-links et /api/v1/events. Elles ne remplacent pas le cookie de session pour les paramètres du compte ni les routes administratives.
const me = await fetch('/api/auth/me').then(r => r.json());
if (!me.authenticated) throw new Error('Sign in required');
const response = await fetch('/api/account/settings', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': me.csrfToken },
body: JSON.stringify({ vatPayer: 'merchant' })
});
if (!response.ok) throw new Error('Settings were not saved');
const updated = await response.json();Groupes de points de terminaison#
GET /api/config signale la présence de la configuration serveur. GET /api/checkout/{token} renvoie la disponibilité de la facture pour la méthode sélectionnée, y compris l'approbation du commerçant et les conditions enregistrées. Ces vérifications n'établissent pas la connectivité du fournisseur ni le succès du paiement : le résultat provient de l'opération de passerelle vérifiée.
| Groupe | Objectif |
|---|---|
| Configuration et santé | Disponibilité du service public et du stockage |
| Authentification | Défis et sessions Telegram |
| Compte | Paramètres et application commerçant privée |
| /api/v1/payments | Création et lecture de factures serveur à portée limitée ; ne lance pas de débit |
| /api/v1/events | Journal d'événements serveur avec events:read |
| Intégrations | Administration des clés et des points de terminaison webhook authentifiés par session |
| Applications et modération | Soumissions possédées, suivi du statut et autorisations de modérateur distinctes |
| Paiement | Facture publique, demande de carte chiffrée, opération concrète, code bancaire, statut et rapprochement |
| Entrée de passerelle | Notifications v3 signées et vérification d'opération authentifiée |
| Support et notifications | Questions, demandes privées, événements et état de lecture |
| Telegram | Webhook de bot vérifié |
| Routes monétaires non prises en charge | Les /api/payments et /api/payouts directs hérités ne créent pas de débit ni de paiement |
Une demande de connaissance publique#
La réponse comprend mode, answer, sources, knowledgeVersion et needsHuman. Un Origin fourni doit correspondre à l'origine de l'application. Un agent de documentation côté serveur peut omettre Origin.
curl 'https://kevmi.one/api/support/ask' \
-H 'Content-Type: application/json' \
--data '{"question":"Who pays VAT?","locale":"en"}'Erreurs et limites#
Une erreur comprend un code lisible par machine et un message. Les champs de requête inconnus sont rejetés. Les corps JSON standard permettent 16 384 octets ; /api/support/ask et le webhook Telegram permettent 65 536.
429 indique une limite de débit. 503 peut indiquer une intégration indisponible, pas un paiement refusé. Lisez error.code et ne modifiez pas un statut financier sur la seule base d'un statut HTTP.
Plusieurs boutiques et un prix de base USD unique#
Choisissez Toutes les boutiques pour les analyses et opérations agrégées, ou sélectionnez une boutique pour ses propres enregistrements. Chaque boutique possède un storeId, un nom, une TVA par défaut, des factures, des clés API, des points de terminaison webhook, un historique d'événements et une application de site Web distincts. Les notifications et les tickets de support appartiennent au compte. Un compte peut créer jusqu'à 100 boutiques. Les enregistrements existants restent dans sa première boutique.
Les factures du nouvel espace de travail utilisent pricingMode="universal" et un prix de base en USD. Any inclut carte, alipay, sbp et crypto ; un commerçant peut sélectionner un sous-ensemble. Les cartes et Alipay facturent en USD. SBP facture en RUB en utilisant le taux de référence USD/RUB de la Banque de Russie. La crypto facture en USDT selon la règle de facturation explicite 1 USD = 1 USDT. Il s'agit d'une règle de conversion de facturation, pas d'une cotation USDT de marché. La passerelle fournit le taux de la pièce sélectionnée, le montant exact du transfert et les instructions avant le transfert.
Le taux de référence et les deux montants sont gelés à la création. Les factures impliquant une conversion RUB expirent dans les 24 heures. Si le taux de référence ne peut pas être obtenu, la création échoue avec FX_UNAVAILABLE ; aucun taux de secours inventé ou obsolète n'est utilisé. Le montant en monnaie mineure du propriétaire et les cotations utilisent la monnaie comptable USD. quotes[method].settlement contient la cotation de frais native. Le paiement public expose la monnaie de frais sélectionnée dans currency, le prix d'origine dans baseAmountMinor/baseCurrency, et le taux de référence dans fx. Une fois qu'un paiement a été envoyé, sa méthode ne peut pas être modifiée ; une facture a une seule opération de passerelle.
Créez une clé API dans la boutique prévue et envoyez Authorization: Bearer <key> depuis votre serveur. Sa liaison de boutique est immuable ; X-Kevmi-Store ne peut pas lui accorder l'accès à une autre boutique. Les sessions de navigateur sélectionnent X-Kevmi-Store: <storeId> ; si omis, la première boutique est sélectionnée. La valeur all n'est acceptée que par GET /api/account/dashboard et GET /api/payment-links. Les mutations nécessitent une boutique sélectionnée, Origin et X-CSRF-Token. Les identifiants de compte et les identifiants de boutique sont des identifiants différents.
Pour la compatibilité, les demandes API sans pricingMode="universal" conservent la tarification native et les restrictions de monnaie d'origine. Les factures existantes ne sont jamais recalculées. Les reçus confirmés dans les analyses reflètent les paiements vérifiés moins les dépenses de facture enregistrées ; ils ne constituent pas un solde retirable. Les monnaies de facture héritées restent séparées et les paiements sont organisés avec le support. Exécutez une commande uniquement après avoir vérifié payment.fulfillmentReady=true et payment.status="succeeded" via l'API serveur, l'historique d'événements ou un webhook signé.
{
"pricingMode": "universal",
"title": "Order 1042",
"amountMinor": 1000,
"currency": "USD",
"methods": [
"card",
"alipay",
"sbp",
"crypto"
],
"vatCustomerPercent": 100,
"feeCustomerPercent": 0
}Points d’accès API #
Ouvrez un point d’accès pour voir champs, autorisation et réponses. Les schémas utilisent le même document OpenAPI accessible publiquement.
Service
État du service public.
GET/api/config
Préparation d'intégration actuelle
Réponses
200Configuration sans secrets.
telegramobjectobligatoiresupportobjectobligatoiregatewayobjectobligatoirecapabilitiesobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/health
État de l'API et des tables D1
not_configured peut avoir status=ok : les pages publiques et la recherche peuvent fonctionner sans base de données. Une base de données configurée avec des tables indisponibles renvoie 503/dégradé. Cette réponse ne teste pas la connectivité réseau Telegram ou modèle.
Réponses
200Le stockage est prêt ou not_configured.
telegramobjectobligatoiresupportobjectobligatoiregatewayobjectobligatoirecapabilitiesobjectobligatoirestatusok | degradedobligatoirestorageready | not_configured | unavailableobligatoire503D1 est indisponible ou une erreur de service inattendue s'est produite.
Variante 1
telegramobjectobligatoiresupportobjectobligatoiregatewayobjectobligatoirecapabilitiesobjectobligatoirestatusok | degradedobligatoirestorageready | not_configured | unavailableobligatoireVariante 2
errorobjectobligatoireGET/openapi.json
Contrat public lisible par machine
Lecture seule. Ne contient aucun secret, session, enregistrement d'utilisateur ni contrat opérationnel de fournisseur de paiement.
Réponses
200Ce document OpenAPI 3.1.
object
POST/api/jobs/dispatch
Exécuter les tâches de livraison et d'application dues
Point d'entrée du planificateur serveur. Nécessite JOBS_SECRET, pas une session navigateur ni une clé marchande. N'accepte pas d'identifiants de tâche ni d'URL sortantes arbitraires.
Réponses
200Terminé sans contexte d'arrière-plan.
object
202Accepté dans un contexte d'exécution en arrière-plan.
acceptedtrueobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireAuth
L'inscription et la connexion partagent le flux Telegram vérifié.
GET/api/auth/me
Session actuelle et CSRF
Réponses
200authenticated=false lorsqu'aucune session valide n'existe.
Variante 1
authenticatedfalseobligatoireVariante 2
authenticatedtrueobligatoireuserobjectobligatoirecsrfTokenstringobligatoireexpiresAtintegerobligatoireHorodatage Unix en millisecondes, UTC.
503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/auth/telegram/start
Démarrer la connexion ou l'inscription
Crée un défi de 300 secondes et un cookie de preuve de navigateur HttpOnly ; au maximum six démarrages par minute par adresse hachée. Comparez le code à six chiffres sur le site et dans le chat privé du bot.
En-têtes et paramètres
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
Corps JSON
Réponses
201Demande de connexion créée ; le cookie de preuve la lie au navigateur d'origine.
challengeIdstringobligatoirecodestringobligatoireexpiresAtintegerobligatoireHorodatage Unix en millisecondes, UTC.
telegramUrlstringobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/auth/telegram/complete
Terminer une connexion vérifiée
Nécessite le cookie de preuve du début et le même navigateur. En attente renvoie 202. Après confirmation du bot, la demande émet une session de 24 heures. Jusqu'à 90 vérifications par minute par défi. Un identifiant Telegram fourni par le client n'est pas accepté.
En-têtes et paramètres
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
Corps JSON
challengeIdstringobligatoireRéponses
200Compte créé ou mis à jour et session émise.
status"authenticated"obligatoireuserobjectobligatoirecsrfTokenstringobligatoireexpiresAtintegerobligatoireHorodatage Unix en millisecondes, UTC.
202En attente de confirmation dans Telegram.
status"pending"obligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire410La demande de connexion de cinq minutes a expiré.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/auth/logout
Terminer la session actuelle
Aucun corps n'est requis ou lu. La commande /logout du bot termine séparément toutes les sessions du compte.
En-têtes et paramètres
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
Réponses
200Session supprimée et cookie effacé.
loggedOuttrueobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireAccount
Paramètres de l'utilisateur actuel uniquement.
GET/api/account/settings
Paramètres de l'utilisateur actuel
En-têtes et paramètres
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Réponses
200Champs publics du profil de l'utilisateur actuel.
userobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePATCH/api/account/settings
Modifier le nom du magasin, l'assujetti à la TVA ou les notifications
Tous les champs sont facultatifs : correctif partiel. Enregistrer vatPayer ne crée pas d'opération financière. Les interrupteurs paiements et versements contrôlent les préférences, pas la disponibilité de la passerelle.
En-têtes et paramètres
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Corps JSON
storeNamestringLes espaces environnants sont supprimés. Longueur après suppression : 1–80 caractères. Les caractères de contrôle sauf les tabulations et les sauts de ligne sont interdits.
vatPayercustomer | merchantnotificationsobjectRéponses
200Profil mis à jour.
userobjectobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/stores
Répertorier toutes les boutiques possédées par le compte actuel
Réponses
200Les identifiants de boutique sont distincts des identifiants de compte. Aucun secret n'est exposé.
storesarray<object>obligatoiredefaultStoreIdstringobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/stores
Créer une boutique séparée
Jusqu'à 100 boutiques/compte et 10 créations/heure/compte. Une nouvelle boutique nécessite sa propre approbation de site Web avant de démarrer un paiement.
En-têtes et paramètres
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
Corps JSON
namestringobligatoireRéponses
201Créé.
storeobjectobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePATCH/api/stores/{id}
Renommer une boutique possédée ou modifier sa TVA par défaut
En-têtes et paramètres
idpathobligatoireOriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
Corps JSON
namestringvatPayercustomer | merchantRéponses
200Les cotations de facture existantes sont inchangées.
storeobjectobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/account/dashboard
Lire les reçus vérifiés pour une boutique ou toutes les boutiques possédées
Les reçus nets ne constituent pas un solde retirable. Les monnaies héritées restent séparées. Les totaux sont de tous les temps ; les répartitions quotidiennes/par méthode utilisent la période UTC demandée.
En-têtes et paramètres
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
daysqueryRéponses
200Résumé comptable en lecture seule.
storeIdstring | nullobligatoirestoresarray<object>obligatoiretotalsarray<object>obligatoiredailyarray<object>obligatoiremethodsarray<object>obligatoiredays7 | 30obligatoirefromintegerobligatoireHorodatage Unix en millisecondes, UTC.
generatedAtintegerobligatoireHorodatage Unix en millisecondes, UTC.
accountingBasis"verified_receipts"obligatoirewithdrawableBalancenullobligatoirepayoutCreationAvailablefalseobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePayment links
Factures serveur pour le magasin actuel. Le prix, la devise, l'assujetti à la TVA, le nom du vendeur et le calcul sont immuables.
GET/api/payment-links
Lister les liens de paiement possédés
Triés par createdAt DESC, id DESC. Les liens publics fonctionnent sur tous les appareils ; la liste nécessite un compte.
En-têtes et paramètres
limitquerycursorquerynextCursor de la réponse précédente. Le service utilise JSON base64 [createdAt,id] ; passez-le inchangé via URLSearchParams.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Réponses
200Une page de liens de paiement possédés.
linksarray<object>obligatoirenextCursorstring | nullobligatoireCurseur opaque de page suivante. Passez-le comme paramètre de requête encodé URL ; null marque la fin.
400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/payment-links
Créer une facture avec conditions immuables
Créer une facture immuable et recevoir immédiatement checkoutUrl ; cela ne débite pas l'acheteur. USD : carte/Alipay ; RUB : SBP ; USDT : crypto. L'USD crypto reste accepté pour compatibilité mais ne peut pas être payé sans facture USDT. Les parts client des frais et de la TVA sont des entiers indépendants de 0 à 100 ; la carte/Alipay live actuelle prend en charge TVA client=100 et frais client=0. Le total client n'est jamais modifié silencieusement. La dernière application du site Web doit être approuvée avant un nouveau débit live. La création de facture et son événement marchand sont validés atomiquement.
En-têtes et paramètres
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
Idempotency-KeyheaderobligatoireUne clé par demande logique. Une répétition avec une entrée canonique identique renvoie l'enregistrement original ; une entrée différente avec la même clé renvoie 409.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Corps JSON
Devise USD
titlestringobligatoireLes espaces environnants sont supprimés. Longueur après suppression : 1 à 120 caractères. Les caractères de contrôle, à l'exception des tabulations et des sauts de ligne, sont interdits.
descriptionstringFacultatif ; une chaîne vide est autorisée. Jusqu'à 500 caractères après suppression des espaces.
amountMinorintegerobligatoireLimite entière technique, pas une limite commerciale du fournisseur. Un crédit marchand négatif est rejeté.
vatPayercustomer | merchantLorsqu'il est omis, la règle actuelle du magasin est enregistrée.
expiresAtintegerUn moment futur, au plus 90 jours après la création. Par défaut sept jours. Enregistré dans l'instantané de la facture.
currency"USD"obligatoiremethodsarray<card | alipay | crypto>obligatoireLe nouveau paiement USD prend en charge la carte et Alipay. Les factures crypto USD sont acceptées uniquement pour compatibilité et renvoient crypto_requires_usdt au paiement en direct ; utilisez USDT pour la crypto.
vatCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout. Par défaut : la préférence TVA héritée du magasin.
feeCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout.
orderIdstringRéférence de commande visible par l'acheteur.
metadataobjectMétadonnées privées du marchand. Au plus 3000 octets UTF-8 après sérialisation JSON. Jamais exposées dans le paiement public.
pricingMode"native"Tarification héritée spécifique à la monnaie. Omettre pour la compatibilité avec les intégrations existantes.
Devise RUB
titlestringobligatoireLes espaces environnants sont supprimés. Longueur après suppression : 1 à 120 caractères. Les caractères de contrôle, à l'exception des tabulations et des sauts de ligne, sont interdits.
descriptionstringFacultatif ; une chaîne vide est autorisée. Jusqu'à 500 caractères après suppression des espaces.
amountMinorintegerobligatoireLimite entière technique, pas une limite commerciale du fournisseur. Un crédit marchand négatif est rejeté.
vatPayercustomer | merchantLorsqu'il est omis, la règle actuelle du magasin est enregistrée.
expiresAtintegerUn moment futur, au plus 90 jours après la création. Par défaut sept jours. Enregistré dans l'instantané de la facture.
currency"RUB"obligatoiremethodsarray<"sbp">obligatoirevatCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout. Par défaut : la préférence TVA héritée du magasin.
feeCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout.
orderIdstringRéférence de commande visible par l'acheteur.
metadataobjectMétadonnées privées du marchand. Au plus 3000 octets UTF-8 après sérialisation JSON. Jamais exposées dans le paiement public.
pricingMode"native"Tarification héritée spécifique à la monnaie. Omettre pour la compatibilité avec les intégrations existantes.
Devise USDT
titlestringobligatoireLes espaces environnants sont supprimés. Longueur après suppression : 1 à 120 caractères. Les caractères de contrôle, à l'exception des tabulations et des sauts de ligne, sont interdits.
descriptionstringFacultatif ; une chaîne vide est autorisée. Jusqu'à 500 caractères après suppression des espaces.
amountMinorintegerobligatoireLimite entière technique, pas une limite commerciale du fournisseur. Un crédit marchand négatif est rejeté.
vatPayercustomer | merchantLorsqu'il est omis, la règle actuelle du magasin est enregistrée.
expiresAtintegerUn moment futur, au plus 90 jours après la création. Par défaut sept jours. Enregistré dans l'instantané de la facture.
currency"USDT"obligatoiremethodsarray<"crypto">obligatoirevatCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout. Par défaut : la préférence TVA héritée du magasin.
feeCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout.
orderIdstringRéférence de commande visible par l'acheteur.
metadataobjectMétadonnées privées du marchand. Au plus 3000 octets UTF-8 après sérialisation JSON. Jamais exposées dans le paiement public.
pricingMode"native"Tarification héritée spécifique à la monnaie. Omettre pour la compatibilité avec les intégrations existantes.
Variante 4
titlestringobligatoireLes espaces environnants sont supprimés. Longueur après suppression : 1 à 120 caractères. Les caractères de contrôle, à l'exception des tabulations et des sauts de ligne, sont interdits.
descriptionstringFacultatif ; une chaîne vide est autorisée. Jusqu'à 500 caractères après suppression des espaces.
amountMinorintegerobligatoireLimite entière technique, pas une limite commerciale du fournisseur. Un crédit marchand négatif est rejeté.
vatPayercustomer | merchantLorsqu'il est omis, la règle actuelle du magasin est enregistrée.
expiresAtintegerUn moment futur, au plus 90 jours après la création. Par défaut sept jours. Enregistré dans l'instantané de la facture.
currencyUSD | RUB | USDTobligatoireUnité d'entrée. RUB est converti en USD au taux de référence enregistré ; USDT utilise la règle de facturation explicite 1:1. La monnaie de base de facture enregistrée est USD.
methodsarray<card | alipay | sbp | crypto>obligatoirevatCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout. Par défaut : la préférence TVA héritée du magasin.
feeCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout.
orderIdstringRéférence de commande visible par l'acheteur.
metadataobjectMétadonnées privées du marchand. Au plus 3000 octets UTF-8 après sérialisation JSON. Jamais exposées dans le paiement public.
pricingMode"universal"obligatoireRéponses
200Relecture idempotente ; replayed=true.
linkobjectobligatoirereplayedbooleanobligatoirecheckoutUrlstringobligatoireLe lien de paiement est disponible immédiatement ; aucune interrogation périodique n'est requise.
201Facture créée ; replayed=false.
linkobjectobligatoirereplayedbooleanobligatoirecheckoutUrlstringobligatoireLe lien de paiement est disponible immédiatement ; aucune interrogation périodique n'est requise.
400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/payment-links/{id}
Lien possédé et calcul enregistré
En-têtes et paramètres
idpathobligatoireIdentifiant de lien possédé, pas le jeton public.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Réponses
200L'identifiant d'un autre utilisateur et un identifiant manquant renvoient tous deux 404.
linkobjectobligatoirecheckoutUrlstringInclus dans les réponses de mise à jour de statut ; le lien imbriqué contient toujours son checkoutUrl.
401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePATCH/api/payment-links/{id}
Suspendre, reprendre ou annuler un lien
Modifie uniquement le statut. La mise à jour et l'événement facture.updated immuable sont validés atomiquement. Les modifications simultanées utilisent une vérification de version ; actualisez et réessayez en cas de LINK_CHANGED. cancelled est terminal, l'expiration n'est jamais prolongée, et le prix, les méthodes, les parts de coûts et la description restent figés. Répéter le statut enregistré renvoie la facture actuelle.
En-têtes et paramètres
idpathobligatoireIdentifiant de lien possédé, pas le jeton public.
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Corps JSON
statusactive | paused | cancelledobligatoireRéponses
200État actuel du lien possédé.
linkobjectobligatoirecheckoutUrlstringInclus dans les réponses de mise à jour de statut ; le lien imbriqué contient toujours son checkoutUrl.
400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireCheckout
Lire une facture sans compte. La disponibilité du paiement est vérifiée séparément.
GET/api/checkout/{token}
Détails de facture publique pour le client
Lire le devis de facture publique immuable et son instantané de paiement persisté. method doit appartenir à la facture. Aucun compte n'est requis. N'expose pas l'identité du propriétaire, les métadonnées privées ni les revenus du marchand. Le jeton accorde l'accès uniquement à ce paiement. availability reflète la configuration, l'allocation, les limites techniques et l'approbation du marchand ; la confirmation de paiement est séparée.
En-têtes et paramètres
tokenpathobligatoireIdentifiant public aléatoire de l'URL de paiement. Accorde l'accès en lecture uniquement à cette facture.
methodqueryDoit être présent dans les méthodes enregistrées de la facture.
Réponses
200Facture publique et paiement existant, s'il a été émis.
invoiceobjectobligatoirepaymentoneOfobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/checkout/{token}/pay
Démarrer ou reprendre le paiement de la facture
Opération acheteur de même origine ; aucun compte ni jeton CSRF requis. Le serveur réserve une opération et une clé d'idempotence stable avant l'envoi à la passerelle. Une répétition récupère la même opération ; une réponse perdue doit être résolue via le statut. La méthode de paiement se verrouille après l'envoi. Les données de carte doivent être chiffrées par le navigateur avec une intention de paiement fraîche. SBP/crypto utilisent le total client enregistré ; carte/Alipay utilisent la configuration fiscale immuable prise en charge. Les nouveaux frais nécessitent une demande marchande approuvée. Les paiements envoyés existants peuvent être récupérés après l'expiration de la facture, une pause ou des changements d'approbation. Aucune route /v2 ni de carte hébergée n'est utilisée.
En-têtes et paramètres
tokenpathobligatoireIdentifiant public aléatoire de l'URL de paiement. Accorde l'accès en lecture uniquement à cette facture.
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
Corps JSON
Variante 1
method"card"obligatoiresealedobjectobligatoireVariante 2
method"alipay"obligatoirenamestringobligatoirecountry"CN"obligatoireemailstringVariante 3
method"sbp"obligatoireVariante 4
method"crypto"obligatoirepayerCurrencystringobligatoirenetworkstringobligatoireRéponses
200Opération existante récupérée ; aucun second paiement.
paymentoneOfobligatoirereplayedboolean202Opération envoyée ; l'achèvement est asynchrone.
paymentoneOfobligatoirereplayedboolean400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire410L'intention de chiffrement de la passerelle ou le défi bancaire a expiré. Obtenez une nouvelle intention pour la même opération ; ne créez pas de paiement de remplacement.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire502Réponse de la passerelle indisponible, malformée ou non vérifiable. Lisez le statut de paiement existant avant de tenter toute nouvelle tentative.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/checkout/{token}/status
Lire et actualiser le même paiement
Aucun compte n'est requis. Actualise une opération existante via un transport de passerelle authentifié, avec limitation côté serveur. Aucun nouveau paiement n'est créé. Renvoie null si rien n'a été envoyé. Confirmez une commande uniquement lorsque fulfillmentReady est vrai.
En-têtes et paramètres
tokenpathobligatoireIdentifiant public aléatoire de l'URL de paiement. Accorde l'accès en lecture uniquement à cette facture.
Réponses
200État de paiement assaini actuel.
paymentoneOfobligatoirereplayedboolean400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire502Réponse de la passerelle indisponible, malformée ou non vérifiable. Lisez le statut de paiement existant avant de tenter toute nouvelle tentative.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/checkout/{token}/reconcile
Demander un réconciliation d'état faisant autorité
Lit l'opération existante et demande à la passerelle de réconcilier son état de fournisseur. Ne crée pas de paiement. Au plus 3 requêtes par facture par minute. Disponible pour les paiements déjà envoyés même si la facture n'est plus active.
En-têtes et paramètres
tokenpathobligatoireIdentifiant public aléatoire de l'URL de paiement. Accorde l'accès en lecture uniquement à cette facture.
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
Corps JSON
Réponses
200Paiement réconcilié ou null.
paymentoneOfobligatoirereplayedboolean400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire410L'intention de chiffrement de la passerelle ou le défi bancaire a expiré. Obtenez une nouvelle intention pour la même opération ; ne créez pas de paiement de remplacement.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire502Réponse de la passerelle indisponible, malformée ou non vérifiable. Lisez le statut de paiement existant avant de tenter toute nouvelle tentative.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/checkout/{token}/card-intent
Obtenir une clé publique de passerelle et une intention de chiffrement liée
La passerelle seule possède la clé privée. Une intention expire dans les cinq minutes et lie la commande marchande, la devise, les montants de base/total, la clé d'idempotence de l'opération et l'objet. Les intentions de paiement exigent une facture active et un marchand approuvé ; les intentions de code exigent un défi bancaire existant et actuel. Aucun champ PAN, CVV, code bancaire ou JWK privé n'est accepté par ce point de terminaison. Au plus 8 intentions par facture et 12 par client par minute. Le texte en clair chiffré est {intent,name,country,email?,card:{number,expiration,cvv,holder}} pour le paiement ou {intent,code} pour le code. Le texte en clair est assemblé uniquement dans le navigateur avant le chiffrement JWE.
En-têtes et paramètres
tokenpathobligatoireIdentifiant public aléatoire de l'URL de paiement. Accorde l'accès en lecture uniquement à cette facture.
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
Corps JSON
purposepayment | codeRéponses
200Intention de courte durée et clé publique RSA uniquement.
intentstringobligatoireintentIdstringobligatoireexpiresAtintegerobligatoireHorodatage Unix en millisecondes, UTC.
keyobjectobligatoirealgorithm"RSA-OAEP-256"obligatoireencryption"A256GCM"obligatoireprotocol"kevmi-card-v1"obligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire410L'intention de chiffrement de la passerelle ou le défi bancaire a expiré. Obtenez une nouvelle intention pour la même opération ; ne créez pas de paiement de remplacement.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire502Réponse de la passerelle indisponible, malformée ou non vérifiable. Lisez le statut de paiement existant avant de tenter toute nouvelle tentative.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/checkout/{token}/code
Relayer un code chiffré pour le défi bancaire actuel
Obtenir une intention purpose=code et chiffrer {intent,code} dans le navigateur. La passerelle valide le défi actuel et consomme l'intention scellée une fois. Kevmi ne reçoit jamais le code en clair. Au plus 5 soumissions par facture par minute ; actualiser l'état après une réponse incertaine.
En-têtes et paramètres
tokenpathobligatoireIdentifiant public aléatoire de l'URL de paiement. Accorde l'accès en lecture uniquement à cette facture.
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
Corps JSON
sealedobjectobligatoireRéponses
202Code envoyé ; état de paiement actuel.
paymentoneOfobligatoirereplayedboolean400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire410L'intention de chiffrement de la passerelle ou le défi bancaire a expiré. Obtenez une nouvelle intention pour la même opération ; ne créez pas de paiement de remplacement.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire502Réponse de la passerelle indisponible, malformée ou non vérifiable. Lisez le statut de paiement existant avant de tenter toute nouvelle tentative.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/checkout/{token}/crypto-services
Lire le catalogue actuel des pièces et des réseaux
Uniquement pour une facture USDT qui autorise la crypto. La facture reste libellée en USDT ; la passerelle cite la pièce de payeur choisie. Ne jamais supposer que USD équivaut à USDT ni convertir le montant du transfert en nombre à virgule flottante. Au plus 10 lectures de catalogue par facture par minute.
En-têtes et paramètres
tokenpathobligatoireIdentifiant public aléatoire de l'URL de paiement. Accorde l'accès en lecture uniquement à cette facture.
Réponses
200Catalogue fourni par la passerelle, avec disponibilité actuelle et limites de transfert.
servicesarray<object>obligatoirefetchedAtintegerobligatoireHorodatage Unix en millisecondes, UTC.
400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire502Réponse de la passerelle indisponible, malformée ou non vérifiable. Lisez le statut de paiement existant avant de tenter toute nouvelle tentative.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireSupport
Base de connaissances publique et demandes d'assistance de l'utilisateur actuel.
POST/api/support/ask
Réponse de la base de connaissances publique complète
Question publique sans session ni CSRF. Une Origin fournie doit correspondre à APP_ORIGIN ; les agents peuvent l'omettre. En mode IA, le serveur envoie tous les articles publiés, faits, catalogue de pages et état de préparation des fonctionnalités. L'historique facultatif et le pageContext sont un contexte de question non fiable. Le modèle ne peut pas accéder aux comptes, à l'argent, aux demandes privées ni aux outils. Avec D1, la limite est de 12 questions par minute par adresse hachée. L'IA nécessite D1, une configuration de fournisseur valide et un quota : 60 générations par heure à l'échelle du service par défaut. L'état de préparation de la configuration ne prouve pas la disponibilité de l'API externe. Les erreurs de fournisseur, l'épuisement du quota ou une sortie invalide renvoient une recherche avec aiUnavailable=true et HTTP 200. Sans configuration de génération, une recherche régulière est renvoyée.
En-têtes et paramètres
OriginheaderDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
Corps JSON
questionstringobligatoireLes espaces environnants sont supprimés. Longueur après suppression : 2–2 000 caractères. Les caractères de contrôle sauf les tabulations et les sauts de ligne sont interdits.
localeru | en | es | de | fr | pt | tr | kkLangue de réponse. Si omise, les préférences Accept-Language prises en charge sont utilisées ; sinon anglais. La documentation est disponible dans chaque langue d'interface prise en charge.
historyarray<oneOf>Jusqu'aux trois dernières paires question-réponse. Optionnel. Contexte non fiable, pas des messages de rôle système du fournisseur.
pageContextstringLibellé de section court après suppression, 1–80 caractères. Autorise les lettres, chiffres, espaces et ·.,—–-:(). Les sauts de ligne, URLs, paramètres de requête et HTML sont interdits. Ne pas inclure de jetons ni de secrets.
Réponses
200Une réponse ou une documentation correspondante avec des liens d'articles validés.
Variante 1
mode"search"obligatoireanswerstringobligatoiresourcesarray<object>obligatoireknowledgeVersionstring | nullobligatoireneedsHumanbooleanobligatoireaiUnavailabletrueVariante 2
mode"ai"obligatoireanswerstringobligatoireTexte brut uniquement ; les URLs et HTML sont rejetés. Les liens sont renvoyés uniquement dans les sources.
sourcesarray<object>obligatoireknowledgeVersionstringobligatoireneedsHumanbooleanobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/support/tickets
Les 30 dernières demandes de support possédées
Réponses
200Plus récentes d'abord par createdAt ; renvoie les 30 derniers enregistrements.
ticketsarray<object>obligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/support/tickets
Enregistrer une demande de support
Jusqu'à six demandes par utilisateur par heure, partagées entre le site Web et le bot. L'enregistrement crée un enregistrement de compte. Conservez sa référence pour demander l'état.
En-têtes et paramètres
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
Corps JSON
subjectstringobligatoireLes espaces environnants sont supprimés. Longueur après suppression : 1 à 120 caractères. Les caractères de contrôle, à l'exception des tabulations et des sauts de ligne, sont interdits.
messagestringobligatoireLes espaces environnants sont supprimés. Longueur après suppression : 5 à 4 000 caractères. Les caractères de contrôle, à l'exception des tabulations et des sauts de ligne, sont interdits.
Réponses
201Demande de support enregistrée.
ticketobjectobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/support/tickets/{id}
Lire une demande de support possédée
En-têtes et paramètres
idpathobligatoireIdentifiant d'une demande de support possédée.
Réponses
200La demande d'un autre utilisateur et une demande manquante renvoient toutes deux 404.
ticketobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePATCH/api/support/tickets/{id}
Fermer une demande de support possédée
Le seul changement autorisé est le statut=closed. Cette API ne rouvre pas les demandes, ne modifie pas les messages et ne soumet pas de réponses d'opérateur.
En-têtes et paramètres
idpathobligatoireIdentifiant d'une demande de support possédée.
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
Corps JSON
status"closed"obligatoireRéponses
200Demande de support fermée.
closedtrueobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireNotifications
Centre d'événements du compte, état de lecture du site et état de livraison Telegram indépendant.
GET/api/notifications
Une page de notifications possédées
Jusqu'à 30 enregistrements, triés par createdAt DESC puis id DESC. La liste ne modifie pas readAt et ne déclenche pas de livraison. unreadCount est le nombre total de non-lus de l'utilisateur actuel toutes pages confondues. Les champs du propriétaire, l'identifiant Telegram et les secrets sont exclus.
En-têtes et paramètres
unreadquery1 sélectionne uniquement les non-lus ; 0 ou une valeur omise sélectionne tous les événements.
cursorquerynextCursor de la réponse précédente. Passez-le inchangé via URLSearchParams ; format createdAt:id, avec createdAt un entier sûr en millisecondes.
Réponses
200Événements avec états de lecture et de livraison indépendants.
notificationsarray<object>obligatoireunreadCountintegerobligatoirenextCursorstring | nullobligatoireCurseur de page suivante ; null si aucun autre enregistrement ne subsiste.
400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePATCH/api/notifications/read
Marquer les notifications possédées comme lues
Accepte soit ids, soit all:true avec before. before est l'heure du dernier événement observé et ne peut pas dépasser l'heure du serveur. Les événements plus récents restent non-lus. La demande est idempotente : les valeurs readAt existantes ne changent pas. Les identifiants d'autres utilisateurs et les identifiants manquants ne sont ni modifiés ni divulgués. Le statut Telegram et sentAt restent inchangés.
En-têtes et paramètres
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
Corps JSON
Variante 1
idsarray<string>obligatoireLes doublons sont autorisés et comptés une fois.
Variante 2
alltrueobligatoirebeforeintegerobligatoirecreatedAt du dernier événement affiché. Le serveur exige également avant <= Date.now().
Réponses
200Le nombre d'événements nouvellement lus, le temps d'opération et le nombre actuel de non-lus.
updatedintegerobligatoirereadAtintegerobligatoireHorodatage Unix en millisecondes, UTC.
unreadCountintegerobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/notifications/test
Envoyer une notification de test au Telegram du compte
Met un message en file d'attente et tente la livraison. Au maximum trois par utilisateur par heure. Le test n'est pas une notification de paiement et ne modifie pas de solde. HTTP 202 ne confirme pas la livraison ; vérifiez la liste des notifications.
En-têtes et paramètres
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
Corps JSON
Réponses
202Résultat de la mise en file d'attente.
queuedbooleanobligatoireidstring | null400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireTelegram
Webhook de bot ; pas un webhook de paiement.
POST/api/telegram/webhook
Recevoir un événement Telegram Bot API
Nécessite uniquement l'en-tête secret Telegram, sans session, CSRF ni Origin. Des champs Update supplémentaires sont autorisés. Gère message et callback_query ; les actions personnelles nécessitent la discussion privée de l'expéditeur vérifié. Les autres mises à jour sont ignorées. update_id est dédoublonné ; une mise à jour en cours renvoie 503 pour nouvelle tentative. Ce n'est pas un webhook de fournisseur de paiement.
Corps JSON
update_idintegerobligatoiremessageobjectMessage Telegram : le gestionnaire utilise message_id, text, from et chat.
callback_queryobjectTélégramme CallbackQuery : le gestionnaire utilise id, from, data et message.chat.
Réponses
200Traité, ignoré ou déjà pris en charge.
oktrueobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire502La demande Telegram a échoué.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireRoutes financières non prises en charge
Routes monétaires héritées non prises en charge et exécution des versements. Le flux de paiement public a ses propres points de terminaison documentés.
POST/api/payments
Opération financière indisponible
Renvoie 503 GATEWAY_NOT_CONNECTED. Les opérations financières sont indisponibles. Le corps n'est pas traité et aucune demande de passerelle n'est effectuée.
Réponses
503Les opérations financières sont indisponibles.
errorobjectobligatoirePOST/api/payouts
Opération financière indisponible
Renvoie 503 GATEWAY_NOT_CONNECTED. Les opérations financières sont indisponibles. Le corps n'est pas traité et aucune demande de passerelle n'est effectuée.
Réponses
503Les opérations financières sont indisponibles.
errorobjectobligatoireMerchant API
Factures serveur-à-serveur limitées et historique d'événements immuable.
GET/api/v1/payments
Lister les liens de paiement possédés
Triés par createdAt DESC, id DESC. Les liens publics fonctionnent sur tous les appareils ; la liste nécessite un compte.
En-têtes et paramètres
limitquerycursorquerynextCursor de la réponse précédente. Le service utilise JSON base64 [createdAt,id] ; passez-le inchangé via URLSearchParams.
Réponses
200Une page de liens de paiement possédés.
linksarray<object>obligatoirenextCursorstring | nullobligatoireCurseur opaque de page suivante. Passez-le comme paramètre de requête encodé URL ; null marque la fin.
400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/v1/payments
Créer une facture avec conditions immuables
Créer une facture immuable et recevoir immédiatement checkoutUrl ; cela ne débite pas l'acheteur. USD : carte/Alipay ; RUB : SBP ; USDT : crypto. L'USD crypto reste accepté pour compatibilité mais ne peut pas être payé sans facture USDT. Les parts client des frais et de la TVA sont des entiers indépendants de 0 à 100 ; la carte/Alipay live actuelle prend en charge TVA client=100 et frais client=0. Le total client n'est jamais modifié silencieusement. La dernière application du site Web doit être approuvée avant un nouveau débit live. La création de facture et son événement marchand sont validés atomiquement.
En-têtes et paramètres
Idempotency-KeyheaderobligatoireUne clé par demande logique. Une répétition avec une entrée canonique identique renvoie l'enregistrement original ; une entrée différente avec la même clé renvoie 409.
Corps JSON
Devise USD
titlestringobligatoireLes espaces environnants sont supprimés. Longueur après suppression : 1 à 120 caractères. Les caractères de contrôle, à l'exception des tabulations et des sauts de ligne, sont interdits.
descriptionstringFacultatif ; une chaîne vide est autorisée. Jusqu'à 500 caractères après suppression des espaces.
amountMinorintegerobligatoireLimite entière technique, pas une limite commerciale du fournisseur. Un crédit marchand négatif est rejeté.
vatPayercustomer | merchantLorsqu'il est omis, la règle actuelle du magasin est enregistrée.
expiresAtintegerUn moment futur, au plus 90 jours après la création. Par défaut sept jours. Enregistré dans l'instantané de la facture.
currency"USD"obligatoiremethodsarray<card | alipay | crypto>obligatoireLe nouveau paiement USD prend en charge la carte et Alipay. Les factures crypto USD sont acceptées uniquement pour compatibilité et renvoient crypto_requires_usdt au paiement en direct ; utilisez USDT pour la crypto.
vatCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout. Par défaut : la préférence TVA héritée du magasin.
feeCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout.
orderIdstringRéférence de commande visible par l'acheteur.
metadataobjectMétadonnées privées du marchand. Au plus 3000 octets UTF-8 après sérialisation JSON. Jamais exposées dans le paiement public.
pricingMode"native"Tarification héritée spécifique à la monnaie. Omettre pour la compatibilité avec les intégrations existantes.
Devise RUB
titlestringobligatoireLes espaces environnants sont supprimés. Longueur après suppression : 1 à 120 caractères. Les caractères de contrôle, à l'exception des tabulations et des sauts de ligne, sont interdits.
descriptionstringFacultatif ; une chaîne vide est autorisée. Jusqu'à 500 caractères après suppression des espaces.
amountMinorintegerobligatoireLimite entière technique, pas une limite commerciale du fournisseur. Un crédit marchand négatif est rejeté.
vatPayercustomer | merchantLorsqu'il est omis, la règle actuelle du magasin est enregistrée.
expiresAtintegerUn moment futur, au plus 90 jours après la création. Par défaut sept jours. Enregistré dans l'instantané de la facture.
currency"RUB"obligatoiremethodsarray<"sbp">obligatoirevatCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout. Par défaut : la préférence TVA héritée du magasin.
feeCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout.
orderIdstringRéférence de commande visible par l'acheteur.
metadataobjectMétadonnées privées du marchand. Au plus 3000 octets UTF-8 après sérialisation JSON. Jamais exposées dans le paiement public.
pricingMode"native"Tarification héritée spécifique à la monnaie. Omettre pour la compatibilité avec les intégrations existantes.
Devise USDT
titlestringobligatoireLes espaces environnants sont supprimés. Longueur après suppression : 1 à 120 caractères. Les caractères de contrôle, à l'exception des tabulations et des sauts de ligne, sont interdits.
descriptionstringFacultatif ; une chaîne vide est autorisée. Jusqu'à 500 caractères après suppression des espaces.
amountMinorintegerobligatoireLimite entière technique, pas une limite commerciale du fournisseur. Un crédit marchand négatif est rejeté.
vatPayercustomer | merchantLorsqu'il est omis, la règle actuelle du magasin est enregistrée.
expiresAtintegerUn moment futur, au plus 90 jours après la création. Par défaut sept jours. Enregistré dans l'instantané de la facture.
currency"USDT"obligatoiremethodsarray<"crypto">obligatoirevatCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout. Par défaut : la préférence TVA héritée du magasin.
feeCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout.
orderIdstringRéférence de commande visible par l'acheteur.
metadataobjectMétadonnées privées du marchand. Au plus 3000 octets UTF-8 après sérialisation JSON. Jamais exposées dans le paiement public.
pricingMode"native"Tarification héritée spécifique à la monnaie. Omettre pour la compatibilité avec les intégrations existantes.
Variante 4
titlestringobligatoireLes espaces environnants sont supprimés. Longueur après suppression : 1 à 120 caractères. Les caractères de contrôle, à l'exception des tabulations et des sauts de ligne, sont interdits.
descriptionstringFacultatif ; une chaîne vide est autorisée. Jusqu'à 500 caractères après suppression des espaces.
amountMinorintegerobligatoireLimite entière technique, pas une limite commerciale du fournisseur. Un crédit marchand négatif est rejeté.
vatPayercustomer | merchantLorsqu'il est omis, la règle actuelle du magasin est enregistrée.
expiresAtintegerUn moment futur, au plus 90 jours après la création. Par défaut sept jours. Enregistré dans l'instantané de la facture.
currencyUSD | RUB | USDTobligatoireUnité d'entrée. RUB est converti en USD au taux de référence enregistré ; USDT utilise la règle de facturation explicite 1:1. La monnaie de base de facture enregistrée est USD.
methodsarray<card | alipay | sbp | crypto>obligatoirevatCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout. Par défaut : la préférence TVA héritée du magasin.
feeCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout.
orderIdstringRéférence de commande visible par l'acheteur.
metadataobjectMétadonnées privées du marchand. Au plus 3000 octets UTF-8 après sérialisation JSON. Jamais exposées dans le paiement public.
pricingMode"universal"obligatoireRéponses
200Relecture idempotente ; replayed=true.
linkobjectobligatoirereplayedbooleanobligatoirecheckoutUrlstringobligatoireLe lien de paiement est disponible immédiatement ; aucune interrogation périodique n'est requise.
201Facture créée ; replayed=false.
linkobjectobligatoirereplayedbooleanobligatoirecheckoutUrlstringobligatoireLe lien de paiement est disponible immédiatement ; aucune interrogation périodique n'est requise.
400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/v1/payments/{id}
Lien possédé et calcul enregistré
En-têtes et paramètres
idpathobligatoireIdentifiant de lien possédé, pas le jeton public.
Réponses
200L'identifiant d'un autre utilisateur et un identifiant manquant renvoient tous deux 404.
linkobjectobligatoirecheckoutUrlstringInclus dans les réponses de mise à jour de statut ; le lien imbriqué contient toujours son checkoutUrl.
401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePATCH/api/v1/payments/{id}
Suspendre, reprendre ou annuler un lien
Modifie uniquement le statut. La mise à jour et l'événement facture.updated immuable sont validés atomiquement. Les modifications simultanées utilisent une vérification de version ; actualisez et réessayez en cas de LINK_CHANGED. cancelled est terminal, l'expiration n'est jamais prolongée, et le prix, les méthodes, les parts de coûts et la description restent figés. Répéter le statut enregistré renvoie la facture actuelle.
En-têtes et paramètres
idpathobligatoireIdentifiant de lien possédé, pas le jeton public.
Corps JSON
statusactive | paused | cancelledobligatoireRéponses
200État actuel du lien possédé.
linkobjectobligatoirecheckoutUrlstringInclus dans les réponses de mise à jour de statut ; le lien imbriqué contient toujours son checkoutUrl.
400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/v1/payment-links
Lister les liens de paiement possédés
Triés par createdAt DESC, id DESC. Les liens publics fonctionnent sur tous les appareils ; la liste nécessite un compte.
En-têtes et paramètres
limitquerycursorquerynextCursor de la réponse précédente. Le service utilise JSON base64 [createdAt,id] ; passez-le inchangé via URLSearchParams.
Réponses
200Une page de liens de paiement possédés.
linksarray<object>obligatoirenextCursorstring | nullobligatoireCurseur opaque de page suivante. Passez-le comme paramètre de requête encodé URL ; null marque la fin.
400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/v1/payment-links
Créer une facture avec conditions immuables
Créer une facture immuable et recevoir immédiatement checkoutUrl ; cela ne débite pas l'acheteur. USD : carte/Alipay ; RUB : SBP ; USDT : crypto. L'USD crypto reste accepté pour compatibilité mais ne peut pas être payé sans facture USDT. Les parts client des frais et de la TVA sont des entiers indépendants de 0 à 100 ; la carte/Alipay live actuelle prend en charge TVA client=100 et frais client=0. Le total client n'est jamais modifié silencieusement. La dernière application du site Web doit être approuvée avant un nouveau débit live. La création de facture et son événement marchand sont validés atomiquement.
En-têtes et paramètres
Idempotency-KeyheaderobligatoireUne clé par demande logique. Une répétition avec une entrée canonique identique renvoie l'enregistrement original ; une entrée différente avec la même clé renvoie 409.
Corps JSON
Devise USD
titlestringobligatoireLes espaces environnants sont supprimés. Longueur après suppression : 1 à 120 caractères. Les caractères de contrôle, à l'exception des tabulations et des sauts de ligne, sont interdits.
descriptionstringFacultatif ; une chaîne vide est autorisée. Jusqu'à 500 caractères après suppression des espaces.
amountMinorintegerobligatoireLimite entière technique, pas une limite commerciale du fournisseur. Un crédit marchand négatif est rejeté.
vatPayercustomer | merchantLorsqu'il est omis, la règle actuelle du magasin est enregistrée.
expiresAtintegerUn moment futur, au plus 90 jours après la création. Par défaut sept jours. Enregistré dans l'instantané de la facture.
currency"USD"obligatoiremethodsarray<card | alipay | crypto>obligatoireLe nouveau paiement USD prend en charge la carte et Alipay. Les factures crypto USD sont acceptées uniquement pour compatibilité et renvoient crypto_requires_usdt au paiement en direct ; utilisez USDT pour la crypto.
vatCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout. Par défaut : la préférence TVA héritée du magasin.
feeCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout.
orderIdstringRéférence de commande visible par l'acheteur.
metadataobjectMétadonnées privées du marchand. Au plus 3000 octets UTF-8 après sérialisation JSON. Jamais exposées dans le paiement public.
pricingMode"native"Tarification héritée spécifique à la monnaie. Omettre pour la compatibilité avec les intégrations existantes.
Devise RUB
titlestringobligatoireLes espaces environnants sont supprimés. Longueur après suppression : 1 à 120 caractères. Les caractères de contrôle, à l'exception des tabulations et des sauts de ligne, sont interdits.
descriptionstringFacultatif ; une chaîne vide est autorisée. Jusqu'à 500 caractères après suppression des espaces.
amountMinorintegerobligatoireLimite entière technique, pas une limite commerciale du fournisseur. Un crédit marchand négatif est rejeté.
vatPayercustomer | merchantLorsqu'il est omis, la règle actuelle du magasin est enregistrée.
expiresAtintegerUn moment futur, au plus 90 jours après la création. Par défaut sept jours. Enregistré dans l'instantané de la facture.
currency"RUB"obligatoiremethodsarray<"sbp">obligatoirevatCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout. Par défaut : la préférence TVA héritée du magasin.
feeCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout.
orderIdstringRéférence de commande visible par l'acheteur.
metadataobjectMétadonnées privées du marchand. Au plus 3000 octets UTF-8 après sérialisation JSON. Jamais exposées dans le paiement public.
pricingMode"native"Tarification héritée spécifique à la monnaie. Omettre pour la compatibilité avec les intégrations existantes.
Devise USDT
titlestringobligatoireLes espaces environnants sont supprimés. Longueur après suppression : 1 à 120 caractères. Les caractères de contrôle, à l'exception des tabulations et des sauts de ligne, sont interdits.
descriptionstringFacultatif ; une chaîne vide est autorisée. Jusqu'à 500 caractères après suppression des espaces.
amountMinorintegerobligatoireLimite entière technique, pas une limite commerciale du fournisseur. Un crédit marchand négatif est rejeté.
vatPayercustomer | merchantLorsqu'il est omis, la règle actuelle du magasin est enregistrée.
expiresAtintegerUn moment futur, au plus 90 jours après la création. Par défaut sept jours. Enregistré dans l'instantané de la facture.
currency"USDT"obligatoiremethodsarray<"crypto">obligatoirevatCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout. Par défaut : la préférence TVA héritée du magasin.
feeCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout.
orderIdstringRéférence de commande visible par l'acheteur.
metadataobjectMétadonnées privées du marchand. Au plus 3000 octets UTF-8 après sérialisation JSON. Jamais exposées dans le paiement public.
pricingMode"native"Tarification héritée spécifique à la monnaie. Omettre pour la compatibilité avec les intégrations existantes.
Variante 4
titlestringobligatoireLes espaces environnants sont supprimés. Longueur après suppression : 1 à 120 caractères. Les caractères de contrôle, à l'exception des tabulations et des sauts de ligne, sont interdits.
descriptionstringFacultatif ; une chaîne vide est autorisée. Jusqu'à 500 caractères après suppression des espaces.
amountMinorintegerobligatoireLimite entière technique, pas une limite commerciale du fournisseur. Un crédit marchand négatif est rejeté.
vatPayercustomer | merchantLorsqu'il est omis, la règle actuelle du magasin est enregistrée.
expiresAtintegerUn moment futur, au plus 90 jours après la création. Par défaut sept jours. Enregistré dans l'instantané de la facture.
currencyUSD | RUB | USDTobligatoireUnité d'entrée. RUB est converti en USD au taux de référence enregistré ; USDT utilise la règle de facturation explicite 1:1. La monnaie de base de facture enregistrée est USD.
methodsarray<card | alipay | sbp | crypto>obligatoirevatCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout. Par défaut : la préférence TVA héritée du magasin.
feeCustomerPercentintegerPart du client, en pourcentage entier. 0 signifie que le marchand couvre tout ; 100 signifie que le client couvre tout.
orderIdstringRéférence de commande visible par l'acheteur.
metadataobjectMétadonnées privées du marchand. Au plus 3000 octets UTF-8 après sérialisation JSON. Jamais exposées dans le paiement public.
pricingMode"universal"obligatoireRéponses
200Relecture idempotente ; replayed=true.
linkobjectobligatoirereplayedbooleanobligatoirecheckoutUrlstringobligatoireLe lien de paiement est disponible immédiatement ; aucune interrogation périodique n'est requise.
201Facture créée ; replayed=false.
linkobjectobligatoirereplayedbooleanobligatoirecheckoutUrlstringobligatoireLe lien de paiement est disponible immédiatement ; aucune interrogation périodique n'est requise.
400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/v1/payment-links/{id}
Lien possédé et calcul enregistré
En-têtes et paramètres
idpathobligatoireIdentifiant de lien possédé, pas le jeton public.
Réponses
200L'identifiant d'un autre utilisateur et un identifiant manquant renvoient tous deux 404.
linkobjectobligatoirecheckoutUrlstringInclus dans les réponses de mise à jour de statut ; le lien imbriqué contient toujours son checkoutUrl.
401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePATCH/api/v1/payment-links/{id}
Suspendre, reprendre ou annuler un lien
Modifie uniquement le statut. La mise à jour et l'événement facture.updated immuable sont validés atomiquement. Les modifications simultanées utilisent une vérification de version ; actualisez et réessayez en cas de LINK_CHANGED. cancelled est terminal, l'expiration n'est jamais prolongée, et le prix, les méthodes, les parts de coûts et la description restent figés. Répéter le statut enregistré renvoie la facture actuelle.
En-têtes et paramètres
idpathobligatoireIdentifiant de lien possédé, pas le jeton public.
Corps JSON
statusactive | paused | cancelledobligatoireRéponses
200État actuel du lien possédé.
linkobjectobligatoirecheckoutUrlstringInclus dans les réponses de mise à jour de statut ; le lien imbriqué contient toujours son checkoutUrl.
400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/api-keys
Lister les métadonnées de ses propres clés
En-têtes et paramètres
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Réponses
200Les secrets et les hachages de secrets sont omis.
keysarray<object>obligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/api-keys
Créer une clé à portée limitée ; révéler son secret une seule fois
Maximum 10 clés actives. Au plus 5 créations/heure/utilisateur. Les clés expirent, peuvent être révoquées et sont limitées à 90 requêtes API/minute/clé.
En-têtes et paramètres
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Corps JSON
namestringobligatoirescopesarray<invoices:read | invoices:write | events:read>expiresInDaysintegerRéponses
201Stockez le secret de manière sécurisée sur votre serveur.
keyobjectobligatoiresecretstringobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireDELETE/api/api-keys/{id}
Révoquer sa propre clé
En-têtes et paramètres
idpathobligatoireOriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Réponses
200Les utilisations futures de la clé sont rejetées.
revokedtrueobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/events
Lire son propre historique d'événements immuable
En-têtes et paramètres
beforequeryLimite d'horodatage exclusive héritée. Ne peut pas être combinée avec cursor. Utilisez nextCursor pour une pagination sans perte.
cursorquerynextCursor opaque renvoyé par la page précédente. Encode [createdAt,id] et préserve les événements partageant un même horodatage.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Réponses
200Plus récents en premier ; jusqu'à 50 événements. Suivez nextCursor jusqu'à null.
eventsarray<object>obligatoirenextCursorstring | nullobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/v1/events
Lire son propre historique d'événements immuable
En-têtes et paramètres
beforequeryLimite d'horodatage exclusive héritée. Ne peut pas être combinée avec cursor. Utilisez nextCursor pour une pagination sans perte.
cursorquerynextCursor opaque renvoyé par la page précédente. Encode [createdAt,id] et préserve les événements partageant un même horodatage.
Réponses
200Plus récents en premier ; jusqu'à 50 événements. Suivez nextCursor jusqu'à null.
eventsarray<object>obligatoirenextCursorstring | nullobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireWebhooks
Points de terminaison HTTPS vérifiés, événements signés, tentatives de livraison et nouvelles tentatives.
GET/api/webhooks
Lister les endpoints et les 30 dernières livraisons
En-têtes et paramètres
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Réponses
200Aucun secret de signature n'est renvoyé.
endpointsarray<object>obligatoiredeliveriesarray<object>obligatoireavailablebooleanobligatoireeventTypesarray<invoice.created | invoice.updated | payment.succeeded | payment.failed | payment.refunded | payment.partially_refunded | payment.disputed | payment.review_required>obligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/webhooks
Enregistrer une destination HTTPS publique
Jusqu'à 5 endpoints et 6 créations/heure/utilisateur. Domaines HTTPS publics uniquement ; aucun identifiant, littéral IP ni port personnalisé. Un endpoint nouvellement créé ne reçoit aucune livraison en direct tant que son défi n'a pas réussi.
En-têtes et paramètres
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Corps JSON
urlstringobligatoiredescriptionstringeventsarray<invoice.created | invoice.updated | payment.succeeded | payment.failed | payment.refunded | payment.partially_refunded | payment.disputed | payment.review_required>Réponses
201Enregistrez le secret de signature à usage unique.
endpointobjectobligatoiresecretstringobligatoireAffiché uniquement lors de la création/rotation. Stocké chiffré côté serveur.
400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/webhooks/{id}
Lister les endpoints et les 30 dernières livraisons
En-têtes et paramètres
idpathobligatoireX-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Réponses
200Aucun secret de signature n'est renvoyé.
endpointsarray<object>obligatoiredeliveriesarray<object>obligatoireavailablebooleanobligatoireeventTypesarray<invoice.created | invoice.updated | payment.succeeded | payment.failed | payment.refunded | payment.partially_refunded | payment.disputed | payment.review_required>obligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePATCH/api/webhooks/{id}
Mettre en pause ou reprendre un endpoint vérifié
Les endpoints vérifiés en pause conservent les événements éligibles dans la file d'attente ; la reprise traite les livraisons dues.
En-têtes et paramètres
idpathobligatoireOriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Corps JSON
statusactive | pausedobligatoireRéponses
200Statut enregistré.
updatedtrueobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireDELETE/api/webhooks/{id}
Supprimer l'endpoint et annuler les tâches non livrées
Annule les tâches en attente, échouées et louées. Une requête déjà envoyée sur le réseau ne peut pas être rappelée.
En-têtes et paramètres
idpathobligatoireOriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Réponses
200Endpoint supprimé.
deletedtrueobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/webhooks/{id}/verify
Envoyer un défi de vérification d'endpoint signé
Maximum 5 tentatives de vérification/heure/utilisateur. Votre serveur doit valider Kevmi-Signature et renvoyer un JSON 2xx {"challenge":"<data.challenge>"}. Délai de requête : 8 secondes ; limite de réponse : 8192 octets. Les redirections ne sont pas suivies. La vérification active l'endpoint.
En-têtes et paramètres
idpathobligatoireOriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Corps JSON
Réponses
200Vérifié et actif.
verifiedtrueobligatoireendpointobjectobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire422La destination n'a pas pu être vérifiée.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/webhooks/{id}/rotate
Remplacer le secret de signature et exiger une nouvelle vérification
Maximum 3 rotations/heure/utilisateur. Mettez à jour votre serveur et vérifiez à nouveau l'endpoint. Une requête déjà en vol peut encore porter la signature précédente.
En-têtes et paramètres
idpathobligatoireOriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Corps JSON
Réponses
200Nouveau secret affiché une fois.
secretstringobligatoireAffiché uniquement lors de la création/rotation. Stocké chiffré côté serveur.
requiresVerificationtrueobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/webhooks/{id}/deliveries/{deliveryId}/retry
Réessayer une livraison échouée vers un endpoint actif
Conserve l'ID d'événement et la charge utile ; génère un horodatage et une signature frais. Chaque cycle de livraison automatique effectue au plus 6 tentatives, y compris les baux expirés, avec des délais de 1m, 5m, 30m, 2h et 12h. La livraison est au moins une fois ; dédupliquez les ID d'événements sur votre serveur.
En-têtes et paramètres
idpathobligatoiredeliveryIdpathobligatoireOriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Corps JSON
Réponses
202Réessai planifié.
queuedtrueobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireApplications
Applications de site marchand authentifiées et suivi individuel.
GET/api/applications
Lister jusqu'à 30 de ses propres applications
En-têtes et paramètres
X-Kevmi-LocaleheaderURL de suivi et langue des messages système. Sans valeur prise en charge, le référent de même origine et la langue du navigateur sont pris en compte ; le repli est l'anglais.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Réponses
200Plus récents en premier.
applicationsarray<object>obligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/applications
Soumettre les informations du site Web et recevoir une URL de suivi
Nécessite une connexion Telegram confirmée. Jusqu'à 5 nouvelles soumissions/jour/utilisateur. Une relecture idempotente renvoie 200. Le serveur fait avancer les étapes persistées réelles ; les résultats automatiques indisponibles ou risqués nécessitent un examen humain. L'approbation ne configure pas la passerelle de paiement. La propriété et l'état ne peuvent pas être fournis par le demandeur.
En-têtes et paramètres
OriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
Idempotency-KeyheaderobligatoireUne clé par demande logique. Une répétition avec une entrée canonique identique renvoie l'enregistrement original ; une entrée différente avec la même clé renvoie 409.
X-Kevmi-LocaleheaderURL de suivi et langue des messages système. Sans valeur prise en charge, le référent de même origine et la langue du navigateur sont pris en compte ; le repli est l'anglais.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Corps JSON
websiteUrlstringobligatoireDomaine HTTPS public sans identifiants, paramètres de requête, littéraux IP ni ports personnalisés. Un fragment est supprimé lors de la normalisation.
businessNamestringobligatoirebusinessTypedigital_goods | software | services | physical_goods | education | otherobligatoiredescriptionstringobligatoirecontactTelegramstringobligatoireUn nom d'utilisateur Telegram de 5 à 32 caractères commençant par une lettre, puis lettres/chiffres/tirets bas. Préfixe @ ou https://t.me/ facultatif ; les espaces environnants sont supprimés. Stocké comme @username.
consenttrueobligatoireRéponses
200Soumission existante.
applicationobjectobligatoireurlstringobligatoirereplayedbooleanobligatoire202Accepté ; le traitement continue sur le serveur.
applicationobjectobligatoireurlstringobligatoirereplayedbooleanobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/applications/{id}
Lire ses propres étapes d'examen et son historique d'événements
En-têtes et paramètres
idpathobligatoireX-Kevmi-LocaleheaderURL de suivi et langue des messages système. Sans valeur prise en charge, le référent de même origine et la langue du navigateur sont pris en compte ; le repli est l'anglais.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Réponses
200Projection privée du demandeur. Les preuves et la sortie du modèle ne sont pas exposées.
applicationobjectobligatoireeventsarray<object>obligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/applications/{id}/resume
Reprendre une étape de fond éligible
Ne peut pas sauter l'examen ni approuver une étape. Un bail serveur empêche le travail en double. Les applications nécessitant un examen et finales restent inchangées. Au plus 30 requêtes de reprise de traitement/minute/utilisateur.
En-têtes et paramètres
idpathobligatoireOriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
X-Kevmi-LocaleheaderURL de suivi et langue des messages système. Sans valeur prise en charge, le référent de même origine et la langue du navigateur sont pris en compte ; le repli est l'anglais.
X-Kevmi-StoreheaderSélectionnez une boutique possédée pour une session de navigateur. Omett pour utiliser la première boutique. Les clés API ignorent cet en-tête et utilisent toujours leur liaison de boutique immuable. La valeur all est en lecture seule et n'est prise en charge que par le tableau de bord et les points de terminaison de liste de factures.
Corps JSON
Réponses
200Aucun traitement nécessaire.
applicationobjectobligatoire202Traitement planifié.
applicationobjectobligatoirescheduledtrueobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireModeration
Modérateurs Telegram sur liste blanche ; chaque décision est vérifiée par version.
GET/api/moderation/applications
Lister jusqu'à 100 applications pour modération
Nécessite que l'identité Telegram authentifiée soit dans MODERATOR_TELEGRAM_IDS. Inclut tous les états, ordonnés needs_review d'abord, processing ensuite, puis états finaux ; mises à jour les plus récentes d'abord au sein d'un groupe.
Réponses
200File d'attente du modérateur.
applicationsarray<object>obligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGET/api/moderation/applications/{id}
Lire les preuves d'examen et l'historique des étapes
En-têtes et paramètres
idpathobligatoireRéponses
200Preuves privées du modérateur.
applicationobjectobligatoireeventsarray<object>obligatoireevidenceobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoirePOST/api/moderation/applications/{id}/decision
Approuver l'étape d'examen actuelle ou refuser avec une raison publique
Nécessite un modérateur configuré ; au plus 30 décisions/minute/utilisateur. expectedVersion est comparé atomiquement. Seule l'étape actuelle needs_review peut être approuvée ; les candidatures finales ne peuvent pas être rouvertes silencieusement. Un rejet exige une raison publique modifiable. La décision, l'historique des étapes et la notification activée au candidat sont enregistrés ensemble.
En-têtes et paramètres
idpathobligatoireOriginheaderobligatoireDoit correspondre exactement à APP_ORIGIN. Sec-Fetch-Site : cross-site est rejeté. Le serveur ne fournit pas d'accès CORS.
X-CSRF-TokenheaderobligatoireJeton de session actuel depuis GET /api/auth/me ou achèvement réussi de la connexion.
Corps JSON
Variante 1
expectedVersionintegerobligatoireaction"approve_step"obligatoirereasonstringVariante 2
expectedVersionintegerobligatoireaction"reject"obligatoirereasonstringobligatoireRéponses
200Décision enregistrée.
applicationobjectobligatoire400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401Aucune session valide ; pour un webhook, un secret invalide.
errorobjectobligatoire403La validation d'origine, CSRF ou de liaison navigateur a échoué.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire409La demande de connexion est utilisée ou annulée, l'identité n'est pas confirmée, ou une demande d'assistance entre en conflit.
errorobjectobligatoire429Limite de débit dépassée.
errorobjectobligatoire503Une intégration ou un stockage est indisponible, un événement est en cours de traitement, ou le service est indisponible.
errorobjectobligatoireGateway events
Les événements de passerelle natifs à la source sont vérifiés, puis le paiement faisant autorité est lu via un transport serveur authentifié. Les webhooks destinés aux marchands utilisent une signature et une file de livraison distinctes.
POST/api/gateway/webhook
Recevoir des événements de passerelle signés d'origine native
Natif v3 : fournir X-Gateway-Timestamp (secondes Unix), X-Gateway-Signature et X-Gateway-Event-Id correspondant. L'écart de horodatage maximal est de 300 secondes. Après vérification de la signature, Kevmi récupère le paiement via l'API de passerelle authentifiée, vérifie la commande enregistrée, la devise/montant exacts, la méthode et l'état confirmé par le fournisseur, puis stocke atomiquement le reçu et l'événement de boîte de sortie marchand. Le texte de webhook et les observations du navigateur seuls ne confirment jamais un paiement. Les identifiants répétés sont dédupliqués ; un corps modifié pour un identifiant existant est rejeté. Les événements retardés utilisent un état faisant autorité frais. Les remboursements partiels, les remboursements complets, les litiges et les états d'examen sont pris en charge. Les commandes non liées sont accusées réception et ignorées. Les événements normalisés hérités utilisant Kevmi-Signature restent pris en charge séparément ; seules leurs transitions succeeded/failed/full-refunded s'appliquent.
En-têtes et paramètres
X-Gateway-TimestampheaderRequis pour les événements natifs v3.
X-Gateway-Event-IdheaderRequis pour le natif v3 ; doit correspondre à body.id.
Corps JSON
Variante 1
idstringobligatoireapi_version"3"obligatoiremode"live"obligatoiretypestringobligatoiredataobjectobligatoireVariante 2
eventIdstringobligatoirepaymentIdstringobligatoireinvoiceIdstringobligatoirestatussucceeded | failed | refundedobligatoireamountMinorintegerobligatoireMontant entier en unités monétaires mineures.
currencyUSD | RUB | USDTobligatoireUnités de facture : cents USD, kopecks RUB ou centièmes d'USDT. Aucune conversion automatique de devise.
methodcard | alipay | sbp | cryptoobligatoireoccurredAtintegerobligatoireHorodatage Unix en millisecondes, UTC.
Réponses
200Reçu, dédupliqué ou ignoré en toute sécurité.
receivedtrueobligatoirereplayedbooleanignoredbooleanappliedboolean400JSON invalide, champ inconnu ou valeur invalide.
errorobjectobligatoire401La signature de la passerelle est manquante, invalide ou hors de la fenêtre temporelle acceptée.
errorobjectobligatoire404L'enregistrement est manquant, le jeton public est invalide, ou l'enregistrement demandé appartient à un autre utilisateur.
errorobjectobligatoire409Un identifiant d'événement a été réutilisé avec un contenu modifié ou un identifiant de paiement entre en conflit avec la liaison de facture enregistrée.
errorobjectobligatoire413Le corps dépasse 16 384 octets ; la limite est de 65 536 octets pour /api/support/ask et le webhook Telegram.
errorobjectobligatoire415Content-Type : application/json est requis.
errorobjectobligatoire429La passerelle est occupée ; réessayer la livraison du webhook avec le même identifiant d'événement.
errorobjectobligatoire502Réponse de la passerelle indisponible, malformée ou non vérifiable. Lisez le statut de paiement existant avant de tenter toute nouvelle tentative.
errorobjectobligatoire503La configuration de la passerelle ou le secret de signature est manquant.
errorobjectobligatoire