Support/Payments

Payments

Direct Payments

The simplest flow. No API needed.

  1. The payer goes to RSends and selects token, amount, and recipient.
  2. The Oracle verifies the transaction and signs.
  3. Transaction executes on-chain via the FeeRouter contract.

The merchant receives the net amount (minus 0.5% fee) directly in their wallet. No webhook, no callback — just an on-chain transfer.

Payment Intents (Merchant API)

For programmatic integrations. The merchant creates a payment intent via the API, gets back an intent_id, and passes it to the payer. When the payer completes the payment, RSends sends a webhook.

Create Intent

POST /api/v1/merchant/payment-intent
{
  "amount": "100.00",
  "currency": "USDC",
  "recipient": "0x742d35Cc6634C0532925a3b844Bc9e7595f2bD18",
  "expires_in": 1800
}

Response

200 OK
{
  "intent_id": "pi_abc123",
  "status": "pending",
  "amount": "100.00",
  "currency": "USDC",
  "expires_at": "2025-04-15T12:30:00Z"
}

The intent_id (e.g. pi_abc123) is what you pass to the payer. They use it to complete the payment on RSends.

Payment Matching

When an incoming payment hits the FeeRouter, RSends matches it against open payment intents. The match uses three fields:

  • Amount — must match exactly.
  • Currency— must match the intent's token.
  • Recipient wallet— must match the intent's destination.

If a match is found, the intent status changes to completed and the webhook fires. If no match is found, the payment is recorded as a generic transfer — it still goes through, but no intent is fulfilled.

Intent Expiry

Payment intents expire after the configured time (default 30 minutes). Expired intents cannot be completed — a new one must be created. The payer's funds are not affected by expiry.