Create offramp quote
Create an exact-in, variable quote to a Cash App username or Lightning address. Returns the normal quote response and deposit instructions; paying creates the order. The recipient is resolved at delivery, so an unavailable account or an amount outside its limits can fail after funding. Completion confirms Lightning delivery. Cash App USD conversion depends on the recipient setting and is not guaranteed. Successful idempotency replays recheck the frozen quote recipient, refund and fee addresses against the current OFAC list without overwriting the successful quote or creating a replacement.
curl --request POST \
--url https://orchestration.flashnet.xyz/v1/orchestration/offramp \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Idempotency-Key: <x-idempotency-key>' \
--data '
{
"sourceChain": "solana",
"sourceAsset": "USDC",
"amount": "50000000",
"recipientAddress": "$username",
"refundAddress": "YOUR_SOURCE_CHAIN_REFUND_ADDRESS"
}
'const options = {
method: 'POST',
headers: {
'X-Idempotency-Key': '<x-idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
sourceChain: 'solana',
sourceAsset: 'USDC',
amount: '50000000',
recipientAddress: '$username',
refundAddress: 'YOUR_SOURCE_CHAIN_REFUND_ADDRESS'
})
};
fetch('https://orchestration.flashnet.xyz/v1/orchestration/offramp', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://orchestration.flashnet.xyz/v1/orchestration/offramp"
payload = {
"sourceChain": "solana",
"sourceAsset": "USDC",
"amount": "50000000",
"recipientAddress": "$username",
"refundAddress": "YOUR_SOURCE_CHAIN_REFUND_ADDRESS"
}
headers = {
"X-Idempotency-Key": "<x-idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"amountMode": "exact_in",
"estimatedOut": "49500",
"feeAmount": "250000",
"roundingFeeAmount": "0",
"totalFeeAmount": "250000",
"feeBps": 50,
"feeAsset": "USDC",
"route": [
"USDC",
"USDB",
"BTC"
],
"quoteId": "q_7e450ab4-935b-4f8d-a6c4-4987a3cd2831",
"depositAddress": "7EcDhSYGxXyscszYEp35KHN8vvw3svAuLKTzXwCFLtV",
"amountIn": "50000000",
"expiresAt": "2026-09-12T12:02:00.000Z",
"source": {
"chain": "solana",
"asset": "USDC",
"assetDisplayName": "USDC",
"assetDisplaySymbol": "USDC",
"contractAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"decimals": 6,
"chainId": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
"chainDisplayName": "Solana",
"chainIcon": "/chain-solana.svg"
},
"destination": {
"chain": "lightning",
"asset": "BTC",
"assetDisplayName": "Bitcoin",
"assetDisplaySymbol": "BTC",
"contractAddress": null,
"decimals": 8,
"chainId": null,
"chainDisplayName": "Lightning",
"chainIcon": "/chain-lightning.svg"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Authorizations
Partner API key in the form Authorization: Bearer fn_....
Headers
1Body
Exact-in variable Lightning payout. Unknown fields are rejected.
arbitrum, arc, avalanche, base, bitcoin, bsc, ethereum, hedera, hypercore, hyperevm, lightning, litecoin, monad, monero, optimism, plasma, polygon, robinhood, sei, solana, spark, tempo, ton, tron, xrp, zcash An AssetInput, or a token address. A quote whose source is an unlisted token requires refundAddress: a deposit that cannot be sold is refunded in kind there.
AAPL, AI, AMD, AMZN, BNB, BONER, BTC, CASHCAT, COIN, COST, DAI, DELTA, DJT, ETH, GLD, GME, GOOGL, GRAM, HIMS, HSUSD, HYPE, IF, LTC, META, MON, MSFT, MSTR, MU, NVDA, OUSD, PIPEDOG, PLTR, POL, PONS, PYUSD, PathUSD, QQQ, RDDT, SHX, SKHY, SLV, SNDK, SOL, SPCX, SPY, STONKBROKER, TENDIES, TRX, TSLA, TSM, UP, USDB, USDC, USDC.e, USDG, USDT, USDe, USD₮0, USO, WBNB, WBTC, WEN, XMR, XO, XPL, XRP, ZEC, cbBTC, tBTC Amount in smallest units of the source asset.
^[0-9]+$Cash App username (username or $username), or Lightning address (username@domain). Cash App usernames resolve to [email protected]. BOLT11 invoices and URLs are not accepted.
1Required refund address on the source chain, or the supplied refundChain.
1Include transaction calldata to fund the order. Supported for EVM native and ERC-20 sources only; unsupported sources return calldata_unsupported_source. Defaults to false.
arbitrum, arc, avalanche, base, bitcoin, bsc, ethereum, hedera, hypercore, hyperevm, lightning, litecoin, monad, monero, optimism, plasma, polygon, robinhood, sei, solana, spark, tempo, ton, tron, xrp, zcash Slippage tolerance in basis points, subject to the route minimum.
0 <= x <= 1000Inline app fees, requiring a server key or dashboard session.
1 - 16 elementsShow child attributes
Show child attributes
Opt in to affiliate_not_found / affiliate_disabled for registered affiliate lookup failures. Omitted or legacy preserves invalid_request. HTTP 400 in either mode. Changing this field requires a new idempotency key.
legacy, specific Registered affiliate ID for accrued fees, also accepted from client keys.
Registered affiliate IDs or fee overrides; mutually exclusive with appFees, with overrides requiring a server key or dashboard session.
1 - 16 elementsRegistered affiliate ID or { affiliateId, feeBps } override.
1Your own reporting label, such as an integrator ID. Every order this quote funds carries it, and the dashboard filters and groups by it. Self-reported: anyone holding the key that creates the quote chooses it.
^[A-Za-z0-9._:-]{1,64}$Response
Quote created
Exact immutable reviewed token identities frozen by the native quote. Omitted for legacy or invalid snapshots; caller metadata cannot set these pins.
1 - 32 elementsShow child attributes
Show child attributes
Unsigned deposit transfer, returned only with includeCalldata=true on supported EVM sources. No approval is needed. This funds the deposit; it does not execute the swap.
Show child attributes
Show child attributes
Memo or tag required with the deposit when present.
The invoice is amountless. amountIn and estimatedOut price the indicative amount and are rescaled to the amount actually paid.
true exact_in, exact_out fixed Action required when the locked price can no longer be honored.
strict_requote, approval_required Minimum locked destination amount in smallest units.
Quoted network cost in smallest units of networkCostAsset.
Asset used to pay the quoted network cost.
Whether the quoted network cost must be paid.
Itemized network costs and quote-time assumptions.
- Option 1
- Option 2
- Option 3
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Unlisted destinations only: the least amount of the token, in its smallest units, the recipient receives when the swap succeeds. Enforced on chain at the recipient.
Unlisted destinations only: what the recipient receives if the swap into the token cannot deliver minAmountOut.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
The request's tag; null when none was sent.
Client-key read token for this quote and its order, including private ZeroConf outcomes.
Was this page helpful?
curl --request POST \
--url https://orchestration.flashnet.xyz/v1/orchestration/offramp \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Idempotency-Key: <x-idempotency-key>' \
--data '
{
"sourceChain": "solana",
"sourceAsset": "USDC",
"amount": "50000000",
"recipientAddress": "$username",
"refundAddress": "YOUR_SOURCE_CHAIN_REFUND_ADDRESS"
}
'const options = {
method: 'POST',
headers: {
'X-Idempotency-Key': '<x-idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
sourceChain: 'solana',
sourceAsset: 'USDC',
amount: '50000000',
recipientAddress: '$username',
refundAddress: 'YOUR_SOURCE_CHAIN_REFUND_ADDRESS'
})
};
fetch('https://orchestration.flashnet.xyz/v1/orchestration/offramp', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://orchestration.flashnet.xyz/v1/orchestration/offramp"
payload = {
"sourceChain": "solana",
"sourceAsset": "USDC",
"amount": "50000000",
"recipientAddress": "$username",
"refundAddress": "YOUR_SOURCE_CHAIN_REFUND_ADDRESS"
}
headers = {
"X-Idempotency-Key": "<x-idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"amountMode": "exact_in",
"estimatedOut": "49500",
"feeAmount": "250000",
"roundingFeeAmount": "0",
"totalFeeAmount": "250000",
"feeBps": 50,
"feeAsset": "USDC",
"route": [
"USDC",
"USDB",
"BTC"
],
"quoteId": "q_7e450ab4-935b-4f8d-a6c4-4987a3cd2831",
"depositAddress": "7EcDhSYGxXyscszYEp35KHN8vvw3svAuLKTzXwCFLtV",
"amountIn": "50000000",
"expiresAt": "2026-09-12T12:02:00.000Z",
"source": {
"chain": "solana",
"asset": "USDC",
"assetDisplayName": "USDC",
"assetDisplaySymbol": "USDC",
"contractAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"decimals": 6,
"chainId": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
"chainDisplayName": "Solana",
"chainIcon": "/chain-solana.svg"
},
"destination": {
"chain": "lightning",
"asset": "BTC",
"assetDisplayName": "Bitcoin",
"assetDisplaySymbol": "BTC",
"contractAddress": null,
"decimals": 8,
"chainId": null,
"chainDisplayName": "Lightning",
"chainIcon": "/chain-lightning.svg"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}