Skip to content
RugWard
☰ Menu

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 basehttps://rugward.com
FormatoJSON 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çãouma chave de API em Authorization: Bearer rwp_… ou x-api-key: rwp_…
ValoresUSD como string com até 2 casas decimais ("25", "25.50"); valores em moeda são strings decimais
Temposmilissegundos 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.

Chaves de API e webhook no painel
Crie ou revogue chaves de API e configure o webhook

O que uma chave pode e não pode fazer:

Uma chave podeUma chave não pode
criar, listar, ler e cancelar faturasalterar configurações ou endereços de recebimento
criar, listar e desativar links de pagamentocriar, 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 caminhoAutenticaçãoFinalidade
POST /api/pay/merchant/invoiceschave ou sessãoCriar uma fatura
GET /api/pay/merchant/invoiceschave ou sessãoListar faturas, das mais recentes, 50 por página
GET /api/pay/merchant/invoices/:idchave ou sessãoLer uma fatura com cotações e pagamentos (também reverifica a rede)
POST /api/pay/merchant/invoices/:id/cancelchave ou sessãoCancelar uma fatura aberta sem pagamentos
GET /api/pay/merchant/linkschave ou sessãoListar links de pagamento
POST /api/pay/merchant/linkschave ou sessãoCriar um link de pagamento, ou desativá-lo
GET /api/pay/proof/:idpúblicaProva 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

CampoTipoObrigatórioRegras
amountUsdstring ou númerosim1 a 50000, máx. 2 casas decimais
orderIdstringnão1–64 caracteres: letras, dígitos, . _ - : # /
descriptionstringnãomáx. 200 caracteres, mostrada ao comprador
redirectUrlstringnãoURL https:// (máx. 500 caracteres), mostrada após o pagamento
expiresMininteironão15 a 10080 (7 dias); padrão 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"]
}

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:

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

Ler 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 · 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: 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, com confirmations, o número required e confirmed.
  • 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 · 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
    }
  ]
}

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

Erros#

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

// some temporary errors also carry  "retry": true
HTTPSignificadoO que fazer
400entrada inválida (a mensagem diz qual campo)corrija a requisição
401chave de API ausente ou inválidaconfira a chave; ela pode ter sido revogada
403requisição entre sites recusada, termos do comerciante não aceitos, conta suspensa ou ação não permitida para chavesleia a mensagem
404não encontrado ou não é seuconfira o id
409conflito (por exemplo, cancelar uma fatura paga, ou já existem 100 links ativos)leia a mensagem
415o corpo não é JSONenvie Content-Type: application/json
429limite de taxa, ou 500 faturas na última horaaguarde e tente de novo com espera progressiva
451indisponível na sua região—
503 com "retry": trueuma blockchain ou fonte de preço está temporariamente inacessíveltente 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#

  1. Crie a fatura pelo seu servidor quando o cliente finalizar a compra; salve o id junto ao pedido.
  2. Redirecione o cliente para url.
  3. Em invoice.paid ou invoice.overpaid (webhook), verifique a assinatura, depois releia a fatura com GET /api/pay/merchant/invoices/:id e confira status e amountUsd antes de enviar o pedido.
  4. Trate underpaid, late e expired (veja Status).
  5. Torne o seu handler idempotente: o mesmo evento pode chegar mais de uma vez.

Última atualização: 30 de outubro de 2026