Skip to main content

dcex - DEX & CEX trading library

English | 繁體中文

dcex is a Rust-backed crypto exchange API library with synchronous and asynchronous Python clients and a standalone Rust crate. It covers market data, account queries, order APIs, and public and private WebSocket streams for centralized exchanges (Binance, Bybit, OKX, Bitget, Kraken, MEXC, BingX) and decentralized perpetual exchanges (Hyperliquid, Lighter, Backpack, Aster, Extended, Ondo, Arcus).

Broker codes: dcex does not set or attach a broker code or broker tag by default. You can specify one explicitly when the exchange API supports it.

Forked from krex, a simplified version of the ccxt Python library.

Python Rust License PyPI Crates.io Ask DeepWiki

Installation

Python:

pip install dcex
# or, in a uv-managed project:
uv add dcex

Rust:

cargo add dcex

Key features

  • Synchronous and asynchronous Python HTTP clients, plus public and private WebSocket clients.
  • HTTP, WebSocket, and signing APIs for direct use from Rust.
  • A Product Table Manager (PTM) that normalizes exchange symbols and trading specifications.
  • Support for multiple CEX and DEX platforms; available endpoints vary by exchange.

Compared with ccxt

ccxt offers one unified API across 100+ exchanges. dcex covers fewer exchanges and keeps each exchange's own endpoints instead:

  • Exchange-native methods and parameters, with coverage tracked endpoint by endpoint against the official docs.
  • Signing, serialization and response validation run in Rust, including DEX signing for Hyperliquid, Lighter and Extended.
  • The same core is available from Python (sync and async) and Rust.
  • Normalized symbols (BTC-USDT-SWAP) and trading specifications through the Product Table Manager.

Documented withdrawal, market-maker and partner endpoints are in scope; current coverage and specification gaps are recorded in the endpoint ledger. API withdrawals have no second confirmation; they execute on submit. Trading API keys should not have withdrawal permission. PTM includes listed options from Binance, Bybit, and OKX; option trading remains exchange-specific.

Supported exchanges

Exchange HTTP Sync HTTP Async WS Public WS Private
Binance Yes Yes Yes Yes
Bybit Yes Yes Yes Yes
OKX Yes Yes Yes Yes
Bitget Yes Yes Yes Yes
Kraken Yes Yes Yes Yes
MEXC Yes Yes Yes Yes
BingX Yes Yes Yes Yes
Hyperliquid Yes Yes Yes Yes
Lighter (Mainnet + Robinhood) Yes Yes Yes Yes
Backpack Yes Yes Yes Yes
Aster Yes Yes Yes Yes
Extended Yes Yes Yes Yes
Ondo Yes Yes Yes Yes
Arcus Yes Yes Yes Yes

Bitget began migrating accounts to UTA on 2026-09-15. Classic-account private endpoints that Bitget rejects for UTA accounts (error 40085) have been removed; public market-data, tax and institutional-loan endpoints that still work remain. Use a UTA account for trading. See the official UTA upgrade guide and account settings.

Private WebSocket support includes authenticated or address-scoped user-data streams. Trading WebSocket APIs are available for Binance, Bybit, Bitget, OKX and Kraken Spot; Hyperliquid and Lighter accept signed actions, and Arcus provides signed request construction. Lighter Mainnet and Robinhood use separate credential profiles; select the network per client (Mainnet is the default); see .env.example and the Lighter examples. Ondo spot currently supports only public market data (depth, trades, symbol_info, history and WS spot channels); Ondo has not published its spot trading API, so private operations such as placing or cancelling orders with a -SPOT symbol fail locally without sending a request.

Endpoint coverage, limitations and verification.

Python quick start

Synchronous HTTP:

import dcex

client = dcex.binance()
print(client.get_klines(product_symbol="BTC-USDT-SWAP", interval="1m"))

Asynchronous HTTP:

import asyncio
import dcex.async_support as dcex

async def main():
    client = await dcex.binance()
    try:
        print(await client.get_klines(product_symbol="BTC-USDT-SWAP", interval="1m"))
    finally:
        await client.close()

asyncio.run(main())

Additional profiles cover Binance Alpha, Aster Prediction and Kraken Spot V1. Bitget SBE returns raw binary frames for caller-side decoding.

Public WebSocket:

import asyncio
from dcex.ws import binance

async def main():
    async with binance.public() as ws:
        await ws.subscribe_agg_trades("BTC-USDT-SPOT")
        print(await ws.recv())

asyncio.run(main())

Product Table Manager

PTM maps normalized product_symbol values, such as BTC-USDT-SWAP, to exchange-native exchange_symbol values and exposes trading metadata. Clients use this mapping where applicable.

Product product_symbol Example
Spot BASE-QUOTE-SPOT BTC-USDT-SPOT
Perpetual BASE-QUOTE-SWAP BTC-USDT-SWAP
Dated futures BASE-QUOTE-YYMMDD-FUTURES (UTC delivery date) BTC-USD-261225-FUTURES
Fields Meaning
exchange, product_symbol, exchange_symbol Exchange and normalized/native symbols
product_type, exchange_type Normalized and exchange-specific market types
base_currency, quote_currency Product currencies
price_precision, size_precision Price and size increments
min_size, min_notional Minimum size and notional
size_per_contract Contract multiplier

Binance and BingX coin-margined contracts sit in their own exchange namespaces, binance_coinm and bingx_coinm (for example BTC-USD-SWAP), so they never collide with USDT-margined products; their coin-margined methods resolve symbols there.

from dcex.product_table.manager import ProductTableManager

table = ProductTableManager.get_instance("binance")
print(table.get_exchange_symbol("binance", "BTC-USDT-SWAP"))
print(table.get_product_symbol("binance", "BTCUSDT", product_type="swap"))
print(table.rows()[0])

Hyperliquid loads its first perp DEX, spot and every builder-deployed (HIP-3) perp DEX by default. Pass perp_dexs to load only the builder DEXs you trade; names come from get_perp_dexs, unknown names are rejected, and asset ids stay the same as with the full table:

from dcex.hyperliquid import Client

client = Client(perp_dexs=["xyz"])
table = ProductTableManager.get_instance("hyperliquid", perp_dexs=["xyz"])

Lighter nonces

Every Lighter transaction method accepts nonce. Without it, dcex asks the exchange for the next nonce, which costs one request per transaction. Trading systems usually keep the nonce themselves:

  • Read the starting value once per API key with get_next_nonce(api_key_index=...).
  • Increment it locally and pass nonce= with each transaction, holding a lock if several tasks share the key.
  • After a failed transaction or a nonce error, read get_next_nonce again; a rejected transaction may not consume its nonce.
  • Give each process its own api_key_index so their nonces never collide.

More examples and development

Runnable examples are in Python sync, Python async and WebSocket, and Rust. They focus on public data or read-only account queries. Private HTTP examples require credentials; private stream examples require credentials or a user address.

uv run python examples/sync/binance_public.py
uv run python examples/async/binance_ws_public.py
cargo run -p dcex --example binance_ws_public

For direct Rust usage, see the crate README. The default test suite runs offline with uv run pytest; live suites are opt-in. See the contributing guide for development and testing details.

This project uses the MIT License; see the third-party notices for additional licenses.

Metadata

Release files for dcex 0.42.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dcex 0.42.1
File Size Uploaded Provenance Actions
dcex-0.42.1.tar.gz 1.7 MB Without provenance Details for dcex-0.42.1.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for dcex 0.42.1
File Interpreter ABI Platform Actions
dcex-0.42.1-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details for dcex-0.42.1-cp312-cp312-win_amd64.whl
dcex-0.42.1-cp312-cp312-manylinux_2_34_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.34+ x86-64 Details for dcex-0.42.1-cp312-cp312-manylinux_2_34_x86_64.whl
dcex-0.42.1-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details for dcex-0.42.1-cp312-cp312-macosx_11_0_arm64.whl

Total release size: 45.4 MB

Release files / dcex-0.42.1.tar.gz

Download URL dcex-0.42.1.tar.gz
Size 1.7 MB
Tags Source
SHA-256 checksum
How to use checksums
43d48d5f865ac9dc7c143922a18ede58538f66b8dce72cb1ab635556a73be313
BLAKE2b-256 checksum
How to use checksums
25800e0ac05cdc071f72c7c3107990cf469d0074e870627fcff1fcc61c8f1f79
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / dcex-0.42.1-cp312-cp312-win_amd64.whl

Download URL dcex-0.42.1-cp312-cp312-win_amd64.whl
Size 15.0 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
0a6656d2e4ae0d452e90c3dd49d94c458e5f8f32b28aa5f4d34272e3ca26f91d
BLAKE2b-256 checksum
How to use checksums
e6947d73c7f6b98ec9a0d68238a96284767606093a5b5ac31dcc8fd0d3ac5c70
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / dcex-0.42.1-cp312-cp312-manylinux_2_34_x86_64.whl

Download URL dcex-0.42.1-cp312-cp312-manylinux_2_34_x86_64.whl
Size 14.7 MB
Tags CPython 3.12 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
613ec14c411a58f5767c3978c14d235dcfc5425c264f6947808953400005e3cb
BLAKE2b-256 checksum
How to use checksums
50822927bcd468018761c41c0dd9446d3c15f88dff6dfc11f9d0cdb68d60b821
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / dcex-0.42.1-cp312-cp312-macosx_11_0_arm64.whl

Download URL dcex-0.42.1-cp312-cp312-macosx_11_0_arm64.whl
Size 14.0 MB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
ea109d50e2a339acba4423096ee9ce4e4f31ec05a188340a706c6934aa04f65b
BLAKE2b-256 checksum
How to use checksums
d8076169cf129cc23ae1249ac65f91d7da8a87c7ac2ac6f88b200ec7ec282c8b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for dcex 0.42.1

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.42.1 This release

4 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page