This is the complete method reference for @polymarket/clob-client, Polymarket’s official TypeScript SDK for interacting with the CLOB (Central Limit Order Book) API. Every method is documented with its signature, parameters, return type, and a working code example.
For the Python equivalent, see the py_clob_client Reference. For a conceptual overview of how the Polymarket API ecosystem works, see the Polymarket API Guide. For side-by-side comparison across platforms, see the Prediction Market API Reference.
Try it live: Test Polymarket endpoints in the API Playground — no setup required.
Installation and Setup
Installing @polymarket/clob-client
npm install @polymarket/clob-client ethers
The SDK requires ethers (v5 or v6) for wallet signing. If you prefer Viem, the SDK also supports WalletClient as a signer — see the Viem Alternative section below.
ClobClient Initialization
ClobClient is the main entry point for all SDK operations.
Signature:
import { ClobClient } from "@polymarket/clob-client";
const client = new ClobClient(
host: string,
chainId: number,
signer: Wallet | WalletClient,
creds?: ApiKeyCreds,
signatureType?: number,
funder?: string
);
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
host | string | Yes | CLOB API base URL. Use "https://clob.polymarket.com" for production |
chainId | number | Yes | Blockchain chain ID. Use 137 for Polygon mainnet |
signer | Wallet | WalletClient | For trading | An ethers.js Wallet instance or a Viem WalletClient |
creds | ApiKeyCreds | No | Pre-existing API credentials. Omit and derive them with createOrDeriveApiKey() |
signatureType | number | No | Wallet type: 0 = EOA (MetaMask), 1 = POLY_PROXY (Magic/email), 2 = GNOSIS_SAFE (browser proxy) |
funder | string | For proxy wallets | The proxy wallet address that holds your funds on Polymarket |
Example — Read-only client (no authentication):
import { ClobClient } from "@polymarket/clob-client";
const client = new ClobClient("https://clob.polymarket.com", 137);
// Public endpoints work without auth
const price = await client.getPrice({ tokenID: "<token-id>", side: "BUY" });
console.log("Price:", price);
Example — Authenticated client (EOA wallet):
import { ClobClient } from "@polymarket/clob-client";
import { ethers } from "ethers";
const wallet = new ethers.Wallet("<your-private-key>");
const client = new ClobClient(
"https://clob.polymarket.com",
137,
wallet,
undefined, // creds — derive below
0 // signatureType: EOA
);
// Derive API credentials
const creds = await client.createOrDeriveApiKey();
// Re-initialize with credentials
const authedClient = new ClobClient(
"https://clob.polymarket.com",
137,
wallet,
creds,
0
);
Example — Authenticated client (Gnosis Safe / browser proxy wallet):
This is the most common configuration for wallets created through Polymarket’s web interface.
import { ClobClient } from "@polymarket/clob-client";
import { ethers } from "ethers";
const wallet = new ethers.Wallet("<your-private-key>");
const client = new ClobClient(
"https://clob.polymarket.com",
137,
wallet,
undefined, // creds — derive below
2, // signatureType: GNOSIS_SAFE
"<your-proxy-wallet-address>" // funder
);
const creds = await client.createOrDeriveApiKey();
const authedClient = new ClobClient(
"https://clob.polymarket.com",
137,
wallet,
creds,
2,
"<your-proxy-wallet-address>"
);
Viem Alternative
If you prefer Viem over ethers.js, the SDK accepts a WalletClient as the signer parameter.
import { ClobClient } from "@polymarket/clob-client";
import { createWalletClient, http } from "viem";
import { polygon } from "viem/chains";
import { privateKeyToAccount } from "viem/accounts";
const account = privateKeyToAccount("<your-private-key>");
const walletClient = createWalletClient({
account,
chain: polygon,
transport: http(),
});
const client = new ClobClient(
"https://clob.polymarket.com",
137,
walletClient,
undefined,
2,
"<your-proxy-wallet-address>"
);
Constructor Options
The ClobClient constructor also accepts an optional options object as the seventh parameter:
| Option | Type | Default | Description |
|---|---|---|---|
throwOnError | boolean | false | When true, the client throws ApiError on failed requests instead of returning error objects |
geoBlockToken | string | undefined | Pass a geo-block bypass token if you have one |
const client = new ClobClient(
"https://clob.polymarket.com",
137,
wallet,
creds,
2,
"<proxy-address>",
{ throwOnError: true }
);
Authentication
createOrDeriveApiKey()
Derives or creates API credentials from your wallet signature. This is the recommended method for obtaining credentials. If credentials already exist for your wallet, it returns them. If not, it creates new ones.
Signature:
client.createOrDeriveApiKey(): Promise<ApiKeyCreds>
Returns: An ApiKeyCreds object containing:
| Field | Type | Description |
|---|---|---|
key | string | Your API key |
secret | string | Your API secret |
passphrase | string | Your API passphrase |
Example:
import { ClobClient } from "@polymarket/clob-client";
import { ethers } from "ethers";
const wallet = new ethers.Wallet("<your-private-key>");
// Step 1: Create a temporary client without credentials
const tempClient = new ClobClient(
"https://clob.polymarket.com",
137,
wallet,
undefined,
2,
"<proxy-wallet-address>"
);
// Step 2: Derive credentials
const creds = await tempClient.createOrDeriveApiKey();
console.log("API Key:", creds.key);
console.log("Secret:", creds.secret);
console.log("Passphrase:", creds.passphrase);
// Step 3: Re-initialize with credentials for authenticated trading
const client = new ClobClient(
"https://clob.polymarket.com",
137,
wallet,
creds,
2,
"<proxy-wallet-address>"
);
Credentials are deterministic — deriving them again with the same wallet and signatureType produces the same result. You can safely store and reuse them across sessions.
Other Authentication Methods
| Method | Signature | Description |
|---|---|---|
deriveApiKey() | deriveApiKey(): Promise<ApiKeyCreds> | Derives existing API credentials. Throws if none exist. |
createApiKey() | createApiKey(): Promise<ApiKeyCreds> | Creates new API credentials. Overwrites any existing credentials. |
getApiKeys() | getApiKeys(): Promise<ApiKeyCreds[]> | Returns all API key sets associated with your wallet. |
deleteApiKey() | deleteApiKey(): Promise<void> | Deletes the current API credentials. |
Use createOrDeriveApiKey() in most cases. The individual methods are useful when you need finer control — for example, rotating credentials with deleteApiKey() followed by createApiKey().
Balance Methods
getBalanceAllowance(params)
Returns your balance and token allowance for a specific asset type. Essential for checking whether you have sufficient funds and allowance set before trading.
Signature:
client.getBalanceAllowance(params: BalanceAllowanceParams): Promise<BalanceAllowanceResponse>
Parameters:
| Field | Type | Required | Description |
|---|---|---|---|
asset_type | string | Yes | "COLLATERAL" for USDC, or "CONDITIONAL" for outcome tokens |
token_id | string | For conditional | The specific outcome token ID (required when asset_type is "CONDITIONAL") |
Returns: An object with balance and allowance fields as strings (in wei for USDC, where 1 USDC = 10^6 wei).
Example — Check USDC balance:
const result = await client.getBalanceAllowance({
asset_type: "COLLATERAL",
});
const balanceUsdc = parseInt(result.balance) / 1e6;
console.log(`Balance: ${balanceUsdc.toFixed(2)} USDC`);
console.log(`Allowance: ${result.allowance}`);
Example — Check conditional token balance:
const result = await client.getBalanceAllowance({
asset_type: "CONDITIONAL",
token_id: "<outcome-token-id>",
});
console.log(`Token balance: ${result.balance}`);
console.log(`Token allowance: ${result.allowance}`);
updateBalanceAllowance(params)
Sets or updates the token allowance for a specific asset type. You may need to call this before trading if your allowance is insufficient.
Signature:
client.updateBalanceAllowance(params: BalanceAllowanceParams): Promise<void>
Parameters: Same as getBalanceAllowance() — specify asset_type and optionally token_id.
Example:
await client.updateBalanceAllowance({
asset_type: "COLLATERAL",
});
console.log("Allowance updated for USDC");
Market Data Methods
These methods are available without authentication. You can use a read-only client (no signer) to call any of them.
getPrice(params)
Returns the best available price for a given side (BUY or SELL) on a specific outcome token.
Signature:
client.getPrice(params: { tokenID: string; side: string }): Promise<string>
Parameters:
| Field | Type | Description |
|---|---|---|
tokenID | string | The outcome token ID |
side | string | "BUY" or "SELL" |
Returns: A string representing the best price as a decimal between 0 and 1.
Example:
const price = await client.getPrice({
tokenID: "<token-id>",
side: "BUY",
});
console.log(`Best buy price: $${price}`);
// Example output: Best buy price: $0.65
getMidpoint(params)
Returns the midpoint price between the best bid and best ask for an outcome token.
Signature:
client.getMidpoint(params: { tokenID: string }): Promise<string>
Example:
const midpoint = await client.getMidpoint({ tokenID: "<token-id>" });
console.log(`Midpoint: $${midpoint}`);
getOrderBook(params)
Returns the full order book for a specific outcome token, including all bids and asks with their prices and sizes.
Signature:
client.getOrderBook(params: { tokenID: string }): Promise<OrderBookSummary>
Returns: An OrderBookSummary object with bids and asks arrays. Each entry contains price and size.
Example:
const book = await client.getOrderBook({ tokenID: "<token-id>" });
console.log("Top bids:");
book.bids.slice(0, 5).forEach((bid) => {
console.log(` $${bid.price} — ${bid.size} shares`);
});
console.log("Top asks:");
book.asks.slice(0, 5).forEach((ask) => {
console.log(` $${ask.price} — ${ask.size} shares`);
});
getOrderBooks(params)
Fetches order books for multiple tokens in a single request.
Signature:
client.getOrderBooks(params: { tokenIDs: string[] }): Promise<OrderBookSummary[]>
Example:
const books = await client.getOrderBooks({
tokenIDs: ["<token-id-1>", "<token-id-2>"],
});
books.forEach((book, i) => {
console.log(`Book ${i}: ${book.bids.length} bids, ${book.asks.length} asks`);
});
getPricesHistory(params)
Returns historical price data for a specific outcome token.
Signature:
client.getPricesHistory(params: {
tokenID: string;
startTs?: number;
endTs?: number;
interval?: string;
fidelity?: number;
}): Promise<PriceHistoryPoint[]>
Parameters:
| Field | Type | Description |
|---|---|---|
tokenID | string | The outcome token ID |
startTs | number | Start timestamp (Unix seconds) |
endTs | number | End timestamp (Unix seconds) |
interval | string | Time interval (e.g., "1h", "1d") |
fidelity | number | Number of data points to return |
Example:
const now = Math.floor(Date.now() / 1000);
const oneDayAgo = now - 86400;
const history = await client.getPricesHistory({
tokenID: "<token-id>",
startTs: oneDayAgo,
endTs: now,
fidelity: 100,
});
history.forEach((point) => {
console.log(`${new Date(point.t * 1000).toISOString()}: $${point.p}`);
});
getTickSize(tokenId)
Returns the minimum tick size (price increment) for a specific token. Orders must be priced in multiples of this value.
Signature:
client.getTickSize(tokenID: string): Promise<string>
Example:
const tickSize = await client.getTickSize("<token-id>");
console.log(`Tick size: ${tickSize}`);
// Example output: Tick size: 0.01
getMidpoints and getPrices
Batch variants that return midpoints or prices for multiple tokens.
Signatures:
client.getMidpoints(params: { tokenIDs: string[] }): Promise<Record<string, string>>
client.getPrices(params: { tokenIDs: string[] }): Promise<Record<string, string>>
Example:
const midpoints = await client.getMidpoints({
tokenIDs: ["<token-1>", "<token-2>"],
});
Object.entries(midpoints).forEach(([tokenId, price]) => {
console.log(`${tokenId}: $${price}`);
});
Order Types
Before placing orders, understand the two primary order argument interfaces.
OrderArgs
Used for limit orders where you specify a price and size.
interface OrderArgs {
tokenID: string; // The outcome token to trade
price: number; // Limit price, decimal 0.01 to 0.99
size: number; // Order size in USDC units
side: Side; // Side.BUY or Side.SELL
feeRateBps?: number; // Fee rate in basis points (optional)
nonce?: number; // Unique nonce (auto-generated if omitted)
expiration?: number; // Unix timestamp for order expiry (optional)
}
Key details:
priceis a decimal between 0 and 1. A price of0.65means 65% implied probability and costs $0.65 per share.sizeis denominated in USDC. A size of50means $50 worth of the outcome token at the specified price.- Import
Sidefrom the SDK:import { Side } from "@polymarket/clob-client";
MarketOrderArgs
Used for market orders where you specify how much USDC to spend rather than a specific price.
interface MarketOrderArgs {
tokenID: string; // The outcome token to trade
amount: number; // USDC amount to spend
}
OrderType Enum
Specify how long your order stays active:
| Value | Description |
|---|---|
OrderType.GTC | Good-Til-Cancelled. Stays on the book until filled or cancelled. |
OrderType.FOK | Fill-Or-Kill. Must fill entirely and immediately, or the entire order is cancelled. |
OrderType.GTD | Good-Til-Date. Stays on the book until a specified expiration time. |
Import with: import { OrderType } from "@polymarket/clob-client";
Order Placement
All order placement methods require an authenticated client with valid API credentials.
createOrder(orderArgs)
Creates and signs an order locally without submitting it to the CLOB. Returns a signed OrderPayload that you can inspect, log, or submit later with postOrder().
Signature:
client.createOrder(orderArgs: OrderArgs): Promise<OrderPayload>
Returns: A signed OrderPayload object ready for submission.
Example:
import { ClobClient, Side } from "@polymarket/clob-client";
const signedOrder = await client.createOrder({
tokenID: "<token-id>",
price: 0.55,
size: 100,
side: Side.BUY,
});
console.log("Signed order:", JSON.stringify(signedOrder, null, 2));
// Inspect the order before submitting...
postOrder(signedOrder, orderType)
Submits a previously signed order to the CLOB.
Signature:
client.postOrder(order: OrderPayload, orderType?: OrderType): Promise<OrderResponse>
Parameters:
| Field | Type | Description |
|---|---|---|
order | OrderPayload | A signed order from createOrder() |
orderType | OrderType | Order type. Defaults to OrderType.GTC. |
Example:
import { OrderType } from "@polymarket/clob-client";
const signedOrder = await client.createOrder({
tokenID: "<token-id>",
price: 0.55,
size: 100,
side: Side.BUY,
});
const response = await client.postOrder(signedOrder, OrderType.GTC);
console.log("Order ID:", response.orderID);
console.log("Status:", response.status);
createAndPostOrder(orderArgs, orderType)
Creates, signs, and submits an order in a single call. This is the most convenient method for straightforward order placement.
Signature:
client.createAndPostOrder(
orderArgs: OrderArgs,
orderType?: OrderType
): Promise<OrderResponse>
Example:
import { ClobClient, Side, OrderType } from "@polymarket/clob-client";
const response = await client.createAndPostOrder(
{
tokenID: "<token-id>",
price: 0.55,
size: 100,
side: Side.BUY,
},
OrderType.GTC
);
console.log("Order placed:", response.orderID);
When to use createOrder + postOrder vs createAndPostOrder:
- Use
createAndPostOrder()for simple, immediate order placement. - Use
createOrder()+postOrder()when you need to inspect the signed payload, add logging, or batch multiple orders before submitting.
createMarketOrder(marketOrderArgs)
Creates a market order that executes at the best available price. Market orders use Fill-Or-Kill (FOK) execution — they fill immediately or are cancelled entirely.
Signature:
client.createMarketOrder(args: MarketOrderArgs): Promise<OrderPayload>
Example:
const marketOrder = await client.createMarketOrder({
tokenID: "<token-id>",
amount: 50, // Spend $50 USDC at the best available price
});
const response = await client.postOrder(marketOrder, OrderType.FOK);
console.log("Market order filled:", response.orderID);
Batch Operations
For placing multiple orders at once, create them individually and submit as a batch.
createOrders / postOrders:
// Create and post multiple orders in a batch
const prices = [0.50, 0.52, 0.54, 0.56, 0.58];
const signedOrders = await Promise.all(
prices.map((price) =>
client.createOrder({
tokenID: "<token-id>",
price,
size: 50,
side: Side.BUY,
})
)
);
// Submit all orders at once
const responses = await client.postOrders(signedOrders, OrderType.GTC);
console.log(`Placed ${responses.length} orders`);
This is significantly more efficient than calling createAndPostOrder() in a loop, as it reduces the number of API calls.
Order Management
getOrder(orderId)
Retrieves the details of a specific order by its ID.
Signature:
client.getOrder(orderID: string): Promise<Order>
Example:
const order = await client.getOrder("<order-id>");
console.log(`Order ${order.id}: ${order.side} ${order.size} @ $${order.price}`);
console.log(`Status: ${order.status}`);
getOrders(params)
Retrieves your open orders with optional filters.
Signature:
client.getOrders(params?: {
market?: string;
asset_id?: string;
}): Promise<Order[]>
Example:
// Get all open orders
const orders = await client.getOrders();
console.log(`You have ${orders.length} open orders`);
// Get orders for a specific market
const marketOrders = await client.getOrders({
market: "<condition-id>",
});
getOrdersHistory(params)
Retrieves your historical orders (filled, cancelled, etc.).
Signature:
client.getOrdersHistory(params?: {
market?: string;
asset_id?: string;
}): Promise<Order[]>
Example:
const history = await client.getOrdersHistory();
history.forEach((order) => {
console.log(`${order.side} ${order.size} @ $${order.price} — ${order.status}`);
});
cancelOrder(orderId)
Cancels a specific open order.
Signature:
client.cancelOrder(orderID: string): Promise<CancelResponse>
Example:
const result = await client.cancelOrder("<order-id>");
console.log("Cancelled:", result);
cancelOrders(orderIds)
Cancels multiple orders in a single request.
Signature:
client.cancelOrders(orderIDs: string[]): Promise<CancelResponse[]>
Example:
const results = await client.cancelOrders([
"<order-id-1>",
"<order-id-2>",
"<order-id-3>",
]);
console.log(`Cancelled ${results.length} orders`);
cancelAll()
Cancels all open orders across all markets.
Signature:
client.cancelAll(): Promise<CancelResponse[]>
Example:
const results = await client.cancelAll();
console.log(`Cancelled all ${results.length} open orders`);
cancelMarketOrders(params)
Cancels all open orders for a specific market.
Signature:
client.cancelMarketOrders(params: {
market: string;
asset_id?: string;
}): Promise<CancelResponse[]>
Example:
const results = await client.cancelMarketOrders({
market: "<condition-id>",
});
console.log(`Cancelled ${results.length} orders in market`);
Position Methods
getPositions(params)
Retrieves your current positions across all markets. Each position represents your holdings of a specific outcome token.
Signature:
client.getPositions(params?: {
market?: string;
asset_id?: string;
}): Promise<Position[]>
Example:
const positions = await client.getPositions();
positions.forEach((pos) => {
console.log(`Token: ${pos.asset_id}`);
console.log(` Size: ${pos.size}`);
console.log(` Avg entry: $${pos.avgPrice}`);
});
getTrades(params)
Retrieves your trade history.
Signature:
client.getTrades(params?: {
market?: string;
asset_id?: string;
before?: string;
after?: string;
}): Promise<Trade[]>
Example:
const trades = await client.getTrades();
trades.forEach((trade) => {
console.log(
`${trade.side} ${trade.size} @ $${trade.price} — ${trade.status}`
);
});
getNotifications(params)
Retrieves your trade notifications (fills, cancellations, etc.).
Signature:
client.getNotifications(): Promise<Notification[]>
Example:
const notifications = await client.getNotifications();
notifications.forEach((n) => {
console.log(`[${n.type}] ${n.message}`);
});
Server Utilities
getOk()
Health check endpoint. Returns "OK" if the CLOB server is operational.
Signature:
client.getOk(): Promise<string>
Example:
const status = await client.getOk();
console.log("Server status:", status); // "OK"
getServerTime()
Returns the CLOB server’s current time. Useful for synchronizing timestamps when signing orders.
Signature:
client.getServerTime(): Promise<string>
Example:
const serverTime = await client.getServerTime();
console.log("Server time:", serverTime);
If your local clock is significantly out of sync with the server, order signatures may be rejected. Use this method to detect clock drift.
Error Handling
The SDK supports two error handling patterns depending on how you configure the client.
Option 1: throwOnError Mode
When throwOnError is set to true, the client throws an ApiError on any failed API request. This integrates naturally with try/catch.
import { ClobClient, ApiError, Side, OrderType } from "@polymarket/clob-client";
const client = new ClobClient(
"https://clob.polymarket.com",
137,
wallet,
creds,
2,
"<proxy-address>",
{ throwOnError: true }
);
try {
const result = await client.createAndPostOrder(
{
tokenID: "<token-id>",
price: 0.55,
size: 100,
side: Side.BUY,
},
OrderType.GTC
);
console.log("Order placed:", result.orderID);
} catch (error) {
if (error instanceof ApiError) {
console.error("API Error:", error.message);
} else {
console.error("Unexpected error:", error);
}
}
Option 2: Check Response (Default)
Without throwOnError, failed requests return an object with an error field instead of throwing. You must check the response manually.
const result = await client.createAndPostOrder(
{
tokenID: "<token-id>",
price: 0.55,
size: 100,
side: Side.BUY,
},
OrderType.GTC
);
if (result.error) {
console.error("Order failed:", result.error);
} else {
console.log("Order placed:", result.orderID);
}
Recommendation: Use throwOnError: true for production bots. It prevents silent failures and makes error logging straightforward.
Common Pitfalls
These are the most frequent issues developers encounter with the TypeScript SDK:
Wrong signatureType — Using
0(EOA) when your Polymarket account uses a proxy wallet (should be1or2). See the Polymarket Auth Troubleshooting guide for diagnostic steps.Forgetting the funder for proxy wallets — If your signatureType is
1(POLY_PROXY) or2(GNOSIS_SAFE), you must pass thefunderparameter with your proxy wallet address. Without it, order signatures are invalid.Price not in 0-1 decimal range — Prices must be decimals between
0.01and0.99. Passing65instead of0.65will cause order rejection. The SDK does not auto-convert.Size is in USDC, not shares — A size of
50means $50 USDC, not 50 shares. The number of shares you receive depends on the price.Not awaiting async methods — Every method on
ClobClientreturns aPromise. Forgettingawaitproduces a pending Promise object instead of the actual result.Stale credentials after key rotation — If you call
deleteApiKey()and thencreateApiKey(), you must re-initialize the client with the new credentials. Old credential references become invalid.Clock drift — Order signatures include timestamps. If your system clock is more than a few seconds off from the CLOB server, signatures are rejected. Use
getServerTime()to detect drift.
FAQ
How do I install the Polymarket TypeScript SDK?
Run npm install @polymarket/clob-client ethers in your project directory. The SDK requires ethers.js for wallet signing operations. Once installed, import ClobClient from @polymarket/clob-client and create a new instance with the Polymarket CLOB host URL (https://clob.polymarket.com), chain ID 137 (Polygon), and an ethers.Wallet signer created from your private key.
What is the difference between createOrder and createAndPostOrder?
createOrder() only creates and signs the order locally, returning an OrderPayload object. The order is not submitted to the CLOB until you call postOrder() with that payload. createAndPostOrder() does both steps in a single call — it creates, signs, and submits the order to the CLOB, returning the order response directly. Use createOrder() when you want to inspect signed payloads, add custom logging, or batch multiple orders together before submission with postOrders().
How do I set up authentication in the TypeScript SDK?
First, initialize ClobClient with your private key (via ethers.Wallet), the correct signatureType (0 for EOA/MetaMask, 1 for Magic Link/email wallets, 2 for Gnosis Safe browser proxy wallets), and your funder address if using a proxy wallet. Then call createOrDeriveApiKey() to obtain your API credentials. Finally, create a new ClobClient instance passing those credentials as the creds parameter. The credentials are deterministic and can be stored for reuse across sessions.
Can I use the Polymarket TypeScript SDK with Viem instead of ethers.js?
Yes. The SDK supports both ethers.Wallet and Viem WalletClient as signers. Create a WalletClient using Viem’s createWalletClient() function configured for the Polygon chain, then pass it as the signer parameter to ClobClient. All other parameters and method calls remain the same regardless of which signing library you use.
What price format does the Polymarket TypeScript SDK use?
Prices are decimals between 0 and 1 representing probability. A price of 0.65 means 65% implied probability and costs $0.65 per share. Order sizes are in USDC units — a size of 50 means $50 worth of the outcome token at the specified price. The minimum price increment (tick size) varies by market; check it with getTickSize(). Always use the decimal format; the SDK does not accept percentages or cent values.
See Also
- py_clob_client Reference — Python SDK equivalent
- Polymarket API Guide — Full API reference
- Polymarket Auth Troubleshooting — Fix authentication errors
- Polymarket WebSocket Guide — Real-time streaming
- Polymarket Rate Limits Guide — Rate limits and retry strategies
- Prediction Market API Reference — Cross-platform comparison
- Polymarket Rust SDK Reference — Rust SDK alternative
This guide is maintained by AgentBets.ai. Found an error or API change we missed? Let us know on Twitter.
Not financial advice. Built for builders.
