AgentBroker Python SDK
Official Python SDK for AgentBroker — the non-custodial crypto trading platform built for autonomous agents on Jupiter DEX (Solana).
Features
- Async-first client (
AgentBrokerClient) built onhttpx— runs cleanly underasyncio, FastAPI, Discord bots, etc. - Sync wrapper (
AgentBroker) — backward-compatible with the existing v1.x API. - Non-custodial trading — your wallet signs the Jupiter swap; AgentBroker never holds your private key.
- Typed response models — every API response is parsed into a
dataclassyou can autocomplete against. - Typed exceptions —
AuthenticationError,NotFoundError,RateLimitError,ServerError, etc. — all subclasses ofAgentBrokerError. - WebSocket helpers — decorator-style event handlers with auto-reconnect (optional
agentbroker[ws]extra).
Installation
pip install agentbroker
With WebSocket support:
pip install "agentbroker[ws]"
Quickstart (5 lines)
pip install agentbroker → working trade in 5 lines of Python:
from agentbroker import AgentBrokerClient
import asyncio
client = AgentBrokerClient(api_key="ab_live_...")
async def main():
acct = await client.get_account()
trade = await client.trade("SOL", "USDC", amount_sol=0.1)
asyncio.run(main())
That's it — the asyncio plumbing is already wired up.
Sync wrapper (backward-compatible)
Existing v1.x users keep working unchanged:
from agentbroker import AgentBroker
client = AgentBroker(api_key="ab_live_...")
acct = client.get_account()
order = client.place_order("BTC-USDC", "buy", "market", quantity=0.001)
Both classes ship from agentbroker — pick the one that matches your runtime.
Non-custodial registration (new agents)
import asyncio
from agentbroker import AgentBrokerClient
async def register():
async with AgentBrokerClient() as client:
agent = await client.register(
wallet_address="9B5X5AF5zxkXk7gw7Xj7t3rK4vN2mL1pQ8sR6tU5vW4",
name="my-trading-bot",
email="me@example.com",
)
print(agent.api_key) # ← save this — shown ONCE
asyncio.run(register())
The returned api_key authenticates every subsequent request. The agent's own Solana wallet signs and submits the unsigned trade() output — AgentBroker never touches your private key.
Features in depth
- Full API coverage — registration (legacy + non-custodial), orders, deposits, market data, WebSocket streaming.
- Type hints throughout — autocomplete-friendly with
dataclassresponse models (Agent,Account,DiscoveredToken,TradeResult, ...). - Smart error handling — typed exceptions for auth failures, insufficient balance, not found, rate limit, server errors, etc.
API Reference
AgentBrokerClient(api_key=None, base_url=None, timeout=30.0)
Async client. Use this for all new code.
client = AgentBrokerClient(api_key="ab_live_...", timeout=30.0)
async with client:
...
| Parameter | Type | Default | Description |
|---|---|---|---|
api_key |
str |
None |
API key (required for authenticated endpoints; not needed for register or discover) |
base_url |
str |
https://agentbroker.polsia.app |
API base URL |
timeout |
float |
30.0 |
HTTP request timeout in seconds |
Registration & Account
| Method | Returns | Description |
|---|---|---|
await client.register(wallet_address, name=None, email=None, ...) |
Agent |
Register a non-custodial agent using your own Solana wallet (no API key needed) |
await client.get_account() |
Account |
Balance + totals summary |
await client.get_balance() |
float |
Current USDC balance, as a float |
# Non-custodial register
agent = await client.register(
wallet_address="9B5X5AF5zxkXk7gw7Xj7t3rK4vN2mL1pQ8sR6tU5vW4",
name="my-bot",
email="me@example.com",
)
print(agent.api_key) # save it!
# Account
acct = await client.get_account()
print(acct.balance_usdc)
Discovery
| Method | Returns | Description |
|---|---|---|
await client.discover(limit=20, strategy='trending') |
list[DiscoveredToken] |
Trending tokens + recent launches + recently-active |
tokens = await client.discover(limit=10)
for t in tokens[:5]:
print(f"{t.symbol} ({t.type}) — price: {t.price} — liq: {t.liquidity_usd}")
Trading (non-custodial)
| Method | Returns | Description |
|---|---|---|
await client.trade(token_in, token_out, amount_sol, slippage_bps=50, side=None) |
TradeResult |
Build an unsigned Jupiter swap — your wallet signs + submits |
side is auto-detected from the symbol pair (SOL→USDC = buy, USDC→SOL = sell); pass it explicitly to override. The result contains a base64 unsigned_transaction ready for your wallet to sign, plus the Jupiter quote, expected_output_amount, and the trade_id you'll later confirm via POST /v1/trades/swap-confirm.
trade = await client.trade(
token_in="SOL",
token_out="USDC",
amount_sol=0.1,
slippage_bps=50, # 0.5% default
)
print(f"trade_id {trade.trade_id}: {trade.unsigned_transaction[:40]}…")
print(f"expected out: {trade.expected_output_amount} atomic units")
To execute end-to-end: sign unsigned_transaction in your wallet, broadcast on Solana mainnet, then call swap-confirm with the resulting signature.
Trades (history)
| Method | Returns | Description |
|---|---|---|
await client.get_trades(base_symbol=None, limit=50) |
list[Trade] |
Recent trades for this agent |
WebSocket
ws = await client.connect_ws() # requires agentbroker[ws]
@ws.on_trade
def on_trade(event): ...
ws.run_forever()
Channels: "trades", "balance", "orderbook", "prices".
Exceptions
from agentbroker.exceptions import (
AgentBrokerError, # Base class
AuthenticationError, # 401 — missing/invalid API key
ValidationError, # 400 — bad request params
InsufficientBalanceError,# 400 with code INSUFFICIENT_BALANCE
NotFoundError, # 404 — resource not found
RateLimitError, # 429 — too many requests
ServerError, # 5xx — server-side error
ConnectionError, # Network failure
TimeoutError, # Request timed out
WebSocketError, # WS connection issues
)
try:
trade = await client.trade("SOL", "USDC", amount_sol=10_000)
except InsufficientBalanceError as e:
print(f"Need {e.required} USDC, have {e.available} USDC")
except AuthenticationError:
print("Check your API key")
except AgentBrokerError as e:
print(f"[{e.code}] {e.message}")
Legacy sync API (AgentBroker)
If you're not running under asyncio, the AgentBroker class is a thin synchronous wrapper around AgentBrokerClient (v1.x users keep their existing code).
from agentbroker import AgentBroker
client = AgentBroker(api_key="ab_live_...")
# Same names, same dataclasses — backward-compatible
profile = client.get_profile()
order = client.place_order("BTC-USDC", "buy", "market", quantity=0.001)
The original classmethod registration path is preserved:
agent = AgentBroker.register(
name="quickstart-bot",
email="trader@example.com",
preferred_pairs=["BTC-USDC", "ETH-USDC"],
)
print(agent.api_key)
Examples
| File | Description |
|---|---|
examples/async_basics.py |
Register / account / discover / trade (async) |
examples/basic_trade.py |
Register, deposit, place market + limit orders (sync) |
examples/momentum_bot.py |
Trend-following bot with stop-loss + WebSocket balance updates |
examples/arbitrage_scanner.py |
Scan order books for wide spreads + triangular arb signals |
Run any example:
export AGENTBROKER_API_KEY=ab_live_your_key_here
python examples/async_basics.py
Environment Variables
| Variable | Description |
|---|---|
AGENTBROKER_API_KEY |
Your API key (used by examples) |
AGENTBROKER_BASE_URL |
Override base URL (default: https://agentbroker.polsia.app) |
Development
git clone https://github.com/Polsia-Inc/agentbroker
cd agentbroker/python-sdk
pip install -e ".[dev]"
# Run tests
pytest
# Format
black agentbroker/ examples/
isort agentbroker/ examples/
# Type check
mypy agentbroker/
# Build wheel + sdist
python -m build
License
MIT © AgentBroker
Release files for agentbroker 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| agentbroker-1.1.0.tar.gz | 19.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agentbroker-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 37.5 kB
Release files / agentbroker-1.1.0.tar.gz
| Download URL | agentbroker-1.1.0.tar.gz |
|---|---|
| Size | 19.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cec5def2df960381ad76a9c46a3a681cfdf8fb96f4496438aecdf20b22b22979
|
|
BLAKE2b-256 checksum How to use checksums |
b764d12aaeb5127c691be8071f5db8bd6806b212f552e9eb456bc4779191525a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.
Transparency logRelease files / agentbroker-1.1.0-py3-none-any.whl
| Download URL | agentbroker-1.1.0-py3-none-any.whl |
|---|---|
| Size | 17.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
057e2dc3997524c87b553899100e2da0a8e5f546d2b14b2f8b671f79281a0f1f
|
|
BLAKE2b-256 checksum How to use checksums |
ec77e2d7b374efb66c9560cf34d3e9f22528ac35616d9ee55c94207aa31145a7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 14, 2026.
Transparency log