- Added new documentation URLs from llms.txt index - Updated TARGET.md with 244 total documentation pages - Scraped new pages for trading, concepts, and API reference sections - Updated changelog and new index pages
8.8 KiB
Documentation Index
Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt Use this file to discover all available pages before exploring further.
Trading
Order entry, management, and best practices for market makers
Market makers interact with Polymarket through the CLOB API — posting two-sided quotes, managing inventory across markets, and rebalancing positions. The SDK clients handle order signing and submission, so you can focus on strategy.
This page covers MM-specific workflows and best practices. For full order mechanics, see [Create Orders](/trading/orders/create) and [Cancel Orders](/trading/orders/cancel).Two-Sided Quoting
The core market making workflow is posting a bid and ask around your fair value. Use createAndPostOrder to place each side:
const client = new ClobClient( "https://clob.polymarket.com", 137, wallet, credentials, signatureType, funder, );
// Bid at 0.48 const bid = await client.createAndPostOrder({ tokenID: "3409705850427531082723332342151729...", side: Side.BUY, price: 0.48, size: 1000, orderType: OrderType.GTC, });
// Ask at 0.52 const ask = await client.createAndPostOrder({ tokenID: "3409705850427531082723332342151729...", side: Side.SELL, price: 0.52, size: 1000, orderType: OrderType.GTC, });
```python Python theme={null}
from py_clob_client.clob_types import OrderArgs, OrderType
from py_clob_client.order_builder.constants import BUY, SELL
token_id = "3409705850427531082723332342151729..."
# Bid at 0.48
bid = client.create_and_post_order(
OrderArgs(token_id=token_id, side=BUY, price=0.48, size=1000),
order_type=OrderType.GTC,
)
# Ask at 0.52
ask = client.create_and_post_order(
OrderArgs(token_id=token_id, side=SELL, price=0.52, size=1000),
order_type=OrderType.GTC,
)
Batch Orders
For tighter spreads across multiple levels, use postOrders to submit up to 15 orders in a single request:
const response = await client.postOrders( orders.map((order) => ({ order, orderType: OrderType.GTC })), );
```python Python theme={null}
from py_clob_client.clob_types import OrderArgs, OrderType, PostOrdersArgs
from py_clob_client.order_builder.constants import BUY, SELL
response = client.post_orders([
PostOrdersArgs(
order=client.create_order(OrderArgs(
price=0.48, size=500, side=BUY, token_id=token_id,
)),
order_type=OrderType.GTC,
),
PostOrdersArgs(
order=client.create_order(OrderArgs(
price=0.47, size=500, side=BUY, token_id=token_id,
)),
order_type=OrderType.GTC,
),
PostOrdersArgs(
order=client.create_order(OrderArgs(
price=0.52, size=500, side=SELL, token_id=token_id,
)),
order_type=OrderType.GTC,
),
PostOrdersArgs(
order=client.create_order(OrderArgs(
price=0.53, size=500, side=SELL, token_id=token_id,
)),
order_type=OrderType.GTC,
),
])
Choosing Order Types
| Type | Behavior | When to Use |
|---|---|---|
| GTC | Rests on the book until filled or cancelled | Default for passive quoting |
| GTD | Auto-expires at a specified time | Expire quotes before known events |
| FOK | Must fill entirely and immediately, or cancel | Aggressive rebalancing — all or nothing |
| FAK | Fills what's available immediately, cancels rest | Rebalancing where partial fills are OK |
GTC and GTD are your primary tools for passive market making — they rest on the book at your specified price. FOK and FAK are for rebalancing inventory against resting liquidity.
Time-Limited Quotes with GTD
Auto-expire quotes before known events like market close or resolution:
```typescript TypeScript theme={null} // Expire in 1 hour const expiringOrder = await client.createOrder({ tokenID, side: Side.BUY, price: 0.5, size: 1000, orderType: OrderType.GTD, expiration: Math.floor(Date.now() / 1000) + 3600, }); ```import time
# Expire in 1 hour
expiring_order = client.create_order(
OrderArgs(
token_id=token_id,
side=BUY,
price=0.50,
size=1000,
expiration=int(time.time()) + 3600,
),
order_type=OrderType.GTD,
)
Managing Orders
Cancelling
Cancel individual orders, by market, or everything at once:
```typescript TypeScript theme={null} await client.cancelOrder(orderId); // Single order await client.cancelOrders(orderIds); // Multiple orders await client.cancelMarketOrders(conditionId); // All orders in a market await client.cancelAll(); // Everything ```client.cancel(order_id=order_id) # Single order
client.cancel_market_orders(market=condition_id) # All orders in a market
client.cancel_all() # Everything
See Cancel Orders for full details including onchain cancellation.
Monitoring Open Orders
```typescript TypeScript theme={null} const order = await client.getOrder(orderId);const orders = await client.getOpenOrders({ market: "0xbd31dc8a...", asset_id: "52114319501245...", });
```python Python theme={null}
from py_clob_client.clob_types import OpenOrderParams
order = client.get_order(order_id)
orders = client.get_orders(
OpenOrderParams(market="0xbd31dc8a...")
)
Tick Sizes
Your order price must conform to the market's tick size, or it will be rejected. Look it up with the SDK before quoting:
```typescript TypeScript theme={null} const tickSize = await client.getTickSize(tokenID); // Returns: "0.1" | "0.01" | "0.001" | "0.0001" ```tick_size = client.get_tick_size(token_id)
# Returns: "0.1" | "0.01" | "0.001" | "0.0001"
Fees
Most markets have zero fees for both makers and takers. However, the following market types have taker fees:
- 5-minute crypto markets
- 15-minute crypto markets
- Select sports markets (e.g., NCAAB, Serie A)
See Fees for the full fee schedule and calculation details.
Best Practices
Quote Management
- Quote both sides — Post bids and asks to earn maximum liquidity rewards
- Skew on inventory — Adjust quote prices based on your current position to manage exposure
- Cancel stale quotes — Pull orders immediately when market conditions change
- Use GTD for events — Auto-expire quotes before known catalysts to avoid stale exposure
Latency
- Batch orders — Use
postOrders()to submit multiple quotes in a single request - WebSocket for data — Subscribe to real-time feeds instead of polling REST endpoints
Risk Controls
- Size limits — Check token balances before quoting and don't exceed your available inventory
- Price guards — Validate prices against the book midpoint and reject outliers
- Kill switch — Call
cancelAll()immediately on errors or position breaches - Monitor fills — Subscribe to the WebSocket user channel for real-time fill notifications