Polymarket Data API v2: What Changed and How to Migrate Before October 24
Polymarket retires Data API v1 on October 24, 2026. What changed in v2 and how to migrate: cursors, renamed fields, price history and rate limits.
Polymarket is retiring Data API v1 on October 24, 2026.
If you have an application using Polymarket's Data API today, this is more than a version change. Pagination works differently, several response fields have been renamed, some endpoints have been consolidated, and price history has moved to a new API route.
The good news is that most of the migration is straightforward once you understand the differences. We tested the v1 and v2 APIs side by side against live Polymarket data to identify the changes that are most likely to break existing applications.
This guide walks through those changes, shows how to update common requests, and explains what we found when comparing the two APIs with real historical trade data.
When is Polymarket Data API v1 being retired?
Data API v2 went live on September 4, 2026. From that point forward, new Data API functionality has been added to v2 rather than v1.
The important date is October 24, 2026, when Polymarket retires Data API v1.
One endpoint is the exception:
This endpoint does not have a v2 replacement and is not being retired. Applications using it can continue to call the v1 endpoint.
Polymarket also added GET /v2/tokens on October 7, 2026, providing token and condition lookup through the new API.

What is the Polymarket Data API?
Polymarket exposes several public APIs, each designed for a different type of data.
API | Base URL | Primary use |
|---|---|---|
Gamma |
| Market and event discovery, metadata, slugs |
CLOB |
| Live order books, prices, midpoints, trading |
Data API |
| Trades, activity, positions, holders, open interest, leaderboards, and price history |
The Data API is public and does not require an API key or authentication.
For applications that already use the Data API, the main migration work is therefore inside the requests and response handling rather than authentication.
What changed in v2?
There are five changes that matter when migrating an existing application.
1. Responses now use a data envelope
Many v1 endpoints return an array or object directly.
For example, code written against v1 may expect:
In v2, the same type of response is wrapped in a data field:
If your application currently reads the response directly, this is one of the first things you will need to change.
2. Offset pagination has been replaced by cursors
This is probably the most important change for applications pulling historical data.
v1 uses limit and offset:
v2 uses an opaque cursor returned by the previous response:
The important difference is that you should no longer try to calculate the next page yourself.
Read pagination.next_cursor, send it back as cursor, and continue until next_cursor is null.
Do not stop simply because a page contains fewer rows than your requested limit.
This also removes one of the biggest limitations of the old API. In v1, /trades rejected offsets above 10,000. That meant offset pagination could only reach the first 20,000 trades of a market before returning:
There is no equivalent 10,000-row offset limit in v2.
3. Response fields have changed
Most v2 fields use snake_case instead of the camelCase used by v1.
For example:
But the migration is not simply a case conversion.
Some fields have actually been renamed:
This is important if you are transforming v1 responses automatically. A simple camelCase-to-snake_case conversion will not be enough.

4. Market filtering now uses condition
The v1 API uses:
The v2 API uses:
For example:
The v2 API also accepts condition_id and conditionId as aliases.
A request can include up to 20 condition IDs.
5. Several endpoints have been consolidated
Polymarket has combined some of the old endpoints into broader v2 routes.
The most important examples are:
v1 | v2 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
There are also several endpoints that are new in v2, including:
Migrating historical trade data
The biggest practical improvement in v2 is cursor-based pagination.
The /v2/trades endpoint can return trades for a wallet, market, event, or the global feed.
A basic market query looks like this:
The response contains the trades under data and the cursor under pagination:
To retrieve the next page, send that cursor back with the same request parameters.
A reusable Python cursor loop
The following pattern works across cursor-paginated v2 endpoints:
You can then retrieve every trade for a market:
The important detail is that the cursor controls where the next page begins. Keep the other filters unchanged throughout the walk.
Retrieving a wallet's full history
Wallet queries behave slightly differently.
If you need more than the default three-year window, send:
For example:
There is an important distinction here: start and end work for user queries, but they are ignored for market and event trade queries.
If you request trades by condition or event_id, Polymarket serves a fixed three-year window. If you need a narrower time range, filter the returned timestamps in your application.
What happened to the 10,000-row limit?
This was one of the biggest problems with the old API.
In v1, /trades used offset pagination and rejected requests once the offset exceeded 10,000.
That meant a market with more than 20,000 trades could not be completely traversed using offset pagination alone.
Polymarket's documented workaround was to split the request into time windows and page each window independently.
That approach works until v1 is retired.
With v2, the problem goes away because pagination is cursor-based.
We tested this using a high-volume Polymarket market with 71,107 trades.
Method | Rows | Requests |
|---|---|---|
v1 offset pagination | 20,000 | 3, then HTTP 400 |
v1 time-window workaround | 71,107 | 8 |
v2 cursor pagination | 71,107 | 72 |

The v1 time-window results and v2 cursor results were identical: 71,107 rows appeared in both datasets, with no rows appearing in only one version.
We performed the comparison using transaction hash, token, wallet, side, size, price, and timestamp.
Working with Polymarket price history
Price history is also changing as part of the migration.
The old route lives on the CLOB API:
The v2 route is:
The request format has changed as well.
CLOB v1 | Data API v2 | |
|---|---|---|
Token parameter |
|
|
Time window |
|
|
Resolution |
|
|
Pagination | None | Cursor-based |
Maximum | — | 10,000 |
For example:
The response now looks like:
Choosing a price-history resolution
Polymarket keeps different resolutions for different lengths of time.
Resolution |
| Retained for at least |
|---|---|---|
1 minute | 60 | 7 days |
5 minutes | 300 | 60 days |
30 minutes | 1,800 | 90 days |
3 hours | 10,800 | Permanent |
12 hours | 43,200 | Permanent |
The 12-hour series goes back to November 18, 2022.
There is also a 15-day maximum when using an explicit start and end window. For longer periods, use an appropriate interval and resolution or split the request into multiple windows.
One detail worth watching is that requesting a resolution that is no longer available for the selected time range can return an empty data array rather than an error.
Rate limits changed too
The migration also changes request limits.
Route | v1 | v2 |
|---|---|---|
General | 1,000 / 10s | 800 / 10s |
Trades | 200 / 10s | 300 / 10s |
Positions | 150 / 10s | 200 / 10s |
Activity | General | 200 / 10s |
Price history | 1,000 / 10s | 200 / 10s |
Status | 100 / 10s | 100 / 10s |
The lower price-history limit is particularly important for applications doing large historical backfills.
When the API returns HTTP 429 or 503, respect the Retry-After header rather than immediately retrying the request.
Common migration errors
A few errors showed up repeatedly during our testing.

offset is not a query param on this API
You are sending a v1 pagination parameter to a v2 endpoint.
Replace the offset loop with cursor pagination and pass the value from pagination.next_cursor.
invalid cursor
The cursor is invalid, expired, damaged, or belongs to another route.
Start the pagination walk again from the first page.
market is not a query param on this API
Replace:
with:
limit must be between 0 and 1000
The /v2/trades endpoint accepts a maximum limit of 1,000.
'start' to 'end' must span at most 15 days
You are requesting too much price history in a single explicit time window.
Use a supported interval or split the request into multiple 15-day windows.
required query param 'token_id' not provided
The v2 price-history endpoint expects the CLOB token ID, not the market condition ID.
A practical migration checklist
Before October 24, check each place in your application that calls the Polymarket Data API.
Find every reference to
data-api.polymarket.com.Map each v1 endpoint to its v2 replacement.
Update response parsing to read from
data.Replace offset pagination with cursor pagination.
Update renamed fields, not just camelCase fields.
Replace
marketwithcondition.Update
/closed-positionsto/v2/positions?status=CLOSED.Update
/tradedto/v2/user-stats.Update price history to
/v2/prices-history.Replace
fidelitywithbucket_seconds.Add handling for 429 and 503 responses.
Review your request pacing against the new rate limits.
Upgrade official Polymarket SDKs to 0.10.0 or later if you use them.
Keep
/v1/accounting/snapshoton v1.Run v1 and v2 side by side and compare the results before switching over.
If your application uses the Data API mainly for wallet trades, positions, and PnL, you can also get that data from Bravado's Data API, which reconstructs each wallet's full history from on-chain Polygon settlement.
We tested the migration ourselves
To make sure these differences were not limited to the documentation, we built a small comparison script that calls the same endpoints against both versions of the API.
The test compares renamed fields, casing changes, fields that exist in only one version, and value differences.
For full trade-history tests, it also walks the entire dataset using both pagination methods.
One of our tests produced the following result:
The migration therefore does not require rebuilding your data pipeline from scratch. But it does require changing how your application requests and parses the data.
When the official API is not enough
The v2 Data API covers most historical and account-level reads, but there are still cases where developers need data that the public API does not provide directly.
At Bravado, we are building infrastructure around those gaps.
For example, Polymarket's market WebSocket provides live trade events, but the standard trade event does not include the wallet address for each fill. Bravado's Live Trades WebSocket provides wallet-level trade data in a single stream.
We also maintain reconstructed wallet data from on-chain Polygon settlement, including trade history, redeems, splits, merges, rewards, and maker rebates.
For historical order-book analysis, Polymarket's public API does not currently provide an endpoint for retrieving historical L2 books. Bravado maintains order-book archives and can provide historical L2 data by market and date range.
The goal is not to replace Polymarket's API. The Data API is useful for many applications and is the right place to start. Bravado is designed for applications that need deeper historical data, wallet-level real-time feeds, or infrastructure that sits between raw venue data and an application.
Why use Bravado's Data API and WebSockets
The v2 migration is a good time to decide which parts of your data pipeline you want to maintain yourself. If you use Polymarket data mainly for wallet history, PnL, or a live trade tape, Bravado serves that data through one integration.
Full wallet history. The Trader Data API replays each wallet's history from its first trade, using on-chain Polygon settlement records and a FIFO cost-basis engine.
PnL already computed. Responses include realized and unrealized PnL, fees, and cost basis. Income such as maker rebates and liquidity rewards is reported separately. Numeric values are returned as JSON strings to preserve decimal precision.
Rate limits you can read. Every Data API response includes
X-RateLimit-Limit,X-RateLimit-Remaining, andX-RateLimit-Reset. A 429 response includesRetry-After.Live trades with wallets. The Live Trades WebSocket streams every fill across all Polymarket markets over one connection, with the trader's wallet address on each trade. It sends the last 200 trades on connect, so the feed does not start empty.
Order books for more than one venue. The order-book WebSockets carry many outcome tokens over one connection per venue, with a shared message format for Polymarket and Predict.fun.
The two main entry points are:
Requests are signed with an API key from the Bravado Console. The free tier includes 5,000 API credits per month, and each Data API request costs 1 credit. WebSockets require an eligible paid plan.
To get an API key and see what is covered, visit Bravado's Data API and WebSockets.
Conclusion
The Polymarket Data API v2 migration is relatively straightforward, but the differences are significant enough that existing v1 integrations should not be expected to work unchanged.
The biggest changes are cursor-based pagination, the new response envelope, renamed fields, the condition filter, consolidated endpoints, and the new price-history interface.
The most important thing to do now is test your existing integration against v2 rather than waiting for the October 24 shutdown.
If your application relies heavily on historical trades, start with pagination. If it uses positions or activity, audit the field names. If it uses price history, update the endpoint and resolution parameters. And if you are running large backfills, review the new rate limits before moving to production.
Polymarket's v1 API is going away on October 24. The sooner you run the migration side by side, the easier the transition will be.
Read more blogs
Trading insights, market analysis, and strategies for Polymarket prediction markets.





