Payment Requests

Create instant payment links for agents.

Generate a code, share it, get paid in seconds.

No checkout. No integration. Just send and get paid.

Generate a payment link and get paid instantly.

Anyone with the link can pay — no account required, no gas.

~2s
Settlement time
USDC arrives seconds after approval
$0
Gas fees
RelAI sponsors all on-chain fees
1-use
Single-use code
Built-in expiry, no double-spend

What this is

Payment Requests let you create a one-time payment link for a specific amount.

The buyer opens it, connects their wallet, approves the payment, and funds settle instantly to your address.

No checkout flow. No merchant account. No manual wallet addresses. Just a link.

Use cases

AI agents paying for servicesAgents can receive a payment link and settle it programmatically
Invoices without integrationsGenerate a link from your backend and email it — buyer pays in one click
Paywalls and gated accessCreate a request, wait for payment confirmation via SSE, then unlock content
One-time paymentsSingle-use, expires automatically — no risk of double charging
Developer tools and APIsMonetise scripts, CLIs, or services with a payment link in the response

How it works

01Create a payment request (amount + optional description)
02Share the code or link with your buyer
03Buyer opens the page, connects wallet, and approves
04Payment settles instantly — tx hash returned

Security: The buyer signs an EIP-3009 authorization binding the exact amount and recipient. The facilitator cannot alter the amount or redirect funds.

Example

Payment link
https://relai.fi/pay#MW78SGTW

Anyone with the link can pay. No account. No onboarding. Open, connect wallet, approve.

The code is 8 characters — human-readable, easy to embed in invoices, messages, or QR codes.

Why not just send USDC?

Raw USDC transfer
address typos
wrong amount sent
no expiry — funds locked
no confirmation callback
no description or context
RelAI Payment Request
no address mistakes
exact amount enforced
built-in expiry
real-time confirmation via SSE
optional description + metadata

Share anywhere

Payment links are fully shareable — no special integration needed on the buyer side.

Send via linkDrop the URL in a message, email, or invoice
Embed in your UIUse the payUrl from the API response as a button or CTA
Attach to invoicesInclude the code or link in any billing document
Generate from backendPOST to create — get a URL back in milliseconds
QR codeEncode the payUrl as a QR for real-world payment scenarios

Paying

Buyers don't need an account. Payment page is at /pay.

01Open the link or enter the 8-character code
02Connect your EVM wallet (MetaMask or compatible)
03Approve the payment — no gas prompt
04Done — explorer link shown on success

Looking to redeem a one-time use code instead? Redeem Code docs · /redeem

Built-in expiration

Each request expires automatically.
Set a ttl in seconds when creating the request (default: 1 hour).
Expired codes return an expired error — no payment is possible.
Create a new request to retry. Single-use — no double-spend risk.

Track status

Monitor payment completion in real time using the SSE event stream.

createdRequest was registered — link is now shareable
paidPayment confirmed on-chain — tx hash available
expiredTTL elapsed without payment — create a new request
SSE — listen for payment confirmation
// GET /facilitator/pay-requests/events
// Content-Type: text/event-stream

const es = new EventSource(
  'https://api.relai.fi/facilitator/pay-requests/events',
  { headers: { 'X-Service-Key': 'sk_live_...' } }
);

es.onmessage = (e) => {
  const { code, status, payTxHash, explorerUrl } = JSON.parse(e.data);
  if (status === 'paid') {
    console.log('Paid!', explorerUrl);
    es.close();
  }
};

API reference

All endpoints require an X-Service-Key header.

POST/facilitator/pay-requests

Create a new one-time payment request. Returns the 8-char code and payUrl.

GET/facilitator/pay-requests

List all active payment requests for your account.

GET/facilitator/pay-requests/:code

Look up a specific request — amount, status, expiry.

GET/facilitator/pay-requests/events

SSE stream — real-time status updates when a request is paid.

Create a payment request
curl -X POST https://api.relai.fi/facilitator/pay-requests \
  -H "X-Service-Key: sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "to": "0xYourMerchantWallet",
    "amount": 5.00,
    "network": "base-sepolia",
    "description": "Invoice #42",
    "ttl": 3600
  }'
Response — 201 Created
{
  "code": "MW78SGTW",
  "expiresIn": 3600,
  "payUrl": "https://relai.fi/pay#MW78SGTW"
}

Settlement networks

NetworkIDGasPrivacy
Base Sepoliabase-sepoliaSponsoredPublic on-chain
SKALE Base Sepoliaskale-base-sepoliaFree (SKALE gasless)🔒 BITE encrypted

Error reference

not_foundRequest not found

The code does not exist or was already consumed.

expiredRequest is no longer valid

The TTL elapsed before payment. Create a new request.

already_paidCode was already used

Each code is single-use. Payment was already settled.

amount_mismatchIncorrect payment amount

Signed amount does not match the request. Rejected for security.