polyedge 1.2.0

Official Rust SDK for PolyEdge ultra-low latency Polymarket mempool trade streaming and real-time on-chain analytics API.
Documentation

PolyEdge Rust SDK

Crates.io Docs.rs License: MIT Documentation Benchmark

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.


Key Features

  • 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-ID Resumption: 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.

Installation

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-util

Quick Start

1. Initialize Client & Query Analytics

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);

    // 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(())
}

2. Real-Time Mempool SSE Trade Stream

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(())
}

Complete API Service Reference (28 Methods)

1. Streams Service (client.streams())

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

2. Analytics Service (client.analytics())

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)

3. Account Service (client.account())

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

4. Subscription Service (client.subscription())

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

License

MIT © 2026 PolyEdge Labs