Built for
performance
Multiple ways to access your data. Choose what fits your workflow — from real-time streams to direct SQL queries.
Get StartedServer-Sent Events
Subscribe to real-time updates via SSE. Prices, trades, orderbook changes, and market resolutions — streamed the instant they happen. No polling, no WebSocket complexity.
- Sub-10ms latency from source to your application
- Filter by platform, market, or event type
- Automatic reconnection with event replay
GET /api/v1/stream?platforms=polymarket,kalshi Simple, powerful API
RESTful endpoints for markets, trades, orderbooks, and historical data. Consistent response format across all platforms. Paginated, filterable, and fast.
- Unified schema — same format across all platforms
- Filter by platform, category, date range, and more
- 3,000 requests per 10 seconds rate limit
{
"data": [
{
"id": "poly_0x1234...",
"platform": "polymarket",
"title": "BTC above $100k?",
"status": "active",
"outcomes": ["Yes", "No"],
"close_date": "2026-12-31"
}
],
"meta": { "total": 12847, "page": 1 }
}Most granular orderbook data
200-500M orderbook updates per day at 1-millisecond resolution. 100x more granular than any competitor. Download as Parquet or query via SQL.
- 200-500M updates/day — 100x more than competitors
- 1ms LOCF interpolation — no gaps in your data
- Polymarket coverage live, more platforms coming soon
Direct S3 access
For large-scale analysis and ML pipelines, access complete historical datasets directly from S3. Parquet files partitioned by date and platform for efficient queries.
- Parquet format — works with Spark, DuckDB, Pandas
- Weekly fills and monthly market exports
- Direct S3 bucket access for automation
Query with SQL
Connect directly to our ClickHouse cluster from your browser or any SQL client. Run complex analytical queries on billions of rows in milliseconds.
- In-browser SQL console — no setup required
- Connect via HTTPS or native ClickHouse protocol
- Sub-second queries across all historical data
SELECT market_id, platform, AVG(price) as avg_price, COUNT(*) as trade_count FROM fills WHERE timestamp > now() - INTERVAL 1 HOUR GROUP BY market_id, platform ORDER BY trade_count DESC LIMIT 10