data.solana. See the Swap Quoting page for the full input parameters.
Native SOL and WSOL
tokenIn / tokenOut value when the user is paying with, or receiving, native SOL from their wallet.
Wrapped SOL is the SPL mint So11111111111111111111111111111111111111112. Use the WSOL mint only when the user is intentionally swapping an existing WSOL token account.
Request
| Param | Required | Notes |
|---|---|---|
chainId | ✓ | solana:solana |
tokenIn / tokenOut | ✓ | Token mint address. Native SOL sentinel = So111…111; WSOL SPL mint = So111…112. |
amount or amountRaw | ✓ | Human-readable ("1.5") or raw ("1500000" for 6-decimal USDC) |
walletAddress | ✓ | User’s Solana base58 pubkey |
slippage | – | % value (0-100) or auto. Defaults to auto. |
prioritizationFeeLamports | – | Jupiter-compatible priority fee budget: auto, fixed lamports, or {"priorityLevelWithMaxLamports":{"priorityLevel":"medium" | "high" | "veryHigh","maxLamports":1000000,"global":false}} |
dynamicComputeUnitLimit | – | true by default; dynamically sizes the Solana compute limit from the built swap instructions |
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. This wallet pays transaction fees, priority fees, Jito tips, and ATA rent. It must sign when different from walletAddress. The swap funds still come from walletAddress. |
closeAuthority | – | Optional close authority for non-WSOL ATAs Mobula creates during the swap when payerAddress is used. Usually set it to the central payer wallet to reclaim rent later. |
destinationWallet | – | Solana-only tokenOut recipient. Defaults to walletAddress. Do not combine with finalRecipientWallet. |
swapRecipientAddress | – | Solana-only router-enforced final recipient. MobulaRouter transfers the exact final swap output to this wallet after swap execution and fee/slippage checks. Do not combine with destinationWallet. Legacy alias: finalRecipientWallet. |
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) |
Sponsored fees, close authority, and final recipient
UsepayerAddress when a central wallet should pay Solana fees / ATA rent for the user. Add closeAuthority when that central wallet should be able to close non-WSOL ATAs created by Mobula during the swap and recover rent later.
walletAddressowns the input funds and signs for the swap.payerAddresspays network fees / rent and must also sign when different fromwalletAddress.closeAuthorityonly has an effect whenpayerAddressis provided. It applies to non-WSOL ATAs Mobula creates and leaves open after execution.swapRecipientAddressreceives the final output amount. It does not need to sign.swapRecipientAddresskeepswalletAddressas the swap taker/authority, then MobulaRouter transfers the final output after fee and slippage checks.swapRecipientAddressrequires a Mobula on-chain router route. If the selected route cannot use the router, the quote returns an error.
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
prioritizationFeeLamportswithdynamicComputeUnitLimit=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.