Pay as you go stays available while a payment retry is in progress, so API access and usage reporting agree. The live_sports_updated webhook event starts delivering a bounded per-game pulse. The API sandbox answers four operations it used to refuse, so an integration can be written against every documented operation but the live event stream without an account.
API
GET /api/v1/large-trades,GET /api/v1/large-trades/{id},GET /api/v1/large-trades/history, their/api/v1/whale-tradesaliases andexpand=tradeonGET /api/v1/events/feed/sincenow returnreview_scoreandrecorded_review_scorebesidesignal_scoreandrecorded_signal_score, with the same values. The older keys stay on the wire and are marked deprecated. The SDK types the new keys (@0xinsider/sdk0.10.0), and the MCP package adds themarket_reviewprompt, withtrading_signalskept as its alias (@0xinsider/mcp2.5.0). Additive: existing calls are unchanged.- New
GET /api/v1/market/{condition_id}/intelandPOST /api/v1/markets/intel/batchnow returnsharp_money.oldest_snapshot_as_of, and the same field on the deprecatedsmart_moneyalias: the time of the oldest position behindtop_positions, so you can tell how current that list is. It isnullwhen the list is empty. Additive (@0xinsider/sdk0.9.0). - The API sandbox now matches the live API in six more places:
POST /api/v1/mcprefuses a malformed message with a JSON-RPC error object andX-Mcp-Error-Code, answers an unknown method with-32601and an id-lesspingor notification with202;min_gradevisibly drops lower-graded rows, andGET /api/v1/market/{condition_id}/holderslists S, A and B holders only; a trader posted toPOST /api/v1/traders/batchcarries its own username or none, andexpand: nullthere gets400; the single-market routes describe thecondition_idin their path; andGET /api/v1/webhooks/eventsgives every event its real description and payload shape. - The API sandbox now answers the way the live API does: a body over 1 MiB gets
413; anullthe schema does not allow, a string past its length limit, a wrongconst, afromthat is not an RFC 3339 timestamp or more than 25walletvalues across repeats gets400; an unknownexpandvalue is ignored; amkt_,wt_orrf_id inPOST /api/v1/traders/batchis a per-item error; and responses carry the live id formats (pos_,wt_,rf_,pe_,mkt_), the postedcondition_idinPOST /api/v1/markets/intel/batch, only the trader sectionsexpandasks for, all eleven events inGET /api/v1/webhooks/events, and anX-Effective-Querythat names only the filters applied. GET /api/v1/trader/{address}now includesforecast_score(0-100) andforecast_evidence(0-1) beside the grade when forecasting data is available; unavailable values are omitted.- New
GET /api/v1/gamesandGET /api/v1/games/{event_slug}return one game per row: both sides with their provider ids and live scores, the UTC kickoff, the provider's status, the esports series format, and every linked Polymarket market with itscondition_idand outcome token ids. Filter bysport,league,status,starts_afterandstarts_before; each page carries the sports and leagues covered. Draws, postponements and cancellations each keep their ownstatus.state(@0xinsider/sdk0.7.0). - The TypeScript SDK's
mcp()now sendsinitialize,ping,tools/listand notifications without an API key, as the MCP server allows, and always sendsjsonrpc: "2.0";downloadTraderExportkeeps yoursignalanddownloadTimeoutMsactive until the file body is read.npx -y @0xinsider/mcp initnow writes through a config that is a dangling symlink instead of replacing it, and merges its change into~/.claude.jsonagain if Claude Code saved the file meanwhile. - NewThe export job resource (
POST /api/v1/trader/{address}/export,GET .../export/status) now says what a client should do next:terminal,next_action,poll_after_s, the lifecycle timestamps,expires_at, the file'sdata_as_ofand, once ready, itsartifact; a job past its retention window readsexpired, its download answers410witherror.reasonexport_expired, andfresh=trueskips reusing an older file. Every field is additive. - When
GET /api/v1/streamends with anevent: errorframe (key revoked, account lapsed, credential store unavailable), the TypeScript SDK now throws the typed error it carries, such asSubscriptionRequiredError, instead of delivering the frame as a feed event and ending quietly. The frame never reachesonEventor moves the cursor, andretry: falsestopsstreamFeedResilientfrom reconnecting. - MCP tools now match their routes: the stdio
get_sports_edge_signalsreturns the route'smeta(includingdirectional_source), andget_leaderboardlists the tenstrategyvalues on both the stdio and remote servers, so an unknown strategy is refused by the tool schema instead of the route. - NewMCP adds
list_gamesandget_game, so an agent reads the fixture list directly instead of assembling a game from market searches and team names. They callGET /api/v1/gamesandGET /api/v1/games/{event_slug}, take the same arguments, and return the same page on both the remote and stdio servers, including thecoveragethat says which sports are served (@0xinsider/mcp2.4.0). - In the TypeScript SDK,
call,list,text,paginatePages,paginateandcollectnow require the options argument for an operation with path parameters or a request body, soclient.call("createWebhook")is a compile error instead of a request the API refuses. Calls that already pass their options are unchanged. - The TypeScript SDK's
streamFeednow holds every frame tomaxFrameBytes, including one that arrives with its blank-line delimiter in the same chunk: an oversized frame throwsStreamProtocolError(frame_too_large) before it is parsed, delivered or movescursor.seq. Frames under the limit are unchanged. - In the TypeScript SDK,
error.reasonnow carries every documented reason the API sends:subscription_inactiveonSubscriptionRequiredError,monthly_quota_exceeded,ip_rate_limitedandip_throttledonRateLimitedError, andinvalid_body,payload_too_largeand the other request reasons onBadRequestError. Twelve of the 24 readnullbefore. An unrecognized reason still readsnulland stays onerror.error.reason. GET /api/v1/market/{condition_id}/holdersanswers200with an emptyholderslist and zero totals for a market no S, A or B wallet holds; it answered503withRetry-After, a retry that could never succeed.Was503 Retry-Afternow200, empty roster- Pay as you go remains available while a payment retry is in progress, and
GET /api/keys/usagereports it as available; accounts that have canceled or exhausted payment retries remain refused past the included quota. - Pre-game sides get canonical paths:
GET /api/v1/sports/pre-game-sidesandGET /api/v1/sports/pre-game-side-observations, with thePreGameSideandPreGameSideObservationschemas. Every row now carriesside,ranked_at,backing_scoreandside_sharebeside thepiled_side,signal_created_at,conviction_scoreandsmart_scorekeys, which keep the same values. The/api/v1/sports-edge-signalsand/api/v1/sports-edge-observationspaths stay live as deprecated aliases and answer withDeprecationand successorLinkheaders. The SDK addslistPreGameSides,listPreGameSideObservationsandlistPreGameSideObservationsConditional(@0xinsider/sdk0.8.0), and MCP addsget_pre_game_sidesandget_pre_game_side_observations(@0xinsider/mcp2.3.0). Additive: existing calls are unchanged. - Large trades get canonical paths:
GET /api/v1/large-trades,/api/v1/large-trades/{id},/api/v1/large-trades/history, and the two counterparties reads under/api/v1/large-trades/{id}, with theLargeTradeschema. Responses that named whale fields now carry thelargespelling beside them:top_large_trades,total_large_tradesandtotal_large_trade_volumeon reports,rep_large_trades,large_trade_count,large_trade_signaland the otherlarge_trade_*market fields onGET /api/v1/markets/explore, andlarge_tradesin platform capabilities. The/api/v1/whale-tradespaths and every whale field stay live as deprecated aliases with the same values. The SDK addslistLargeTrades,getLargeTradeandlistLargeTradeHistory(@0xinsider/sdk0.6.0), MCP addsget_large_trades,get_large_tradeandget_large_trades_history, and the CLI addslarge-trades list(@0xinsider/mcp2.2.0). Additive: existing calls are unchanged. market_volume_shareon every large trade fromGET /api/v1/whale-trades,/whale-trades/history,/whale-trades/{id}and the replay'sexpand=tradenow always reads between 0 and 1, measured against a market volume figure recorded no earlier than the trade, and is absent when no such figure is available. It previously read above 1 on 412 of 3,086 trades, the highest at 18,358.WasUp to 18,358now0 to 1- V1 query diagnostics now decode
+as a space inX-Effective-Query, and strict validation rejects an unknown name even when its percent escape is incomplete; existing callers need no change. - The
live_sports_updatedwebhook event now delivers. Subscribe to it onPOST /api/v1/webhooksand every live game sends a bounded pulse when its scores, status, period or live/ended state moves: at most one delivery per game per 20 seconds, with a live or ended transition never held back and the game clock alone never firing one.datacarriesevent_slug,game_id,league,version,changed,observed_at,published_at,status,period,clock,live,ended,scores,series_formatandsnapshot_url. It needs no Pro subscription, andGET /api/v1/webhooks/eventsnow lists it asactive(@0xinsider/sdk0.5.1 types the payload).WasSubscribable, never deliverednowDelivered as a per-game pulse - The sandbox at
https://0xinsider.com/sandbox/api/v1answersGET /api/v1/trader/{address}/context.mdandGET /api/v1/market/{condition_id}/context.mdwith a Markdown document, andGET /api/v1/trader/{address}/export/downloadwith its documented302to a sample export file. All three answered400before. GET /api/v1/mcpon the sandbox answers405withAllow: POST, the same as the live API, and the documented body for that answer is now the JSON-RPC error the live API sends rather than the REST error envelope.GET /api/v1/streamis now named as the one operation the sandbox does not answer, in the OpenAPI document, the registration response and the SDK.- A Polymarket fill now has to be at least 0.1% of its market's traded volume to count as a large trade, on top of the $10,000 floor ($1,000 in earnings markets). The same rule decides the live feed and
GET /api/v1/whale-trades. Over the 14 days before it shipped it would have left out 351 of 6,499 fills, every one of them in a politics or geopolitics market large enough that $10,000 was rounding error. Rows stored before 2026-09-23 are unchanged.Was$10,000now$10,000 and 0.1% of the market - The API sandbox now answers
initializeonPOST /api/v1/mcpthe way the live API does:serverInfo,capabilities,instructionsand aprotocolVersionnegotiated against the revisions the live server supports, withMcp-Session-Idon the answer. It answered the endpoint'stools/listexample before. AMCP-Protocol-Versionheader naming a revision the live API does not serve now answers400with-32600there too.WasA tools/list examplenowThe live handshake
Reports
- The daily reports calendar now shades the last day of the month for viewers east of UTC. It was left blank, as if nothing had traded that day.
Market pages
- The Holders count on a market page and on a game page's holders rail now reads
100+for a side with more holders than the 100 the page ranks, and says the count covers the 100 biggest holders on each side. It read100, which made a market with thousands of holders look like a market with exactly 100.Was100now100+
Research
- NewCan you use 0xinsider for Kalshi or DraftKings? now carries a dated addendum scoring its 81 captured games against their results. All three venues beat the base rate by a wide margin and the interval on every pairwise difference spans zero, so the study still names no venue as more accurate, and it now says so with the games played rather than before them.
