Skip to main content
REST endpoints for Polymarket CLOB v2 data. Every endpoint returns JSON enriched with market metadata (question, slug, outcome label, image, condition_id) baked in — you never need to look up a market name separately. This is the v2-only surface. The existing /v2/onchain/* endpoints cover v1 Polymarket. Use /clobv2/* for anything that needs v2 fills, positions, builder attribution, or neg-risk events.

Collateral token: pUSD

v2 trades settle in pUSD (Polymarket USD), an ERC-20 on Polygon at 0xc011a7e12a19f7b1f670d46f03b03f3342e82dfb. Every pUSD is backed 1:1 by USDC.e and the backing is enforced on-chain by the contract, so dollar amounts are exact. Fields named *_usdc in the response schemas (maker_usdc, taker_usdc, fee_usdc, notional_usdc, etc.) are the pUSD amounts of each fill. The “usdc” suffix is a holdover from v1 and reflects the dollar value — it does NOT mean USDC.e was the token that moved. If you’re verifying on-chain against Polygonscan, look for Transfer events on the pUSD contract above, not the USDC.e contract. Why you care:
  • Integrators: an API user wrapping USDC.e → pUSD via Polymarket’s Collateral Onramp will see their wallets/{address}/trades results denominated in the same units their pUSD balance moved.
  • Historical data: early v2 fills (pre-mainnet-launch on April 28, 2026) may show mixed pUSD / USDC.e transfers on-chain as wallets migrated; the aggregated amounts our API returns remain dollar-correct because 1 pUSD = 1 USDC.e.
  • v1 data: the legacy /v2/onchain/* endpoints are v1 Polymarket and genuinely denominated in USDC.e. Different exchange, different collateral.

Base URL

Authentication

Every endpoint requires a paid-tier API key (starter and up). Free-tier keys receive 402 Payment Required. Pass your key by any of three methods:
Never pass the key in a URL you’d share publicly — the query-param form is fine for local scripts but logs it to server access logs.

Endpoints

Fills

Positions

Market aggregates

Builders (v2-exclusive)

Neg-risk events (v2-exclusive)

Numeric precision

All USDC / share / price fields in list responses are returned as JSON strings (e.g. "1.3440000000000000", not 1.344) to preserve full database precision. Parse to Decimal / BigNumber / bignumber.js before arithmetic. Integer counts (trade counts, market counts) remain JSON numbers. Single-object market-volume + market-orderbook responses return numbers for convenience.

Response envelope

Every list endpoint wraps results the same way:
  • count: the number of rows in this response.
  • source: always "onchain-v2" for clobv2 endpoints — identifies this as v2 exchange data.
  • pagination: standard offset-based. has_more: true means you can fetch offset += count to get the next page.
  • The array field name matches the endpoint (trades, positions, events, etc.).
Single-object endpoints (e.g. volume, orderbook-rollup) skip the pagination object and include a found boolean.

Rate limits

Every response carries:
Limits are per-API-key over a rolling 60-second window. When exceeded you get 429 Too Many Requests with {"error": "rate limit exceeded", "reset_at": <unix>}.

Error shape

All error bodies follow {"error": "<human readable>"}. 402 also includes tier and upgrade_url fields.

Known stubs

These endpoints exist on the server but are not yet documented because their supporting historical datasets are still being completed:
  • /clobv2/wallets/{address}/redemptions
  • /clobv2/wallets/{address}/activity
  • /clobv2/markets/{condition_id}/oi
  • /clobv2/oi
They currently return the empty-shape response (count/volume fields zeroed). When coverage is complete, they’ll return populated data and get their own doc pages — no API contract change.