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.1.tar.gz (13.2 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.1-py3-none-any.whl (11.5 kB view details)

Uploaded Python 3

File details

Details for the file jupiter_swap_python-0.1.1.tar.gz.

File metadata

  • Download URL: jupiter_swap_python-0.1.1.tar.gz
  • Upload date:
  • Size: 13.2 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.1.tar.gz
Algorithm Hash digest
SHA256 d7ea821b86c3708ce13a8e376ad5fb07974e7059111cf43ae299cbbc8bff6141
MD5 8e86ff1af4cd35dba2f8890322fb1744
BLAKE2b-256 c21d0748f2d7caaf64484507ede2bbf826820f5a4a6a258ed244e342ebb08fd2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for jupiter_swap_python-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5b4e9bd6cc02cfb743be43cdbb8836d2db88d74041957aa7720d3213461c66ea
MD5 e4e8c1f1790a5432df3464d0ceb5bc95
BLAKE2b-256 3f05c52bda44e53a88baeb0c3013fdbf491479113a39ffd6ab7425fcf50da8ba

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