Polymarket Market Price History
polymarket_market_price_historyPrice SERIES of ONE prediction market (Polymarket) — Open/High/Low/Close, VWAP and volume per time bucket, for EACH outcome. Use for charts, "probability over time", "how did the odds move", momentum. NOT a single latest price — use polymarket_market_odds. NOT the individual fills — use polymarket_market_trades.
Identify the market with question_id, condition_id OR outcome_asset_id — at least one is required. Resolve them with polymarket_find_markets (search by question title) or polymarket_market_info. question_id is the direct lookup and is fastest; condition_id and outcome_asset_id have to be looked up through the market's registration first, so they answer a little slower. Precedence when more than one is given: question_id, then condition_id, then outcome_asset_id — the others are ignored. Passing none returns nothing.
Prices are USD per share, 0..1, and ARE the market-implied probability (Close 0.62 = 62 %). On a two-outcome market the two Closes of the same bucket should add up to about 1.
interval accepts 1s, 5s, 10s, 30s, 1m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 12h or 1d; anything else is rejected. Buckets are aligned to whole UTC units.
The default window is the market's WHOLE history, which is cheap here — narrow it with after_time / before_time only when you actually want a slice.
limit is the number of buckets PER OUTCOME, newest first. Reverse the rows client-side to plot a chart left-to-right.
Buckets with no trades are omitted; there is no gap filling, so a sparse market yields sparse rows.
Open / Close are the first / last fill inside the bucket. On a thin bucket (small Trades) they can be a single dust trade — Vwap is the more robust number, and Volume_Usd / Trades tell you how much to trust the bucket.
Shares is the outcome-token quantity traded; Volume_Usd is the collateral value.
Series are keyed by Outcome_Asset_Id, which is what distinguishes the outcomes; Outcome is its display name. Plot one line per Outcome_Asset_Id.
Every match leaves one record per resting order it filled plus one for the order that crossed the book. The two classes do NOT mirror each other one to one - a match can pair orders on opposite outcomes at complementary prices - so "both" is NOT a fixed multiple of "maker" (it is not "double"), and the ratio differs by outcome, market and bucket. order_side picks which records to count; keep the default "maker" for a volume and VWAP series.
Last_Indexed_Time (on every row) is the newest fill recorded in ANY market and Data_Lag_Minutes how far that is behind the clock - usually well under half an hour, occasionally hours. Buckets after Last_Indexed_Time cannot exist yet and the bucket containing it may be incomplete: a series that stops well before Last_Indexed_Time means the market went quiet, one that stops at it means the newest fills have not arrived yet.
Recovered_Trades and Unresolved_Trades break each bucket's Trades down by how its fills were identified, so no bucket is silently short or silently restored. Not every fill records which market it belongs to, and a fill whose market is missing from the registration cannot be named at all. The three tools make that visible instead of guessing:
Recovered = 0: the fill carried its own market identity — nothing was inferred.
Recovered = 1: the fill did not name its market, and it was matched to this one through the market's registered outcome tokens. Price, size, direction, trader and transaction are always the fill's own; only the naming was restored.
Recovered = -1: the fill named neither a market nor an outcome the registration knows. It is reported because it is a real trade, but its labels stay blank.
Outcome_Resolved = 0 marks a row whose outcome name could not be taken from the market's own definition. Treat a blank or surprising Outcome on such a row as UNKNOWN, not as fact — an outcome name stored on the fill itself can describe the other side of the match. An empty label with Outcome_Resolved = 1 really is an unnamed outcome; an empty label with Outcome_Resolved = 0 means nobody recorded the name. Because the outcome token id survives on every fill even when the market identity does not, outcome_asset_id is the key most likely to find such trades.
Tool call template
This tool declares no required parameters. Add optional parameters from the input schema as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {},
"name": "polymarket_market_price_history"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max buckets PER OUTCOME, newest first. Default 200. A two-outcome market therefore returns up to 2x this many rows. At most 5000. | |
| format | No | Shape of the returned data. "rows" (the default) returns one item per row. "columnar" returns a single item, {"columns":[...],"rows":[[value,...],...]}, naming the columns once and listing each row's values in that order; it is more compact for large results and carries the same values. | rows |
| outcome | No | Restrict to ONE outcome — either its label ("Yes", "No", "Up", "Down"; case-insensitive) or its Outcome_Asset_Id as returned by polymarket_market_odds. The asset id is the reliable form; a label matches nothing on the few markets whose fills carry no outcome name. Empty (default) = every outcome. No backslashes. | |
| interval | No | Bucket size: one of "1s", "5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "4h", "6h", "12h", "1d". Anything else is rejected. Match it to the window — 1m over a year of history returns only the newest `limit` buckets. | 1h |
| after_time | No | Only trades at/after this UTC time (e.g. "2026-08-20 19:00:00"). Empty (default) = from the market's first trade. | |
| order_side | No | Which side's order records to count. "maker" (default) = the resting orders only, the right basis for a volume and VWAP series - use it for volume. "taker" = only the orders that crossed the book; those are real traders' own orders and show aggressive flow. "both" = every maker and taker order record; it is NOT a fixed multiple of "maker" (not simply double) and varies by outcome, market and bucket. Any other value is rejected. Prices barely move between the three; this mainly changes Volume_Usd / Shares / Trades. | maker |
| before_time | No | Only trades strictly before this UTC time. Empty (default) = up to the market's last trade. Format: YYYY-MM-DD, YYYY-MM-DD HH:MM[:SS], ISO-8601 like 2026-09-20T00:00:00Z (fraction or +02:00 offset allowed) or 10-digit unix seconds. | |
| question_id | No | The market's question id, 0x-hex (case-insensitive; the 0x prefix is optional). The preferred, fastest lookup. Get it from polymarket_find_markets or polymarket_market_info. Empty = identify the market by condition_id instead. Must be 64 hex characters; anything else is rejected. | |
| condition_id | No | The market's condition id, 0x-hex (case-insensitive; the 0x prefix is optional). Use it when you do not have the question_id — this lookup answers a little slower. Ignored when question_id is set. Empty = identify the market by question_id instead. Must be 64 hex characters; anything else is rejected. | |
| outcome_asset_id | No | Identify the market by ONE of its outcome tokens, given as that token's Outcome_Asset_Id (a long decimal number, as returned by polymarket_market_odds or in the Cursor-bearing rows of polymarket_market_trades). Use it as the LAST-RESORT key: it is the only key that still works for fills whose market identity was never recorded, because the outcome token id is present on every fill. It returns the WHOLE market (every outcome), not just that one token — narrow with the outcome param where one exists. Ignored when question_id or condition_id is set. Empty = identify the market by one of those instead. Must be a plain decimal number of at most 78 digits; anything else is rejected. |