TL;DR
Swap any token on Solana in two API calls. Get a quote and unsigned transaction, sign it, submit it. No RPC node, no routing logic, no slippage math. Jupiter handles routing across multiple DEXs and 20+ market makers, MEV protection, and transaction landing. Base URL:https://api.jup.ag/ultra/v1
Prerequisites
- Get an API key at portal.jup.ag (free)
- All requests need the
x-api-keyheader - Install
@solana/web3.jsfor transaction signing
Quick start
transaction (base64 unsigned) and a requestId. Sign the transaction, then hit execute:
API reference
Base URL:https://api.jup.ag/ultra/v1
| Endpoint | Description |
|---|---|
GET /order | Get a swap quote and unsigned transaction |
POST /execute | Submit signed transaction for execution |
GET /holdings/{address} | Get wallet token balances |
GET /shield?mints={mints} | Get token security warnings |
GET /search?query={query} | Search tokens by name, symbol, or mint |
The swap flow
Three steps: get order, sign, execute.Step 1: Get an order
GET /order takes the token pair, amount, and the taker’s wallet. It returns a quote with an unsigned transaction ready to sign.
| Parameter | Required | Description |
|---|---|---|
inputMint | Yes | Input token mint address |
outputMint | Yes | Output token mint address |
amount | Yes | Amount in native token units (before decimals) |
taker | No | User’s wallet address. Required to get a signable transaction. Omit to get a quote only (useful for showing price before wallet connect). |
referralAccount | No | Referral account for integrator fees |
referralFee | No | Referral fee in basis points (50-255) |
excludeRouters | No | Manual mode only. Comma-separated routers to exclude: iris, jupiterz, dflow, okx |
excludeDexes | No | Manual mode only. Comma-separated DEXs to exclude (applies to Iris router only). Full list of DEXs. |
| Field | What it means |
|---|---|
transaction | Base64 unsigned transaction. Sign this. null if you didn’t pass taker. |
requestId | Pass this to /execute. It’s how Ultra tracks your order. |
outAmount | Expected output in native token units |
router | Which router won the auction: iris, jupiterz, dflow, okx |
gasless | true if this swap is gasless |
slippageBps | Slippage tolerance set by RTSE (you don’t need to configure this) |
feeBps | Total fee in basis points |
feeMint | Which token the fee is taken in |
priceImpact | Price impact as a percentage |
errorCode | Present when simulation fails (1 = insufficient funds, 2 = need SOL for gas, 3 = below gasless minimum) |
Step 2: Sign the transaction
Deserialise the base64 transaction, sign it, serialise it back:Step 3: Execute
Post the signed transaction andrequestId to /execute. Jupiter broadcasts it via Beam and polls for the result. You get back the final status.
Full working example
End-to-end: swap 1 SOL to USDC, from scratch.Response format
Order response
Execute response
Error handling
Order errors
The order can return a quote but fail simulation. When that happens, you’ll seeerrorCode and errorMessage alongside the quote data, but transaction will be empty.
errorCode | What happened | What to show the user |
|---|---|---|
| 1 | Insufficient funds | ”Not enough tokens to swap” |
| 2 | Not enough SOL for gas | ”Top up X SOL for gas fees” |
| 3 | Below gasless minimum | ”Minimum ~$10 swap for gasless” |
Execute errors
| Code | What happened | What to do |
|---|---|---|
| 0 | Success | Show the Solscan link |
| -1 | Order not found or expired | Get a new order |
| -2 | Invalid signed transaction | Check your signing logic |
| -3 | Invalid message bytes | Don’t modify the transaction |
| -4 | Missing request ID | Include requestId from the order response |
| -5 | Missing signed transaction | Include signedTransaction in the request body |
| -1000 | Failed to land on network | Retry with a fresh order |
| -1005 | Transaction expired | Get a new order and try again |
| -1006 | Timed out | Get a new order and try again |
| 6001 | Slippage exceeded | Market moved. Retry with a new order. |
Gasless swaps
Ultra handles gasless automatically. You don’t configure anything. Ultra Gasless Support (Iris). When the taker has less than 0.01 SOL and the trade is at least ~$10, Jupiter covers everything: network fee, priority fee, token account rent, and other accounts rent (e.g. DEX-specific accounts). The cost gets deducted from the swap output (you’ll see it infeeBps).
JupiterZ (RFQ). When a market maker provides the route, the market maker pays network and priority fees. But they don’t cover token account rent, so the user still needs enough SOL for that.
Check gasless: true in the order response to know if it kicked in. For the full breakdown of scenarios, see Gasless Support.
Integrator fees
You can earn fees on swaps through your integration. Ultra handles collection.- Create a referral account using the @jup-ag/referral-sdk or the Referral Dashboard
- Create referral token accounts for the mints you expect to collect fees in (at minimum: SOL, USDC, USDT)
- Pass
referralAccountandreferralFeeto/order
feeBps matches what you set.
Full setup walkthrough: Add Integrator Fees.
Fees
Ultra charges 0-10 bps on most swaps, 50 bps for new tokens. Lower than the industry average by 8-10x.| Token pair | Fee |
|---|---|
| SOL/Stable → JUP/JLP/jupSOL | 0 bps |
| Stable ↔ Stable, LST ↔ LST | 0 bps |
| SOL ↔ Stable | 2 bps |
| LST ↔ Stable | 5 bps |
| Everything else | 10 bps |
| New tokens (< 24h old) | 50 bps |
Common questions
Do I need an RPC if I integrate Ultra?
Do I need an RPC if I integrate Ultra?
Nope. Ultra runs on Jupiter’s own validator stake and dedicated infra so you don’t have to. You just sign the transaction.
Can I modify the transaction before signing?
Can I modify the transaction before signing?
No. Ultra transactions must be submitted as-is. This is what lets Jupiter provide end-to-end observability, customer support, and continuous optimisation across your swaps.
How fast is it?
How fast is it?
/order averages ~300ms (P50). Transaction landing via Jupiter Beam is 50-400ms. End-to-end including polling, 95% of swaps complete under 2 seconds.What's the rate limit?
What's the rate limit?
Dynamic. Base is 50 requests per 10-second sliding window, and it scales up with your swap volume. $1M in daily volume gets you ~165 req/10s. No paid tiers. Just get a free API key at portal.jup.ag. Details: Rate Limits.
Can I get a quote without connecting a wallet?
Can I get a quote without connecting a wallet?
Yes. Omit the
taker parameter. You’ll get the full quote (pricing, route plan, fees) but no transaction field. Good for showing price previews before wallet connect.My connection dropped during /execute. Did my swap go through?
My connection dropped during /execute. Did my swap go through?
Re-submit the same
signedTransaction and requestId to /execute. You can do this for up to 2 minutes. The transaction has the same signature so it can’t double-execute. This is your built-in retry and polling mechanism.Next steps
- Ultra API Reference. Full endpoint schema and playground.
- Gasless Support. Deep dive into gasless mechanisms.
- Add Integrator Fees. Set up referral accounts and earn on swaps.
- Embed Swap Widget. Want a drop-in UI instead of an API? Use Plugin.
- Ultra V3 Blog. What makes Ultra the best execution engine on Solana.
- Jupiter Developer Portal. Get your API key.
