Async Python client for the Jupiter DEX aggregator on Solana — V6 quote/swap and Ultra API.
Project description
jupiter-swap-python
The missing Jupiter swap client for Python. Async. Typed. Production-tested.
Jupiter's own Python SDK was abandoned (returns 404). This library fills the gap — a clean, typed, async client for Jupiter, the #1 DEX aggregator on Solana.
⚡ Quickstart
pip install jupiter-swap-python
Get a quote
import asyncio
from jupiter_swap import JupiterClient
SOL = "So11111111111111111111111111111111111111112"
USDC = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
async def main():
async with JupiterClient() as jup:
quote = await jup.get_quote(SOL, USDC, 1_000_000_000) # 1 SOL
print(f"1 SOL = {int(quote.out_amount) / 1e6:.2f} USDC")
print(f"Price impact: {quote.price_impact_pct}%")
asyncio.run(main())
Swap tokens
async with JupiterClient(api_key="your-key") as jup:
# Step 1: Get quote
quote = await jup.get_quote(SOL, USDC, 1_000_000_000)
# Step 2: Build swap transaction
swap = await jup.get_swap_transaction(
quote,
user_public_key="YourWalletPublicKey...",
priority_fee_lamports=500_000, # 0.0005 SOL
)
# Step 3: Sign and send swap.swap_transaction with your wallet
print(f"Transaction ready (block height: {swap.last_valid_block_height})")
Ultra API (recommended for production)
async with JupiterClient(api_key="your-key") as jup:
# Combined quote + swap in one call
order = await jup.ultra_order(
input_mint=SOL,
output_mint=USDC,
amount=1_000_000_000,
taker="YourWalletPublicKey...",
)
print(f"Swap type: {order.swap_type}")
print(f"Out amount: {order.out_amount}")
# Sign order.swap_transaction with your wallet, then:
tx_sig = await jup.ultra_execute(signed_transaction, order.request_id)
print(f"Executed: {tx_sig}")
Token verification
from jupiter_swap import TokenClient
async with TokenClient() as tokens:
info = await tokens.get_token_info("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v")
print(f"{info.symbol} — verified: {info.is_verified}, banned: {info.is_banned}")
# Check if a token is a known scam
if await tokens.is_banned("SomeScamMint..."):
print("🚫 Token is banned!")
🔧 API Reference
JupiterClient
| Method | Description |
|---|---|
get_quote() |
Get the best swap route and price |
get_swap_transaction() |
Build a signable transaction from a quote |
ultra_order() |
Combined quote + swap via Ultra API (MEV protection) |
ultra_execute() |
Execute a signed Ultra swap order |
TokenClient
| Method | Description |
|---|---|
get_token_info() |
Get token metadata and verification status |
is_banned() |
Check if a token is on the banned list |
is_verified() |
Check if a token is verified |
get_strict_list() |
Get all strictly verified tokens |
refresh_banned_list() |
Manually refresh the banned list |
Models
QuoteResponse— Route details, expected output, price impactSwapResponse— Base64 transaction ready to signUltraOrder— Combined quote + transaction from Ultra APITokenInfo— Name, symbol, decimals, verification flags
🛡️ Why this library?
| Problem | Solution |
|---|---|
| Jupiter's Python SDK is deleted | This exists |
Raw httpx.post() calls everywhere |
Typed client with proper models |
| No 429 handling | Built-in retry with exponential backoff |
| Token safety is an afterthought | TokenClient with banned/verified checks |
| Sync-only clients | Fully async with httpx |
🔑 API Key
A Jupiter API key is optional but recommended for production use (higher rate limits).
Get one at station.jup.ag.
client = JupiterClient(api_key="your-api-key")
📦 Also by JinUltimate1995
- solana-rpc-resilient — Solana RPC client with automatic failover, rate limiting, and circuit breaker
- dexscreener-python — Async DexScreener API client for token/pair data across 80+ chains
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jupiter_swap_python-0.1.0.tar.gz.
File metadata
- Download URL: jupiter_swap_python-0.1.0.tar.gz
- Upload date:
- Size: 12.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4a4e9b832426fc25aa3dbc402293d1d2b66c6452d743d9f36ab4b8e6bccbd9c5
|
|
| MD5 |
a098ec0b3c030ef9fc4a27e588242303
|
|
| BLAKE2b-256 |
e3d2b9e0a4818e870d14afa6f9bec05197e287150bd7a445afb406de4753ae96
|
File details
Details for the file jupiter_swap_python-0.1.0-py3-none-any.whl.
File metadata
- Download URL: jupiter_swap_python-0.1.0-py3-none-any.whl
- Upload date:
- Size: 11.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb2c0f13aaa91a98521e2faee1cc05c2e3629d73f1877a4fda2bd8f109256ac4
|
|
| MD5 |
fa823affcadef5e06830e7491b0f684c
|
|
| BLAKE2b-256 |
8a4c9a0f290466433e97aded88aff6fd61fb6f0a01f965101ac9ac3e2a1a33ae
|