Skip to main content
POST
/
swap-instructions
swap-instructions
curl --request POST \
  --url https://lite-api.jup.ag/swap/v1/swap-instructions \
  --header 'Content-Type: application/json' \
  --data '{
  "userPublicKey": "jdocuPgEAjMfihABsPgKEvYtsmMzjUHeq9LX4Hvs7f3",
  "quoteResponse": {
    "inputMint": "So11111111111111111111111111111111111111112",
    "inAmount": "1000000",
    "outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "outAmount": "125630",
    "otherAmountThreshold": "125002",
    "swapMode": "ExactIn",
    "slippageBps": 50,
    "platformFee": null,
    "priceImpactPct": "0",
    "routePlan": [
      {
        "swapInfo": {
          "ammKey": "AvBSC1KmFNceHpD6jyyXBV6gMXFxZ8BJJ3HVUN8kCurJ",
          "label": "Obric V2",
          "inputMint": "So11111111111111111111111111111111111111112",
          "outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
          "inAmount": "1000000",
          "outAmount": "125630",
          "feeAmount": "5",
          "feeMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
        },
        "percent": 100
      }
    ]
  },
  "prioritizationFeeLamports": {
    "priorityLevelWithMaxLamports": {
      "maxLamports": 10000000,
      "priorityLevel": "veryHigh"
    }
  },
  "dynamicComputeUnitLimit": true
}'
{
  "otherInstructions": [
    {
      "programId": "<string>",
      "accounts": [
        {
          "pubkey": "<string>",
          "isSigner": true,
          "isWritable": true
        }
      ],
      "data": "<string>"
    }
  ],
  "computeBudgetInstructions": [
    {
      "programId": "<string>",
      "accounts": [
        {
          "pubkey": "<string>",
          "isSigner": true,
          "isWritable": true
        }
      ],
      "data": "<string>"
    }
  ],
  "setupInstructions": [
    {
      "programId": "<string>",
      "accounts": [
        {
          "pubkey": "<string>",
          "isSigner": true,
          "isWritable": true
        }
      ],
      "data": "<string>"
    }
  ],
  "swapInstruction": {
    "programId": "<string>",
    "accounts": [
      {
        "pubkey": "<string>",
        "isSigner": true,
        "isWritable": true
      }
    ],
    "data": "<string>"
  },
  "cleanupInstruction": {
    "programId": "<string>",
    "accounts": [
      {
        "pubkey": "<string>",
        "isSigner": true,
        "isWritable": true
      }
    ],
    "data": "<string>"
  },
  "addressLookupTableAddresses": [
    "<string>"
  ]
}

Body

application/json
userPublicKey
string
required
quoteResponse
object
required
payer
string
  • Allow a custom payer to pay for the transaction fees and rent of token accounts
  • Note that users can close their ATAs elsewhere and have you reopen them again, your fees should account for this
wrapAndUnwrapSol
boolean
default:true
  • To automatically wrap/unwrap SOL in the transaction, as WSOL is an SPL token while native SOL is not
  • When true, it will strictly use SOL amount to wrap it to swap, and each time after you swap, it will unwrap all WSOL back to SOL
  • When false, it will strictly use WSOL amount to swap, and each time after you swap, it will not unwrap the WSOL back to SOL
  • To set this parameter to false, you need to have the WSOL token account initialized
  • Parameter will be ignored if destinationTokenAccount is set because the destinationTokenAccount may belong to a different user that we have no authority to close
useSharedAccounts
boolean
  • The default is determined dynamically by the routing engine, allowing us to optimize for compute units, etc
  • This enables the usage of shared program accounts, this is essential as complex routing will require multiple intermediate token accounts which the user might not have
  • If true, you do not need to handle the creation of intermediate token accounts for the user
  • Do note, shared accounts route will fail on some new AMMs (low liquidity token)
feeAccount
string
  • An initialized token account that will be used to collect fees
  • The mint of the token account can only be either the input or output mint of the swap
  • Swap API no longer requires the use of the Referral Program
  • If platformFeeBps is passed in /quote, the feeAccount must be passed as well
trackingAccount
string
  • Specify any public key that belongs to you to track the transactions
  • Useful for integrators to get all the swap transactions from this public key
  • Query the data using a block explorer like Solscan/SolanaFM or query like Dune/Flipside
prioritizationFeeLamports
object
  • To specify a level or amount of additional fees to prioritize the transaction
  • It can be used for EITHER priority fee OR Jito tip (not both at the same time)
  • If you want to include both, you will need to use /swap-instructions to add both at the same time
  • Defaults to auto, but preferred to use priorityLevelWithMaxLamports as it may be more accurate when accounting local fee market
  • Fixed lamports can be passed in as an integer in the prioritizationFeeLamports parameter
  • priorityLevelWithMaxLamports
  • jitoTipLamports
  • jitoTipLamportsWithPayer
asLegacyTransaction
boolean
default:false
  • Builds a legacy transaction rather than the default versioned transaction
  • Used together with asLegacyTransaction in /quote, otherwise the transaction might be too large
destinationTokenAccount
string
  • Public key of a token account that will be used to receive the token out of the swap
  • If not provided, the signer's token account will be used
  • If provided, we assume that the token account is already initialized
dynamicComputeUnitLimit
boolean
default:false
  • When enabled, it will do a swap simulation to get the compute unit used and set it in ComputeBudget's compute unit limit
  • This incurs one extra RPC call to simulate this
  • We recommend to enable this to estimate compute unit correctly and reduce priority fees needed or have higher chance to be included in a block
skipUserAccountsRpcCalls
boolean
default:false
  • When enabled, it will not do any additional RPC calls to check on required accounts
  • The returned swap transaction will still attempt to create required accounts regardless if it exists or not
dynamicSlippage
boolean
default:false
  • When enabled, it estimates slippage and apply it in the swap transaction directly, overwriting the slippageBps parameter in the quote response.
  • This is no longer maintained, we are focusing efforts on RTSE on Ultra Swap API
computeUnitPriceMicroLamports
integer
  • To use an exact compute unit price to calculate priority fee
  • computeUnitLimit (1400000) * computeUnitPriceMicroLamports
  • We recommend using prioritizationFeeLamports and dynamicComputeUnitLimit instead of passing in your own compute unit price
blockhashSlotsToExpiry
integer
  • Pass in the number of slots we want the transaction to be valid for
  • Example: If you pass in 10 slots, the transaction will be valid for ~400ms * 10 = approximately 4 seconds before it expires

Response

200 - application/json

Successful response

otherInstructions
object[]
required
  • If you set jito tips using the prioritizationFeeLamports parameter, you will see a custom tip instruction to Jito here.
computeBudgetInstructions
object[]
required
  • To setup the compute budget for the transaction.
setupInstructions
object[]
required
  • To setup required token accounts for the users.
swapInstruction
object
required
  • The actual swap instruction.
addressLookupTableAddresses
string[]
required
  • The lookup table addresses if you are using versioned transaction.
cleanupInstruction
object
  • To wrap and unwrap the SOL.
I