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: {} }
Cancel Multiple Orders
const resp = await client.cancelOrders(["0xb816482a...", "0xc927593b..."]);
Cancel All Orders
Cancel every open order across all markets:
const resp = await client.cancelAll();
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
});
Onchain Cancellation
If the API is unavailable, you can cancel orders directly on the Exchange contract by calling cancelOrder(Order order) onchain. Pass the full order struct that was signed when placing the order.
Use the CTFExchange or NegRiskCTFExchange contract depending on the market type. See Contract Addresses for addresses.
This is a fallback mechanism — API cancellation is instant while onchain cancellation requires a transaction.
Querying Orders
Get a Single Order
const order = await client.getOrder("0xb816482a...");
console.log(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...",
});
OpenOrder Object
| Field | Type | Description |
|---|
id | string | Order ID |
status | string | Current order status |
market | string | Condition ID |
asset_id | string | Token ID |
side | string | BUY or SELL |
original_size | string | Size at placement |
size_matched | string | Amount filled |
price | string | Limit price |
outcome | string | Human-readable outcome (e.g., “Yes”, “No”) |
order_type | string | Order type (GTC, GTD, FOK, FAK) |
maker_address | string | Funder address |
owner | string | API key of the order owner |
associate_trades | string[] | Trade IDs this order has been included in |
expiration | string | Unix expiration timestamp (0 if none) |
created_at | string | Unix creation timestamp |
Trade History
When an order is matched, it creates a trade. Trades progress through these statuses:
| Status | Terminal | Description |
|---|
MATCHED | No | Matched and sent for onchain submission |
MINED | No | Mined on the chain, no finality yet |
CONFIRMED | Yes | Achieved finality — trade successful |
RETRYING | No | Transaction failed — being retried |
FAILED | Yes | Failed permanently |
// All trades
const trades = await client.getTrades();
// Filtered by market
const marketTrades = await client.getTrades({
market: "0xbd31dc8a...",
});
Additional filter parameters: id, maker_address, asset_id, before, after.
For large result sets, use the paginated variant:
const page = await client.getTradesPaginated({ market: "0xbd31dc8a..." });
console.log(page.trades, page.count); // trades array + total count
Trade Object
| Field | Type | Description |
|---|
id | string | Trade ID |
taker_order_id | string | Taker order hash |
market | string | Condition ID |
asset_id | string | Token ID |
side | string | BUY or SELL |
size | string | Trade size |
price | string | Execution price |
fee_rate_bps | string | Fee rate in basis points |
status | string | Trade status (see table above) |
match_time | string | Unix timestamp when matched |
last_update | string | Unix timestamp of last status change |
outcome | string | Human-readable outcome (e.g., “Yes”) |
maker_address | string | Maker’s funder address |
owner | string | API key of the trade owner |
transaction_hash | string | Onchain transaction hash |
bucket_index | number | Index for trade reconciliation |
trader_side | string | TAKER or MAKER |
maker_orders | MakerOrder[] | 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..."],
});
Next Steps