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.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.
Overview
The flow involves three services:- Dashboard (dashboard.request.network) β Sign in with your wallet, create payment destinations, and generate Client IDs
- Auth API (auth.request.network) β Programmatic alternative for Client IDs, and the home of webhooks
- Request API (api.request.network) β Create payment links (secure payments)
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
Open the Dashboard
Go to dashboard.request.network.
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.
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:
Supported Chains and Tokens
| Network | Chain ID | USDC | USDT |
|---|---|---|---|
| Ethereum | 1 | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 | 0xdAC17F958D2ee523a2206206994597C13D831ec7 |
| Arbitrum One | 42161 | 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 | 0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9 (USDT0) |
| Optimism | 10 | 0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85 | 0x94b008aA00579c1307B0EF2c499aD98a8ce58e58 |
| Base | 8453 | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 | 0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2 |
| Polygon | 137 | 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359 | 0xc2132D05D31c914a87C6611C10748AEb04B58e8F |
| BSC | 56 | 0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d | 0x55d398326f99059ff775485246999027b3197955 |
| Tron | 728126428 | β (API-only via Auth API: TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8) | TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t |
POST /v1/payee-destination on the Auth API directly with the USDC token address.
Testnet:
| Network | Chain ID | Tokens |
|---|---|---|
| Sepolia | 11155111 | FAU: 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.Option A β Dashboard (recommended)
Open Dashboard
Go to dashboard.request.network.
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.
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: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 theclientId field so you can identify which Client ID the payment was associated with.
Creating a webhook
Open auth.request.network/open-api and call:Managing webhooks
Use the same Scalar docs page to list, toggle, or delete webhooks (all acceptx-client-id):
| Method | Path | Purpose |
|---|---|---|
GET | /v1/webhook | List webhooks for this Client ID |
PUT | /v1/webhook/:webhookId | Toggle active / inactive |
DELETE | /v1/webhook/:webhookId | Permanently delete |
POST | /v1/webhook/test | Body { "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:| Header | Description |
|---|---|
x-request-network-signature | HMAC-SHA256 of the raw JSON body, signed with your webhook secret |
x-request-network-delivery | Unique delivery ID β use as an idempotency key |
x-request-network-retry-count | Retry attempt number (0β3) |
x-request-network-test | true only for test deliveries via /v1/webhook/test |
HMAC-SHA256(rawBody, webhookSecret) and compare it to x-request-network-signature using a constant-time comparison.
Webhook events for payment links
When a payer completes a payment on a payment link you created, your webhook receives apayment.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:
| Field | Description |
|---|---|
event | payment.confirmed (fully paid) or payment.partial (partial payment) |
requestId | The request ID from when you created the payment link |
clientId | The Client ID used to create the payment link β use this to route events if you have multiple Client IDs |
amount | The amount paid in this transaction |
totalAmountPaid | Cumulative amount paid so far |
expectedAmount | The total amount expected |
txHash | On-chain transaction hash |
network | The blockchain network |
currency | The token used for payment |
All supported webhook events
| Event | Description |
|---|---|
payment.confirmed | Payment fully confirmed |
payment.partial | Partial payment received |
payment.confirmed.client_id | Client ID-scoped variant of payment.confirmed |
payment.partial.client_id | Client ID-scoped variant of payment.partial |
payment.confirmed.checkout | Secure-payment-scoped variant of payment.confirmed |
payment.partial.checkout | Secure-payment-scoped variant of payment.partial |
payment.failed | Payment failed |
payment.refunded | Payment refunded |
payment.processing | Offramp processing started |
request.recurring | A recurring request fired |
payment_detail.updated | Payment detail metadata changed |
compliance.updated | Compliance status changed |
Step 5: Create a Secure Payment (Payment Link)
With thedestinationId 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.
Open the API docs
Open the Request API docs: api.request.network/open-api.
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 ::
Request body fields
| Field | Type | Required | Description |
|---|---|---|---|
requests | array | Yes | Array of payment request items (at least 1; multiple items create a batch on EVM only) |
requests[].destinationId | string | Yes | Composite ID: humanReadableInteropAddress:tokenAddress |
requests[].amount | string | Yes | Amount in human-readable format (e.g. "10" for 10 USDC) |
feePercentage | string | No | Fee percentage (0β100). If set, feeAddress is required. |
feeAddress | string | No | Address to receive fees. Required if feePercentage is set. |
reference | string | No | Merchant reference (β€ 255 chars) |
payerIdentifier | string | No | Payer identifier (β€ 255 chars) |
| Field | Type | Description |
|---|---|---|
requestIds | string[] | IDs of the created payment requests |
securePaymentUrl | string | Shareable URL for the payer to complete payment |
token | string | Unique token for this payment session |
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 therequestId 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):
| Field | Type | Description |
|---|---|---|
hasBeenPaid | boolean | Whether the request has been fully paid |
requestId | string | The request ID |
payee | string | The payeeβs wallet address |
isListening | boolean | Whether the system is still listening for payment |
txHash | string | Transaction hash of the payment (null if unpaid) |
Quick Reference
| Step | Action | Where |
|---|---|---|
| 1 | Sign in with wallet | dashboard.request.network |
| 2 | Create payment destination | dashboard.request.network |
| 3 | Create Client ID | dashboard.request.network (or auth.request.network/open-api) |
| 4 | Register webhook | auth.request.network/open-api |
| 5 | Create payment link | api.request.network/open-api |
| 6 | Check payment status | api.request.network/open-api (or via webhook) |
Troubleshooting
| Issue | Solution |
|---|---|
401 Unauthorized on Dashboard / Auth API calls | Your wallet session has likely expired (15 min TTL). Go back to dashboard.request.network and sign in again. |
Origin header is required | When using x-client-id from a browser, include an Origin header matching one of the Client IDβs allowed domains. |
Invalid destination ID format | The destinationId must be humanReadableInteropAddress:tokenAddress. Make sure both values are joined with : as the separator. |
Batch payments are not supported for TRON networks | Tron requests must be single-recipient. Submit one requests[] item per Tron destination. |
| Webhook signature doesnβt match | Verify against the raw request body (no re-serialization), use HMAC-SHA256, and compare with a constant-time check. |
| Webhook secret lost | Secrets are only shown at creation. Delete the webhook (DELETE /v1/webhook/:id) and create a new one. |
| Payment link expired | Payment 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.