Skip to content
RugWard
☰ Menu

RugWard Pay

Référence de l'API REST

Tous les endpoints marchands de RugWard Pay avec exemples de requêtes et de réponses, authentification par clé API, erreurs, limites et code en curl, Node.js, Python et PHP.

Sur cette page

Notions de base#

URL de basehttps://rugward.com
FormatJSON en entrée, JSON en sortie. Envoyez Content-Type: application/json avec chaque corps (sinon 415). Les corps sont limités à quelques Ko.
Authentificationune clé API dans Authorization: Bearer rwp_… ou x-api-key: rwp_…
MontantsUSD sous forme de chaîne avec 2 décimales max. ("25", "25.50") ; les montants en crypto sont des chaînes décimales
Horodatagesmillisecondes Unix (createdAt, expiresAt, paidAt)
Erreurs{"error": "human readable message"}, parfois avec "retry": true

De serveur à serveur uniquement. Gardez la clé API sur votre serveur. Les navigateurs ne peuvent pas appeler l'API marchand avec une clé (les requêtes cross-origin ne sont pas autorisées), et une clé dans une page web serait publique.

Clés API#

Créez des clés dans le tableau de bord sous API keys (connexion requise). Une clé a la forme rwp_ suivi de 40 lettres et chiffres et n'est affichée qu'une fois : copiez-la immédiatement dans le coffre à secrets de votre serveur. RugWard ne conserve qu'un hash SHA-256, donc une clé perdue ne peut pas être réaffichée : créez-en une nouvelle et révoquez l'ancienne. Jusqu'à 10 clés par marchand ; le tableau de bord affiche le préfixe de chaque clé et sa dernière utilisation.

Clés API et webhook dans le tableau de bord
Créez ou révoquez des clés API et configurez le webhook

Ce qu'une clé peut et ne peut pas faire :

Une clé peutUne clé ne peut pas
créer, lister, lire et annuler des facturesmodifier les paramètres ou les adresses de réception
créer, lister et désactiver des liens de paiementcréer, lister ou révoquer des clés API
modifier ou lire le webhook ou son secret
créer des factures de test

Ainsi, une clé divulguée ne peut pas détourner votre argent : les adresses de réception ne peuvent être modifiées qu'en vous connectant avec votre portefeuille.

Endpoints#

Méthode et cheminAuthentificationRôle
POST /api/pay/merchant/invoicesclé ou sessionCréer une facture
GET /api/pay/merchant/invoicesclé ou sessionLister les factures, les plus récentes d'abord, 50 par page
GET /api/pay/merchant/invoices/:idclé ou sessionLire une facture avec ses cotations et paiements (revérifie aussi la chaîne)
POST /api/pay/merchant/invoices/:id/cancelclé ou sessionAnnuler une facture ouverte sans paiement
GET /api/pay/merchant/linksclé ou sessionLister les liens de paiement
POST /api/pay/merchant/linksclé ou sessionCréer un lien de paiement, ou le désactiver
GET /api/pay/proof/:idpublicPreuve de paiement (factures paid ou overpaid uniquement)

Les paramètres, les clés API, le webhook et les paiements non rapprochés se gèrent dans le tableau de bord (session portefeuille uniquement).

Créer une facture#

POST /api/pay/merchant/invoices

ChampTypeObligatoireRègles
amountUsdchaîne ou nombreouide 1 à 50000, 2 décimales max.
orderIdchaînenon1 à 64 caractères : lettres, chiffres, . _ - : # /
descriptionchaînenon200 caractères max., affichée à l'acheteur
redirectUrlchaînenonURL https:// (500 caractères max.), affichée après le paiement
expiresMinentiernonde 15 à 10080 (7 jours) ; 60 par défaut
curl · create an invoice
curl -X POST https://rugward.com/api/pay/merchant/invoices \
  -H "Authorization: Bearer $RUGWARD_PAY_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amountUsd": "25.00",
    "orderId": "1234",
    "description": "1 x T-shirt, size M",
    "redirectUrl": "https://shop.example/thanks?order=1234",
    "expiresMin": 60
  }'
201 Created
{
  "id": "Zx3kQ8pL2mN7vR1tY5wB9c",
  "url": "https://rugward.com/pay/i/Zx3kQ8pL2mN7vR1tY5wB9c",
  "status": "open",
  "expiresAt": 1793326882069,
  "assets": ["BTC", "ETH-8453", "USDC-8453", "USDT-56", "SOL", "USDC-SOL"]
}

Envoyez l'acheteur vers url. assets liste les ids d'actifs parmi lesquels l'acheteur peut choisir (vos cryptos activées qui ont une adresse de réception).

La même requête dans d'autres langages :

Node.js 18+ (server side only)
// Never put the API key in a browser page: call RugWard Pay from your server.
const res = await fetch("https://rugward.com/api/pay/merchant/invoices", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.RUGWARD_PAY_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ amountUsd: "25.00", orderId: "1234", expiresMin: 60 }),
});
const body = await res.json();
if (!res.ok) throw new Error(body.error);
// Save body.id with your order, then send the buyer to body.url
console.log(body.id, body.url);
Python 3 (requests)
import os, requests

r = requests.post(
    "https://rugward.com/api/pay/merchant/invoices",
    headers={"Authorization": f"Bearer {os.environ['RUGWARD_PAY_KEY']}"},
    json={"amountUsd": "25.00", "orderId": "1234", "expiresMin": 60},
    timeout=15,
)
data = r.json()
if r.status_code != 201:
    raise RuntimeError(data.get("error"))
print(data["id"], data["url"])  # store the id, redirect the buyer to the url
PHP 8 (cURL)
<?php
$ch = curl_init("https://rugward.com/api/pay/merchant/invoices");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer " . getenv("RUGWARD_PAY_KEY"),
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => json_encode(["amountUsd" => "25.00", "orderId" => "1234", "expiresMin" => 60]),
]);
$data = json_decode(curl_exec($ch), true);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($code !== 201) { throw new Exception($data["error"] ?? "RugWard Pay error"); }
header("Location: " . $data["url"]); // send the buyer to the hosted checkout

Lire une facture#

GET /api/pay/merchant/invoices/:id. Lire une facture vérifie aussi les blockchains à la recherche de nouveaux paiements ; c'est donc le bon appel pour confirmer un paiement avant d'expédier (en complément des webhooks).

curl · read one invoice
curl https://rugward.com/api/pay/merchant/invoices/Zx3kQ8pL2mN7vR1tY5wB9c \
  -H "Authorization: Bearer $RUGWARD_PAY_KEY"
200 OK
{
  "invoice": {
    "id": "Zx3kQ8pL2mN7vR1tY5wB9c",
    "status": "paid",
    "amountUsd": "25.00",
    "orderId": "1234",
    "description": "1 x T-shirt, size M",
    "redirectUrl": "https://shop.example/thanks?order=1234",
    "createdAt": 1793323282069,
    "expiresAt": 1793326882069,
    "paidAt": 1793324100512,
    "assets": ["BTC", "ETH-8453", "USDC-8453", "USDT-56", "SOL", "USDC-SOL"],
    "test": false,
    "quotes": [
      {
        "id": 4711,
        "asset": "USDC-8453",
        "amount": "25.000629",
        "rateUsd": "1",
        "address": "0xYourMerchantAddress…",
        "expiresAt": 1793325082069
      }
    ],
    "payments": [
      {
        "txid": "0x…",
        "asset": "USDC-8453",
        "amount": "24.875626",
        "confirmations": 30,
        "required": 30,
        "confirmed": true,
        "seenAt": 1793324012000,
        "explorer": "https://basescan.org/tx/0x…"
      }
    ]
  }
}
  • quotes : une entrée par crypto choisie par l'acheteur (montant, taux, adresse de réception, expiration du blocage du taux).
  • payments : chaque transaction vue pour cette facture, avec confirmations, le nombre required et confirmed.
  • Pour les paiements via le splitter sur Base, amount est ce qui vous est parvenu (99,5 %).

Lister les factures#

GET /api/pay/merchant/invoices?before=<createdAt> : 50 par page, les plus récentes d'abord. Pour obtenir la page suivante, passez le createdAt de la dernière facture reçue.

curl · list invoices (50 per page, newest first)
curl "https://rugward.com/api/pay/merchant/invoices" \
  -H "Authorization: Bearer $RUGWARD_PAY_KEY"

# next page: pass the createdAt of the last invoice you received
curl "https://rugward.com/api/pay/merchant/invoices?before=1793323282069" \
  -H "Authorization: Bearer $RUGWARD_PAY_KEY"
200 OK
{
  "invoices": [
    {
      "id": "Zx3kQ8pL2mN7vR1tY5wB9c",
      "status": "open",
      "amountUsd": "25.00",
      "orderId": "1234",
      "description": "1 x T-shirt, size M",
      "createdAt": 1793323282069,
      "expiresAt": 1793326882069,
      "paidAt": null
    }
  ]
}

Annuler une facture#

POST /api/pay/merchant/invoices/:id/cancel (sans corps). Fonctionne uniquement tant que la facture est open et qu'aucun paiement n'a été vu ; sinon 409.

curl · cancel an open invoice
curl -X POST https://rugward.com/api/pay/merchant/invoices/Zx3kQ8pL2mN7vR1tY5wB9c/cancel \
  -H "Authorization: Bearer $RUGWARD_PAY_KEY"

# 200 {"ok":true}
# 409 {"error":"Only your open invoices without payments can be canceled."}

POST /api/pay/merchant/links avec {amountUsd, description?, redirectUrl?} crée un lien réutilisable ; {"deactivate": "<link id>"} en désactive un. GET liste jusqu'à 100 liens avec uses, active et createdAt. Les conditions marchands doivent d'abord être acceptées. Voir Liens de paiement.

curl · create a reusable payment link
curl -X POST https://rugward.com/api/pay/merchant/links \
  -H "Authorization: Bearer $RUGWARD_PAY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"amountUsd": "15", "description": "Monthly membership", "redirectUrl": "https://shop.example/welcome"}'

# 201 {"id":"k33JZ0ij5F2yLDprwrQgjN","url":"https://rugward.com/pay/l/k33JZ0ij5F2yLDprwrQgjN"}

# list your links
curl https://rugward.com/api/pay/merchant/links -H "Authorization: Bearer $RUGWARD_PAY_KEY"

# turn one off
curl -X POST https://rugward.com/api/pay/merchant/links \
  -H "Authorization: Bearer $RUGWARD_PAY_KEY" -H "Content-Type: application/json" \
  -d '{"deactivate": "k33JZ0ij5F2yLDprwrQgjN"}'

Erreurs#

Error response (any 4xx/5xx)
{ "error": "Amount in USD, e.g. 25 or 25.50." }

// some temporary errors also carry  "retry": true
HTTPSignificationQue faire
400entrée invalide (le message indique le champ)corriger la requête
401clé API absente ou invalidevérifier la clé ; elle a peut-être été révoquée
403requête intersites refusée, conditions marchands non acceptées, compte suspendu ou action non autorisée avec une clélire le message
404introuvable ou ne vous appartient pasvérifier l'id
409conflit (par exemple annulation d'une facture payée, ou déjà 100 liens actifs)lire le message
415le corps n'est pas du JSONenvoyer Content-Type: application/json
429limite de débit, ou 500 factures dans la dernière heureattendre et réessayer avec un délai croissant
451indisponible dans votre région—
503 avec "retry": trueune blockchain ou une source de prix est temporairement injoignableréessayer après quelques secondes

Limites#

  • Débit de requêtes : environ 20 requêtes par minute et par adresse IP sur l'ensemble des endpoints /api/pay/*, plus un plafond de 30 par minute par groupe d'endpoints. Utilisez les webhooks plutôt que l'interrogation ; si vous interrogez, une fois par minute par facture ouverte suffit largement.
  • Factures : 500 par marchand et par heure.
  • Liens de paiement : 100 actifs par marchand ; chaque lien crée au maximum 100 factures par heure.

Liste de contrôle d'intégration#

  1. Créez la facture depuis votre serveur lorsque le client passe commande ; enregistrez l'id avec votre commande.
  2. Redirigez le client vers url.
  3. Sur invoice.paid ou invoice.overpaid (webhook), vérifiez la signature, puis relisez la facture avec GET /api/pay/merchant/invoices/:id et contrôlez status et amountUsd avant d'expédier.
  4. Gérez underpaid, late et expired (voir Statuts).
  5. Rendez votre gestionnaire idempotent : le même événement peut arriver plusieurs fois.

Dernière mise à jour: 30 octobre 2026

Référence de l'API REST · RugWard Documentation | RugWard