RugWard Pay
Referensi REST API
Semua endpoint merchant RugWard Pay dengan contoh permintaan dan respons, autentikasi kunci API, error, batasan, dan kode dalam curl, Node.js, Python, dan PHP.
Di halaman ini
Dasar-dasar#
| URL dasar | https://rugward.com |
| Format | JSON masuk, JSON keluar. Kirim Content-Type: application/json bersama setiap body (jika tidak, 415). Ukuran body dibatasi beberapa KB. |
| Autentikasi | kunci API di Authorization: Bearer rwp_… atau x-api-key: rwp_… |
| Jumlah | USD sebagai string dengan maksimal 2 desimal ("25", "25.50"); jumlah koin berupa string desimal |
| Waktu | milidetik Unix (createdAt, expiresAt, paidAt) |
| Error | {"error": "human readable message"}, terkadang dengan "retry": true |
Hanya server ke server. Simpan kunci API di server Anda. Browser tidak dapat memanggil API merchant dengan kunci (permintaan lintas origin tidak diizinkan), dan kunci di halaman web akan menjadi publik.
Kunci API#
Buat kunci di dasbor pada API keys (perlu masuk). Kunci berbentuk rwp_ diikuti 40 huruf dan angka dan hanya ditampilkan sekali: segera salin ke penyimpanan rahasia server Anda. RugWard hanya menyimpan hash SHA-256, sehingga kunci yang hilang tidak dapat ditampilkan lagi: buat yang baru dan cabut yang lama. Hingga 10 kunci per merchant; dasbor menampilkan prefiks setiap kunci dan kapan terakhir dipakai.

Yang bisa dan tidak bisa dilakukan kunci:
| Kunci bisa | Kunci tidak bisa |
|---|---|
| membuat, mendaftar, membaca, dan membatalkan invoice | mengubah pengaturan atau alamat penerimaan |
| membuat, mendaftar, dan menonaktifkan tautan pembayaran | membuat, mendaftar, atau mencabut kunci API |
| mengubah atau membaca webhook maupun rahasianya | |
| membuat invoice uji |
Jadi kunci yang bocor tidak dapat mengalihkan uang Anda: alamat penerimaan hanya dapat diubah dengan masuk menggunakan dompet Anda.
Endpoint#
| Metode dan path | Autentikasi | Fungsi |
|---|---|---|
POST /api/pay/merchant/invoices | kunci atau sesi | Membuat invoice |
GET /api/pay/merchant/invoices | kunci atau sesi | Mendaftar invoice, terbaru dulu, 50 per halaman |
GET /api/pay/merchant/invoices/:id | kunci atau sesi | Membaca satu invoice beserta kuotasi dan pembayaran (sekaligus memeriksa ulang rantai) |
POST /api/pay/merchant/invoices/:id/cancel | kunci atau sesi | Membatalkan invoice terbuka tanpa pembayaran |
GET /api/pay/merchant/links | kunci atau sesi | Mendaftar tautan pembayaran |
POST /api/pay/merchant/links | kunci atau sesi | Membuat tautan pembayaran, atau menonaktifkannya |
GET /api/pay/proof/:id | publik | Bukti pembayaran (hanya invoice paid atau overpaid) |
Pengaturan, kunci API, webhook, dan pembayaran yang tidak cocok dikelola di dasbor (hanya dengan sesi dompet).
Membuat invoice#
POST /api/pay/merchant/invoices
| Kolom | Tipe | Wajib | Aturan |
|---|---|---|---|
amountUsd | string atau angka | ya | 1 hingga 50000, maks. 2 desimal |
orderId | string | tidak | 1–64 karakter: huruf, angka, . _ - : # / |
description | string | tidak | maks. 200 karakter, ditampilkan kepada pembeli |
redirectUrl | string | tidak | URL https:// (maks. 500 karakter), ditampilkan setelah pembayaran |
expiresMin | integer | tidak | 15 hingga 10080 (7 hari); bawaan 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"]
}Arahkan pembeli ke url. assets mencantumkan id aset yang dapat dipilih pembeli (koin aktif Anda yang memiliki alamat penerimaan).
Permintaan yang sama dalam bahasa lain:
// 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 checkoutMembaca invoice#
GET /api/pay/merchant/invoices/:id. Membaca invoice juga memeriksa blockchain untuk pembayaran baru, jadi ini panggilan yang tepat untuk memastikan pembayaran sebelum mengirim barang (bersama webhook).
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: satu entri per koin yang dipilih pembeli (jumlah, kurs, alamat penerimaan, kedaluwarsa penguncian kurs).payments: setiap transaksi yang terlihat untuk invoice ini, denganconfirmations, jumlahrequired, danconfirmed.- Pada pembayaran splitter Base,
amountadalah yang sampai ke Anda (99,5%).
Mendaftar invoice#
GET /api/pay/merchant/invoices?before=<createdAt>: 50 per halaman, terbaru dulu. Untuk halaman berikutnya, kirim createdAt dari invoice terakhir yang Anda terima.
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
}
]
}Membatalkan invoice#
POST /api/pay/merchant/invoices/:id/cancel (tanpa body). Hanya berfungsi selama invoice open dan belum ada pembayaran yang terlihat; jika tidak, 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."}Tautan pembayaran#
POST /api/pay/merchant/links dengan {amountUsd, description?, redirectUrl?} membuat tautan yang dapat dipakai ulang; {"deactivate": "<link id>"} menonaktifkannya. GET mendaftar hingga 100 tautan dengan uses, active, dan createdAt. Ketentuan merchant harus disetujui terlebih dulu. Lihat Tautan pembayaran.
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"}'Error#
{ "error": "Amount in USD, e.g. 25 or 25.50." }
// some temporary errors also carry "retry": true| HTTP | Arti | Yang harus dilakukan |
|---|---|---|
| 400 | input tidak valid (pesan menyebutkan kolomnya) | perbaiki permintaan |
| 401 | kunci API tidak ada atau tidak valid | periksa kunci; mungkin sudah dicabut |
| 403 | permintaan lintas situs ditolak, ketentuan merchant belum disetujui, akun ditangguhkan, atau tindakan tidak diizinkan untuk kunci | baca pesannya |
| 404 | tidak ditemukan atau bukan milik Anda | periksa id |
| 409 | konflik (misalnya membatalkan invoice yang lunas, atau sudah ada 100 tautan aktif) | baca pesannya |
| 415 | body bukan JSON | kirim Content-Type: application/json |
| 429 | batas laju, atau 500 invoice dalam satu jam terakhir | tunggu dan coba lagi dengan jeda bertahap |
| 451 | tidak tersedia di wilayah Anda | — |
503 dengan "retry": true | blockchain atau sumber harga sementara tidak dapat dijangkau | coba lagi setelah beberapa detik |
Batasan#
- Laju permintaan: sekitar 20 permintaan per menit per alamat IP di semua endpoint
/api/pay/*, ditambah batas 30 per menit per grup endpoint. Gunakan webhook alih-alih polling; jika melakukan polling, sekali per menit per invoice terbuka sudah lebih dari cukup. - Invoice: 500 per merchant per jam.
- Tautan pembayaran: 100 aktif per merchant; setiap tautan membuat paling banyak 100 invoice per jam.
Daftar periksa integrasi#
- Buat invoice dari server Anda saat pelanggan checkout; simpan
idbersama pesanan Anda. - Arahkan pelanggan ke
url. - Saat menerima
invoice.paidatauinvoice.overpaid(webhook), verifikasi tanda tangannya, lalu baca ulang invoice denganGET /api/pay/merchant/invoices/:iddan periksastatussertaamountUsdsebelum mengirim barang. - Tangani
underpaid,late, danexpired(lihat Status). - Buat handler Anda idempoten: event yang sama dapat datang lebih dari sekali.
Terakhir diperbarui: 30 Oktober 2026