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 base | https://rugward.com |
| Format | JSON en entrée, JSON en sortie. Envoyez Content-Type: application/json avec chaque corps (sinon 415). Les corps sont limités à quelques Ko. |
| Authentification | une clé API dans Authorization: Bearer rwp_… ou x-api-key: rwp_… |
| Montants | USD sous forme de chaîne avec 2 décimales max. ("25", "25.50") ; les montants en crypto sont des chaînes décimales |
| Horodatages | millisecondes 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.

Ce qu'une clé peut et ne peut pas faire :
| Une clé peut | Une clé ne peut pas |
|---|---|
| créer, lister, lire et annuler des factures | modifier les paramètres ou les adresses de réception |
| créer, lister et désactiver des liens de paiement | cré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 chemin | Authentification | Rôle |
|---|---|---|
POST /api/pay/merchant/invoices | clé ou session | Créer une facture |
GET /api/pay/merchant/invoices | clé ou session | Lister les factures, les plus récentes d'abord, 50 par page |
GET /api/pay/merchant/invoices/:id | clé ou session | Lire une facture avec ses cotations et paiements (revérifie aussi la chaîne) |
POST /api/pay/merchant/invoices/:id/cancel | clé ou session | Annuler une facture ouverte sans paiement |
GET /api/pay/merchant/links | clé ou session | Lister les liens de paiement |
POST /api/pay/merchant/links | clé ou session | Créer un lien de paiement, ou le désactiver |
GET /api/pay/proof/:id | public | Preuve 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
| Champ | Type | Obligatoire | Règles |
|---|---|---|---|
amountUsd | chaîne ou nombre | oui | de 1 à 50000, 2 décimales max. |
orderId | chaîne | non | 1 à 64 caractères : lettres, chiffres, . _ - : # / |
description | chaîne | non | 200 caractères max., affichée à l'acheteur |
redirectUrl | chaîne | non | URL https:// (500 caractères max.), affichée après le paiement |
expiresMin | entier | non | de 15 à 10080 (7 jours) ; 60 par défaut |
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
}'{
"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 :
// 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);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
$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 checkoutLire 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 https://rugward.com/api/pay/merchant/invoices/Zx3kQ8pL2mN7vR1tY5wB9c \
-H "Authorization: Bearer $RUGWARD_PAY_KEY"{
"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, avecconfirmations, le nombrerequiredetconfirmed.- Pour les paiements via le splitter sur Base,
amountest 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 "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"{
"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 -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."}Liens de paiement#
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 -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": "Amount in USD, e.g. 25 or 25.50." }
// some temporary errors also carry "retry": true| HTTP | Signification | Que faire |
|---|---|---|
| 400 | entrée invalide (le message indique le champ) | corriger la requête |
| 401 | clé API absente ou invalide | vérifier la clé ; elle a peut-être été révoquée |
| 403 | requête intersites refusée, conditions marchands non acceptées, compte suspendu ou action non autorisée avec une clé | lire le message |
| 404 | introuvable ou ne vous appartient pas | vérifier l'id |
| 409 | conflit (par exemple annulation d'une facture payée, ou déjà 100 liens actifs) | lire le message |
| 415 | le corps n'est pas du JSON | envoyer Content-Type: application/json |
| 429 | limite de débit, ou 500 factures dans la dernière heure | attendre et réessayer avec un délai croissant |
| 451 | indisponible dans votre région | — |
503 avec "retry": true | une blockchain ou une source de prix est temporairement injoignable | ré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#
- Créez la facture depuis votre serveur lorsque le client passe commande ; enregistrez l'
idavec votre commande. - Redirigez le client vers
url. - Sur
invoice.paidouinvoice.overpaid(webhook), vérifiez la signature, puis relisez la facture avecGET /api/pay/merchant/invoices/:idet contrôlezstatusetamountUsdavant d'expédier. - Gérez
underpaid,lateetexpired(voir Statuts). - Rendez votre gestionnaire idempotent : le même événement peut arriver plusieurs fois.
Dernière mise à jour: 30 octobre 2026