SYLI Payments

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.

Télécharger le .md

REQUEST

curl https://sylipayments.com/api/v1/status

Response

200 OK
{
  "message": "OK"
}
GET

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

  1. Installez le paquet, puis créez un client avec votre clé (Configuration → API paiement).
  2. Checkout hébergé : createInvoice puis redirigez vers invoice_url.
  3. API directe : createPayment et affichez pay_address (et payin_extra_id si présent).
  4. Sur votre URL HTTPS, appelez constructEvent et répondez 2xx.

Méthodes

AttributTypeDescription
createInvoicefnFacture checkout — renvoie invoice_url
getInvoicefnRécupère une facture par id
createPaymentfnAdresse de paiement unique + QR
getPaymentfnStatut resynchronisé on-chain
constructEventfnParse et vérifie un webhook HMAC
getCurrenciesfnCryptos 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.

  1. Ajoutez syli_sdk en path dans pubspec.yaml.
  2. Checkout hébergé : createInvoice puis ouvrez invoiceUrl.
  3. API directe : createPayment et affichez payAddress.
  4. Sur votre URL HTTPS, appelez constructEvent et répondez 2xx.

Méthodes

AttributTypeDescription
createInvoicefnFacture checkout — renvoie invoiceUrl
getInvoicefnRécupère une facture par id
createPaymentfnAdresse de paiement unique + QR
getPaymentfnStatut resynchronisé on-chain
constructEventfnParse et vérifie un webhook HMAC
getCurrenciesfnCryptos 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/dart

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"
}

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.

GET

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

AttributTypeDescription
btcstringBitcoin — taux gelé jusqu’à expiration_estimate_date
ethstringEthereum — taux gelé jusqu’à expiration_estimate_date
usdterc20stringUSDT Ethereum — 1:1, pas de gel de taux
usdttrc20stringUSDT Tron — 1:1, pas de gel de taux
usdtbscstringUSDT BNB Smart Chain — 1:1, pas de gel de taux
usdcerc20stringUSDC Ethereum — 1:1, pas de gel de taux
solstringSolana — taux gelé jusqu’à expiration_estimate_date
bnbbscstringBNB Smart Chain — taux gelé jusqu’à expiration_estimate_date
xrpstringXRP — taux gelé ; payin_extra_id = destination tag
xmrstringMonero — 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"
    }
  ]
}
POST

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

AttributTypeDescription
price_amount*numberMontant facturé en USDT (> 0), ≥ minimum SYLI Payments
price_currency*stringusdt (usd accepté, renvoyé usdt)
pay_currency*stringCode de GET /currencies (wallet validé)
order_idstringVotre référence. Réutilisée = même paiement tant qu’il est actif
order_descriptionstringLibellé visible
ipn_callback_urlstringHTTPS — 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"
}
GET

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"
POST

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

AttributTypeDescription
price_amount*numberMontant en USDT (≥ minimum SYLI Payments)
price_currency*stringusdt
pay_currencystringOptionnel — sinon le client choisit sur /pay
order_idstringRéférence boutique
order_descriptionstringLibellé visible
success_urlstringRedirection HTTPS après paiement
cancel_urlstringRedirection HTTPS si abandon
ipn_callback_urlstringSurcharge 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"
}
GET

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"
POST

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"
}
GET

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&currency_from=usdt&currency_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

AttributTypeDescription
400errorCorps invalide, crypto absente du compte, wallet manquant, montant sous le minimum
403errorKYC non vérifié, ou compte marchand désactivé
404errorPaiement ou facture introuvable (ou d’un autre compte)
410errorCheckout clos : expired / failed / refunded
502errorLe processeur n’a pas renvoyé d’adresse de paiement
503errorProcesseur 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)

AttributTypeDescription
waitingstatusEn attente du virement client
confirmingstatusVu on-chain, confirmations en cours
confirmedstatusMontant attendu reçu — livrer / activer. Inclut l’ancien sending/finished interne
partially_paidstatusReçu < 99,5 % du pay_amount marchand
expiredstatusDélai dépassé, plus de paiement accepté sur cette adresse
failed / refundedstatusÉchec ou remboursement — checkout clos (410 si réutilisé)
Documentation API — SYLI Payments