RugWard Pay
Referência da API REST
Todos os endpoints de comerciante do RugWard Pay com exemplos de requisição e resposta, autenticação por chave de API, erros, limites e código em curl, Node.js, Python e PHP.
Nesta página
Noções básicas#
| URL base | https://rugward.com |
| Formato | JSON de entrada, JSON de saída. Envie Content-Type: application/json com todo corpo (caso contrário, 415). Os corpos são limitados a poucos KB. |
| Autenticação | uma chave de API em Authorization: Bearer rwp_… ou x-api-key: rwp_… |
| Valores | USD como string com até 2 casas decimais ("25", "25.50"); valores em moeda são strings decimais |
| Tempos | milissegundos Unix (createdAt, expiresAt, paidAt) |
| Erros | {"error": "human readable message"}, às vezes com "retry": true |
Somente de servidor para servidor. Mantenha a chave de API no seu servidor. Navegadores não conseguem chamar a API do comerciante com uma chave (requisições cross-origin não são permitidas), e uma chave numa página web seria pública.
Chaves de API#
Crie chaves no painel em API keys (é preciso estar logado). Uma chave tem o formato rwp_ seguido de 40 letras e dígitos e é mostrada uma única vez: copie-a imediatamente para o cofre de segredos do seu servidor. O RugWard guarda apenas um hash SHA-256, então uma chave perdida não pode ser mostrada de novo: crie uma nova e revogue a antiga. Até 10 chaves por comerciante; o painel mostra o prefixo de cada chave e quando foi usada pela última vez.

O que uma chave pode e não pode fazer:
| Uma chave pode | Uma chave não pode |
|---|---|
| criar, listar, ler e cancelar faturas | alterar configurações ou endereços de recebimento |
| criar, listar e desativar links de pagamento | criar, listar ou revogar chaves de API |
| alterar ou ler o webhook ou o segredo dele | |
| criar faturas de teste |
Assim, uma chave vazada não consegue desviar o seu dinheiro: os endereços de recebimento só podem ser alterados entrando com a sua carteira.
Endpoints#
| Método e caminho | Autenticação | Finalidade |
|---|---|---|
POST /api/pay/merchant/invoices | chave ou sessão | Criar uma fatura |
GET /api/pay/merchant/invoices | chave ou sessão | Listar faturas, das mais recentes, 50 por página |
GET /api/pay/merchant/invoices/:id | chave ou sessão | Ler uma fatura com cotações e pagamentos (também reverifica a rede) |
POST /api/pay/merchant/invoices/:id/cancel | chave ou sessão | Cancelar uma fatura aberta sem pagamentos |
GET /api/pay/merchant/links | chave ou sessão | Listar links de pagamento |
POST /api/pay/merchant/links | chave ou sessão | Criar um link de pagamento, ou desativá-lo |
GET /api/pay/proof/:id | pública | Prova de pagamento (somente faturas paid ou overpaid) |
Configurações, chaves de API, o webhook e pagamentos sem correspondência são gerenciados no painel (somente com sessão de carteira).
Criar uma fatura#
POST /api/pay/merchant/invoices
| Campo | Tipo | Obrigatório | Regras |
|---|---|---|---|
amountUsd | string ou número | sim | 1 a 50000, máx. 2 casas decimais |
orderId | string | não | 1–64 caracteres: letras, dígitos, . _ - : # / |
description | string | não | máx. 200 caracteres, mostrada ao comprador |
redirectUrl | string | não | URL https:// (máx. 500 caracteres), mostrada após o pagamento |
expiresMin | inteiro | não | 15 a 10080 (7 dias); padrão 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"]
}Envie o comprador para url. assets lista os ids de ativo que o comprador pode escolher (as suas moedas ativadas que têm endereço de recebimento).
A mesma requisição em outras linguagens:
// 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 checkoutLer uma fatura#
GET /api/pay/merchant/invoices/:id. Ler uma fatura também verifica as blockchains em busca de novos pagamentos, então esta é a chamada certa para confirmar um pagamento antes de enviar o pedido (junto com os 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: uma entrada por moeda escolhida pelo comprador (valor, taxa, endereço de recebimento, expiração da trava de cotação).payments: cada transação vista para esta fatura, comconfirmations, o númerorequiredeconfirmed.- Em pagamentos via splitter na Base,
amounté o que chegou a você (99,5%).
Listar faturas#
GET /api/pay/merchant/invoices?before=<createdAt>: 50 por página, das mais recentes. Para obter a próxima página, passe o createdAt da última fatura recebida.
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
}
]
}Cancelar uma fatura#
POST /api/pay/merchant/invoices/:id/cancel (sem corpo). Funciona apenas enquanto a fatura está open e nenhum pagamento foi visto; caso contrário, 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."}Links de pagamento#
POST /api/pay/merchant/links com {amountUsd, description?, redirectUrl?} cria um link reutilizável; {"deactivate": "<link id>"} desativa um. GET lista até 100 links com uses, active e createdAt. Os termos do comerciante precisam ser aceitos antes. Veja Links de pagamento.
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"}'Erros#
{ "error": "Amount in USD, e.g. 25 or 25.50." }
// some temporary errors also carry "retry": true| HTTP | Significado | O que fazer |
|---|---|---|
| 400 | entrada inválida (a mensagem diz qual campo) | corrija a requisição |
| 401 | chave de API ausente ou inválida | confira a chave; ela pode ter sido revogada |
| 403 | requisição entre sites recusada, termos do comerciante não aceitos, conta suspensa ou ação não permitida para chaves | leia a mensagem |
| 404 | não encontrado ou não é seu | confira o id |
| 409 | conflito (por exemplo, cancelar uma fatura paga, ou já existem 100 links ativos) | leia a mensagem |
| 415 | o corpo não é JSON | envie Content-Type: application/json |
| 429 | limite de taxa, ou 500 faturas na última hora | aguarde e tente de novo com espera progressiva |
| 451 | indisponível na sua região | — |
503 com "retry": true | uma blockchain ou fonte de preço está temporariamente inacessível | tente de novo após alguns segundos |
Limites#
- Taxa de requisições: cerca de 20 requisições por minuto por endereço IP em todos os endpoints
/api/pay/*, mais um teto de 30 por minuto por grupo de endpoints. Use webhooks em vez de polling; se fizer polling, uma vez por minuto por fatura aberta é mais que suficiente. - Faturas: 500 por comerciante por hora.
- Links de pagamento: 100 ativos por comerciante; cada link cria no máximo 100 faturas por hora.
Checklist de integração#
- Crie a fatura pelo seu servidor quando o cliente finalizar a compra; salve o
idjunto ao pedido. - Redirecione o cliente para
url. - Em
invoice.paidouinvoice.overpaid(webhook), verifique a assinatura, depois releia a fatura comGET /api/pay/merchant/invoices/:ide confirastatuseamountUsdantes de enviar o pedido. - Trate
underpaid,lateeexpired(veja Status). - Torne o seu handler idempotente: o mesmo evento pode chegar mais de uma vez.
Última atualização: 30 de outubro de 2026