Observed since 20 Oct, 21:20 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Python SDK for the AgavaDEX exchange API (REST + WebSocket)
Python client for the AgavaDEX exchange API — a thin, typed wrapper over the public REST + WebSocket interface.
pip install agavadex
Requires Python 3.9+.
from agavadex import Client
with Client() as client:
for sym in client.get_symbols():
print(sym.symbol, sym.tick_size)
book = client.get_order_book("AGAVAUSDT")
print(book.bids[0].price, book.asks[0].price)
API keys are created in the AgavaDEX web app (Account → API keys). Pass them to the client — never hard-code them; read them from the environment.
import os
from agavadex import Client
with Client(api_key=os.environ["AGAVADEX_API_KEY"],
api_secret=os.environ["AGAVADEX_API_SECRET"]) as client:
for balance in client.get_balances():
print(balance.asset, balance.available)
result = client.place_order(
"AGAVAUSDT", side="buy", type="limit", price="100.00", qty="1",
)
print(result.order.id, result.order.status)
import asyncio
from agavadex import MarketDataStream
async def main():
async with MarketDataStream(channels=["trades@AGAVAUSDT"]) as stream:
async for msg in stream:
print(msg.channel, msg.type, msg.data)
asyncio.run(main())
The private UserStream takes api_key / api_secret and
authenticates in-band with a signed first frame. Subscribe to any of
orders, trades, balances:
import asyncio, os
from agavadex import UserStream
async def main():
async with UserStream(
api_key=os.environ["AGAVADEX_API_KEY"],
api_secret=os.environ["AGAVADEX_API_SECRET"],
channels=["orders", "balances"],
) as stream:
async for msg in stream:
print(msg.channel, msg.type, msg.data)
asyncio.run(main())
Both streams auto-reconnect and re-subscribe on a dropped socket.
Every monetary value — price, qty, volume, fee amounts — is a
decimal.Decimal, never a float. The API sends and receives these as
JSON strings; this SDK parses them losslessly. When placing orders,
price / qty accept a Decimal, str or int.
Non-2xx responses raise a typed exception — BadRequestError,
AuthenticationError, PermissionDeniedError, NotFoundError,
RateLimitError, ServerError — all subclasses of APIError. Each
carries status_code and the API's request_id; RateLimitError adds
retry_after. Pass max_retries= to Client to auto-retry 429s.
Withdrawals are not part of the AgavaDEX API and not in this SDK — they require a wallet signature and happen only in the web app.
pip install -e ".[dev]"
pytest # offline tests run with no credentials
ruff check .
Integration tests run only when AGAVADEX_API_KEY / AGAVADEX_API_SECRET
are set, and are read-only — they never place orders.
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.2 | 2 Jun 2026 | 5 |
This describes our collected data; it is not a security assessment.
Shared repository data · GitLab
| Contributor | Contributions |
|---|---|
| John Michaelson | 4 |
Default-branch author identities; GitLab commit counts exclude merge commits.
Public sponsor counts have not been collected. These signals belong to the repository owner.
gitlab · 3 observations shown. Missing days are unknown.
| Date / source period | Value | Observed at |
|---|---|---|
| 2026-10-23 | 1 | 2026-10-23T11:07:11.0353260Z |
| 2026-10-22 | 1 | 2026-10-22T11:06:43.1429143Z |
| 2026-10-21 | 1 | 2026-10-21T11:06:23.1187763Z |
Observed since 20 Oct, 21:20 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:12c64c6a522df41394bab4755bece89b04cc7837a729922ed778d3e1d638a7e7