Skip to main content
Ultra V1 is deprecated. Use Swap API V2 instead - it unifies Ultra and Metis into a single API with /order (managed execution) and /build (custom transactions). See the Migration Guide.

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

  1. Get an API key at Portal (free)
  2. All requests need the x-api-key header
  3. Install @solana/web3.js for transaction signing

Quick start

You get back a transaction (base64 unsigned) and a requestId. Sign the transaction, then hit execute:
Done. Your swap lands in 50-400ms via Jupiter Beam.

API reference

Base URL: https://api.jup.ag/ultra/v1 Full schema at API Reference.

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.
Parameters: What you get back:

Step 2: Sign the transaction

Deserialise the base64 transaction, sign it, serialise it back:
Don’t modify the transaction. Ultra transactions are meant to be signed and submitted as-is.

Step 3: Execute

Post the signed transaction and requestId to /execute. Jupiter broadcasts it via Beam and polls for the result. You get back the final status.
Connection dropped? Re-submit the same signedTransaction and requestId to /execute for up to 2 minutes. The transaction won’t double-execute because it has the same signature. This is your built-in polling mechanism.

Full working example

End-to-end: swap 1 SOL to USDC, from scratch.
That’s the entire integration.

Response format

Order response

Execute response


Error handling

Order errors

The order can return a quote but fail simulation. When that happens, you’ll see errorCode and errorMessage alongside the quote data, but transaction will be empty. Show the quote even when there’s an error. Users want to see the price. Just disable the swap button and explain why.

Execute errors

For the full list of error codes including aggregator and RFQ-specific codes, see Response docs.

Gasless swaps

Ultra handles gasless automatically. You don’t configure anything. Ultra Gasless Support (Metis). 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 in feeBps). JupiterZ (RFQ). When a market maker provides the route, the market maker pays network and priority fees. If the taker’s output token account does not exist, Jupiter’s gas wallet pays the rent to create it. 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.
  1. Create a referral account using the @jup-ag/referral-sdk or the Referral Dashboard
  2. Create referral token accounts for the mints you expect to collect fees in (at minimum: SOL, USDC, USDT)
  3. Pass referralAccount and referralFee to /order
Fees range from 50 to 255 bps. Jupiter takes 20% of your integrator fee (no additional Ultra base fee on top). Ultra decides which token to collect fees in based on a priority list. If the referral token account for that mint isn’t initialised, the swap still goes through, but without your fee. So always check that 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. Full breakdown: Fees.

Common questions

Nope. Ultra runs on Jupiter’s own validator stake and dedicated infra so you don’t have to. You just sign the transaction.
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.
/order averages ~300ms (P50). Transaction landing via Jupiter Beam is 50-400ms. End-to-end including polling, 95% of swaps complete under 2 seconds.
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. Details: Rate Limits.
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.
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

Built something? Tag @JupDevRel or @0xanmol.