add skills
This commit is contained in:
+216
@@ -0,0 +1,216 @@
|
||||
# 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` | 1–500 (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
|
||||
Reference in New Issue
Block a user