Skip to main content
All cancel endpoints require L2 authentication. The response always includes canceled (list of cancelled order IDs) and not_canceled (map of order IDs to failure reasons).

Cancel a Single Order

const resp = await client.cancelOrder("0xb816482a...");
console.log(resp);
// { canceled: ["0xb816482a..."], not_canceled: {} }
resp = client.cancel(order_id="0xb816482a...")
print(resp)
# {"canceled": ["0xb816482a..."], "not_canceled": {}}
let resp = client.cancel_order("0xb816482a...").await?;
println!("{:?}", resp);
// CancelOrdersResponse { canceled: ["0xb816482a..."], not_canceled: {} }
curl -X DELETE "https://clob.polymarket.com/order" \
  -H "Content-Type: application/json" \
  -H "POLY_ADDRESS: ..." \
  -H "POLY_SIGNATURE: ..." \
  -H "POLY_TIMESTAMP: ..." \
  -H "POLY_API_KEY: ..." \
  -H "POLY_PASSPHRASE: ..." \
  -d '{"orderID": "0xb816482a..."}'

Cancel Multiple Orders

const resp = await client.cancelOrders(["0xb816482a...", "0xc927593b..."]);
resp = client.cancel_orders([
    "0xb816482a...",
    "0xc927593b...",
])
let resp = client.cancel_orders(&["0xb816482a...", "0xc927593b..."]).await?;
curl -X DELETE "https://clob.polymarket.com/orders" \
  -H "Content-Type: application/json" \
  -H "POLY_ADDRESS: ..." \
  -H "POLY_SIGNATURE: ..." \
  -H "POLY_TIMESTAMP: ..." \
  -H "POLY_API_KEY: ..." \
  -H "POLY_PASSPHRASE: ..." \
  -d '["0xb816482a...", "0xc927593b..."]'

Cancel All Orders

Cancel every open order across all markets:
const resp = await client.cancelAll();
resp = client.cancel_all()
let resp = client.cancel_all_orders().await?;
curl -X DELETE "https://clob.polymarket.com/cancel-all" \
  -H "POLY_ADDRESS: ..." \
  -H "POLY_SIGNATURE: ..." \
  -H "POLY_TIMESTAMP: ..." \
  -H "POLY_API_KEY: ..." \
  -H "POLY_PASSPHRASE: ..."

Cancel by Market

Cancel all orders for a specific market, optionally filtered to a single token. Both market and asset_id are optional — omit both to cancel all orders.
const resp = await client.cancelMarketOrders({
  market: "0xbd31dc8a...", // optional: condition ID
  asset_id: "52114319501245...", // optional: specific token
});
resp = client.cancel_market_orders(
    market="0xbd31dc8a...",
    asset_id="52114319501245...",  # optional
)
use polymarket_client_sdk_v2::clob::types::request::CancelMarketOrderRequest;

let request = CancelMarketOrderRequest::builder()
    .market("0xbd31dc8a...".parse()?)
    .asset_id("52114319501245...".parse()?)
    .build();
let resp = client.cancel_market_orders(&request).await?;
curl -X DELETE "https://clob.polymarket.com/cancel-market-orders" \
  -H "Content-Type: application/json" \
  -H "POLY_ADDRESS: ..." \
  -H "POLY_SIGNATURE: ..." \
  -H "POLY_TIMESTAMP: ..." \
  -H "POLY_API_KEY: ..." \
  -H "POLY_PASSPHRASE: ..." \
  -d '{"market": "0xbd31dc8a...", "asset_id": "52114319501245..."}'

Querying Orders

Get a Single Order

const order = await client.getOrder("0xb816482a...");
console.log(order.status, order.size_matched);
order = client.get_order("0xb816482a...")
print(order["status"], order["size_matched"])
let order = client.order("0xb816482a...").await?;
println!("{:?} {}", order.status, order.size_matched);

Get Open Orders

Retrieve all open orders, optionally filtered by market or token:
// All open orders
const orders = await client.getOpenOrders();

// Filtered by market
const marketOrders = await client.getOpenOrders({
  market: "0xbd31dc8a...",
});

// Filtered by token
const tokenOrders = await client.getOpenOrders({
  asset_id: "52114319501245...",
});
from py_clob_client_v2 import OpenOrderParams

# All open orders
orders = client.get_orders()

# Filtered by market
market_orders = client.get_orders(
    OpenOrderParams(market="0xbd31dc8a...")
)
use polymarket_client_sdk_v2::clob::types::request::OrdersRequest;

// All open orders
let orders = client.orders(&OrdersRequest::default(), None).await?;

// Filtered by market
let request = OrdersRequest::builder()
    .market("0xbd31dc8a...".parse()?)
    .build();
let market_orders = client.orders(&request, None).await?;

OpenOrder Object

FieldTypeDescription
idstringOrder ID
statusstringCurrent order status
marketstringCondition ID
asset_idstringToken ID
sidestringBUY or SELL
original_sizestringSize at placement
size_matchedstringAmount filled
pricestringLimit price
outcomestringHuman-readable outcome (e.g., “Yes”, “No”)
order_typestringOrder type (GTC, GTD, FOK, FAK)
maker_addressstringFunder address
ownerstringAPI key of the order owner
associate_tradesstring[]Trade IDs this order has been included in
expirationstringUnix expiration timestamp (0 if none)
created_atstringUnix creation timestamp

Trade History

When an order is matched, it creates a trade. Trades progress through these statuses:
StatusTerminalDescription
MATCHEDNoMatched and sent for onchain submission
MINEDNoMined on the chain, no finality yet
CONFIRMEDYesAchieved finality — trade successful
RETRYINGNoTransaction failed — being retried
FAILEDYesFailed permanently
// All trades
const trades = await client.getTrades();

// Filtered by market
const marketTrades = await client.getTrades({
  market: "0xbd31dc8a...",
});
from py_clob_client_v2 import TradeParams

trades = client.get_trades()

market_trades = client.get_trades(
    TradeParams(market="0xbd31dc8a...")
)
use polymarket_client_sdk_v2::clob::types::request::TradesRequest;

// All trades
let trades = client.trades(&TradesRequest::default(), None).await?;

// Filtered by market
let request = TradesRequest::builder()
    .market("0xbd31dc8a...".parse()?)
    .build();
let market_trades = client.trades(&request, None).await?;
Additional filter parameters: id, maker_address, asset_id, before, after. The Rust SDK uses cursor-based pagination via the next_cursor parameter:
const page = await client.getTradesPaginated({ market: "0xbd31dc8a..." });
console.log(page.trades, page.count); // trades array + total count
page = client.get_trades_paginated(TradeParams(market="0xbd31dc8a..."))
// First page
let page = client.trades(&request, None).await?;
println!("{} trades, cursor: {}", page.data.len(), page.next_cursor);

// Next page
let page2 = client.trades(&request, Some(page.next_cursor)).await?;

Trade Object

FieldTypeDescription
idstringTrade ID
taker_order_idstringTaker order hash
marketstringCondition ID
asset_idstringToken ID
sidestringBUY or SELL
sizestringTrade size
pricestringExecution price
fee_rate_bpsstringFee rate in basis points
statusstringTrade status (see table above)
match_timestringUnix timestamp when matched
last_updatestringUnix timestamp of last status change
outcomestringHuman-readable outcome (e.g., “Yes”)
maker_addressstringMaker’s funder address
ownerstringAPI key of the trade owner
transaction_hashstringOnchain transaction hash
bucket_indexnumberIndex for trade reconciliation
trader_sidestringTAKER or MAKER
maker_ordersMakerOrder[]Maker orders that filled this trade
A single trade can be split across multiple onchain transactions due to gas limits. Use bucket_index and match_time to reconcile related transactions back to a single logical trade.

Order Scoring

Check if your resting orders are eligible for maker rebates scoring:
// Single order
const scoring = await client.isOrderScoring({ orderId: "0x..." });

// Multiple orders
const batch = await client.areOrdersScoring({
  orderIds: ["0x...", "0x..."],
});
from py_clob_client_v2 import OrderScoringParams, OrdersScoringParams

scoring = client.is_order_scoring(
    OrderScoringParams(orderId="0x...")
)

batch = client.are_orders_scoring(
    OrdersScoringParams(orderIds=["0x...", "0x..."])
)
// Single order
let scoring = client.is_order_scoring("0x...").await?;

// Multiple orders
let batch = client.are_orders_scoring(&["0x...", "0x..."]).await?;

Next Steps

Order Attribution

Attribute orders to your builder account for volume credit

Fees

Understand fee structures and maker rebates