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
Field Type Description idstring Order ID statusstring Current order status marketstring Condition ID asset_idstring Token ID sidestring BUY or SELLoriginal_sizestring Size at placement size_matchedstring Amount filled pricestring Limit price outcomestring Human-readable outcome (e.g., “Yes”, “No”) order_typestring Order type (GTC, GTD, FOK, FAK) maker_addressstring Funder address ownerstring API key of the order owner associate_tradesstring[] Trade IDs this order has been included in expirationstring Unix expiration timestamp (0 if none) created_atstring Unix creation timestamp
Trade History
When an order is matched, it creates a trade. Trades progress through these statuses:
Status Terminal Description MATCHEDNo Matched and sent for onchain submission MINEDNo Mined on the chain, no finality yet CONFIRMEDYes Achieved finality — trade successful RETRYINGNo Transaction failed — being retried FAILEDYes Failed 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
Field Type Description idstring Trade ID taker_order_idstring Taker order hash marketstring Condition ID asset_idstring Token ID sidestring BUY or SELLsizestring Trade size pricestring Execution price fee_rate_bpsstring Fee rate in basis points statusstring Trade status (see table above) match_timestring Unix timestamp when matched last_updatestring Unix timestamp of last status change outcomestring Human-readable outcome (e.g., “Yes”) maker_addressstring Maker’s funder address ownerstring API key of the trade owner transaction_hashstring Onchain transaction hash bucket_indexnumber Index for trade reconciliation trader_sidestring TAKER or MAKERmaker_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