A fully typed, validated async client for the MEXC API.
Project description
Typed MEXC
A fully typed, validated async client for the MEXC API
Use autocomplete instead of documentation.
from mexc import MEXC
async with MEXC.new() as client:
account = await client.spot.account()
for balance in account['balances']:
if float(balance['free']) > 0:
print(f"{balance['asset']}: {balance['free']}")
Why Typed MEXC?
- 🎯 Precise Types: Literal types, not strings. Your IDE knows exactly what's valid.
- ✅ Automatic Validation: Pydantic-powered response validation catches API changes instantly.
- ⚡ Async First: Built on
httpxfor high-performance async operations. - 🔒 Type Safety: Full type hints throughout. Catch errors before runtime.
- 🎨 Beautiful DX: No unnecessary imports, sensible defaults, optional complexity.
- 📦 Batteries Included: Pagination helpers, WebSocket streams for real-time data.
Installation
pip install typed-mexc
Quick Start
1. Set up API credentials
export MEXC_ACCESS_KEY="your_access_key"
export MEXC_SECRET_KEY="your_secret_key"
2. Start trading
from mexc import MEXC
async with MEXC.new() as client:
# Get spot account info
account = await client.spot.account()
# Get futures positions
positions = await client.futures.positions()
# Get funding rate
rate = await client.futures.funding_rate(symbol='BTC_USDT')
Features
No Unnecessary Imports
Notice something? You never imported Literal types. Just use strings:
# ❌ Other libraries
from some_sdk import Interval
candles = await client.get_candles(symbol='BTCUSDT', interval=Interval.M1)
# ✅ Typed MEXC
candles = await client.spot.candles(
'BTCUSDT', interval='1m' # Your IDE autocompletes this!
)
Precise Type Annotations
Every field is precisely typed. Prices are strings (for precision), timestamps are datetime where applicable:
from datetime import datetime
account = await client.spot.account()
for balance in account['balances']:
asset: str = balance['asset']
free: str = balance['free'] # String for decimal precision
Automatic Validation
Response validation is on by default but can be disabled:
# Validated (default) - throws ValidationError if API response changes
account = await client.spot.account()
# Skip validation for maximum performance
account = await client.spot.account(validate=False)
Built-in Pagination
# Manual pagination
candles = await client.spot.candles(
'BTCUSDT', interval='1m', limit=500
)
# Automatic pagination - yields chunks as they arrive
async for chunk in client.spot.candles_paged(
'BTCUSDT', interval='1m', start=start, end=end
):
for candle in chunk:
print(f"Candle: {candle['open']} -> {candle['close']}")
WebSocket Streams
Real-time market and user data via WebSockets:
async with MEXC.new() as client:
# Spot: subscribe to candles (public stream)
async for candle in client.spot.streams.candles('BTCUSDT', interval='Min1'):
print(candle)
# Futures: subscribe to tickers
async for tickers in client.futures.streams.tickers():
print(tickers)
API Coverage
This library covers Spot and Futures with market data, trading, user data, and WebSocket streams.
- Spot: Account, candles, depth, trades, orders (place/cancel), wallet (deposits, withdrawals)
- Futures: Positions, assets, funding rates, contracts, candles, depth, user streams
📋 See API Overview for complete coverage details.
Documentation
- Quickstart Guide - Get up and running in 5 minutes
- Authentication - API credentials setup
- API Overview - Available endpoints and modules
- Examples - Common use cases and patterns
- Design Philosophy - Why we built it this way
Design Philosophy
Typed MEXC follows the principles outlined in this blog post:
- Inputs shouldn't require custom imports - Use string literals, not enums
- Annotate types precisely -
TypedDict, strings for prices,Literalfor enums - Avoid unnecessary complication - Sensible defaults, optional complexity
- Provide extra behavior optionally - Pagination and validation are opt-in
Details matter. Developer experience matters.
Examples
Portfolio Tracking
async with MEXC.new() as client:
account = await client.spot.account()
total_held = sum(
float(b['free']) + float(b['locked'])
for b in account['balances']
if float(b['free']) > 0 or float(b['locked']) > 0
)
print(f"Spot Balance: {total_held}")
Trading Bot
async with MEXC.new() as client:
# Get open orders
orders = await client.spot.open_orders(symbol='BTCUSDT')
# Place limit order
result = await client.spot.place_order(
'BTCUSDT',
{'side': 'BUY', 'type': 'LIMIT', 'price': '50000', 'quantity': '0.001'}
)
Funding Rate Monitor
async with MEXC.new() as client:
rate = await client.futures.funding_rate(symbol='BTC_USDT')
print(f"Funding rate: {rate['fundingRate']}")
Error Handling
from mexc import MEXC
from mexc.core import ApiError, ValidationError, NetworkError
async with MEXC.new() as client:
try:
account = await client.spot.account()
except ValidationError:
# API response doesn't match expected schema
pass
except ApiError as e:
# MEXC API returned an error
print(f"API Error: {e}")
except NetworkError:
# Network/connection issue
pass
Contributing
This is a work in progress! Contributions are welcome. The codebase is designed to be:
- Consistent: All endpoints follow the same patterns
- Type-safe: Everything is fully typed
- Validated: Pydantic models for all responses
Inspired by this blog post on building better API clients.
Built with ❤️ by Tribulnation
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file typed_mexc-0.1.2.tar.gz.
File metadata
- Download URL: typed_mexc-0.1.2.tar.gz
- Upload date:
- Size: 43.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
05734e76d108c167c5eff5761c5b916d273dc63794645540b58e9b5e0e436b4c
|
|
| MD5 |
f2e704e8eef36b267e5f7d8e131318cf
|
|
| BLAKE2b-256 |
30a5fcd670bd83b9659198f61c31b64e624106c02f0b08409799042ef68d72e5
|
File details
Details for the file typed_mexc-0.1.2-py3-none-any.whl.
File metadata
- Download URL: typed_mexc-0.1.2-py3-none-any.whl
- Upload date:
- Size: 92.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4517c8a61b024f6887aafeed3a1d410db1975d669af2b73dabb4d10b681860d3
|
|
| MD5 |
0e797b37b37f9af4a75d0bd678bc4233
|
|
| BLAKE2b-256 |
8d871e83b35db6a12c027becb5c5a956d350f572359065c0aa5b369837bfc75b
|