Files

217 lines
5.9 KiB
Markdown
Raw Permalink Normal View History

2026-02-19 21:29:35 +05:30
# Market Data
Four sources for market data: **Gamma API** (events, markets, search), **Data API** (trades, positions, user data), **CLOB** (orderbook, prices), and **Subgraph** (onchain queries).
## Gamma API
Base URL: `https://gamma-api.polymarket.com` — no auth required.
### Events Endpoint
```bash
# All active events
GET https://gamma-api.polymarket.com/events?active=true&closed=false&limit=100
# By slug (from polymarket.com/event/{slug})
GET https://gamma-api.polymarket.com/events?slug=fed-decision-in-october
# By tag
GET https://gamma-api.polymarket.com/events?tag_id=100381&limit=10&active=true&closed=false
# By series (sports)
GET https://gamma-api.polymarket.com/events?series_id=10345&active=true&closed=false
# Sorted by volume
GET https://gamma-api.polymarket.com/events?active=true&closed=false&order=volume_24hr&ascending=false&limit=100
```
### Markets Endpoint
```bash
# By slug
GET https://gamma-api.polymarket.com/markets?slug=fed-decision-in-october
```
### Sort Parameters
| Parameter | Values |
|-----------|--------|
| `order` | `volume_24hr`, `volume`, `liquidity`, `start_date`, `end_date`, `competitive`, `closed_time` |
| `ascending` | `true` / `false` (default: `false`) |
| `active` | `true` / `false` |
| `closed` | `true` / `false` |
| `limit` | 1500 (default: 20) |
| `offset` | Pagination offset |
### Pagination
```bash
# Page 1
GET https://gamma-api.polymarket.com/events?active=true&closed=false&limit=50&offset=0
# Page 2
GET https://gamma-api.polymarket.com/events?active=true&closed=false&limit=50&offset=50
```
Response includes `has_more: true/false`. Increment offset by limit until `has_more` is `false`.
### Tags & Sports
```bash
# Discover tags
GET https://gamma-api.polymarket.com/tags
# Sports metadata
GET https://gamma-api.polymarket.com/sports
```
## Data API
Base URL: `https://data-api.polymarket.com` — no auth required. Used for trades, positions, and user-specific data.
## CLOB Orderbook
Base URL: `https://clob.polymarket.com` — no auth for read endpoints.
### Get Orderbook
```typescript
// TypeScript
const client = new ClobClient("https://clob.polymarket.com", 137);
const book = await client.getOrderBook("TOKEN_ID");
// { bids: [{price, size}...], asks: [{price, size}...], tick_size, min_order_size, neg_risk }
```
```python
# Python
client = ClobClient("https://clob.polymarket.com", chain_id=137)
book = client.get_order_book("TOKEN_ID")
```
```bash
# REST
curl "https://clob.polymarket.com/book?token_id=TOKEN_ID"
```
### Prices
```typescript
const buyPrice = await client.getPrice("TOKEN_ID", "BUY"); // best ask
const sellPrice = await client.getPrice("TOKEN_ID", "SELL"); // best bid
```
```bash
curl "https://clob.polymarket.com/price?token_id=TOKEN_ID&side=BUY"
```
### Midpoint
```typescript
const mid = await client.getMidpoint("TOKEN_ID"); // { mid: "0.50" }
```
If bid-ask spread > $0.10, Polymarket UI shows last traded price instead of midpoint.
### Spread
```typescript
const spread = await client.getSpread("TOKEN_ID"); // { spread: "0.04" }
```
### Last Trade Price
```typescript
const last = await client.getLastTradePrice("TOKEN_ID"); // { price, side }
```
### Price History
```typescript
const history = await client.getPricesHistory({
market: "TOKEN_ID",
interval: PriceHistoryInterval.ONE_DAY,
fidelity: 60, // data points every 60 minutes
});
// Each entry: { t: timestamp, p: price }
```
| Interval | Description |
|----------|-------------|
| `1h` | Last hour |
| `6h` | Last 6 hours |
| `1d` | Last day |
| `1w` | Last week |
| `1m` | Last month |
| `max` | All available |
Use `startTs`/`endTs` for absolute ranges (mutually exclusive with `interval`).
### Estimate Fill Price
Walk the orderbook to estimate slippage for a given order size:
```typescript
const price = await client.calculateMarketPrice(
"TOKEN_ID", Side.BUY, 500, OrderType.FOK
);
```
### Batch Requests
All orderbook queries have batch variants (up to 500 tokens):
| Single | Batch | REST |
|--------|-------|------|
| `getOrderBook()` | `getOrderBooks()` | `POST /books` |
| `getPrice()` | `getPrices()` | `POST /prices` |
| `getMidpoint()` | `getMidpoints()` | `POST /midpoints` |
| `getSpread()` | `getSpreads()` | `POST /spreads` |
| `getLastTradePrice()` | `getLastTradesPrices()` | — |
```typescript
const prices = await client.getPrices([
{ token_id: "TOKEN_A", side: Side.BUY },
{ token_id: "TOKEN_B", side: Side.BUY },
]);
```
## Key Market Fields
| Field | Description |
|-------|-------------|
| `tokenID` / `asset_id` | ERC1155 token ID for an outcome |
| `conditionID` / `market` | Condition ID — identifies the market |
| `questionID` | Hash of UMA ancillary data |
| `neg_risk` | `true` for multi-outcome events |
| `minimum_tick_size` | Minimum price increment |
| `enableOrderBook` | Whether orderbook is active |
| `slug` | URL-friendly identifier |
| `tokens` | Array of `{ token_id, outcome }` for both outcomes |
## Subgraph (Onchain Data)
GraphQL queries via Goldsky-hosted subgraphs:
| Subgraph | Description |
|----------|-------------|
| Positions | User token balances |
| Orders | Order book and trade events |
| Activity | Splits, merges, redemptions |
| Open Interest | Market and global OI |
| PNL | User position P&L |
```bash
curl -X POST \
https://api.goldsky.com/api/public/project_cl6mb8i9h0003e201j6li0diw/subgraphs/orderbook-subgraph/0.0.1/gn \
-H "Content-Type: application/json" \
-d '{"query": "query { orderbooks { id tradesQuantity } }"}'
```
## Fetching Strategy
1. **Specific market**: fetch by slug — `GET https://gamma-api.polymarket.com/events?slug=...`
2. **Category browsing**: filter by tag — `GET https://gamma-api.polymarket.com/events?tag_id=...`
3. **All active markets**: paginate events — `GET https://gamma-api.polymarket.com/events?active=true&closed=false`
4. **Always include** `active=true&closed=false` unless you need historical data
5. **Events > Markets**: events contain their markets, reducing API calls