◈   ⌘ api · Intermediate

Jupiter Quote API: The Complete Guide for Crypto Traders

Jupiter Quote API powers real-time Solana swap pricing for traders and bots. Covers endpoints, rate limits, BullX integration, error handling, and code examples to get you trading fast.

Uncle Solieditor · voc · 06.05.2026 ·views 41
◈   Contents
  1. → What the Jupiter Quote API Actually Does
  2. → Making Your First Quote Request
  3. → Understanding and Working Around Rate Limits
  4. → Jupiter Quote API with BullX and Third-Party Tools
  5. → Fetching Quotes and Building Swap Transactions in Python
  6. → Integrating Jupiter Quotes into a Trading Signal Workflow
  7. → Frequently Asked Questions
  8. → Conclusion

If you're building a Solana trading bot or automating swaps on decentralized exchanges, the Jupiter Quote API is the backbone of almost every serious setup. Jupiter aggregates liquidity across the entire Solana ecosystem — Raydium, Orca, Meteora, and dozens more — and exposes it through a clean, fast HTTP API. Whether you're routing large trades to minimize slippage or running a high-frequency bot that fires hundreds of quotes per minute, understanding this API deeply will save you time, money, and a lot of debugging headaches.

What the Jupiter Quote API Actually Does

At its core, the Jupiter Quote API (hosted at quote-api.jup.ag) does one thing: given an input token, an output token, and an amount, it returns the best possible swap route across all aggregated liquidity sources on Solana. The response includes the expected output amount, price impact, route breakdown, and everything you need to execute the swap. Unlike centralized exchanges like Binance or Bybit where you're trading against an order book, Jupiter routes through automated market makers (AMMs) and finds the optimal path — sometimes splitting across multiple pools.

The current production version is Jupiter Quote API v6, which brought significant improvements over v4: compressed transaction formats, better route caching, and support for dynamic slippage. If you're still on v4 or v5, migrate now — v6 is more reliable under load and the older versions are being deprecated. The official Jupiter Quote API docs live at dev.jup.ag, and they're genuinely well-maintained compared to most DeFi protocols.

The Jupiter Quote API does not require an API key for basic usage. The public endpoint at https://quote-api.jup.ag/v6/quote is free and rate-limited. For higher throughput, you need either Jupiter's paid tier or a self-hosted instance.

Making Your First Quote Request

The quote endpoint is a simple GET request. You pass the input mint address, output mint address, amount in the smallest denomination (lamports for SOL, base units for SPL tokens), and optionally slippage tolerance in basis points. The response comes back fast — typically under 200ms from a server close to the RPC endpoint. Here's a minimal JavaScript example to fetch a SOL → USDC quote:

// Jupiter Quote API v6 - Basic Quote Request
const fetch = require('node-fetch');

const JUPITER_QUOTE_API = 'https://quote-api.jup.ag/v6/quote';

// Token mint addresses on Solana mainnet
const SOL_MINT = 'So11111111111111111111111111111111111111112';
const USDC_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';

async function getQuote(inputMint, outputMint, amountLamports, slippageBps = 50) {
  const params = new URLSearchParams({
    inputMint,
    outputMint,
    amount: amountLamports.toString(),
    slippageBps: slippageBps.toString(),
    onlyDirectRoutes: 'false',
    asLegacyTransaction: 'false'
  });

  const response = await fetch(`${JUPITER_QUOTE_API}?${params}`);

  if (!response.ok) {
    throw new Error(`Jupiter API error: ${response.status} ${response.statusText}`);
  }

  return response.json();
}

// Fetch quote for 1 SOL (1e9 lamports) to USDC
getQuote(SOL_MINT, USDC_MINT, 1_000_000_000)
  .then(quote => {
    const outAmount = parseInt(quote.outAmount) / 1e6; // USDC has 6 decimals
    const priceImpact = parseFloat(quote.priceImpactPct) * 100;
    console.log(`Expected output: ${outAmount.toFixed(2)} USDC`);
    console.log(`Price impact: ${priceImpact.toFixed(4)}%`);
    console.log(`Route: ${quote.routePlan.map(r => r.swapInfo.label).join(' → ')}`);
  })
  .catch(console.error);

The response object from Jupiter Quote API contains more than just the price. The `routePlan` array tells you exactly which pools are being used — you'll often see routes like Raydium → Orca or a direct Meteora pool depending on liquidity depth. The `outAmount` is the raw token amount before fees, while `otherAmountThreshold` is the minimum you'll receive given your slippage tolerance. Pay attention to `priceImpactPct` — anything above 1% on a large trade is a red flag.

Understanding and Working Around Rate Limits

The Jupiter Quote API rate limit on the public endpoint is roughly 600 requests per minute per IP. That sounds like a lot until you're running a bot that polls 20 trading pairs every second — then you hit the ceiling fast. When you exceed the limit, the API returns a 429 status with a Retry-After header. Ignoring this and hammering the endpoint will get your IP temporarily blocked.

The practical approaches to handle Jupiter Quote API rate limits depend on your use case. For monitoring tools or signal platforms like VoiceOfChain, batching quote requests and caching results for 2-5 seconds dramatically reduces API calls without meaningfully staling the price data. For execution bots, you generally only need a fresh quote immediately before sending a transaction — not on every polling cycle.

// Rate-limit-aware quote fetcher with exponential backoff
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

async function getQuoteWithRetry(inputMint, outputMint, amount, maxRetries = 4) {
  let delay = 1000; // Start with 1 second

  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      const params = new URLSearchParams({ inputMint, outputMint, amount: amount.toString(), slippageBps: '50' });
      const res = await fetch(`https://quote-api.jup.ag/v6/quote?${params}`);

      if (res.status === 429) {
        const retryAfter = parseInt(res.headers.get('Retry-After') || '2') * 1000;
        console.warn(`Rate limited. Waiting ${retryAfter}ms before retry ${attempt + 1}`);
        await sleep(retryAfter || delay);
        delay *= 2; // Exponential backoff
        continue;
      }

      if (res.status === 400) {
        const err = await res.json();
        throw new Error(`Bad request: ${err.error || JSON.stringify(err)}`);
      }

      if (!res.ok) throw new Error(`HTTP ${res.status}`);

      return await res.json();

    } catch (err) {
      if (attempt === maxRetries - 1) throw err;
      console.error(`Attempt ${attempt + 1} failed: ${err.message}. Retrying in ${delay}ms`);
      await sleep(delay);
      delay *= 2;
    }
  }
}

// Usage
getQuoteWithRetry(
  'So11111111111111111111111111111111111111112',
  'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
  500_000_000 // 0.5 SOL
).then(q => console.log('Quote received:', q.outAmount)).catch(console.error);

If you're building something that genuinely needs higher throughput — say, an arbitrage bot comparing Jupiter routes against Binance spot prices in real time — you have two real options: Jupiter's paid API tier (which gives you dedicated rate limits) or running your own Jupiter instance via the self-hosted mode. The self-hosted path is complex but eliminates rate limit concerns entirely for serious operations.

Jupiter Quote API with BullX and Third-Party Tools

BullX is one of the most popular Solana trading terminals, and it uses the Jupiter Quote API under the hood for its swap routing. When traders report 'no response from Jupiter Quote API BullX', the problem is almost never BullX itself — it's usually one of three things: Solana RPC congestion (which indirectly affects quote latency), Jupiter's public endpoint being under load, or the specific token pair having no liquidity routes available.

The 'no response from Jupiter Quote API' error in BullX typically manifests as a spinning loader that never resolves, or a vague 'swap failed' message. If you're seeing this consistently on a specific token, check whether the token has sufficient liquidity on any Jupiter-supported pool. Very new or very small-cap tokens sometimes have no route at all — Jupiter returns an empty `routePlan` or a specific 'no routes found' error rather than a full quote object. Always validate that `outAmount` exists before proceeding to the swap step.

Common Jupiter Quote API Errors and Fixes
ErrorCauseFix
429 Too Many RequestsRate limit exceededImplement exponential backoff, reduce polling frequency
No routes foundNo liquidity for pairCheck token liquidity on Birdeye or Raydium before quoting
400 Bad RequestInvalid mint address or amountValidate mint addresses and ensure amount > 0
Timeout / No ResponseRPC or Jupiter endpoint congestionSwitch to Jupiter's paid endpoint or retry with backoff
Slippage exceededPrice moved before executionIncrease slippageBps or fetch a fresh quote immediately before swap

Fetching Quotes and Building Swap Transactions in Python

The Jupiter Quote API is HTTP-based, so any language works. Python is common for backtesting and signal pipelines. The flow is: get quote → use the quote response to request a swap transaction from the swap endpoint → sign and send that transaction via your RPC. Here's the quote-to-swap flow in Python, which you can wire into a larger trading system alongside data feeds from platforms like VoiceOfChain for entry signals:

import requests
import json
from typing import Optional

JUPITER_QUOTE_URL = "https://quote-api.jup.ag/v6/quote"
JUPITER_SWAP_URL = "https://quote-api.jup.ag/v6/swap"

SOL_MINT = "So11111111111111111111111111111111111111112"
USDC_MINT = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"

def get_jupiter_quote(
    input_mint: str,
    output_mint: str,
    amount: int,
    slippage_bps: int = 50
) -> Optional[dict]:
    """Fetch best swap route from Jupiter Quote API v6."""
    params = {
        "inputMint": input_mint,
        "outputMint": output_mint,
        "amount": str(amount),
        "slippageBps": str(slippage_bps),
        "onlyDirectRoutes": "false"
    }
    try:
        resp = requests.get(JUPITER_QUOTE_URL, params=params, timeout=10)
        resp.raise_for_status()
        data = resp.json()

        # Validate response has usable route
        if not data.get("outAmount"):
            print("No route found for this pair")
            return None

        return data

    except requests.exceptions.Timeout:
        print("Jupiter Quote API timed out — RPC may be congested")
        return None
    except requests.exceptions.HTTPError as e:
        print(f"HTTP error from Jupiter: {e.response.status_code} — {e.response.text}")
        return None

def build_swap_transaction(quote: dict, user_public_key: str) -> Optional[str]:
    """Request a serialized swap transaction from Jupiter using quote data."""
    payload = {
        "quoteResponse": quote,
        "userPublicKey": user_public_key,
        "wrapAndUnwrapSol": True,
        "dynamicComputeUnitLimit": True,
        "prioritizationFeeLamports": "auto"
    }
    try:
        resp = requests.post(JUPITER_SWAP_URL, json=payload, timeout=15)
        resp.raise_for_status()
        swap_data = resp.json()
        return swap_data.get("swapTransaction")  # Base64-encoded transaction
    except requests.exceptions.HTTPError as e:
        print(f"Swap build failed: {e.response.text}")
        return None

# Example: quote 0.25 SOL to USDC
quote = get_jupiter_quote(SOL_MINT, USDC_MINT, amount=250_000_000, slippage_bps=30)

if quote:
    out_usdc = int(quote["outAmount"]) / 1e6
    impact = float(quote["priceImpactPct"]) * 100
    route_labels = [step["swapInfo"]["label"] for step in quote["routePlan"]]
    print(f"Output: {out_usdc:.4f} USDC")
    print(f"Price impact: {impact:.4f}%")
    print(f"Route: {' -> '.join(route_labels)}")

    # Optionally build the swap tx (requires your wallet public key)
    # tx_b64 = build_swap_transaction(quote, "YOUR_WALLET_PUBKEY_HERE")
    # Then sign and submit via solana-py or web3.js

One critical detail: the quote you receive from Jupiter Quote API jup.ag is only valid for a short window — typically 30-60 seconds depending on market volatility. If you fetch a quote and then wait too long before requesting the swap transaction, the swap endpoint will reject it or give you worse execution. Always fetch a fresh quote immediately before building the swap transaction, especially in volatile market conditions where prices on even major pools like Raydium shift quickly.

Integrating Jupiter Quotes into a Trading Signal Workflow

The Jupiter get quote API shines when combined with a signal layer. The typical flow for a systematic Solana trader looks like this: receive a signal (say, from VoiceOfChain alerting on a momentum breakout or whale accumulation pattern) → immediately query Jupiter swap quote API to check available liquidity and current execution price → compare that price against your signal's expected entry → if slippage and price impact are acceptable, build and submit the transaction.

This is meaningfully different from how you'd operate on centralized exchanges. On Binance or OKX, you get a limit order book with known depth. On Bybit, you have perpetual contracts with a clear funding rate signal. Jupiter gives you AMM-based routing where the effective price depends on current pool reserves — which is why checking `priceImpactPct` before every execution is non-negotiable for anything above small amounts. For tokens with shallow liquidity, a $10k swap can move the price 3-5%, turning a profitable signal into a loss.

For automated pipelines, consider maintaining a local cache of recent quotes keyed by token pair and refreshing on a schedule. This lets you pre-filter signals — if a token's best available execution would cost more than 1% in price impact, skip it automatically rather than burning transaction fees on bad fills. Platforms like Coinbase and KuCoin publish public APIs for CEX prices that you can cross-reference to validate whether Jupiter's DeFi price is in line with centralized market rates.

Frequently Asked Questions

What is the Jupiter Quote API v6 and how is it different from previous versions?
Jupiter Quote API v6 is the current production version hosted at quote-api.jup.ag/v6/quote. It introduced support for compressed transaction formats, dynamic slippage calculation, and improved route optimization compared to v4. If you're using older endpoint paths without the /v6 prefix, you're hitting deprecated infrastructure that may be removed — migrate to v6 for reliability and access to all current features.
Why am I getting 'no response from Jupiter Quote API' in BullX?
This usually means either the token pair has no available liquidity routes on any Jupiter-supported pool, or the Solana network or Jupiter's infrastructure is under temporary congestion. Check if the token appears on Birdeye or Raydium with active liquidity. If it's a very new token, liquidity pools may not exist yet or may be too thin to route through.
Does the Jupiter Quote API require authentication or an API key?
No API key is required for the public endpoint at quote-api.jup.ag. You can start making requests immediately with no registration. However, the public endpoint has rate limits around 600 requests per minute per IP. For production bots needing higher throughput, Jupiter offers paid tiers and self-hosted deployment options.
What is the Jupiter Quote API rate limit and how do I handle it?
The public endpoint enforces roughly 600 requests per minute per IP address. Exceeding this returns a 429 status with a Retry-After header. The best mitigation strategies are: implement exponential backoff on 429 responses, cache quotes for 2-5 seconds when monitoring prices, and fetch fresh quotes only immediately before executing a swap rather than continuously polling.
Can I use the Jupiter Quote API to get prices without executing a swap?
Yes — the quote endpoint is read-only and does not initiate any transaction. You can call it freely to check current swap rates, monitor price impact, or build price feeds. Executing a swap is a separate step that requires calling the /v6/swap endpoint with the quote response and your wallet's public key, then signing and submitting the resulting transaction yourself.
How accurate are Jupiter quotes compared to actual execution prices?
Quotes are accurate at the moment they're fetched but AMM prices shift as other trades occur. For small amounts (under $1k), the quote and execution price are typically very close. For larger amounts, set a reasonable slippageBps (50-100 bps is common) and always fetch a fresh quote within a few seconds of submitting the transaction. Stale quotes are the most common cause of swap failures in production bots.

Conclusion

The Jupiter Quote API is straightforward to start with but has real depth once you're operating at scale. Get the basics right first: use v6 endpoints, validate the `outAmount` and `priceImpactPct` on every response, implement proper retry logic for 429s, and never reuse stale quotes for transaction building. From there, the path to a production-grade Solana bot is integrating quote checks into your signal workflow — whether signals come from on-chain data, cross-exchange price feeds from Binance or OKX, or a real-time platform like VoiceOfChain. The API itself won't make you a profitable trader, but misusing it will definitely make you an unprofitable one.

◈   more on this topic
◉ basics Mastering the ccxt library documentation for crypto traders ⌂ exchanges Mastering the Binance CCXT Library for Crypto Traders ⌬ bots Best Crypto Trading Bots 2025: Profitable AI-Powered Strategies