source.network (off-ramp) and destination.recipient.network (on-ramp): the order itself lives on a native settlement network, and a cross-chain intent provider carries funds between the bridged network and the settlement network. Assignment, payout and settlement are exactly the native flow.
Tokens on bridged networks are listed by GET /v2/tokens and quoted by the rates endpoint, and an order that uses one is described by a bridge object; off-ramp adds two webhook events, on-ramp adds none. The same leg fields describe an off-ramp deposit on a bridged network and an on-ramp delivery to one.
Which networks are bridged
Each bridged token has one settlement token on a native network, and it serves off-ramp and on-ramp alike: Solana USDC, for example, settles as Base USDC in both directions. There is no separate route per direction. Bridging is per token, not per network: the same bridged network can carry one symbol to one settlement network and another symbol to a different one, because a bridge does not route every symbol to every chain. The examples on this page use Solana USDC settling on Base. Paycrest never settles natively on a bridged network, soGET /v2/tokens lists a token there only while it is bridged. A token with no settlement token configured, or every token on the network while bridging is switched off, is not listed. A listed row looks like any other token row and does not name the settlement network:
GET /v2/rates/solana/USDC/100/NGN returns buy and sell, both priced on the token’s settlement network. A token that is not bridged gets no quote. Once an order exists, bridge.settlementNetwork on the order says where it settles, and it is the chain the order’s txHash values are on.
The bridge route is selected by Paycrest. Integrators do not choose a carrier or depend on its identity; use the order’s bridge object to see where it settles and to track the hop.
Paycrest can take a token off its bridged network (both directions at once) or switch bridging off entirely; orders already created finish on the route they were created with. A symbol that is not bridged on an otherwise live bridged network is refused with 400 “Provided token or payment rail is not supported” (field Source on off-ramp, Destination on on-ramp). A Solana token that is not bridged at all, or any Solana token while bridging is switched off, is refused with 400 “Solana is available only via POST /v2/sender/orders for tokens configured on a bridged network”. Paycrest does not settle natively on Solana in either direction.
Off-ramp on a bridged network
The user deposits on the bridged network; the bridge delivers the settlement-network amount to the order’s receive address, and the native off-ramp flow takes over from there.Create the order
Use the normal off-ramp payload with the origin chain insource.network and a refund address on that chain:
amount, rate, senderFee, provider pinning and everything else behave as on a native network. amount is still what settles on the settlement network; amountIn: "fiat" works too.
What comes back
providerAccount.amountToTransfer of providerAccount.currency on providerAccount.network to providerAccount.receiveAddress before validUntil, and to include providerAccount.memo whenever it is present (some chains share deposit addresses and need it).
A deposit on a bridged network is an ordinary transfer on the origin chain, so the sender pays its gas:
amountToTransfer covers the transfer itself and nothing else. Deposit addresses are per quote, so on Solana the sender also pays the one-off cost of creating the deposit address’s token account — currently about 0.0015 SOL, roughly 300× the signature fee a wallet quotes, and not refunded. A wallet holding the token but no native balance refuses before broadcast, with an error that does not mention Paycrest.Track the bridge
providerAccount.amountToTransfer is the quote — what the sender was told to send — and is never rewritten, so it still reads the same after the order settles. Once the bridge reports a deposit, bridge.forward.depositedAmount carries what actually arrived. Compare the two to see whether the user over- or underpaid; they can differ slightly in normal operation, since the bridge deducts its intake fee before the swap.
Two webhook events cover the hops. Neither changes data.status, so branch on event:
payment_order.bridge_deposit_detected— the origin deposit was seen (bridge.forwardmoved toknown_deposit_tx/processing). A good moment to tell the user “we’ve got it, bridging now”.payment_order.bridge_refunded— a refund reachedsource.refundAddresson the origin chain (bridge.reverse.status = success).
payment_order.deposited event, exactly like a direct deposit.
Refunds
Refunds always go back tosource.refundAddress on the origin chain. There are two paths:
- Before delivery (deposit too small, sent after the deadline, or the bridge could not route it): the bridge refunds the origin deposit directly. The order becomes
expiredandbridge.forwardrecordsrefundedAmount/refundReason. Nobridge.reverseis created. - After delivery (the provider queue was exhausted or the order was refunded on the settlement network): the order becomes
refundedas usual, and Paycrest then carries the settlement-network balance back with a reverse hop.bridge.reversemay includedepositAddresswhilebridge.forwarddoes not; otherwise the legs share the same tracking fields. When reverse reachessuccessyou receivepayment_order.bridge_refundedandbridge.reverse.destinationTxHashis the origin-chain tx.
payment_order.refunded means the refund reached the settlement network. payment_order.bridge_refunded means the reverse hop completed and the funds are back at source.refundAddress on the origin chain.bridge.reverse.status = dust and are handled by operations.
Timing
providerAccount.validUntilis the bridge’s deposit window. Deposits after it are refunded by the bridge.- The order stays creditable for a delivery grace period beyond the deadline, and Paycrest extends it further once a deposit is seen, so an on-time deposit is never expired mid-delivery. The usual “expired after
validUntil” copy does not apply to bridged networks. - Delivery typically completes within a few minutes of the deposit confirming.
Errors
Explorer links
source.network is the origin chain; the order’s txHash and bridge.forward.destinationTxHash are on bridge.settlementNetwork. Link bridge.forward.originTxHash and bridge.reverse.destinationTxHash to the origin-chain explorer and everything else to the settlement-network explorer.
On-ramp on a bridged network
The user pays fiat exactly as on a native network. The provider settles the stablecoins on the settlement network through the Gateway, onto an address Paycrest controls; Paycrest then bridges them to the user’s address on the bridged network with a delivery hop. Before settlement, the order is an ordinary on-ramp order on the settlement network.Create the order
Use the normal on-ramp payload with the bridged network indestination.recipient.network and the user’s address on that network:
GET /v2/tokens on that network); the order settles on the token’s settlement network, the same one its off-ramp orders use, and the response names it in bridge.settlementNetwork. On Solana, the user’s wallet must already have a token account for the stablecoin’s mint; Paycrest checks this at create and refuses the order otherwise.
rate, senderFee, provider pinning and everything else behave as on a native network, priced on the settlement network.
Two amounts
The order carries two crypto amounts, because the bridge costs something:amountis the settlement-side amount: what the provider settles on the settlement network and what the sender pays for in fiat. Fees, the fiat total andproviderAccount.amountToTransferare all computed from it.bridge.recipientAmountis what the user receives on the bridged network, as quoted at create.
amountIn:
Show the user
bridge.recipientAmount as what they will receive, not amount. Paycrest never tops up a delivery. Once delivery completes, bridge.delivery.amountOut carries what actually arrived.
What comes back
destination always echoes the user’s address and bridged network; the Paycrest address that receives the settlement is never exposed. bridge.delivery is absent until the delivery starts, and bridge.forward / bridge.reverse are never set on on-ramp orders. Present providerAccount to the user exactly as for a native on-ramp.
Track the delivery
No webhook event is added for delivery. Everything before settlement —
payment_order.pending, payment_order.expired, fiat refunds to source.refundAccount — is the native on-ramp flow.
Refunds
Fiat refunds work as on a native on-ramp: they happen only before the order settles, and go tosource.refundAccount. Once the order is settled the provider has released the stablecoins, so the order is never refunded in fiat; a delivery the bridge returns is retried by Paycrest until it reaches the user’s address.
Timing
providerAccount.validUntilis the fiat deposit window, as on a native on-ramp.- Delivery starts within a few minutes of settlement and typically completes a few minutes later.
payment_order.settledarrives correspondingly later than on a native on-ramp.
Errors
Explorer links
destination.recipient.network is the bridged network; the order’s txHash and bridge.delivery.originTxHash are on bridge.settlementNetwork. Link bridge.delivery.destinationTxHash to the bridged network’s explorer and everything else to the settlement-network explorer.