Skip to main content

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.

PyPI version Python 3.11+ License: MIT CI

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 impact
  • SwapResponse — Base64 transaction ready to sign
  • UltraOrder — Combined quote + transaction from Ultra API
  • TokenInfo — 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jupiter_swap_python-0.1.0.tar.gz (12.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jupiter_swap_python-0.1.0-py3-none-any.whl (11.4 kB view details)

Uploaded Python 3

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

Hashes for jupiter_swap_python-0.1.0.tar.gz
Algorithm Hash digest
SHA256 4a4e9b832426fc25aa3dbc402293d1d2b66c6452d743d9f36ab4b8e6bccbd9c5
MD5 a098ec0b3c030ef9fc4a27e588242303
BLAKE2b-256 e3d2b9e0a4818e870d14afa6f9bec05197e287150bd7a445afb406de4753ae96

See more details on using hashes here.

File details

Details for the file jupiter_swap_python-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for jupiter_swap_python-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bb2c0f13aaa91a98521e2faee1cc05c2e3629d73f1877a4fda2bd8f109256ac4
MD5 fa823affcadef5e06830e7491b0f684c
BLAKE2b-256 8a4c9a0f290466433e97aded88aff6fd61fb6f0a01f965101ac9ac3e2a1a33ae

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page