data.solana. See the Swap Quoting page for the full input parameters.
SOL addresses in swap requests
So11111111111111111111111111111111111111111 when the user holds native SOL in their wallet and wants to swap from or receive native SOL.
Wrapped SOL is a real SPL mint and uses So11111111111111111111111111111111111111112. Use the wrapped SOL mint only when the user is explicitly swapping WSOL token-account balance, not their native lamports balance.
Request
| Param | Required | Notes |
|---|---|---|
chainId | ✓ | solana:solana |
tokenIn / tokenOut | ✓ | Token address. Native SOL sentinel = So11111111111111111111111111111111111111111. Wrapped SOL SPL mint = So11111111111111111111111111111111111111112. |
amount or amountRaw | ✓ | Human-readable ("1.5") or raw ("1500000" for 6-decimal USDC) |
walletAddress | ✓ | User’s Solana base58 pubkey. It signs/funds the swap and receives tokenOut unless destinationWallet or finalRecipientWallet is provided. |
slippage | – | auto or fixed percentage 0-100. Default: auto. |
prioritizationFeeLamports | – | Jupiter-compatible priority fee budget: auto, fixed lamports, or {"priorityLevelWithMaxLamports":{"priorityLevel":"medium" | "high" | "veryHigh","maxLamports":1000000,"global":false}} |
computeUnitLimit | – | true by default; dynamically sizes the Solana compute limit from the built swap instructions. You can also pass a fixed integer. |
jitoTipLamports | – | Add a Jito tip transfer to one of the official tip accounts |
multiLander | – | true returns N candidates over a durable nonce — see Multi-lander |
landerTipLamports | – | Per-lander tip when multiLander=true |
payerAddress | – | Fee abstraction — separate fee payer from walletAddress |
destinationWallet | – | Sends output to another wallet when supported. Mutually exclusive with finalRecipientWallet. |
finalRecipientWallet | – | Router-enforced final output recipient. The router sends the exact post-swap output to this wallet after swap, fees, and slippage checks. Mutually exclusive with destinationWallet. |
feePercentage | – | Caller referral fee 0-99% (taken from input or output SOL) |
feeWallet | – | Required when feePercentage > 0 (and for minFeesNative / feeToken) |
minFeesNative | – | Minimum referral fee in SOL, e.g. 0.05. Floors the referral fee — max(amountIn × feePercentage/100, minFeesNative) — enforced on-chain by MobulaRouter when the fee asset is native SOL. |
feeToken | – | Mint of a token to charge a flat minimum fee in (with minFeesTokenRaw). Transferred to feeWallet via a dedicated instruction, independent of the route. |
minFeesTokenRaw | – | Raw amount (smallest unit) of feeToken to charge. Tx reverts if the user’s balance is insufficient. |
onlyRouters | – | Comma-list of jupiter,naos,kyberswap,lifi |
excludedProtocols / onlyProtocols | – | DEX-level filter (e.g. raydium,orca,pump-amm) |
Recipient controls
By default,walletAddress receives the output token. Use destinationWallet for a simple recipient override when supported by the route. Use finalRecipientWallet when the Mobula Solana router must transfer the exact final output amount after swap execution, fees, and slippage checks.
destinationWallet and finalRecipientWallet are mutually exclusive. payerAddress only changes the Solana fee payer/signing wallet; it does not redirect the swap output.
Response — data.solana
data.solana fields
| Field | Type | Description |
|---|---|---|
transaction.serialized | base64 | Full Solana transaction. Deserialize with VersionedTransaction.deserialize (or Transaction.from for legacy). |
transaction.variant | 'versioned' | 'legacy' | Discriminator — almost always 'versioned' in practice. |
lastValidBlockHeight | number | Blockhash expiry — your client should broadcast before the chain ticks past this. |
Multi-lander
SetmultiLander=true to receive N candidate transactions sharing a durable nonce. Race them across Jito / Nozomi / 0slot for fastest landing — only one can commit.
/swap/send in batch mode (candidates: [{lander, signedTransaction}, …]).
Signing
Supported aggregators
Jupiter, KyberSwap, NAOS, Li.Fi — pick one or several viaonlyRouters. Per-DEX filtering (Raydium, Orca, Meteora DLMM/Damm, Pump AMM, Whirlpool, …) via onlyProtocols / excludedProtocols.
Limits
- Blockhash expiry —
lastValidBlockHeightis ~150 slots (60s). Re-quote if the user takes longer than that to sign. - Priority budget — use
prioritizationFeeLamportswithcomputeUnitLimit=trueso the CU price is derived from the final compute limit. When bundling with Jito, setjitoTipLamportsseparately. - Address forms — Solana addresses are case-sensitive base58. Don’t lowercase.