RugWard Pay
REST-API-Referenz
Alle Händler-Endpunkte von RugWard Pay mit Anfrage- und Antwortbeispielen, Authentifizierung per API-Schlüssel, Fehlern, Limits und Code in curl, Node.js, Python und PHP.
Auf dieser Seite
Grundlagen#
| Basis-URL | https://rugward.com |
| Format | JSON rein, JSON raus. Senden Sie bei jedem Body Content-Type: application/json (sonst 415). Bodys sind auf wenige KB begrenzt. |
| Authentifizierung | ein API-Schlüssel in Authorization: Bearer rwp_… oder x-api-key: rwp_… |
| Beträge | USD als String mit bis zu 2 Nachkommastellen ("25", "25.50"); Coin-Beträge sind Dezimal-Strings |
| Zeiten | Unix-Millisekunden (createdAt, expiresAt, paidAt) |
| Fehler | {"error": "human readable message"}, manchmal mit "retry": true |
Nur Server zu Server. Bewahren Sie den API-Schlüssel auf Ihrem Server auf. Browser können die Händler-API nicht mit einem Schlüssel aufrufen (Cross-Origin-Anfragen sind nicht erlaubt), und ein Schlüssel in einer Webseite wäre öffentlich.
API-Schlüssel#
Erstellen Sie Schlüssel im Dashboard unter API keys (Anmeldung erforderlich). Ein Schlüssel sieht aus wie rwp_ gefolgt von 40 Buchstaben und Ziffern und wird nur einmal angezeigt: Kopieren Sie ihn sofort in den Geheimnisspeicher Ihres Servers. RugWard speichert nur einen SHA-256-Hash, ein verlorener Schlüssel kann also nicht erneut angezeigt werden: Erstellen Sie einen neuen und widerrufen Sie den alten. Bis zu 10 Schlüssel pro Händler; das Dashboard zeigt das Präfix jedes Schlüssels und wann er zuletzt verwendet wurde.

Was ein Schlüssel kann und was nicht:
| Ein Schlüssel kann | Ein Schlüssel kann nicht |
|---|---|
| Rechnungen erstellen, auflisten, lesen und stornieren | Einstellungen oder Empfangsadressen ändern |
| Zahlungslinks erstellen, auflisten und deaktivieren | API-Schlüssel erstellen, auflisten oder widerrufen |
| den Webhook oder sein Secret ändern oder lesen | |
| Testrechnungen erstellen |
Ein geleakter Schlüssel kann Ihr Geld also nicht umleiten: Empfangsadressen lassen sich nur durch Anmeldung mit Ihrer Wallet ändern.
Endpunkte#
| Methode und Pfad | Authentifizierung | Zweck |
|---|---|---|
POST /api/pay/merchant/invoices | Schlüssel oder Sitzung | Rechnung erstellen |
GET /api/pay/merchant/invoices | Schlüssel oder Sitzung | Rechnungen auflisten, neueste zuerst, 50 pro Seite |
GET /api/pay/merchant/invoices/:id | Schlüssel oder Sitzung | Eine Rechnung mit Angeboten und Zahlungen lesen (prüft auch die Chain erneut) |
POST /api/pay/merchant/invoices/:id/cancel | Schlüssel oder Sitzung | Eine offene Rechnung ohne Zahlungen stornieren |
GET /api/pay/merchant/links | Schlüssel oder Sitzung | Zahlungslinks auflisten |
POST /api/pay/merchant/links | Schlüssel oder Sitzung | Einen Zahlungslink erstellen oder deaktivieren |
GET /api/pay/proof/:id | öffentlich | Zahlungsnachweis (nur bezahlte oder überbezahlte Rechnungen) |
Einstellungen, API-Schlüssel, der Webhook und nicht zugeordnete Zahlungen werden im Dashboard verwaltet (nur mit Wallet-Sitzung).
Eine Rechnung erstellen#
POST /api/pay/merchant/invoices
| Feld | Typ | Pflicht | Regeln |
|---|---|---|---|
amountUsd | String oder Zahl | ja | 1 bis 50000, max. 2 Nachkommastellen |
orderId | String | nein | 1–64 Zeichen: Buchstaben, Ziffern, . _ - : # / |
description | String | nein | max. 200 Zeichen, wird dem Käufer angezeigt |
redirectUrl | String | nein | https://-URL (max. 500 Zeichen), wird nach der Zahlung angezeigt |
expiresMin | Ganzzahl | nein | 15 bis 10080 (7 Tage); Standard 60 |
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"]
}Leiten Sie den Käufer zu url. assets listet die Asset-IDs, aus denen der Käufer wählen kann (Ihre aktivierten Coins mit Empfangsadresse).
Dieselbe Anfrage in anderen Sprachen:
// 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 checkoutEine Rechnung lesen#
GET /api/pay/merchant/invoices/:id. Das Lesen einer Rechnung prüft auch die Blockchains auf neue Zahlungen; das ist daher der richtige Aufruf, um eine Zahlung vor dem Versand zu bestätigen (zusammen mit 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: ein Eintrag pro Coin, den der Käufer gewählt hat (Betrag, Kurs, Empfangsadresse, Ablauf der Kursfixierung).payments: jede für diese Rechnung gesehene Transaktion mitconfirmations, der Anzahlrequiredundconfirmed.- Bei Base-Splitter-Zahlungen ist
amountdas, was bei Ihnen ankam (99,5 %).
Rechnungen auflisten#
GET /api/pay/merchant/invoices?before=<createdAt>: 50 pro Seite, neueste zuerst. Für die nächste Seite übergeben Sie das createdAt der letzten erhaltenen Rechnung.
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
}
]
}Eine Rechnung stornieren#
POST /api/pay/merchant/invoices/:id/cancel (ohne Body). Funktioniert nur, solange die Rechnung open ist und keine Zahlung gesehen wurde; sonst 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."}Zahlungslinks#
POST /api/pay/merchant/links mit {amountUsd, description?, redirectUrl?} erstellt einen wiederverwendbaren Link; {"deactivate": "<link id>"} deaktiviert einen. GET listet bis zu 100 Links mit uses, active und createdAt. Zuvor müssen die Händlerbedingungen akzeptiert sein. Siehe Zahlungslinks.
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"}'Fehler#
{ "error": "Amount in USD, e.g. 25 or 25.50." }
// some temporary errors also carry "retry": true| HTTP | Bedeutung | Was tun |
|---|---|---|
| 400 | ungültige Eingabe (die Meldung nennt das Feld) | Anfrage korrigieren |
| 401 | API-Schlüssel fehlt oder ist ungültig | Schlüssel prüfen; er wurde evtl. widerrufen |
| 403 | websiteübergreifende Anfrage abgelehnt, Händlerbedingungen nicht akzeptiert, Konto gesperrt oder Aktion für Schlüssel nicht erlaubt | Meldung lesen |
| 404 | nicht gefunden oder nicht Ihres | ID prüfen |
| 409 | Konflikt (z. B. Stornieren einer bezahlten Rechnung oder bereits 100 aktive Links) | Meldung lesen |
| 415 | Body ist kein JSON | Content-Type: application/json senden |
| 429 | Ratenlimit oder 500 Rechnungen in der letzten Stunde | warten und mit Backoff erneut versuchen |
| 451 | in Ihrer Region nicht verfügbar | — |
503 mit "retry": true | eine Blockchain oder Preisquelle ist vorübergehend nicht erreichbar | nach einigen Sekunden erneut versuchen |
Limits#
- Anfragerate: etwa 20 Anfragen pro Minute und IP-Adresse über alle
/api/pay/*-Endpunkte, plus eine Obergrenze von 30 pro Minute pro Endpunktgruppe. Nutzen Sie Webhooks statt Polling; wenn Sie pollen, reicht einmal pro Minute und offener Rechnung völlig. - Rechnungen: 500 pro Händler und Stunde.
- Zahlungslinks: 100 aktive pro Händler; jeder Link erstellt höchstens 100 Rechnungen pro Stunde.
Integrations-Checkliste#
- Erstellen Sie die Rechnung von Ihrem Server aus, wenn der Kunde zur Kasse geht; speichern Sie die
idmit Ihrer Bestellung. - Leiten Sie den Kunden zu
urlweiter. - Bei
invoice.paidoderinvoice.overpaid(Webhook) prüfen Sie die Signatur, lesen dann die Rechnung mitGET /api/pay/merchant/invoices/:iderneut und kontrollierenstatusundamountUsdvor dem Versand. - Behandeln Sie
underpaid,lateundexpired(siehe Status). - Machen Sie Ihren Handler idempotent: Dasselbe Ereignis kann mehrfach eintreffen.
Zuletzt aktualisiert: 30. Oktober 2026