API Changelog
Every change to the public API contract - new endpoints, parameters, response shapes, and deprecations - recorded by date. The raw source is available at /api-changelog.md.
2026-09-27
- Explicit Kalshi ticker subscriptions on WebSocket
pricesnow share the dedicated Kalshi feed while retainingprice_updatemessages and numeric cent prices. Existing snapshots, entitlements and subscription limits remain. Kalshi readiness and interruption warnings identify when REST price reconciliation is required. Group-only subscriptions retain the general price feed.
2026-09-25 · v8.1.1
/marketsnow returns a structured 400 for limits outside 1-2000 or malformed integers./searchmatches short uppercase acronyms such as NFL as whole words, so unrelated words such as inflation no longer match.- WebSocket price and orderbook examples now consistently show prices in cents.
2026-09-25 · v8.1.0
- Corrected EV gain per dollar to equal ROI divided by 100, with binary payout checks.
- Added top-holder offset pagination and explicit top-20-per-outcome coverage metadata.
- Added volume materialization watermark, refresh time and lag metadata.
- Reject malformed trade time bounds with a structured 400 response.
- Hydrate native Kalshi tickers from captured current quotes in bulk prices.
- Withhold confirmed election office/year contradictions from matched discovery and opportunities; unified books return 409 for conflicting groups and populate event/outcome labels.
- Unknown WebSocket channels now return the documented UNKNOWN_CHANNEL code.
2026-09-25
Changed in OpenAPI 8.0.0
/statusnow reports broad market availability. It reportsokwhen a strict majority of venues have live markets, anddegradedwhen that majority is lost. Individual venue status no longer labels a venue stale solely because a full catalog refresh is late.last_updatednow shows the latest observed matched-market price update or successful catalog refresh, whichever is newer. It does not imply that every market has a current quote.
2026-09-24
Changed in OpenAPI 7.0.0
- Polymarket token volume and volume chart now default to the last 24 hours
when
start_tsis omitted. This keeps the default hourly query bounded. Passstart_tsto request longer history within the existing bucket limits. /statusnow reads recorded completed catalog syncs for venue connectors and uses the catalog watchdog's venue-specific freshness thresholds. Legacy refresh attempts no longer override those venues' catalog status.
Added
- Kalshi-specific
kalshi_pricesWebSocket channel with decimal-dollar ticker updates, explicit recovery signals, and Enterprise all-market subscriptions, including combinations and short-duration markets. Existing price entitlements apply. - Native creation, metadata-update, and settlement time windows on
/api/v2/kalshi/marketsfor symbol reconciliation. Existingcreated_sinceobservation-time behavior remains unchanged.
2026-09-23
Corrected in OpenAPI 6.6.0
-
/statusreads Opinion's latest complete catalog sync instead of its retired refresh log. Missing or incomplete syncs cannot advance its freshness. -
/tradesdocuments a moving retention window instead of a fixed May 19 start. Read_meta.data_available_fromfrom a live response before planning backfills. The default remains the last 48 hours for unfiltered requests, or the full served range for market, token, and wallet filters. -
Smart Activity documents
_meta.warmingfor every window. A warming response has no available ranking; its empty list does not mean no activity. Retry with backoff and treat persistent warming as unavailable. -
Polymarket token and condition volume responses may be reused for up to 20 seconds to reduce repeated database work.
Corrected in OpenAPI 6.5.0
/eventsdocuments its acceptedstatusfilters (activeandall) and the existinginclude_groups=truedefault. Responses may still reportstatus: completedfor past events./kalshi/marketsdocumentsvolume_fpandopen_interest_fpas fixed-point strings, matching the current catalog response. Legacy integervolumeandopen_interestremain optional when supplied by Kalshi. Generated clients should refresh their types for these fields.- The WebSocket prices reference now gives bid, ask, and last price units in cents (0 to 100). The URL matcher reference lists only the four accepted URL hosts: Polymarket, Kalshi, PredictIt, and Novig.
Added
- OpenAPI 6.4.0 adds
include_pricesto/search(defaulttrue). Setinclude_prices=falseto omitlast_price,yes_bidandyes_askand skip the price lookup for faster searches. Values other than true/false (or 1/0, yes/no) return 400. - OpenAPI 6.1.0 documents the
X-Request-IDresponse header. Send a UUID inX-Request-IDto correlate your request, including client-side timeouts, with support diagnostics. Other values are replaced with a server-generated UUID. Server completion does not confirm that your client received the body. - Added REST reference pages and interactive examples for
/alerts/smart-moneyand/alerts/fade-finder, including filters, pagination, signal types, and plan quotas.
Changed
- OpenAPI 6.4.0:
/searchprices now come from current order books.last_priceis the midpoint of the current best YES bid and ask, in cents, rather than the last recorded price. It is null when either side is missing or the spread is wider than 20 cents. Markets in completed events or settled groups, and markets without a current quote, return null prices, and every market now carries all three price keys. If current prices cannot be read, every price is null and_meta.prices_unavailableistrue; retry later. - OpenAPI 6.3.0:
/kalshi/marketsdelta mode (created_since) now examines at mostlimitnewly observed markets per page for everystatus, so a page filtered bystatusorcategorycan hold fewer markets thanlimit, or none, whilecursoris non-null. Keep paging untilcursoris null: a complete walk returns the same markets as before. This fixes status-filtered delta requests on wider windows that could exceed the server time limit and return HTTP 500. Understatus=open, markets we already know have closed are still skipped and are not listed inomitted_tickers.
Fixed
-
OpenAPI 6.2.0 documents the existing nullable
/marketstotal_countand itsas_ofresponse timestamp. Response behavior is unchanged. -
Corrected the remaining
/arband/evparameter prose to match their existingmin_roi=0.0default. Opportunity selection is unchanged.
2026-09-22
Changed
- OpenAPI 6.0.0:
/statusreportsdegradedwhen any catalog refresh is unhealthy. If health cannot be determined, it returns HTTP 503 withstatus: "unknown". Handle these states in monitoring. Refresh timestamps describe catalog refresh attempts, not live quote freshness. /searchacceptsstatus=active|completed|all. Unsupported values now return HTTP 400 instead of silently selecting active events. The previously advertisedresolvedandcancelledvalues were not supported.completedincludes events outside their visibility window and does not imply settlement.
Fixed
-
OpenAPI 6.0.1 corrects
/searchto document its existinginclude_groups=truedefault. Setinclude_groups=falseto retrieve event summaries and group counts without expanded markets and prices. The runtime default is unchanged. -
Corrected
/arband/evdocumentation to show the existingmin_roi=0.0default. Default opportunity results are unchanged. -
Documented the
live_gamesWebSocket channel,event_idsscope, andUNKNOWN_EVENT_IDwarning. Trade messages are scoped to live games; there is no standalone trades channel. -
Invalid WebSocket URL credentials retain their authentication failure reason instead of being replaced by a message-authentication timeout.
2026-09-17
Changed
- Novig market URLs (
market_url_novig,urlon Novig legs and cells) are now Novig's mobile-aware links (novig.onelink.me/...): they open the Novig app on the order slip when it is installed, the app store otherwise, and the novig.com order slip on desktop.GET /v2/matching-markets/urlresolves both this form and the previousnovig.com/events/...form. OpenAPI 5.2.1.
2026-09-15
Added
GET /v2/matching-markets/urlresolves Novig deep links (novig.com/events/<outcome_id>/<partner_id>?referralCode=...): the outcome id in the path identifies the market, so a link copied from a Novig order slip now returns its matched group. OpenAPI 5.2.0.
2026-09-14
Changed
- Prediction.com is now the recommended API origin. New integrations should
use
https://prediction.com/api/v2andwss://ws.prediction.com. Existing integrations may continue usinghttps://www.predictionhunt.com/api/v2andwss://ws.predictionhunt.com; both compatibility endpoints remain supported and API requests are served directly rather than redirected. - OpenAPI 5.1.1 lists the new recommended production endpoint first while retaining the old production endpoint and a relative local/preview endpoint.
2026-09-11
Added
-
New platform: Novig (
novig), the CFTC-regulated peer-to-peer sports exchange. OpenAPI 5.1.0 adds the enum value everywhere a platform is accepted or returned:GET /v2/marketsandGET /v2/prices/history: filter withplatform=novig. Market ids are prefixed (novig_<outcome_id>); each Novig outcome is its own market and the venue market id is returned inticker_name.GET /v2/orderbook:platform=novig. Books are available for markets matched to a cross-platform event and refresh on the polling cadence; the long (Yes) side is quoted and the short side is priced as its complement, sonolevels are empty (same aspolymarket_usandpredictfun).GET /v2/arbandGET /v2/ev:platforms=novigfilters to opportunities whose legs include the venue;ArbLegandEVLeggainnovig. Fee-adjusted ROI uses the venue's schedule: no taker fee before the game starts,0.03 x P x (1 - P)per contract once it is live, and0.06 x P x (1 - P)on NFL and NCAAF futures.GET /v2/status: anovigentry inplatforms.- WebSocket
prices,arbandevchannels: ticks and legs withsource: "novig".
Novig is not covered by
GET /v2/tradesor the smart-money feeds (no public attributed trade or wallet data) and cannot be resolved byGET /v2/matching-markets/urlyet (Novig links address a bet slip, not a market page).
2026-09-07
Fixed
- OpenAPI 5.0.0 corrects the existing
GET /v2/marketscontract. The accepted status filters areactive,closed, andall(defaultactive). The previously advertisedresolvedandcancelledfilters are rejected by the API; useclosedto retrieve closed markets. Regenerate clients that derive status enums from the spec. This major spec version corrects the published enum; endpoint behavior has not changed. - Document the existing 2,000-row page limit and optional
include=rulesresponse section, including the optionalrulesobject and validation errors.
2026-08-21
Changed
- Price History documentation now uses consistent, platform-neutral positioning: Historical OHLC price data normalized by Prediction Hunt across supported markets.
2026-08-20
Fixed
-
Kalshi path parameters in the interactive docs are now substituted into the URL. The Market playground previously generated a request to the literal path
/kalshi/markets/{ticker}and also appended?ticker=…, which always returnednot_found.resource. It now generates and executes/kalshi/markets/<full-market-ticker>as documented. This fix applies to all interactive endpoint pages with path parameters. -
GET /v2/prices/historynow covers Kalshi tickers discovered through the full catalog. Prediction Hunt now delivers normalized Kalshi candlestick coverage for active, settled, and archived contracts on the existing 0-100 scale. Use the catalog's full market-levelticker, notevent_ticker. The endpoint accepts1m,5m,15m,1h, and1d; Prediction Hunt builds Kalshi5m/15mcandles from one-minute price history. -
GET /v2/kalshi/markets/{ticker}now follows Kalshi's archive boundary. Rules, timing, result, and settlement fields remain available after a settled market moves into archival availability.
2026-08-13 (later)
Added
_meta.degradedonGET /v2/kalshi/marketsdelta responses. Present and true only while delta serving is temporarily degraded. During such periods the returnedwatermarkis frozen at yourcreated_sincerather than advancing, so newly observed markets are never skipped past while degraded: keep polling with the same value and the window re-opens automatically on recovery. You may receive repeated markets across those polls; deduplicating on ticker, which the polling contract already requires, handles them. The field is absent in normal operation, so existing integrations need no change.
2026-08-13
Fixed
-
GET /v2/kalshi/markets?created_since=…now sees short-lived markets. Delta mode resolved its window from our catalog sync, which enumerates open markets every 30 minutes. A market whose entire open window fell between two syncs was never observed, so it could never appear in a delta response. This affected Kalshi's short-dated books in particular, including the 15-minute crypto series (KXBTC15M,KXETH15M,KXSOL15Mand siblings), where roughly a third of markets were reaching delta callers.Delta mode now resolves its window from a first-seen ledger fed by our whole-venue quote capture as well as the catalog sync, so a market becomes eligible on the first quote we receive for it rather than on the next catalog sweep.
No request changes are required. Responses gain no new fields and lose none.
Changed
-
first_seen_atis documented as our observation time. It has always been the instant our capture first saw a market, never a venue-stated listing or open time, and the docs now say so. It may also be revised earlier if a source that saw the market sooner reports it later. Pagination is unaffected: the cursor pages on a separate immutable ordering key, so a revisedfirst_seen_atcannot move a market behind a watermark you have already passed. -
_meta.omitted_tickersis the place to look for short-lived markets. Its meaning is unchanged, but the docs now call out the case that matters: a market that opens and closes between two of your polls is past its close time by the time you ask, so under a status filter that excludes finished markets (for examplestatus=open) it does not arrive inmarkets. When we do not yet hold a close time for it, it is reported inomitted_tickers; when we already knew it had closed, it is skipped before that list is built so wide windows stay pageable. So the list is worth reading, but it is not an exhaustive record of everything listed in the window. Poll at least as often as the shortest-lived book you care about. -
created_sincefilters on an internal record time, not onfirst_seen_at. These are deliberately different values, and the distinction is what keeps a late-arriving observation from being skipped forever. A market whosefirst_seen_atpredates yourcreated_sincecan legitimately appear in the window: that happens when a source that saw the market earlier reports it late, and the earlier timestamp is the more accurate one. Treatfirst_seen_atas information rather than as a bound to re-check, and do not discard such a market as out-of-window.Existing cursors keep working across this change. A pagination cursor issued before the switch continues to page the previous backend until that walk finishes, so a walk already in flight is never re-ordered mid-way.
2026-08-11
Changed
-
GET /v2/kalshi/marketsnow excludes Kalshi's auto-generated combo (parlay) markets by default. These multi-leg series are roughly 99% of the raw venue feed, which meant astatus=opencrawl paged through more than 700,000 markets to reach the roughly 83,000 standalone markets most integrations actually want. The default is now the filtered view: the same crawl is about 83 pages instead of 700.This changes the default response set, so re-check any code that assumed the combo series were present.
Set
include_combos=trueto restore the previous behavior. The value must betrueorfalse; anything else returns a 400 rather than silently falling back to the default, because the flag changes the result set by an order of magnitude.include_combos=trueis not valid alongsidecreated_sinceand returns a 400 there: combo markets have never been tracked in the delta catalog, so delta responses were already combo-free and are unaffected by this change.
Fixed
GET /v2/kalshi/marketsnow rejects a comma-separatedstatuswith a clean 400 instead of surfacing an upstream error as a 502. Thestatusparameter takes a single value: one ofunopened,open,closed,settled. Earlier docs describing a comma-separated subset were wrong: the upstream venue has never accepted one, so no working integration is affected by this change.- Documented Kalshi's response-side status vocabulary. Market objects
returned by this endpoint carry Kalshi's own lifecycle values
(
initialized,active,closed,determined,finalized), which differ from the request filter's vocabulary. In particular, markets matchingstatus=openread"active"in the response, so do not re-filter the response body on the literal"open".
2026-08-06
Added
-
GET /v2/kalshi/marketsgains a delta mode for keeping a mirrored catalog current without re-crawling it. Passcreated_since(Unix seconds or ISO 8601) to receive only markets first listed after that instant, oldest first, with live prices and status as usual. Each market carriesfirst_seen_at, and_metaadds:watermark: pass this back as the nextcreated_since. It is computed with a safety margin, so a few markets may repeat across polls; deduplicate onticker. Do not substitute your own clock.omitted_tickers: tickers first listed inside the window that the response does not include (filtered out bystatusorcategory, or momentarily unavailable), so a delta consumer never silently loses a ticker.
status,category, andlimitcombine withcreated_since; page withcursoruntil it is null.tickers,event_ticker,series_ticker,min_close_ts, andmax_close_tsare rejected alongside it, since their regular meaning does not survive inside a created-since window.When
statusexcludes finished markets (for examplestatus=open), acreated_sincewalk skips markets already past their close time. Most of what a venue has ever listed is over, so this is what lets a wide window reach currently open markets on the first page rather than paging through the entire history.
2026-07-30
Changed
-
Polymarket US (
polymarket_us) is now documented everywhere it is accepted. No behavior change — the venue was already live on these surfaces, but the spec and docs pages did not list it:GET /v2/orderbook—platform=polymarket_usis supported. As onpredictfun, only the long (Yes) side is quoted and the short side is priced as its complement, sonolevels come back empty.GET /v2/arbandGET /v2/ev—platforms=polymarket_usfilters to opportunities whose legs include the venue (ArbLegandEVLegalready carried the enum value).MarketPriceandOrderbookLevel— Polymarket US quotes use the same 0-100 cents scale as every other platform.
Polymarket US is still not covered by
GET /v2/tradesor the smart-money / fade-finder feeds (custodial venue, no public attributed trade or wallet data), and cannot be resolved byGET /v2/matching-markets/url(the venue publishes no web market pages for a URL to point at).
2026-07-16
Added
- Arbitrage and +EV opportunity responses can now include Polymarket US
legs: the
platformenum onArbLegandEVLeggainspolymarket_us. Polymarket US market ids are prefixed (polymarket_us_<id>), quotes come from the venue's public gateway, and fee-adjusted ROI uses the venue's taker fee curve (0.06 × P × (1−P)per contract by default). Handle the new enum value when parsing/v2/arbitrage/opportunitiesand/v2/ev/opportunitiesresponses.
2026-07-15
Added
GET /v2/tradescoverage errors (opt-in). A new HTTP422response codehistory_outside_hot_windowis being introduced behind a feature flag. When enabled, a request whosestart_time(or a paginated cursor's bound coverage window) starts before the earliest available data returns422with a structureddata_available_fromfield and a pointer to the historical data product, instead of silently clamping the range up to the coverage start. Thedata_available_fromvalue documents current coverage (2026-05-19T00:00:00Z) and is surfaced in_meta.data_available_fromon in-range responses. Pagination cursors bind to the coverage window at mint time: a cursor keeps working while coverage is unchanged, and returns the same422(never a silently shrunk page) if coverage later moves past it. While the flag is disabled the endpoint behaves exactly as before — an out-of-windowstart_timeis clamped up todata_available_from. No action is required today; if you page/v2/trades, keep following the returnedpagination_keyand read_meta.data_available_fromto know the coverage start.
2026-07-14
Added
- New endpoint:
GET /v2/kalshi/series— list Kalshi series for a category (requiredcategory, case-insensitive, same values as the/v2/kalshi/marketsfilter), withticker,title,tags, andfrequency. Fetch the list once, then pull each series' markets fromGET /v2/kalshi/markets?series_ticker=<ticker>; requests are independent and can run in parallel. - WebSocket
priceschannel — subscriptions now cover the entire live Kalshi catalog, not just markets tracked on Prediction Hunt. Subscribing with any valid Kalshi market ticker (e.g. one discovered viaGET /v2/kalshi/markets) returns an immediate price snapshot and begins streaming live ticks within a few seconds; only tickers Kalshi itself does not recognize returnUNKNOWN_ID. Subscribe with the market ticker (thetickerfield, e.g.KXODIMATCH-26JUL160800INDENG-IND), not the event ticker — an event ticker is not a tradeable market and still returnsUNKNOWN_ID. GET /v2/kalshi/markets— newcategoryfilter (e.g.?category=sports). Kalshi's own market objects carry no category (classification lives on the series), so the filter resolves each market's series against the Kalshi series catalog server-side. Matching is case-insensitive; invalid values return a 400 listing the accepted categories. A filtered request scans up to 10 full-size catalog pages to fill the response towardlimitmatching markets (_meta.pages_scannedreports the number consumed), and the cursor resumes from the last scanned page — so a response may hold fewer or more thanlimitmarkets whilecursoris non-null; keep walking untilcursoris null. Undercategory, treatlimitas the target number of matching markets per response, not a hard page size.GET /v2/kalshi/markets— newmin_close_ts/max_close_tsfilters (Unix seconds): return only markets closing inside the given window. Useful for scoping a sync to markets closing soon instead of walking the entire catalog. Combine freely withstatus,category, and the other filters.GET /v2/kalshi/marketsandGET /v2/kalshi/markets/{ticker}— every returned market is now annotated with its series-levelcategory(e.g.Sports) andtags(e.g.Tennis), so responses are self-describing without a separate series lookup. Markets whose series is not in the Kalshi series catalog are passed through without these fields (and are excluded when acategoryfilter is active). If Kalshi ever adds these fields to market objects natively, the upstream values win.
2026-07-13
Added
-
New platform: Polymarket US (
polymarket_us) — the CFTC-regulated US exchange, a separate venue from international Polymarket (polymarket) with its own markets, ids, and pricing. Now available on:GET /v2/marketsandGET /v2/prices/history— filter withplatform=polymarket_us. Market ids are prefixed (polymarket_us_{id}); the platform slug is returned inticker_name.GET /v2/orderbook—platform=polymarket_us. Books are available for markets matched to a cross-platform event and refresh on the polling cadence; the long (Yes) side is quoted and the short side is priced as its complement, sonolevels are empty (same aspredictfun).GET /v2/status— apolymarket_usentry inplatforms.- WebSocket
priceschannel — subscribed markets includepolymarket_usticks withsource: "polymarket_us". /api/odds/gridand/api/odds/event_rows— apolymarket_uscell per row alongside the existing platforms.
Not included (yet):
GET /v2/trades(Polymarket US exposes no public attributed trade feed), smart-money/fade-finder channels (custodial venue, no wallet data), and arbitrage/EV signals (rolling out separately).
2026-07-09
Changed
GET /v2/markets— theqfilter now also matchesseries_title(the event/game phrasing), so a market whosetitleis a bare outcome label (e.g. a Kalshi player propBobby Witt Jr.: 1+) is findable by the event wording likehome runs. The existingtitleandmarket_idmatching is unchanged, so this only widens whatqfinds.GET /v2/markets— ProphetX markettitleis now the clean outcome label (e.g.Total over 9.5,New York Mets spread plus 3.5) instead of the internalMLB-2026-07-09-…key.event_title(the game) is unchanged, and other platforms are unaffected.- Sports group titles across
GET /v2/events,GET /v2/search, andGET /v2/matching-markets/sportsno longer carry a leadingYYYY-MM-DD(e.g.2026-07-09 Philadelphia Phillies→Philadelphia Phillies). The date is available in each game'sevent_date. GET /v2/matching-markets/sportsnow returns only game moneylines by default. Sports events increasingly carry spreads, totals, and player-prop groups alongside the moneyline; previously this endpoint returned all of them intermixed, so a single game surfaced dozens ofgames[]entries with no way to tell a moneyline from an over/under. It now defaults to the moneylines (the game winners). This is a breaking change for integrations that relied on spreads/totals/props appearing by default — pass the newtypesparameter to get them back:?types=allrestores the previous behavior, or request specific classes, e.g.?types=moneyline,spread,total,player_prop.- WebSocket
subscribe/unsubscribe—market_idsnow also accept the REST-styleplatform:market_idcomposite form used byGET /v2/prices/bulk(e.g.kalshi:KXMENWORLDCUP-26-FR), on every market-keyed channel (prices,orderbook). The server strips the platform prefix; thesubscribedconfirmation and all streamed messages continue to carry the platform-nativemarket_id(e.g.KXMENWORLDCUP-26-FR) plus a separatesourcefield. Previously the composite form triggered anUNKNOWN_IDwarning and delivered no data. Bare platform-native ids keep working unchanged.
Added
- Market-type classification on every matched group. Group objects on
GET /v2/matching-markets/sports,GET /v2/events,GET /v2/search, andGET /v2/matching-marketsnow include:market_class— a small, stable enum to switch on:moneyline,spread,total,player_prop,other(nullon non-sports groups). Filter on this, not on titles. Esports lines fold into the same classes as traditional sports — a map handicap is aspreadand a total-maps line is atotal(so?types=spread/?types=totalwork across every sport) — while per-map winners and game-stat props (first blood / kills) areother.market_type— the specific type (e.g.spread,1h_total,player_home_runs,method_of_victory). Open-ended; new values appear without notice, so branch onmarket_class.period(full/1H),line,side(home/away/over/under),player(player props), andteam(team lines) —nullwhere not applicable.
typesfilter onGET /v2/eventsandGET /v2/search. Comma-separatedmarket_classvalues (orall) restrict each event'sgroups[]to those classes. Default is unchanged (all classes).event_idandevent_nameonGET /v2/matching-markets/sportsgames. Every group for one game now shares anevent_id, so you can group the moneyline, spreads, totals, and props back into a single game — and pair an over/under on(event_id, line). Previously the only per-group label wasgame_title, which collided across games (e.g. eleven different games all titledOver 9.5).
Fixed
GET /v2/matching-marketsno longer returns events that have no cross-platform group (they previously appeared with an emptygroups: []).
2026-07-03
Changed
GET /v2/orderbook— prices are now normalized to the same 0-100 cents scale used everywhere else in the v2 API (/v2/markets,/v2/search,/v2/prices/bulk,/v2/unified-orderbook). Previously Kalshi, Polymarket, and Opinion orderbook prices were returned on a 0-1 scale while Predict.fun was already 0-100, making the endpoint internally inconsistent and inconsistent with the rest of the surface. This is a breaking numeric-scale change for existing integrations that readyes/nobid/ask prices from/v2/orderbook— multiply old values by 100 to get the new ones (e.g.0.62is now62).sizefields are unaffected.- Corrected the
MarketPriceandOrderbookLevelschema descriptions, which previously stated Polymarket prices use a 0-1 scale and that orderbook prices were "the same scale as MarketPrice" (they were not, by 100x). All price fields across every platform and endpoint are 0-100 cents.
Added
GET /v2/status— each platform entry now includeslive_markets, the number of markets that are active and not past expiration (what/v2/markets?platform=<platform>&status=activeactually returns). The existingactive_marketscounts every market ever ingested for the platform regardless of status, so it can be much larger;live_marketsis the currently-tradeable count.GET /v2/kalshi/markets/{ticker}— documented theresultandsettlement_value_dollarsfields returned once a market settles (statusbecomes"finalized").
Fixed
GET /v2/prices/bulk(and/v2/markets,/v2/search) — a request for two or more ids at once could return prices up to a day stale for some markets; single-id requests were always fresh. The batch latest-price lookup was hitting a bad database query plan. Batched requests now return the same current prices as single-id requests — the "one id per request" workaround is no longer needed.GET /v2/prices/history—volumeis now the per-bucket amount traded in each candle (previously it summed a cumulative counter, producing inflated, non-comparable magnitudes), andmidno longer collapses to50after a market settles (it falls back toclosewhen the book is empty). See the updatedvolume/midfield docs.- Polymarket
last_priceon/v2/marketsand/v2/search— for markets whose outcomes are ordered[No, Yes],last_pricewas being reported as the NO-side price (outside the[yes_bid, yes_ask]band). It is now always the YES-side price.yes_bid/yes_askwere already correct. GET /v2/events— no longer returnsauth.endpoint_blockedfor keys whose plan blocks/v2/ev; an internal prefix match was incorrectly catching/v2/events. The endpoint is available on all plans that were meant to have it.
2026-07-02
Fixed
- Price/size fields (
yes_bid,yes_ask,no_bid,no_ask,last_price,volume,liquidity) acrossGET /v2/markets,GET /v2/prices/bulk,GET /v2/events/search, and the sports-matching endpoints now serialize a stored0as0instead ofnull. Only a genuinely missing value isnull.
Added
GET /v2/prices/bulknow returns_metaalongsideprices:{requested, resolved, unresolved_ids}. Previously an id that could not be resolved (malformed pair, or no recent price data) was silently dropped from the response with no way to distinguish it from an id that was never requested.pricesis unchanged and remains backward compatible.
Changed
GET /v2/markets— theqfilter now also matchesmarket_id, in addition totitle. Per-market tickers/ids (e.g. a KalshiKXMLBGAME-*moneyline) are findable byqeven when the market'stitleis a generic team/outcome label. No request or response shape change.
2026-06-29
Changed
GET /v2/trades— an unfiltered request with nostart_timenow defaults to a recent window (last 48h) instead of the full served range, so the broad feed stays fast. Requests that pass amarket_id,token_id, orwalletfilter still default to the full history. The applied window is echoed in_meta.start_time/_meta.end_time, and_meta.default_window_appliedistruewhen the recent-window default was used. To read deeper history on the unfiltered feed, pass an explicitstart_time.
2026-06-23
Added
GET /v2/kalshi/markets— the full Kalshi market catalog with live prices and status, paginated by cursor. Filter bystatus,event_ticker,series_ticker, or specifictickers. Walkcursoruntil it is null to mirror every Kalshi market.GET /v2/kalshi/markets/{ticker}— a single Kalshi market by ticker, with live prices, status, and resolution rules.
2026-06-18
Added
- Published this API changelog. Every change to the public API contract is now recorded here with a date and a summary of what changed.