followsm-sdk
Official Python SDK for the FollowSM smart-money & orderbook toxicity API.
Install
pip install followsm-sdk
Quickstart
from followsm_sdk import FollowSMClient
client = FollowSMClient(api_key="fsm_live_...") # or omit to use the free tier
snapshot = client.get_toxicity_snapshot("BTCUSDT")
print(snapshot.vpin, snapshot.is_toxic_alert)
SymbolToxicityMetrics response
get_toxicity_snapshot() and get_toxic_pairs() both return SymbolToxicityMetrics (pydantic models), matching the raw JSON the backend returns:
{
"symbol": "BTCUSDT",
"timestamp": 1758412800.0,
"price": 62150.5,
"vpin": 0.72,
"ob_toxicity_1pct": 2.35,
"ob_imbalance_l1": 0.61,
"depth_bands": {
"0.5%": { "bid_notional": 184320.0, "ask_notional": 96410.0, "imbalance_ratio": 0.657 },
"1.0%": { "bid_notional": 312500.0, "ask_notional": 210800.0, "imbalance_ratio": 0.597 },
"2.0%": { "bid_notional": 590100.0, "ask_notional": 470200.0, "imbalance_ratio": 0.556 }
},
"volume_z_score": 3.1,
"natr_15m": 0.84,
"taker_buy_ratio": 0.58,
"is_toxic_alert": true
}
| Field | Type | Description |
|---|---|---|
symbol |
str |
Trading pair, e.g. "BTCUSDT" |
timestamp |
float |
Unix epoch seconds when the snapshot was computed |
price |
float |
Last traded price |
vpin |
float |
Volume-Synchronized Probability of Informed Trading, [0.0, 1.0] |
ob_toxicity_1pct |
float |
Ask/bid notional ratio within ±1% of mid price |
ob_imbalance_l1 |
float |
Best bid/ask (L1) imbalance |
depth_bands |
dict[str, OrderBookDepthBand] |
Keyed by band width ("0.5%", "1.0%", "2.0%"), each with bid_notional, ask_notional, imbalance_ratio |
volume_z_score |
float |
Robust Z-score of recent traded volume |
natr_15m |
float |
Normalized ATR over 15-minute candles |
taker_buy_ratio |
float |
Share of taker volume that was buy-side |
is_toxic_alert |
bool |
True when vpin > 0.70 or ob_toxicity_1pct > 2.0 |
Free vs Developer API
| Free / Unauthenticated | DEVELOPER_API ($199/mo) | |
|---|---|---|
| Requests/min | 30 | 300 |
| WebSocket connections | 1 | Multiple |
| Binance pairs | Limited | 50+ |
| Latency | Standard | Sub-10ms in-memory snapshots |
On HTTP 429, the SDK raises RateLimitExceededException with an upgrade prompt pointing to https://follow-sm.com/pricing.
Live streaming
import asyncio
from followsm_sdk import FollowSMClient
async def main() -> None:
client = FollowSMClient(api_key="fsm_live_...")
async for snapshot in client.stream_toxicity():
print(snapshot.symbol, snapshot.vpin, snapshot.is_toxic_alert)
asyncio.run(main())
Release files for followsm-sdk 1.0.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 | |
|---|---|---|---|
| followsm_sdk-1.0.0.tar.gz | 3.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| followsm_sdk-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 8.5 kB
Release files / followsm_sdk-1.0.0.tar.gz
| Download URL | followsm_sdk-1.0.0.tar.gz |
|---|---|
| Size | 3.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3312f1bed2054aa374ce75b6236bc65550bf7a239f119b49b5f746ef7652a740
|
|
BLAKE2b-256 checksum How to use checksums |
b151b5d894d1891c9bc9667e18c2a147756393aa6730e052292423c6de548cf7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / followsm_sdk-1.0.0-py3-none-any.whl
| Download URL | followsm_sdk-1.0.0-py3-none-any.whl |
|---|---|
| Size | 4.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
092d884cd233643fbf67c3594c391445354729e36f7e3b3f8eb364d7ffb2e7a7
|
|
BLAKE2b-256 checksum How to use checksums |
d7306e84fbd7ea2282d493ccec0a8c6e7ce92445772da06ea986855c93f0e8da
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|