Payment Link Out — With Detail
Create a Payment Link Out with the asset, network, and destination address fixed at creation. The payout executes with no end-user interaction.
Use With Detail mode when the merchant already knows exactly where the funds are going — a refund to a known address, a scheduled payout to a saved Contact, or a treasury transfer. The merchant supplies the asset, network, and destination address up front. There is nothing for an end-user to do: the payout proceeds on its own, subject to compliance screening and any approval policy.
No end-user interactionA fully-specified With Detail payout still returns a
redirectUrl, but it is not meant to be sent to anyone. If the URL is opened, it only displays the payment's processing and completion status — there is no asset to pick and no address to enter. Treat With Detail as a server-to-server operation.
1. Create the payout
Via the API
The Create Payment endpoint accepts the standard top-level fields plus a payOutDetails object that fixes the destination.
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
merchantId | string | Yes | UUID of the wallet the payout draws from. Identical to the wallet's ID. |
amount | number | Yes | The amount to send, in the Display Currency. |
currency | string | Yes | The Display Currency code (e.g. EUR, USD). |
reference | string | Yes | A unique reference for the payout, recorded against the transaction. |
type | string | Yes | OUT for this flow. |
payOutDetails.currency | string | Yes | The crypto asset to send (e.g. USDT, BTC, ETH). |
payOutDetails.protocol | string | Yes | The network to send on (e.g. TRC20, ERC20, POLYGON). |
payOutDetails.address | string | Yes | The destination address. Sourced from a saved Contact, entered manually, or set programmatically. |
payOutDetails.tag | string | Conditional | The destination tag/memo. Required for networks that use them, such as XRP. |
expiryMinutes | integer | No | Link expiry in minutes. Defaults to 1440 (24 hours). |
Example request
{
"merchantId": "00a4af9d-ad4b-42d5-bec4-b7a8c90161fe",
"amount": 100,
"currency": "EUR",
"reference": "REFUND-9087",
"type": "OUT",
"payOutDetails": {
"currency": "USDT",
"protocol": "TRC20",
"address": "TTwyxkKzenGBhVX2TsjYLVFfApEQ3hPXGc"
}
}Example response
Because payOutDetails is fully specified, the quote is auto-accepted — there is no separate accept step. The payment moves into PROCESSING and proceeds toward submission.
{
"uuid": "8c2f9d11-4a7e-4e91-bb20-6f3a1d92e4c7",
"merchantId": "00a4af9d-ad4b-42d5-bec4-b7a8c90161fe",
"merchantDisplayName": "Metallica Inc",
"dateCreated": 1704807605678,
"expiryDate": 1704894005678,
"quoteExpiryDate": 1704811205678,
"reference": "REFUND-9087",
"type": "OUT",
"status": "PROCESSING",
"displayCurrency": {
"currency": "EUR",
"amount": 100,
"actual": 100
},
"walletCurrency": {
"currency": "EUR",
"amount": 100,
"actual": 100
},
"paidCurrency": {
"currency": "USDT",
"amount": 108.45,
"actual": 0
},
"feeCurrency": {
"currency": "EUR",
"amount": 0.90,
"actual": 0
},
"networkFeeCurrency": {
"currency": "USDT",
"amount": 1.20,
"actual": 0
},
"displayRate": {
"base": "USDT",
"counter": "EUR",
"rate": 0.92635
},
"exchangeRate": {
"base": "USDT",
"counter": "EUR",
"rate": 0.92635
},
"address": {
"address": "TTwyxkKzenGBhVX2TsjYLVFfApEQ3hPXGc",
"tag": null,
"protocol": "TRC20",
"uri": "TTwyxkKzenGBhVX2TsjYLVFfApEQ3hPXGc",
"alternatives": []
},
"redirectUrl": "https://pay.hostedpaymentspage.net/payout/8c2f9d11-4a7e-4e91-bb20-6f3a1d92e4c7",
"transactions": []
}The response separates two costs:
feeCurrency— BEEM's processing fee for the payout.networkFeeCurrency— the network fee for settling the payout on-chain. It is smoothed: set from market averages rather than real-time gas pricing, giving a predictable, balanced fee. Network fees apply to outbound payouts only. See Network Fees for more details.
Both fees are visible on the response so you can reconcile the full cost of the payout.
Via the Portal
Looking for the Portal flow?The Portal equivalent of With Detail is the Send Crypto action on the Wallets page. See Send Crypto for the walkthrough. The payout proceeds identically once initiated, whether via API or Portal.
2. Approval (if configured)
If your account has an approval policy that applies to this payout, the payment is held after creation and before on-chain submission. The status stays PROCESSING throughout — there is no separate AWAITING_APPROVAL status. An approver acts in the Portal:
- Approve — BEEM runs a final address screening check, then submits the on-chain transaction. Status moves to
COMPLETE. - Reject — the payout terminates in
CANCELLEDand the wallet is not debited.
Whether an approval is required depends on your policy configuration — it can apply to all payouts or only to payouts above a defined amount, and can be set independently for Portal-initiated and API-initiated payouts. See Approvals.
3. Receive webhooks
A Payment Link Out emits two event types:
layer1:payment:checkout:status-change— status transitions:PENDING→PROCESSING→COMPLETE, orPROCESSING→CANCELLED(rejected at approval), orPENDING→EXPIRED.layer1:payment:checkout:transaction-held— the payout was held for compliance screening.
There is no transaction-detected or transaction-confirmed event for an outbound payment — those are specific to confirming inbound deposits. For a payout, on-chain confirmation is rolled into the status-change → COMPLETE event.
See Payment Link Webhooks for event payloads and recommended handler patterns.
What's next
The mode where the recipient picks the asset and enters their own receiving address on the Hosted Payments Page.
Subscribe to lifecycle events: status changes and compliance holds.
Handle held payments, expired payouts, and rejected approvals.

