Skip to content
RugWard
☰ Menü

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-URLhttps://rugward.com
FormatJSON rein, JSON raus. Senden Sie bei jedem Body Content-Type: application/json (sonst 415). Bodys sind auf wenige KB begrenzt.
Authentifizierungein API-Schlüssel in Authorization: Bearer rwp_… oder x-api-key: rwp_…
BeträgeUSD als String mit bis zu 2 Nachkommastellen ("25", "25.50"); Coin-Beträge sind Dezimal-Strings
ZeitenUnix-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.

API-Schlüssel und Webhook im Dashboard
API-Schlüssel erstellen oder widerrufen und den Webhook einrichten

Was ein Schlüssel kann und was nicht:

Ein Schlüssel kannEin Schlüssel kann nicht
Rechnungen erstellen, auflisten, lesen und stornierenEinstellungen oder Empfangsadressen ändern
Zahlungslinks erstellen, auflisten und deaktivierenAPI-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 PfadAuthentifizierungZweck
POST /api/pay/merchant/invoicesSchlüssel oder SitzungRechnung erstellen
GET /api/pay/merchant/invoicesSchlüssel oder SitzungRechnungen auflisten, neueste zuerst, 50 pro Seite
GET /api/pay/merchant/invoices/:idSchlüssel oder SitzungEine Rechnung mit Angeboten und Zahlungen lesen (prüft auch die Chain erneut)
POST /api/pay/merchant/invoices/:id/cancelSchlüssel oder SitzungEine offene Rechnung ohne Zahlungen stornieren
GET /api/pay/merchant/linksSchlüssel oder SitzungZahlungslinks auflisten
POST /api/pay/merchant/linksSchlüssel oder SitzungEinen Zahlungslink erstellen oder deaktivieren
GET /api/pay/proof/:idöffentlichZahlungsnachweis (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

FeldTypPflichtRegeln
amountUsdString oder Zahlja1 bis 50000, max. 2 Nachkommastellen
orderIdStringnein1–64 Zeichen: Buchstaben, Ziffern, . _ - : # /
descriptionStringneinmax. 200 Zeichen, wird dem Käufer angezeigt
redirectUrlStringneinhttps://-URL (max. 500 Zeichen), wird nach der Zahlung angezeigt
expiresMinGanzzahlnein15 bis 10080 (7 Tage); Standard 60
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"]
}

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:

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

Eine 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 · 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: 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 mit confirmations, der Anzahl required und confirmed.
  • Bei Base-Splitter-Zahlungen ist amount das, 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 · 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
    }
  ]
}

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

Fehler#

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

// some temporary errors also carry  "retry": true
HTTPBedeutungWas tun
400ungültige Eingabe (die Meldung nennt das Feld)Anfrage korrigieren
401API-Schlüssel fehlt oder ist ungültigSchlüssel prüfen; er wurde evtl. widerrufen
403websiteübergreifende Anfrage abgelehnt, Händlerbedingungen nicht akzeptiert, Konto gesperrt oder Aktion für Schlüssel nicht erlaubtMeldung lesen
404nicht gefunden oder nicht IhresID prüfen
409Konflikt (z. B. Stornieren einer bezahlten Rechnung oder bereits 100 aktive Links)Meldung lesen
415Body ist kein JSONContent-Type: application/json senden
429Ratenlimit oder 500 Rechnungen in der letzten Stundewarten und mit Backoff erneut versuchen
451in Ihrer Region nicht verfügbar—
503 mit "retry": trueeine Blockchain oder Preisquelle ist vorübergehend nicht erreichbarnach 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#

  1. Erstellen Sie die Rechnung von Ihrem Server aus, wenn der Kunde zur Kasse geht; speichern Sie die id mit Ihrer Bestellung.
  2. Leiten Sie den Kunden zu url weiter.
  3. Bei invoice.paid oder invoice.overpaid (Webhook) prüfen Sie die Signatur, lesen dann die Rechnung mit GET /api/pay/merchant/invoices/:id erneut und kontrollieren status und amountUsd vor dem Versand.
  4. Behandeln Sie underpaid, late und expired (siehe Status).
  5. Machen Sie Ihren Handler idempotent: Dasselbe Ereignis kann mehrfach eintreffen.

Zuletzt aktualisiert: 30. Oktober 2026