Official Rust SDK for PolyEdge — Ultra-Low-Latency Polymarket Mempool Trade Streaming & Real-Time On-Chain Analytics API.
Engineered for Polymarket copy-trading bots, professional traders, and prediction market builders. Capture pending trades pre-block and track smart money with institutional-grade on-chain analytics.
- 4 First-Class Namespaces: Aligned with OpenAPI 3.1:
client.streams(): Real-time SSE trade streaming, sessions & filter management.client.analytics(): Polymarket trade attribution, trader leaderboards, market settlement audit.client.account(): User profile, API keys, request telemetry, and ledger.client.subscription(): Pricing tier catalog, upgrade quotes, and promo codes.
- Async Streaming with Tokio & Reqwest:
- 45s Keep-Alive Watchdog: Native read-timeout detection automatically cleans up dead socket half-open connections.
- Atomic
Last-Event-IDResumption: Seamlessly captures buffered trades on reconnection. - Fail-Fast for Fatal Errors: Immediate non-retry bailout on HTTP 401/403/404.
- Standard Futures Stream: Implements
futures_util::Stream<Item = Result<LiveTransaction, StreamError>>.
- Pre-Block Polymarket Trade Streaming: Peered with 100+ Polygon nodes to capture pending Polymarket trades pre-block. The World's Fastest — verify yourself.
Add to Cargo.toml:
[dependencies]
polyedge = "1.2.0"
tokio = { version = "1", features = ["full"] }
futures-util = "0.3"Or via cargo add:
cargo add polyedge tokio --features full futures-utiluse polyedge::PolyEdgeClient;
use std::env;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let api_key = env::var("POLYEDGE_API_KEY").expect("POLYEDGE_API_KEY is required");
let client = PolyEdgeClient::new(&api_key);
// 1. Query Top Traders Leaderboard
let leaderboard = client.analytics().get_leaderboard(Some(5), None).await?;
println!("Total active traders: {:?}", leaderboard.total_count);
if let Some(traders) = leaderboard.traders {
for (i, t) in traders.iter().enumerate() {
let addr = t.profile.as_ref().and_then(|p| p.address.as_deref()).unwrap_or("0x...");
let name = t.profile.as_ref().and_then(|p| p.name.as_deref()).unwrap_or("Anon");
let pnl_usd = (t.total_pnl.unwrap_or(0) as f64) / 1e6;
println!("#{i} {addr} ({name}) - PnL: ${pnl_usd:.2}");
}
}
Ok(())
}use futures_util::StreamExt;
use polyedge::PolyEdgeClient;
use std::env;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let api_key = env::var("POLYEDGE_API_KEY").expect("POLYEDGE_API_KEY is required");
let client = PolyEdgeClient::new(&api_key);
// Connect to active stream
let stream = client.streams().connect("your_stream_id");
let mut stream_iter = Box::pin(stream.subscribe());
println!("Listening for real-time Polymarket mempool trades...");
while let Some(item) = stream_iter.next().await {
match item {
Ok(tx) => {
let tx_hash = tx.tx_hash.as_deref().unwrap_or("");
let short_hash = if tx_hash.len() > 18 { &tx_hash[..18] } else { tx_hash };
let question = tx.market.as_ref().and_then(|m| m.question.as_deref()).unwrap_or("");
let taker = tx.taker.as_ref();
let outcome = taker.and_then(|t| t.outcome.as_deref()).unwrap_or("");
let side = taker.and_then(|t| t.side.as_ref());
let shares = taker.and_then(|t| t.shares.as_deref()).unwrap_or("0");
let makers_count = tx.makers.as_ref().map(|m| m.len()).unwrap_or(0);
println!("⚡ [Live Trade] Tx: {short_hash}...");
println!(" Market: \"{question}\"");
println!(" Taker: {outcome} ({side:?}) | Shares: {shares}");
println!(" Matched Makers: {makers_count} orders");
}
Err(e) => {
eprintln!("Stream notice/reconnect: {e:?}");
}
}
}
Ok(())
}| Method | HTTP | Description |
|---|---|---|
connect(stream_id) |
GET /streams/{id} (SSE) |
Connect to ultra-low-latency real-time SSE mempool trade stream |
list().await |
GET /streams |
List all configured data streams |
create(&req).await |
POST /streams |
Provision a new targeted filter stream (tags, addresses, series) |
get(id).await |
GET /streams/{id} |
Get stream metadata and configuration by ID |
update_metadata(id, &req).await |
PUT /streams/{id}/meta |
Update stream name and description |
update_subscription(id, &req).await |
PUT /streams/{id}/subscription |
Hot-reload market filters (addresses, tags, series) on active stream |
delete(id).await |
DELETE /streams/{id} |
Delete stream by ID |
get_active_sessions().await |
GET /sessions |
List all active live SSE connections across streams |
disconnect_session(&conn_id).await |
DELETE /sessions/{id} |
Disconnect one of your active SSE connections by conn_id |
get_session_history(limit, offset).await |
GET /sessions/history |
Query historical SSE connection logs and durations |
| Method | HTTP | Description |
|---|---|---|
get_leaderboard(limit, offset).await |
GET /v2/analytics/leaderboard |
Top profitable traders ranked by realized PnL, volume, and ROI |
get_trader(address).await |
GET /v2/traders/{address} |
Comprehensive trader intelligence profile, taker tier, and top tags |
get_trader_hourly_stats(address).await |
GET /v2/traders/{address}/hourly_stats |
24-hour hourly trading PnL and volume breakdown |
get_trader_markets(addr, limit, offset).await |
GET /v2/traders/{address}/markets |
Historical market positions and settled outcomes by trader |
get_trader_market_orders(addr, id, ...).await |
GET /v2/traders/{address}/markets/{id}/orders |
Order fill details for a specific trader in a specific market |
get_market(id).await |
GET /v2/markets/{id} |
Prediction market detail, top 20 earners, and volume attribution |
get_deposits(limit, offset).await |
GET /v2/analytics/deposits |
60-day aggregated trader deposit summaries (>= 100 pUSD) |
| Method | HTTP | Description |
|---|---|---|
get_profile().await |
GET /v2/user/me |
Current user profile, active tier, and deposit balance |
list_keys().await |
GET /v2/user/keys |
List all active API keys and statuses |
create_key(&req).await |
POST /v2/user/keys |
Generate a new API key with custom name |
update_key(key, &req).await |
PATCH /v2/user/keys/{key} |
Enable, disable, or rename an API key |
delete_key(key).await |
DELETE /v2/user/keys/{key} |
Revoke and delete an API key |
get_ledger(limit, offset).await |
GET /v2/user/ledger |
Balance ledger transaction records |
get_telemetry().await |
GET /v2/user/telemetry |
Daily request count and per-endpoint usage telemetry |
| Method | HTTP | Description |
|---|---|---|
list_tiers().await |
GET /v2/tiers |
Public tier catalog, feature allowances, and pricing specifications |
get_quote(&req).await |
POST /v2/user/subscribe/quote |
Calculate quote for plan upgrade or billing cycle change |
subscribe(&req).await |
POST /v2/user/subscribe |
Purchase or upgrade tier subscription |
validate_promo_code(&req).await |
POST /v2/user/promo-codes/validate |
Validate promotional discount code |
MIT © 2026 PolyEdge Labs