API Reference
Documentation API
Encaissez Bitcoin, Ethereum, USDT, USDC, Solana, BNB, XRP et Monero. Checkout hébergé ou API directe. Le client paie en crypto ; le net est versé sur le wallet que vous contrôlez. Pas de solde de dépôt chez SYLI Payments.
Introduction
SYLI Payments n’est pas une banque : il n’y a pas de compte en euros à débiter plus tard. Le client envoie une crypto (payin). Une fois le montant attendu confirmé on-chain, le net part vers l’adresse que vous avez validée pour ce réseau (payout). Deux intégrations. Checkout hébergé : POST /invoice, redirection vers invoice_url — SYLI Payments affiche le QR, le réseau et l’échéance. API directe : POST /payment, vous affichez pay_address (et payin_extra_id s’il est présent). Les encaissements s’ouvrent après KYC validé et au moins un wallet validé dans Réception. Seules ces cryptos sont acceptées. Le KYB est optionnel : il passe le compte en Pro.
Utilisez le checkout si une boutique, un plugin ou une app doit seulement ouvrir une page de paiement. N’utilisez l’API directe que si vous construisez l’UI vous-même : appelez alors GET /currencies pour le sélecteur, affichez le destination tag XRP / payment ID Monero, et suivez le statut par webhook ou GET /payment/:id. Un mauvais réseau ou un extra ID manquant peut faire perdre le payin.
Livrez dès que payment_status vaut confirmed : le client a payé. Ne bloquez pas la commande sur payout_status — le virement wallet peut suivre avec un délai. En API, sending et finished (internes au payout) sont renvoyés comme confirmed. payout_status vaut sending ou finished et décrit uniquement le versement vers votre adresse.
Pour envoyer de vraies requêtes depuis le navigateur, ouvrez le laboratoire API.
Base URL
https://sylipayments.com/api/v1
Tous les exemples ci-dessous utilisent cette URL.
Pour Cursor, Claude, ChatGPT
Prompt d’intégration API
Fichier Markdown à coller dans un agent de code. Il décrit l’API SYLI Payments, le checkout, les webhooks HMAC et les critères de recette pour une intégration complète.
REQUEST
curl https://sylipayments.com/api/v1/status
Response
200 OK{
"message": "OK"
}Authentification
Header x-api-key
Toutes les routes /api/v1/* sauf /status, /estimate et /min-amount exigent la clé secrète (Configuration → API paiement). Un de ces en-têtes suffit, dans cet ordre de lecture : x-syli-api-key, x-api-key, Authorization: Bearer.
GET /currencies est authentifié volontairement : la liste n’est pas le catalogue public SYLI Payments, c’est votre sélecteur (wallets validés dans Réception). Afficher une autre crypto ferait échouer POST /payment.
Format : syli_live_…. Une régénération invalide la clé précédente. Clé absente ou invalide : HTTP 503 et message générique — pas de 401, pour ne pas confirmer qu’une clé existe. Compte désactivé ou KYC manquant : 403.
REQUEST
x-api-key: syli_live_xxxxxxxx x-syli-api-key: syli_live_xxxxxxxx Authorization: Bearer syli_live_xxxxxxxx
Node.js ≥ 18
SDK JavaScript
Client officiel pour créer un checkout, un paiement API, et vérifier les webhooks x-syli-sig. Serveur uniquement : la clé syli_live_… ne doit jamais partir dans le navigateur.
Source : github.com/Nimba-Algo-Trading/syli-sdk
- Installez le paquet, puis créez un client avec votre clé (Configuration → API paiement).
- Checkout hébergé :
createInvoicepuis redirigez versinvoice_url. - API directe :
createPaymentet affichezpay_address(etpayin_extra_idsi présent). - Sur votre URL HTTPS, appelez
constructEventet répondez 2xx.
Méthodes
| Attribut | Type | Description |
|---|---|---|
| createInvoice | fn | Facture checkout — renvoie invoice_url |
| getInvoice | fn | Récupère une facture par id |
| createPayment | fn | Adresse de paiement unique + QR |
| getPayment | fn | Statut resynchronisé on-chain |
| constructEvent | fn | Parse et vérifie un webhook HMAC |
| getCurrencies | fn | Cryptos du compte (wallet validé, clé requise) |
SDK
npm install github:Nimba-Algo-Trading/syli-sdk # après publication npm : # npm install syli-sdk
Response
INVOICE{
"id": "2d6f88d7-5b40-4d9e-b0a4-0793953d2707",
"order_id": "CMD-9001",
"price_amount": 49.9,
"price_currency": "usdt",
"invoice_url": "https://sylipayments.com/pay/2d6f88d7-5b40-4d9e-b0a4-0793953d2707"
}Dart ≥ 3 · Flutter
SDK Flutter / Dart
Paquet pur Dart pour créer un checkout, un paiement API, et vérifier les webhooks x-syli-sig. La clé syli_live_… reste sur le serveur : l’app Flutter ouvre invoice_url.
Source : dossier sdk/dart — ZIP syli-dart-sdk.zip.
- Ajoutez
syli_sdken path danspubspec.yaml. - Checkout hébergé :
createInvoicepuis ouvrezinvoiceUrl. - API directe :
createPaymentet affichezpayAddress. - Sur votre URL HTTPS, appelez
constructEventet répondez 2xx.
Méthodes
| Attribut | Type | Description |
|---|---|---|
| createInvoice | fn | Facture checkout — renvoie invoiceUrl |
| getInvoice | fn | Récupère une facture par id |
| createPayment | fn | Adresse de paiement unique + QR |
| getPayment | fn | Statut resynchronisé on-chain |
| constructEvent | fn | Parse et vérifie un webhook HMAC |
| getCurrencies | fn | Cryptos du compte (wallet validé, clé requise) |
SDK
dependencies:
syli_sdk:
path: packages/syli_sdk
# ZIP : /downloads/syli-dart-sdk.zip
# ou depuis ce dépôt : path: sdk/dartResponse
INVOICE{
"id": "2d6f88d7-5b40-4d9e-b0a4-0793953d2707",
"order_id": "CMD-9001",
"price_amount": 49.9,
"price_currency": "usdt",
"invoice_url": "https://sylipayments.com/pay/2d6f88d7-5b40-4d9e-b0a4-0793953d2707"
}Cursor · Claude · ChatGPT
Serveur MCP
Un serveur Model Context Protocol expose l’API SYLI Payments comme outils pour l’IA. Cursor et Claude Desktop lancent le processus en local (stdio). La clé reste dans la config MCP, pas dans le chat.
Outils : syli_status, syli_list_currencies, syli_estimate, syli_min_amount, syli_create_invoice, syli_get_invoice, syli_create_payment, syli_get_payment, syli_verify_webhook. Prompt : syli_integrate_checkout.
Dans env : la clé API, l’URL de l’API, le secret HMAC (SYLI_IPN_SECRET) et l’URL HTTPS de votre webhook (SYLI_IPN_CALLBACK_URL). Invoice et paiement l’envoient comme ipn_callback_url si l’outil ne la passe pas.
Sources : dossier sdk/mcp du dépôt GitHub.
MCP
{
"mcpServers": {
"syli": {
"command": "npx",
"args": ["-y", "syli-mcp"],
"env": {
"SYLI_API_KEY": "syli_live_xxxxxxxx",
"SYLI_API_URL": "https://sylipayments.com/api/v1",
"SYLI_IPN_SECRET": "xxxxxxxx",
"SYLI_IPN_CALLBACK_URL": "https://boutique.example/webhooks/syli"
}
}
}
}Plugins téléchargeables
ZIP prêts à installer depuis la page Plugins. WooCommerce et PrestaShop s’installent comme un module. Wix se colle dans Velo. Shopify se déploie comme une app Node.
Cryptos
/api/v1/currencies
Avec la clé, la liste n’est pas le catalogue mondial : uniquement les cryptos du compte qui ont une adresse validée dans Dashboard → Réception. C’est le contrat du sélecteur pour une UI maison. Une crypto hors liste est refusée au POST /payment.
currencies = codes. accepted et available sont la même liste enrichie (label, ticker, réseau) — available existe pour la rétrocompatibilité.
Le prix facturé est en USDT (price_currency: "usdt"). usd est accepté et stocké / renvoyé comme usdt. Alias : usdtbep20 → usdtbsc, usdc → usdcerc20, bnb → bnbbsc.
pay_currency
| Attribut | Type | Description |
|---|---|---|
| btc | string | Bitcoin — taux gelé jusqu’à expiration_estimate_date |
| eth | string | Ethereum — taux gelé jusqu’à expiration_estimate_date |
| usdterc20 | string | USDT Ethereum — 1:1, pas de gel de taux |
| usdttrc20 | string | USDT Tron — 1:1, pas de gel de taux |
| usdtbsc | string | USDT BNB Smart Chain — 1:1, pas de gel de taux |
| usdcerc20 | string | USDC Ethereum — 1:1, pas de gel de taux |
| sol | string | Solana — taux gelé jusqu’à expiration_estimate_date |
| bnbbsc | string | BNB Smart Chain — taux gelé jusqu’à expiration_estimate_date |
| xrp | string | XRP — taux gelé ; payin_extra_id = destination tag |
| xmr | string | Monero — taux gelé ; payin_extra_id = payment ID si présent |
REQUEST
curl https://sylipayments.com/api/v1/currencies \ -H "x-api-key: syli_live_xxxxxxxx"
Response
200 OK{
"currencies": ["usdttrc20"],
"accepted": [
{
"code": "usdttrc20",
"label": "Tether USDT (TRC-20)",
"ticker": "USDT",
"network": "Tron"
}
],
"available": [
{
"code": "usdttrc20",
"label": "Tether USDT (TRC-20)",
"ticker": "USDT",
"network": "Tron"
}
]
}Créer un paiement
/api/v1/payment
Génère une adresse unique pour cette commande. Affichez pay_address, le QR, le montant pay_amount (dans la crypto choisie), et payin_extra_id dès qu’il est non null — destination tag XRP, payment ID Monero. Sans extra ID, le payin peut être irrécupérable.
pay_currency doit figurer dans GET /currencies. Stables (USDT / USDC) : montant 1:1, pas de gel de taux. BTC, ETH, SOL, BNB, XRP, XMR : taux gelé jusqu’à expiration_estimate_date.
Idempotence : si vous renvoyez le même order_id alors qu’un paiement de ce compte est encore actif (waiting, confirming, confirmed, sending, partially_paid), l’API renvoie l’existant au lieu d’en créer un second. Utile en cas de retry réseau. Un nouvel essai après expired / failed / refunded crée un nouveau paiement.
ipn_callback_url surcharge l’URL webhook du dashboard si elle est fournie. Sinon SYLI Payments utilise celle enregistrée sur le compte. outcome_amount vaut le reçu on-chain (actually_paid), pas le net payout.
Body
| Attribut | Type | Description |
|---|---|---|
| price_amount* | number | Montant facturé en USDT (> 0), ≥ minimum SYLI Payments |
| price_currency* | string | usdt (usd accepté, renvoyé usdt) |
| pay_currency* | string | Code de GET /currencies (wallet validé) |
| order_id | string | Votre référence. Réutilisée = même paiement tant qu’il est actif |
| order_description | string | Libellé visible |
| ipn_callback_url | string | HTTPS — surcharge l’URL webhook du compte |
REQUEST
curl -X POST https://sylipayments.com/api/v1/payment \
-H "x-api-key: syli_live_xxxxxxxx" \
-H "content-type: application/json" \
-d '{
"price_amount": 20,
"price_currency": "usdt",
"pay_currency": "usdttrc20",
"order_id": "CMD-4821",
"order_description": "Abonnement mensuel"
}'Response
200 OK{
"payment_id": "a2483de0-2a84-4298-a9c8-a8e353311697",
"payment_status": "waiting",
"pay_address": "TXYZxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"payin_extra_id": null,
"price_amount": 20,
"price_currency": "usdt",
"pay_amount": 20,
"actually_paid": 0,
"pay_currency": "usdttrc20",
"order_id": "CMD-4821",
"order_description": "Abonnement mensuel",
"invoice_id": null,
"outcome_amount": 0,
"outcome_currency": "usdttrc20",
"payout_address": "TYourMerchantWallet…",
"payout_amount": null,
"payout_status": null,
"payout_hash": null,
"payin_hash": null,
"created_at": "2026-09-07T12:00:00.000Z",
"updated_at": "2026-09-07T12:00:00.000Z",
"expiration_estimate_date": null,
"rate_locked_at": "2026-09-07T12:00:00.000Z"
}Récupérer un paiement
/api/v1/payment/:id
Resynchronise le payin avec la chaîne avant de répondre. Si le processeur est injoignable, le dernier snapshot local est renvoyé plutôt qu’une erreur. Même objet que POST /payment.
Champs à suivre : payment_status (payin — livrer sur confirmed), actually_paid, payin_hash, puis payout_status / payout_hash pour le virement vers votre wallet. Un GET facture ne remplace pas cet appel : l’invoice n’a pas de statut de paiement.
REQUEST
curl https://sylipayments.com/api/v1/payment/a2483de0-2a84-4298-a9c8-a8e353311697 \ -H "x-api-key: syli_live_xxxxxxxx"
Créer une facture
/api/v1/invoice
Crée une session checkout, pas encore un paiement. Le client ouvre invoice_url (https://sylipayments.com/pay/…). L’adresse on-chain n’existe qu’après choix de la crypto sur la page SYLI Payments (ou si vous figez pay_currency).
Si pay_currency est omis, le client choisit parmi vos wallets validés. Au moins une crypto configurée est requise. success_url / cancel_url doivent être des URL HTTPS valides. GET /invoice/:id renvoie la facture, pas le payin — pour le statut, webhook ou GET /payment/:id.
Recréer un paiement sur un checkout déjà clos (expired, failed, refunded) : HTTP 410.
Body
| Attribut | Type | Description |
|---|---|---|
| price_amount* | number | Montant en USDT (≥ minimum SYLI Payments) |
| price_currency* | string | usdt |
| pay_currency | string | Optionnel — sinon le client choisit sur /pay |
| order_id | string | Référence boutique |
| order_description | string | Libellé visible |
| success_url | string | Redirection HTTPS après paiement |
| cancel_url | string | Redirection HTTPS si abandon |
| ipn_callback_url | string | Surcharge l’URL webhook du compte |
REQUEST
curl -X POST https://sylipayments.com/api/v1/invoice \
-H "x-api-key: syli_live_xxxxxxxx" \
-H "content-type: application/json" \
-d '{
"price_amount": 49.9,
"price_currency": "usdt",
"order_id": "CMD-9001",
"success_url": "https://boutique.example/ok",
"cancel_url": "https://boutique.example/annuler"
}'Response
200 OK{
"id": "2d6f88d7-5b40-4d9e-b0a4-0793953d2707",
"order_id": "CMD-9001",
"order_description": "Commande boutique",
"price_amount": 49.9,
"price_currency": "usdt",
"pay_currency": null,
"ipn_callback_url": "https://boutique.example/webhooks/syli",
"success_url": "https://boutique.example/ok",
"cancel_url": "https://boutique.example/annuler",
"created_at": "2026-09-07T12:00:00.000Z",
"invoice_url": "https://sylipayments.com/pay/2d6f88d7-5b40-4d9e-b0a4-0793953d2707"
}Récupérer une facture
/api/v1/invoice/:id
Renvoie la facture, y compris invoice_url. Pas de payment_status : la facture n’est pas le payin.
REQUEST
curl https://sylipayments.com/api/v1/invoice/2d6f88d7-5b40-4d9e-b0a4-0793953d2707 \ -H "x-api-key: syli_live_xxxxxxxx"
Webhooks
Votre URL HTTPS
POST JSON à chaque changement de statut utile (payin ou payout). En-tête x-syli-sig : HMAC-SHA512 hex du JSON canonique — parsez le body, triez les clés de premier niveau, JSON.stringify(obj, Object.keys(obj).sort()), puis HMAC. Ne signez pas le body HTTP brut : l’ordre des clés du transport n’est pas celui de la signature. Répondez 2xx sinon relance automatique (jusqu’à 8 tentatives : 1 min, 5 min, 15 min, 1 h, 3 h, 6 h, 12 h, 24 h).
Livrez si payment_status === "confirmed". Ne livrez pas sur payout_status : le client a déjà payé, le virement wallet peut arriver après. En API, sending / finished internes au payin sont déjà mappés en confirmed. Le versement = payout_status (sending ou finished) et payout_hash.
Payload plat : payment_id, invoice_id, payment_status, pay_address, price_amount, price_currency, pay_amount, actually_paid, pay_currency, order_id, order_description, outcome_amount, outcome_currency, payout_amount, payout_hash, payin_hash, payout_status. Pas de payin_extra_id dans le webhook.
VERIFY
import { Syli } from "syli-sdk";
const syli = new Syli({ apiKey: process.env.SYLI_API_KEY });
app.post("/webhooks/syli", express.json(), (req, res) => {
const event = syli.constructEvent(
req.body,
req.headers["x-syli-sig"],
process.env.SYLI_IPN_SECRET,
);
res.sendStatus(200);
});Response
EVENT{
"payment_id": "a2483de0-2a84-4298-a9c8-a8e353311697",
"invoice_id": null,
"payment_status": "confirmed",
"pay_address": "TXYZxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"price_amount": 20,
"price_currency": "usdt",
"pay_amount": 20,
"actually_paid": 20,
"pay_currency": "usdttrc20",
"order_id": "CMD-4821",
"order_description": "Abonnement mensuel",
"outcome_amount": 20,
"outcome_currency": "usdttrc20",
"payout_amount": 19.7,
"payout_hash": "0xabc…",
"payin_hash": "abc123…",
"payout_status": "finished"
}Utilitaires
/api/v1/estimate
GET /api/v1/status — santé du service, sans auth. Pinge aussi le processeur de paiement : s’il est down, attendez-vous à un 503.
GET /api/v1/estimate donne un montant crypto indicatif (pas le taux gelé du paiement). Le gel n’existe que sur un POST /payment en crypto volatile, jusqu’à expiration_estimate_date.
GET /min-amount : minimum marchand SYLI Payments = max(1 USDT, 4 × frais réseau estimés) pour toutes les cryptos, y compris USDT TRC-20. rule vaut syli. processor_min_amount est informatif : le processeur peut créer une charge plus haute en interne, le checkout affiche toujours le montant marchand. Un payin à ≥ 99,5 % du pay_amount est traité comme couvert (confirmed), pas comme un partiel.
REQUEST
curl "https://sylipayments.com/api/v1/estimate?amount=20¤cy_from=usdt¤cy_to=btc"
Response
200 OK{
"currency_from": "usdt",
"amount_from": 20,
"currency_to": "btc",
"estimated_amount": 0.00018
}Erreurs
Corps : { "status": false, "message": "…", "error": "…" } — message et error portent le même texte.
HTTP
| Attribut | Type | Description |
|---|---|---|
| 400 | error | Corps invalide, crypto absente du compte, wallet manquant, montant sous le minimum |
| 403 | error | KYC non vérifié, ou compte marchand désactivé |
| 404 | error | Paiement ou facture introuvable (ou d’un autre compte) |
| 410 | error | Checkout clos : expired / failed / refunded |
| 502 | error | Le processeur n’a pas renvoyé d’adresse de paiement |
| 503 | error | Processeur indisponible, ou clé API absente / invalide (message volontairement générique) |
Response
503{
"status": false,
"message": "Service indisponible. Réessayez plus tard.",
"error": "Service indisponible. Réessayez plus tard."
}Cycle de vie
payment_status décrit le payin client. En base, sending / finished existent pour le versement interne ; l’API et les webhooks ne les exposent pas : ils deviennent confirmed. Livrez sur confirmed. Un reçu à ≥ 99,5 % du montant attendu est confirmé (tolérance poussière). Le versement vers votre wallet = payout_status (sending ou finished) et payout_hash.
payment_status (API / webhook)
| Attribut | Type | Description |
|---|---|---|
| waiting | status | En attente du virement client |
| confirming | status | Vu on-chain, confirmations en cours |
| confirmed | status | Montant attendu reçu — livrer / activer. Inclut l’ancien sending/finished interne |
| partially_paid | status | Reçu < 99,5 % du pay_amount marchand |
| expired | status | Délai dépassé, plus de paiement accepté sur cette adresse |
| failed / refunded | status | Échec ou remboursement — checkout clos (410 si réutilisé) |
