Skip to main content
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 and Cancel Orders.

Two-Sided Quoting

The core market making workflow is posting a bid and ask around your fair value. Use createAndPostOrder to place each side:
import { ClobClient, Side, OrderType } from "@polymarket/clob-client";

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,
});

Batch Orders

For tighter spreads across multiple levels, use postOrders to submit up to 15 orders in a single request:
const orders = await Promise.all([
  client.createOrder({ tokenID, side: Side.BUY, price: 0.48, size: 500 }),
  client.createOrder({ tokenID, side: Side.BUY, price: 0.47, size: 500 }),
  client.createOrder({ tokenID, side: Side.SELL, price: 0.52, size: 500 }),
  client.createOrder({ tokenID, side: Side.SELL, price: 0.53, size: 500 }),
]);

const response = await client.postOrders(
  orders.map((order) => ({ order, orderType: OrderType.GTC })),
);
Batching reduces latency by submitting multiple quotes in a single request. Always prefer postOrders() over multiple individual createAndPostOrder() calls.

Choosing Order Types

TypeBehaviorWhen to Use
GTCRests on the book until filled or cancelledDefault for passive quoting
GTDAuto-expires at a specified timeExpire quotes before known events
FOKMust fill entirely and immediately, or cancelAggressive rebalancing — all or nothing
FAKFills what’s available immediately, cancels restRebalancing 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:
// 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,
});

Managing Orders

Cancelling

Cancel individual orders, by market, or everything at once:
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
See Cancel Orders for full details including onchain cancellation.

Monitoring Open Orders

const order = await client.getOrder(orderId);

const orders = await client.getOpenOrders({
  market: "0xbd31dc8a...",
  asset_id: "52114319501245...",
});

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:
const tickSize = await client.getTickSize(tokenID);
// 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:
  • All crypto markets (starting March 6, 2026)
  • Select sports markets (e.g., NCAAB, Serie A)
Fees apply only to markets deployed on or after the activation date. Pre-existing markets are unaffected. Markets with fees enabled have feesEnabled set to true on the market object.
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

Next Steps