Okay, so most people screw up right at the start by hitting the wrong URL. They grab some old V2 link from a random blog post and wonder why their prices are all wonky or missing. Don't do that. Jupiter's Price API is on V3 now (beta), and it's the real deal for accurate Solana token prices. Use the lite one for testing: https://lite api.jup.ag/price/v3. Pro version's at https://api.jup.ag/price/v3 when you're ready to scale.
The thing is, V3 prices come from actual last swaps, starting with solid oracles for SOL and rippling out. They slap on heuristics too-like liquidity checks, holder stats, weird market patterns-to kill outliers. Why does this matter? No more fake pumps messing your app.
Look, grab a mint like SOL's (So11111111111111111111111111111111111111112) or JUP's (JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN). Throw 'em in the query.
const price = await (await fetch('https://lite api.jup.ag/price/v3?ids=So11111111111111111111111111111111111111112,JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN')).json();
console.log(JSON.stringify(price, null, 2));
Boom. You'll see something like:
{ "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN": { "usdPrice": 0.4056018512541055, "blockId": 348004026, "decimals": 6, "priceChange24h": 0.5292887924920519 }, "So11111111111111111111111111111111111111112": { "usdPrice": 147.4789340738336, "blockId": 348004023, "decimals": 9, "priceChange24h": 1.2907622140620008 }
}
usdPrice is your main number. decimals tells you how to format it-like JUP's 6 means divide raw amounts by 1,000,000. blockId? That's for checking if it's fresh. priceChange24h shows the 24h shift. Pretty much all you need.
?ids=So11111111111111111111111111111111111111112,EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v,DEz555.. (USDC, whatever else).audit.isSus.In my experience, new memecoins vanish from results fast if liquidity sucks. Smart filter, honestly.
Ever get an empty object for a hot token? Yeah, happens. Heuristics kick it out if holder distro looks botted or volume's fishy. Fix? Poll less often, or fallback to Swap API's /quote for on demand prices. It's more data heavy but reliable.
https://quote api.jup.ag/v6/quote?inputMint=..&outputMint=So11111111111111111111111111111111111111112&amount=1000000000 (1 SOL worth).outAmount, divide by input decimals for price.So you're making a dashboard. Don't fetch in a loop like an idiot-cache with blockId checks. Here's a simple function I use:
async function getPrices(ids) { try { const res = await fetch(https://lite api.jup.ag/price/v3?ids=${ids.join(',')}); return await res.json(); } catch (e) { console.error('Price fetch failed:', e); return {}; }
} // Use it
const prices = await getPrices(['So11111111111111111111111111111111111111112', 'JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN']);
console.log(SOL: ${prices.So11111111111111111111111111111111111111112?.usdPrice?.toFixed(2)});
Short. Sweet. Handles errors. Scale to React? Wrap in useEffect with a 30s interval. Gas? Negligible, like 0.000005 SOL per call if you're signing anything.
But wait-want prices in SOL not USD? V3 doesn't do that natively yet. Hack it: fetch both, divide usdPricetoken / usdPriceSOL. Works fine, off by like 0.1% max.
| What You Need | Use Price V3 | Use Quote V6 |
|---|---|---|
| Quick USD spot for 50 tokens | ✅ Lightning fast | ❌ Too heavy |
| Swap simulation with slippage | ❌ No amounts | ✅ Full route info |
| 24h change + decimals | ✅ Built in | ❌ Calc yourself |
| Fees? (lp 0.3%, platform varies) | ❌ Nope | ✅ In response |
Table says it all. Price for lists, quotes for trades. I've burned hours mixing 'em up.
First off, beta means changes. They're on Discord if it breaks-join that. Query limits are strict: 50 ids max, no bulk hacks.
Decimals trip everyone. SOL's 9, USDC 6, JUP 6. Mess it up, prices look like 0.000000147 SOL. Always check response.
BlockId stale? Price might be 10min old on low volume tokens. For trading bots, poll every 5s and verify with your own RPC.
And fees-Price API's free, but if you're swapping after, expect ~0.000005 SOL priority + 0.3% lp on most pools. Platforms take 0-0.5% sometimes.
Building a trader? Poll prices, trigger on priceChange24h thresholds. Like this:
setInterval(async () => { const prices = await getPrices(['YOURTOKENMINT']); const tokenPrice = prices['YOURTOKENMINT']?.usdPrice; if (tokenPrice > 0.50) { // Pump alert console.log('Sell time!'); // Hit quote API, swap }
}, 5000);
I've run this for JUP pumps. Catches 80% early. Add your wallet for auto swaps via Jupiter Swap API.
V3 sticks to USD, but old V2 let you vsToken=SOL. If you need that, chain calls or use third party wrappers. Honestly, USD's fine for most.
Those heuristics? They sniff launch method (fair vs sniper), liquidity ratios, organic score. Suspicious? No price. Saves you from rugs.
What's next for V3? More data maybe, but right now it's lean. If V2's extras tempt you (slippage estimates), quote endpoint mimics it without the mess.
In my experience, mixing Price V3 for UI + Quote for trades = perfect stack. No outliers, consistent across apps.
Grab a dead token mint. No price? Good. Pumped one like fresh meme? Might flag if holders concentrated. Test 50 ids-response still snappy under 200ms.
Rate limit? Space calls 1s apart. Pro URL probably higher limits, but lite's plenty for dev.
Decimals wrong in UI? User sees $147.00 for SOL instead of $0.000000147. Fatal.
Not JS? Here's Python, dead simple:
import requests
response = requests.get('https://lite api.jup.ag/price/v3?ids=So11111111111111111111111111111111111111112').json()
print(f"SOL: ${response['So11111111111111111111111111111111111111112']['usdPrice']:.2f}")
Go? That pkg in results has a Client.Price(). Configure endpoint to lite api.
Pick your poison. All fetch the same endpoint under the hood.
Cache 60s, invalidate on blockId change. WebSocket RPC for blocks if you're fancy. For 1k users? Pro URL, cluster fetches.
Errors? Wrap everything. Networks flake on Solana sometimes.
Sound familiar? That bot guide uses Price for monitoring-exact play. Tweak for your gain target, like 1.5% swings.