polyoxide-data
Rust client library for the Polymarket Data API.
Read-only access to Polymarket user positions, trades, activity, holders, open interest, live volume, leaderboards, and builder analytics. No authentication required.
More information about this crate can be found in the crate documentation.
Features
- Read-Only, No Auth: All endpoints are public -- no API keys or signing needed
- Fluent Builder Pattern: Chainable query parameters with
.send().await? - Type-Safe Responses: Strongly-typed structs with serde deserialization
- Built-In Rate Limiting: Automatic rate limiting and concurrency control (default: 4 concurrent requests)
Installation
[]
= "0.12"
Or use the unified client:
[]
= "0.12"
Usage
Create a Client
use DataApi;
// Default configuration
let data = new?;
// Or customize via the builder
let data = builder
.timeout_ms
.pool_size
.max_concurrent
.build?;
User Positions
use PositionSortBy;
let positions = data.user
.list_positions
.limit
.sort_by
.send
.await?;
for pos in positions
User Position Value
let values = data.user
.positions_value
.send
.await?;
for v in values
Closed Positions
let closed = data.user
.closed_positions
.limit
.send
.await?;
for pos in closed
User Trades
use TradeSide;
let trades = data.user
.trades
.side
.limit
.send
.await?;
for trade in trades
User Activity
use ActivityType;
let activity = data.user
.activity
.activity_type
.limit
.send
.await?;
for a in activity
Markets Traded Count
let traded = data.user.traded.await?;
println!;
Global Trades
let trades = data.trades
.list
.limit
.send
.await?;
for trade in trades
Top Holders
let holders = data.holders
.list
.limit
.min_balance
.send
.await?;
for market in holders
Open Interest
let oi = data.open_interest
.get
.market
.send
.await?;
for entry in oi
Live Volume
let volumes = data.live_volume.get.await?;
for vol in volumes
Trader Leaderboard
use ;
use TimePeriod;
let rankings = data.leaderboard
.get
.category
.time_period
.order_by
.limit
.send
.await?;
for trader in rankings
Builder Leaderboard
use TimePeriod;
let rankings = data.builders
.leaderboard
.time_period
.limit
.send
.await?;
for b in rankings
Builder Volume Time Series
use TimePeriod;
let volumes = data.builders
.volume
.time_period
.send
.await?;
for entry in volumes
Health Check
let health = data.health.check.await?;
println!;
let latency = data.health.ping.await?;
println!;
API Namespaces
| Namespace | Access | Description |
|---|---|---|
data.user(addr) |
.list_positions(), .positions_value(), .closed_positions(), .trades(), .activity(), .traded() |
Per-user positions, trades, and activity |
data.trades() |
.list() |
Global trade history with filtering |
data.holders() |
.list(markets) |
Top token holders per market |
data.open_interest() |
.get() |
Market open interest |
data.live_volume() |
.get(event_id) |
Real-time event volume |
data.leaderboard() |
.get() |
Trader rankings by PnL or volume |
data.builders() |
.leaderboard(), .volume() |
Builder analytics and rankings |
data.health() |
.check(), .ping() |
API health and latency |
License
Licensed under either of MIT or Apache-2.0 at your option.