Skip to main content
Cash App supports zero-fee Lightning payments. Orchestra combines this with its Lightning-to-stablecoin pipeline to create a fiat-to-crypto onramp with a single API call. The user pays a Lightning invoice through Cash App (debit card, no fees), and Orchestra handles the swap and delivery to any supported destination chain. The result is the cheapest onramp to USDC, ETH, SOL, or any other supported asset.

How It Works

  1. Your app calls POST /v1/orchestration/onramp with the destination chain, asset, recipient address, and BTC amount in sats.
  2. Orchestra creates a Lightning invoice, builds the order, and returns a Cash App deeplink.
  3. The user opens the deeplink (or scans a QR code), pays in Cash App.
  4. Orchestra receives the Lightning payment, swaps BTC to the destination asset, and delivers it.
The entire flow is a single API call. No separate quote and submit steps.

Why It’s Cheap

Cash App charges zero fees on Lightning payments. Orchestra charges 0.05% on the swap. There are no intermediary fees, no card processing fees, and no withdrawal fees. Compare this to traditional onramps:
ProviderTypical fee
Card-based onramps1.5-3.5%
Bank transfer onramps0.5-1.5%
Cash App + Orchestra~0.05%

Cash App Limits

Cash App allows up to $999 in Lightning payments per rolling 7-day window. Limits reset at the top of the next hour after the 7-day window passes.
The onramp endpoint should not be called with amounts exceeding $999 equivalent. Validate the amount client-side before calling the API.

Supported Routes

The onramp endpoint accepts any destination that Orchestra supports from a Lightning BTC source:
  • lightning:BTC -> solana:USDC
  • lightning:BTC -> base:USDC
  • lightning:BTC -> base:USDT
  • lightning:BTC -> base:ETH
  • lightning:BTC -> solana:SOL
  • lightning:BTC -> spark:USDB
  • lightning:BTC -> ethereum:USDC
  • lightning:BTC -> arbitrum:USDC
  • lightning:BTC -> tron:USDT
  • Many more routes…
The source is always lightning:BTC. The amount is always in sats.

Integration

1

Get a price estimate

Use the estimate endpoint to show the user what they’ll receive before committing.
curl 'https://orchestration.flashnet.xyz/v1/orchestration/estimate?\
sourceChain=lightning&sourceAsset=BTC&\
destinationChain=solana&destinationAsset=USDC&\
amount=100000'
Response:
{
  "estimatedOut": "96543210",
  "feeAmount": "4830",
  "feeBps": 5,
  "feeAsset": "USDC"
}
2

Create the onramp order

A single call creates the Lightning invoice, builds the order, and returns the Cash App deeplink.
const BASE_URL = 'https://orchestration.flashnet.xyz';

const onramp = await fetch(`${BASE_URL}/v1/orchestration/onramp`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${process.env.FLASHNET_API_KEY}`,
    'X-Idempotency-Key': `onramp:${Date.now()}`,
  },
  body: JSON.stringify({
    destinationChain: 'solana',
    destinationAsset: 'USDC',
    recipientAddress: 'So1YourSolanaAddress...',
    amount: '100000', // sats
    slippageBps: 50,
  }),
}).then((r) => r.json());
Response:
{
  "orderId": "op_abc123",
  "quoteId": "q_xyz789",
  "depositAddress": "lnbc1000n1pj...",
  "paymentLinks": {
    "cashApp": "https://cash.app/launch/lightning/lnbc1000n1pj...",
    "shortUrl": "https://orchestration.flashnet.xyz/pay/a3xKm2Rq"
  },
  "amountIn": "100000",
  "estimatedOut": "96543210",
  "feeAmount": "4830",
  "feeBps": 5,
  "totalFeeAmount": "4830",
  "feeAsset": "USDC",
  "route": [
    "verify-lightning-deposit",
    "flashnet-swap-btc-to-usdb",
    "bridge-usdb-to-usdc",
    "deliver-solana-usdc"
  ],
  "expiresAt": "2025-01-15T12:04:00.000Z"
}
3

Open Cash App

On mobile, redirect the user to the deeplink. On desktop, display the deeplink as a QR code for the user to scan with their phone. Use shortUrl when sharing payment links in messages or emails.
// Mobile: direct deeplink
window.location.href = onramp.paymentLinks.cashApp;

// Desktop: render QR code with the deeplink URL
// The QR encodes the full cash.app URL, not the BOLT11 invoice
renderQR(onramp.paymentLinks.cashApp);

// Sharing: use the short URL for texts, emails, etc.
const shareableLink = onramp.paymentLinks.shortUrl;
// e.g. https://orchestration.flashnet.xyz/pay/a3xKm2Rq
The Lightning invoice expires at expiresAt (2 minutes from creation). If the user doesn’t pay in time, create a new onramp order.
4

Track the order

Use SSE or polling to track progress. The order moves through processing -> confirming -> swapping -> bridging -> delivering -> completed.
// SSE (preferred)
const es = new EventSource(
  `${BASE_URL}/v1/sse/operations/${onramp.orderId}?token=${API_KEY}`
);
es.addEventListener('status', (e) => {
  const { status } = JSON.parse(e.data);
  console.log(status); // confirming, swapping, bridging, completed, etc.
});

// Or poll
const status = await fetch(
  `${BASE_URL}/v1/orchestration/status?id=${onramp.orderId}`,
  { headers: { Authorization: `Bearer ${API_KEY}` } }
).then((r) => r.json());

API Reference

POST /v1/orchestration/onramp

Requires authentication (Authorization: Bearer <api_key>) and idempotency (X-Idempotency-Key). Request body:
FieldRequiredTypeNotes
destinationChainYesstringTarget chain (e.g., solana, base)
destinationAssetYesstringTarget asset (e.g., USDC, ETH)
recipientAddressYesstringDestination address on the target chain
amountYesstringBTC amount in sats (integer string)
slippageBpsNonumberSlippage tolerance in basis points (default: 50)
appFeesNoarrayInline affiliate fees (mutually exclusive with affiliateId)
affiliateIdNostringRegistered affiliate ID (mutually exclusive with appFees)
Response fields:
FieldTypeNotes
orderIdstringOperation ID for tracking
quoteIdstringUnderlying quote ID
depositAddressstringBOLT11 Lightning invoice
paymentLinks.cashAppstringCash App deeplink URL
paymentLinks.shortUrlstringShort redirect URL (302s to Cash App deeplink)
amountInstringBTC amount in sats
estimatedOutstringEstimated output in destination asset smallest units
feeAmountstringPlatform fee
feeBpsnumberFee rate in basis points
totalFeeAmountstringTotal fees (platform + app fees)
feeAssetstringFee denomination
routestring[]Pipeline steps
expiresAtstringISO timestamp when the Lightning invoice expires

Affiliate Fees

The onramp endpoint supports the same affiliate fee model as the standard quote flow. Pass either appFees (inline) or affiliateId (registered) to collect fees on each onramp transaction.
{
  "destinationChain": "solana",
  "destinationAsset": "USDC",
  "recipientAddress": "So1...",
  "amount": "100000",
  "affiliateId": "my-partner"
}
Fees are settled in USDC on the destination chain. See Affiliate Fees for registration and claim details.

Next Steps