Polymarket has shipped a coordinated upgrade of its entire trading infrastructure: new Exchange contracts, a rewritten CLOB backend, and a new collateral token (Polymarket USD, or pUSD). This guide walks you through everything you need to migrate from CLOB V1 to CLOB V2.Documentation Index
Fetch the complete documentation index at: https://docs.polymarket.com/llms.txt
Use this file to discover all available pages before exploring further.
https://clob.polymarket.com. The pre-cutover https://clob-v2.polymarket.com testing host is no longer the integration target for production clients.TL;DR
| What | Before (V1) | After (V2) |
|---|---|---|
| SDK package | @polymarket/clob-client / py-clob-client | @polymarket/clob-client-v2 / py-clob-client-v2 |
| Constructor | Positional args | Options object, chainId → chain |
| Order fields | nonce, feeRateBps, taker | timestamp (ms), metadata, builder |
| Fees | Embedded in the signed order | Operator-set at match time |
| Collateral | USDC.e | pUSD (standard ERC-20, backed by USDC) |
| Builder auth | POLY_BUILDER_* HMAC headers + builder-signing-sdk | A single builderCode field on the order |
| EIP-712 domain version | "1" | "2" (exchange only — API auth unchanged) |
Exchange verifyingContract (raw API signers) | V1 addresses | V2 addresses — see Contracts |
| Raw API order signing | V1 Order type | Updated Order type — see API users section |
Before you start
Read this guide end-to-end
Pin the latest SDK
@polymarket/clob-client-v2 (TypeScript) or py-clob-client-v2 (Python). Don’t keep using the old clob-client / py-clob-client packages — those only work against V1 and no longer function against production.What’s changing
1. New Exchange contracts
The onchain exchange has been rewritten from the ground up.- Solidity upgraded from 0.8.15 → 0.8.30, with Solady replacing OpenZeppelin for gas savings.
- Order struct simplified:
nonce,feeRateBps, andtakerremoved;timestamp,metadata,builderadded. - EIP-712 exchange domain version bumped from
"1"to"2". - Fees collected onchain at match time (no longer embedded in the signed order).
- Onchain cancel replaced with operator-controlled
pauseUser/unpauseUser. - Batched mint/merge operations for gas efficiency.
2. Rewritten CLOB backend
The order manager, ledger, executor, balance checker, and tracker are all new services. From an integrator’s perspective:- Nonce system removed. Order uniqueness now comes from
timestamp(milliseconds). You no longer track nonces. - New fee model. Platform fees are dynamic per market and queryable via
getClobMarketInfo(). - Builder codes enable integrator attribution and revenue sharing, replacing the old HMAC-header flow.
3. New collateral token
Polymarket is migrating from USDC.e to pUSD (Polymarket USD), a standard ERC-20 on Polygon backed by USDC. Backing is enforced onchain by the smart contract.- For users trading on polymarket.com, the frontend handles wrapping automatically with a one-time approval.
- Power users and API-only traders wrap their USDC.e into pUSD via the Collateral Onramp contract’s
wrap()function.
For API users
If you sign and post orders directly (without the SDK), here’s what changes in the wire protocol. SDK users can skip this section — the client handles it.EIP-712 domain
The Exchange domain version bumps to"2" and the verifyingContract moves to the V2 Exchange.
verifyingContract is different:
ClobAuthDomain used for L1 API authentication stays at version "1" — L1/L2 auth is identical in V2.EIP-712 Order type
The signed struct dropstaker, expiration, nonce, and feeRateBps, and adds timestamp, metadata, and builder.
Order value to sign
timestamp— order creation time in milliseconds. Replacesnoncefor per-address uniqueness (not an expiration).metadata— bytes32.builder— bytes32. Zero unless you’re attaching a builder code.
side is encoded as uint8 in the signing payload (0 = BUY, 1 = SELL), even though the wire body uses the string "BUY" / "SELL". No change from V1.
POST /order body
expiration is still present in the POST /order wire body for GTD/order-expiry handling, but it is not part of the V2 EIP-712 signed struct.
Request headers
The API auth headers are unchanged. Builder attribution moves into the signedbuilder field on the order, so the POLY_BUILDER_* HMAC headers are gone.
SDK Migration
Install
CLOB V2 ships under new package names. Install them directly — don’t keep using the oldclob-client / py-clob-client packages.
clob-client-v2 / py-clob-client-v2 are the V2 CLOB clients.Constructor: positional args → options object
The single most visible change.chainId is renamed to chain. tickSizeTtlMs is no longer configurable.
Order creation
Three fields are no longer user-settable:feeRateBps, nonce, taker. One new optional field: builderCode.
userUSDCBalance field so the SDK can calculate fee-adjusted fill amounts:
Fee model
Fees are now determined by the protocol at match time, not embedded in your signed order.- Platform fees are dynamic per market:
fee = C × feeRate × p × (1 - p) - Makers are never charged fees — only takers pay.
- You no longer set
feeRateBpson orders. The SDK handles fee calculation automatically.
Querying fee parameters
V2 introducesgetClobMarketInfo(), which returns all CLOB-level market parameters in one call:
userUSDCBalance on market buy orders to get accurate fill amounts after fees.
Builder Program
V2 replaces the old builder authentication flow (HMAC headers + separate signing SDK) with a native builder code attached directly to each order.What’s gone
@polymarket/builder-signing-sdk— no longer neededPOLY_BUILDER_API_KEY,POLY_BUILDER_SECRET,POLY_BUILDER_PASSPHRASE,POLY_BUILDER_SIGNATUREheaders- Remote vs. local signing distinction
What’s new
- A single
builderCode(bytes32) from your Builder Profile - Attach it per-order via the
builderCodefield, or pass it once at construction so every order inherits it
BuilderConfig still exists, but its shape changed. In V1 it wrapped HMAC credentials from @polymarket/builder-signing-sdk. In V2 it’s just { builderCode: string }.builderCode field — your relayer integration keeps the same credentials.Collateral token: USDC.e → pUSD
Polymarket USD (pUSD) replaces USDC.e as the collateral token. pUSD is a standard ERC-20 on Polygon backed by USDC, with backing enforced onchain by the smart contract. The permissionless Collateral Onramp accepts USDC.e.- For users on polymarket.com: the UI handles wrapping automatically.
- For API-only traders: wrap USDC.e into pUSD via the Collateral Onramp’s
wrap()function. See the pUSD page for full examples and Contracts for addresses.
Test markets
The markets below were used for pre-cutover testing onclob-v2.polymarket.com and are retained for migration reference. For live testing, resolve current active markets into token IDs and metadata with gamma-api.polymarket.com/markets?condition_ids=<id>, then submit small orders to production CLOB V2 at https://clob.polymarket.com.
Markets with fees enabled
Use these to verify fee handling end-to-end.0xaf5e903876ad42de97e1cf02c2ef8484df69bcfc5541b96a400116557d1e504e0xe9955a31d76ea97457410f61c9b9f2d27ac6fbd8302ed1849d93133884f4fb3b0x8e6a263fc5f4dd9433b4ccbc9bb9e0d89f4de8a91d3a82d6b437fe73fd847ea50xc7d462e462d8d369aee17c9e3ea8f113166cf9a342a6434a0b2a0f7588dc1bbf0x0440d08e4f534afa8ad9f616a239a19ebf7f2476bd802b1d54180435fa83463f0xd048b3e9ccad82c57a4eec953e75794aeb5e6d0e08bdb79b9e01b24e0049f16d0x88310713845c54e36f29791a1c2dc172b9819b645ba82d5f87560805cd2bb7880xffcab88076a28795281bb07a082c7003a4ff5671420086cb16ec09dfbf9aea680x64a5bcfb0c76a75081c8be49c895a976d506fce8d21aa9d73f1099e502f2fa4e0x8babe4f4d0eff732d660fa02929a581cb8478ed2a1696c158290b2794d3d7ac0
Additional markets with liquidity
0xcf8a237df51a51511c4f96bb4390480ad72b898ca8ec7e9a3c16c47c8e5e468a0x242d251e7e804f79e1f237896b0f5e73caea72375dcb84e5a60d1cd0d2f80ef50x9c47ba9e666983bd8d82bfab790509153bf7756c43913f6ef269e33c8955939c0x221aaa62fed17db56fbc7983f88110a9c34861c3262154ee3315425378e3ae120x625d0091f4c647e5497bd9b03f8526bd486d6c339380b8046e4dd5b3373046b70xc9b9f89ac915385c8d77edb73872c49e5bf76e510b74b9609e74e7f8d0339df20xde9f827cb2d568db7801439693645a941a38fe6feaeb08b86087ad367d9917040xfd029ab3d6d27b6e1f3480dce858c97fb12e5bebd6fb50be7520102c56ba8ce10x894a61a2baa777adf1d03a263a4b2d8faa7e1ebc7bf6694a37701fae8add01d90xcd57f3ad3bbbdaa96aacabd35f50c2d6e30f777e4a33876a4ab2dcd9f0b8c1700xc4b07998e8f9bf6b95f079d6dc0529f3c6f59698d4e168817ad5f99304de6c570xe4f4b614a6c2b4ecd8eb700d19c0e6533d3fbd1bc28193b2255394ef74006e6f0xec181db4470b152493b58229862af3f6335b77cc719f5a0e7ed58c9f9848b9920x6ec4fec4885df7f3ac46e5d0051beb6d8ac75de6a8481f13f245ff26dcb4b6620x8f6e71601903224dc29c69b886a63f248c8051be259e7db299850708f1f86dd60xfa40b5612a905f16ee42a18979f23fa1bbfcfc365f11d168f2e22bd0159ada770x182390641d3b1b47cc64274b9da290efd04221c586651ba190880713da6347d9
Migration checklist
Work through this list as you update your integration:SDK and constructor
SDK and constructor
- Install
@polymarket/clob-client-v2/py-clob-client-v2(remove the legacyclob-client/py-clob-clientpackages) - Convert constructor calls from positional args to options object
- Rename
chainIdparameter tochain - Remove
tickSizeTtlMsandgeoBlockTokenfrom constructor config
Order creation
Order creation
- Remove
feeRateBps,nonce,takerfrom order creation calls - Add
builderCodeto orders if you’re a builder - Pass
userUSDCBalanceon market buy orders for fee-adjusted fill amounts (optional) - Remove any manual fee calculation logic — fees are protocol-handled
Builder program
Builder program
- Remove
@polymarket/builder-signing-sdkfrom dependencies - Remove
POLY_BUILDER_*environment variables - Copy your builder code from your Builder Profile
- Store it as
POLY_BUILDER_CODE(or any env var you prefer) - Attach
builderCodeon every order to get attribution
Raw order struct / manual signing
Raw order struct / manual signing
- Update any code that inspects raw order structs (new fields:
timestamp,metadata,builder) - Update manual EIP-712 signing code (Exchange domain version
"1"→"2") - Update onchain contract references to new V2 addresses
Collateral
Collateral
- If you’re API-only, plan for wrapping USDC.e into pUSD via the Collateral Onramp
- Update any hardcoded references to the old USDC.e address
Testing
Testing
- Test the full order lifecycle with small production orders
- Verify builder attribution appears on the Builder Leaderboard
- Re-create any pre-cutover resting orders with V2 signing
Cutover day
Go-live occurred on April 28, 2026 (~11:00 UTC). The migration involved approximately 1 hour of downtime during which trading was paused. During the window:- All open orders were wiped. Any pre-cutover resting orders must be re-placed with V2 signing.
- The SDK’s hot-swap mechanism queried a version endpoint and auto-refreshed when V2 went live.
- Clients already on the latest V2 SDK did not require manual intervention during the cutover.
FAQ
Do I need to re-generate my API keys?
Do I need to re-generate my API keys?
Will my open orders migrate automatically?
Will my open orders migrate automatically?
What happens if I forget to update the SDK?
What happens if I forget to update the SDK?
Do I need to migrate my USDC.e to pUSD manually?
Do I need to migrate my USDC.e to pUSD manually?
wrap() on the Collateral Onramp contract.Is the builder code a secret?
Is the builder code a secret?
builder field of every attributed order. Only you control which orders include your code, so keep it scoped to apps you own.I calculate fees manually. What do I change?
I calculate fees manually. What do I change?
getClobMarketInfo(conditionID) to query fee parameters (fd.r, fd.e, fd.to), and rely on the SDK to handle fee-adjusted amounts. Pass userUSDCBalance on market buy orders for accurate fill math.Are WebSocket URLs or payloads changing?
Are WebSocket URLs or payloads changing?
fee_rate_bps field on last_trade_price events continues to reflect the fee actually charged on the trade.