Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.request.network/llms.txt

Use this file to discover all available pages before exploring further.

This guide walks through the canonical flow for receiving payments via Request Network: creating a payment destination and Client ID in the Dashboard, registering a webhook for payment notifications, and creating a payment link. Every other use-case page links back to specific steps here.

Overview

The flow involves three services:
  1. Dashboard (dashboard.request.network) β€” Sign in with your wallet, create payment destinations, and generate Client IDs
  2. Auth API (auth.request.network) β€” Programmatic alternative for Client IDs, and the home of webhooks
  3. Request API (api.request.network) β€” Create payment links (secure payments)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  1. Sign in with     β”‚  dashboard.request.network
β”‚     wallet           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  2. Create Payee     β”‚  dashboard.request.network
β”‚     Destination      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  3. Create Client ID β”‚  dashboard.request.network
β”‚                      β”‚  (or auth.request.network/open-api)
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  4. Register Webhook β”‚  auth.request.network/open-api
β”‚                      β”‚  (POST /v1/webhook with x-client-id)
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  5. Create Secure    β”‚  api.request.network/open-api
β”‚     Payment (link)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
Your wallet session cookie (session_token) is shared across dashboard.request.network, auth.request.network, and api.request.network β€” so signing in once on the Dashboard gives you access to the API docs as well.

Prerequisites

  • An EVM wallet (e.g. MetaMask) or a Tron wallet (e.g. TronLink) that will receive payments
  • The ability to sign messages with that wallet

Step 1: Sign in with Your Wallet

1

Open the Dashboard

2

Connect and sign

Connect your EVM or Tron wallet and sign the authentication message when prompted.
3

Active session

Once signed in, you have an active wallet session. This sets a session_token cookie in your browser that is shared across Request Network services.
Wallet sessions expire after 15 minutes of idle time. If your session expires during the following steps, return to the Dashboard and sign in again.

Step 2: Create a Payment Destination

A payment destination registers where you want to receive payments β€” it links your wallet address to a specific token on a specific chain.
1

Navigate to setup

In the Dashboard, navigate to the payment destination setup.
2

Pick chain and token

Select the chain and token you want to receive payments in.
3

Confirm

Confirm the creation.
The Dashboard returns a destinationId (also shown as humanReadableInteropAddress). Save this value β€” you’ll need it in Step 5. The destinationId follows the ERC-7828 format:
{walletAddress}@eip155:{chainId}#{checksum}

Supported Chains and Tokens

NetworkChain IDUSDCUSDT
Ethereum10xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB480xdAC17F958D2ee523a2206206994597C13D831ec7
Arbitrum One421610xaf88d065e77c8cC2239327C5EDb3A432268e58310xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9 (USDT0)
Optimism100x0b2C639c533813f4Aa9D7837CAf62653d097Ff850x94b008aA00579c1307B0EF2c499aD98a8ce58e58
Base84530x833589fCD6eDb6E08f4c7C32D4f71b54bdA029130xfde4C96c8593536E31F229EA8f37b2ADa2699bb2
Polygon1370x3c499c542cEF5E3811e1192ce70d8cC03d5c33590xc2132D05D31c914a87C6611C10748AEb04B58e8F
BSC560x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d0x55d398326f99059ff775485246999027b3197955
Tron728126428β€” (API-only via Auth API: TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8)TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t
The Dashboard UI exposes USDT for Tron destinations. To create a USDC-on-Tron destination, call POST /v1/payee-destination on the Auth API directly with the USDC token address. Testnet:
NetworkChain IDTokens
Sepolia11155111FAU: 0x370DE27fdb7D1Ff1e1BaA7D11c5820a324Cf623C, USDC: 0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238, USDT: 0xF046b3CA5ae2879c6bAcC4D42fAF363eE8379F78

Step 3: Create a Client ID

A Client ID identifies your application and is required to create payment links and register webhooks.
1

Open Dashboard

2

Open destination settings

Open your payment destination settings.
3

Open Client IDs

Open the Client IDs section.
4

Generate

Click Generate New Client ID.
5

Name and configure

Enter a human-readable name. Add Allowed Domains if the Client ID will be used from a frontend application. Leave empty for backend/server-side usage only.
6

Save

Confirm to generate the Client ID. Copy and save the generated clientId β€” you’ll use it in Steps 4 and 5.
Allowed domains must use https:// (except for localhost, 127.0.0.1, or ::1 which allow http://). No path, query, or fragment allowed.

Option B β€” Auth API (for automation)

Open the Scalar docs at auth.request.network/open-api and call:
POST https://auth.request.network/v1/client-ids
Content-Type: application/json

{
  "label": "My Client ID",
  "allowedDomains": ["https://mydomain.com"],
  "feePercentage": null,
  "feeAddress": null,
  "operatorWalletAddress": null,
  "payeeDestinationId": "<destinationId-from-step-2>"
}
Your wallet session from Step 1 is sent automatically via cookie. Example response (201 Created):
{
  "id": "01KJBN4KR5PFG4NAQG60EHR2Y0",
  "clientId": "cli_nz1bj41szV2fvjm9pbxdIhro3ld4x4",
  "label": "My Client ID",
  "allowedDomains": ["https://mydomain.com"],
  "feePercentage": null,
  "feeAddress": null,
  "operatorWalletAddress": null,
  "defaultPreApprovalExpiry": null,
  "defaultAuthorizationExpiry": null,
  "status": "active",
  "createdAt": "2026-03-02T19:42:37 GMT+0000"
}
Save the clientId value (e.g. cli_nz1bj41szV2fvjm9pbxdIhro3ld4x4) β€” you’ll use it in Steps 4 and 5.

Step 4: Register a Webhook

Webhooks let you receive real-time notifications when a payment is completed (or partially paid) for your payment links β€” no polling required. Webhooks are scoped to the Client ID that creates them. Any payment link created with that Client ID will trigger the webhook. The webhook payload includes the clientId field so you can identify which Client ID the payment was associated with.

Creating a webhook

Open auth.request.network/open-api and call:
POST https://auth.request.network/v1/webhook
x-client-id: <clientId-from-step-3>
Content-Type: application/json

{
  "url": "https://mydomain.com/webhook"
}
Example response (201 Created):
{
  "id": "01KJC2WX8EH4MP3DHZB2YQ7N9G",
  "secret": "f3c189a4b5e6d7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2"
}
The secret is only returned once at creation. Store it securely β€” you cannot retrieve it again. Use HTTPS in production. localhost URLs are accepted for local testing.

Managing webhooks

Use the same Scalar docs page to list, toggle, or delete webhooks (all accept x-client-id):
MethodPathPurpose
GET/v1/webhookList webhooks for this Client ID
PUT/v1/webhook/:webhookIdToggle active / inactive
DELETE/v1/webhook/:webhookIdPermanently delete
POST/v1/webhook/testBody { "eventType": "payment.confirmed" } β€” fire a test delivery

Verifying webhook signatures

Every webhook request includes a signature header so you can verify it came from Request Network:
HeaderDescription
x-request-network-signatureHMAC-SHA256 of the raw JSON body, signed with your webhook secret
x-request-network-deliveryUnique delivery ID β€” use as an idempotency key
x-request-network-retry-countRetry attempt number (0–3)
x-request-network-testtrue only for test deliveries via /v1/webhook/test
To verify, compute HMAC-SHA256(rawBody, webhookSecret) and compare it to x-request-network-signature using a constant-time comparison.
import { createHmac, timingSafeEqual } from "node:crypto";

function verify(rawBody: string, signature: string, secret: string) {
  const expected = createHmac("sha256", secret).update(rawBody).digest("hex");
  const a = Buffer.from(expected, "hex");
  const b = Buffer.from(signature, "hex");
  return a.length === b.length && timingSafeEqual(a, b);
}
Always verify against the raw request body before parsing. Retries: up to 3 retries (4 attempts total), default delays 1s / 5s / 15s, triggered on any non-2xx response, timeout, or connection error. When a payer completes a payment on a payment link you created, your webhook receives a payment.confirmed event (or payment.partial for partial payments). For Client ID-scoped variants you’ll also receive payment.confirmed.client_id / payment.partial.client_id with extra clientId and origin fields. Example payment.confirmed payload:
{
  "event": "payment.confirmed",
  "requestId": "01de2a889ee629c15b71b5d7964e3a7e87638c886be75bf1b9d2c1fbe64cf855fb",
  "paymentReference": "0xabc123...",
  "payee": "0x6923831ACf5c327260D7ac7C9DfF5b1c3cB3C7D7",
  "amount": "10.0",
  "totalAmountPaid": "10.0",
  "expectedAmount": "10.0",
  "timestamp": "2026-03-02T20:15:00.000Z",
  "txHash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
  "network": "sepolia",
  "currency": "FAU",
  "paymentCurrency": "FAU",
  "clientId": "cli_nz1bj41szV2fvjm9pbxdIhro3ld4x4",
  "origin": "https://mydomain.com"
}
Key fields to look for:
FieldDescription
eventpayment.confirmed (fully paid) or payment.partial (partial payment)
requestIdThe request ID from when you created the payment link
clientIdThe Client ID used to create the payment link β€” use this to route events if you have multiple Client IDs
amountThe amount paid in this transaction
totalAmountPaidCumulative amount paid so far
expectedAmountThe total amount expected
txHashOn-chain transaction hash
networkThe blockchain network
currencyThe token used for payment

All supported webhook events

EventDescription
payment.confirmedPayment fully confirmed
payment.partialPartial payment received
payment.confirmed.client_idClient ID-scoped variant of payment.confirmed
payment.partial.client_idClient ID-scoped variant of payment.partial
payment.confirmed.checkoutSecure-payment-scoped variant of payment.confirmed
payment.partial.checkoutSecure-payment-scoped variant of payment.partial
payment.failedPayment failed
payment.refundedPayment refunded
payment.processingOfframp processing started
request.recurringA recurring request fired
payment_detail.updatedPayment detail metadata changed
compliance.updatedCompliance status changed
With the destinationId from Step 2 and the clientId from Step 3, you can now create a payment link. When the payment is completed, the webhook from Step 4 will be notified automatically.
1

Open the API docs

Open the Request API docs: api.request.network/open-api.
2

Set the Client ID header

Set the x-client-id header to the clientId value from Step 3.
3

Fill in the request body

{
  "requests": [
    {
      "destinationId": "0x6923831ACf5c327260D7ac7C9DfF5b1c3cB3C7D7@eip155:11155111#1f969856:0x370DE27fdb7D1Ff1e1BaA7D11c5820a324Cf623C",
      "amount": "1"
    }
  ]
}
4

Send

Click Send.

Constructing the destinationId

The destinationId in the request body is a composite value that combines the payee destination’s humanReadableInteropAddress (from Step 2) with the tokenAddress, separated by ::
{humanReadableInteropAddress}:{tokenAddress}
For example:
0x6923831ACf5c327260D7ac7C9DfF5b1c3cB3C7D7@eip155:11155111#1f969856:0x370DE27fdb7D1Ff1e1BaA7D11c5820a324Cf623C
└──────────── humanReadableInteropAddress β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ └──────────── tokenAddress β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Request body fields

FieldTypeRequiredDescription
requestsarrayYesArray of payment request items (at least 1; multiple items create a batch on EVM only)
requests[].destinationIdstringYesComposite ID: humanReadableInteropAddress:tokenAddress
requests[].amountstringYesAmount in human-readable format (e.g. "10" for 10 USDC)
feePercentagestringNoFee percentage (0–100). If set, feeAddress is required.
feeAddressstringNoAddress to receive fees. Required if feePercentage is set.
referencestringNoMerchant reference (≀ 255 chars)
payerIdentifierstringNoPayer identifier (≀ 255 chars)
Submitting multiple requests[] items where any destination is on Tron returns a 400 with Batch payments are not supported for TRON networks. Please submit individual payment requests. Tron secure payments are single-recipient. EVM batches up to 200 payees per link work as expected.
Example response (201 Created):
{
  "requestIds": [
    "01de2a889ee629c15b71b5d7964e3a7e87638c886be75bf1b9d2c1fbe64cf855fb"
  ],
  "securePaymentUrl": "https://pay.request.network/?token=01KJRA0M9QG8MA4X887908T8A4",
  "token": "01KJRA0M9QG8MA4X887908T8A4"
}
FieldTypeDescription
requestIdsstring[]IDs of the created payment requests
securePaymentUrlstringShareable URL for the payer to complete payment
tokenstringUnique token for this payment session
Share the securePaymentUrl with the payer. They can open it in their browser to complete the payment.
The payment link expires after 7 days or once it has been paid, whichever comes first.

Step 6: Check Payment Status (Optional)

In addition to receiving webhook notifications (Step 4), you can also poll for payment status using the requestId from Step 5. Endpoint: GET https://api.request.network/v2/request/{requestId} You can call this from the Request API docs using the same wallet session, or programmatically with the x-client-id header. Example response (200 OK β€” paid):
{
  "hasBeenPaid": true,
  "requestId": "01de2a889ee629c15b71b5d7964e3a7e87638c886be75bf1b9d2c1fbe64cf855fb",
  "payee": "0x6923831ACf5c327260D7ac7C9DfF5b1c3cB3C7D7",
  "isListening": false,
  "txHash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"
}
Example response (200 OK β€” not yet paid):
{
  "hasBeenPaid": false,
  "requestId": "01de2a889ee629c15b71b5d7964e3a7e87638c886be75bf1b9d2c1fbe64cf855fb",
  "payee": "0x6923831ACf5c327260D7ac7C9DfF5b1c3cB3C7D7",
  "isListening": true,
  "txHash": null
}
FieldTypeDescription
hasBeenPaidbooleanWhether the request has been fully paid
requestIdstringThe request ID
payeestringThe payee’s wallet address
isListeningbooleanWhether the system is still listening for payment
txHashstringTransaction hash of the payment (null if unpaid)

Quick Reference

StepActionWhere
1Sign in with walletdashboard.request.network
2Create payment destinationdashboard.request.network
3Create Client IDdashboard.request.network (or auth.request.network/open-api)
4Register webhookauth.request.network/open-api
5Create payment linkapi.request.network/open-api
6Check payment statusapi.request.network/open-api (or via webhook)

Troubleshooting

IssueSolution
401 Unauthorized on Dashboard / Auth API callsYour wallet session has likely expired (15 min TTL). Go back to dashboard.request.network and sign in again.
Origin header is requiredWhen using x-client-id from a browser, include an Origin header matching one of the Client ID’s allowed domains.
Invalid destination ID formatThe destinationId must be humanReadableInteropAddress:tokenAddress. Make sure both values are joined with : as the separator.
Batch payments are not supported for TRON networksTron requests must be single-recipient. Submit one requests[] item per Tron destination.
Webhook signature doesn’t matchVerify against the raw request body (no re-serialization), use HMAC-SHA256, and compare with a constant-time check.
Webhook secret lostSecrets are only shown at creation. Delete the webhook (DELETE /v1/webhook/:id) and create a new one.
Payment link expiredPayment links expire after 7 days or once paid. Create a new one if needed.

What’s next

No-code payment links

Skip the code β€” generate payment links from the Dashboard UI.

Programmatic payment links

Server-side payment link creation with TS / Python / cURL examples.

Multi-chain checkout

Let payers pay from any chain/token; receive on your preferred one.

Webhook reconciliation

Automated payment notifications wired into your accounting/order systems.