- Merchant settlement: accept BTC and deliver stablecoins to any supported chain.
- Wallet sell flow: users sell BTC and receive stablecoins, ETH, SOL, or TRX on their preferred chain.
- Exact-out payments: deliver a precise USDC amount for invoices (Bitcoin L1 only). For exact-out BTC delivery to Lightning, see Stablecoin to BTC.
Supported routes
Supported routes
BTC (spark) -> USDC/USDT/ETH (ethereum|arbitrum|optimism|base), USDC (polygon), SOL (solana), TRX/USDT (tron), USDT (plasma), USDC (solana)BTC (bitcoin|lightning) -> same destinations as spark BTCBTC (bitcoin|lightning) -> USDB (spark)USDB (spark) -> same destinations as spark BTC
BTC (bitcoin) -> USDC (base|solana). For exact-out BTC delivery to Lightning, see Stablecoin to BTC.Affiliate fee settlement (appFees, affiliateId, or affiliateIds) requires amountMode = exact_in.Flow
- Create a quote:
POST /v1/orchestration/quote. - Initiate the source deposit to
depositAddress. - Submit the deposit transaction identifier:
POST /v1/orchestration/submit. - Track status via webhooks or
GET /v1/orchestration/status?id=.... - If status becomes
awaiting_approval, check whetherorder.zeroconfOfferororder.repriceis present and resolve accordingly (see below).
Example: BTC (Spark) to USDC (Base)
Example: BTC (Bitcoin L1) to USDC (Exact In)
A Bitcoin L1 quote returns a BitcoindepositAddress. After you broadcast the transaction, submit the txid. The engine automatically finds the output that paid the deposit address.
Quote request:
bitcoinVout is optional. When omitted, the engine resolves it by scanning the transaction outputs for the one that pays the quote’s deposit address. You can still provide it explicitly for batched transactions where you want to specify a particular output.
Example: BTC (Bitcoin L1) to USDC (Exact Out Payment Intent)
Use exact-out when the destination must receive a precise USDC amount. Quote request:targetAmountOut: requested destination amountrequiredAmountIn: minimum BTC input requiredmaxAcceptedAmountIn: highest BTC input auto-acceptedinputBufferBps: currently2whenslippageBps=0, else0
- Send
requiredAmountInfor the cleanest path. - Keep actual input at or below
maxAcceptedAmountIn. - If actual input is outside bounds, or target output cannot be met at current market conditions, the order moves to
awaiting_approval.
POST /v1/orchestration/reprice/approvePOST /v1/orchestration/reprice/rejectPOST /v1/orchestration/reprice/refund
reprice/refund moves the order to refunding, then terminal refunded after the refund is broadcast and recorded.
Example: BTC (Spark) to USDC (Solana) with Affiliate Fees
Example: BTC (Spark) to USDC (Solana) with Affiliate Registry
Example: BTC (Spark) to USDT (Tron)
Deposit Flexibility and ZeroConf
Deposits do not need to match the quotedamountIn exactly. See Deposit Amount Flexibility for how over/underpayments are handled.
For Bitcoin L1 deposits, ZeroConf enables instant credit without waiting for confirmations. When disabled or unavailable, Bitcoin L1 deposits wait for 3 on-chain confirmations. Exact-out orders always use confirmation-based processing.
USDB Sell Flows
For USDB sell flows (USDB to stablecoin), the quote returns a per-partner derived Spark address indepositAddress. This address is deterministic for a given partner and recipient combination. The sourceSparkAddress field is not required on submit for these flows.
Example: BTC (Lightning) to USDC
Lightning-source routes use a tiered platform fee: 0.20% (20 bps) when the destination is USDB, 0.40% (40 bps) for all other destinations. A Lightning quote returns a BOLT11 invoice indepositAddress and a lightningReceiveRequestId. Pay the invoice, then submit the receive request id.
Quote response fields to pay:
depositAddress: BOLT11 invoiceamountIn: sats to paylightningReceiveRequestId: identifier used bysubmit