Skip to main content
These are the API changelog entries from October 1 to 5, 2026, newest first. The newest changes are on the API changelog.
Pick of the Day game state covers totals and spread selections
GET /api/v1/pick-of-the-day can now return the existing game_ended field for totals and spread picks when the provider reports the verified game’s state under a companion event.Before this change, the field could be absent because the selected market and its game used different provider events. A game’s state is now read across its verified event family; an unavailable or stale scoreboard still leaves game_ended absent, which means unknown.Backward compatible. No public V1 field is added. game_live and game_status remain first-party fields and are not part of the public V1 response.What to change: Nothing. Keep treating an absent game_ended as unknown, and do not infer game completion from game_started or market settlement.
Released Pick of the Day records are permanent
With this release, the Pick of the Day archive and public ledger keep every released pick on its original pick ID, product date and publication order through settlement and history.This strengthens the record guarantee: a released selection cannot be withdrawn, replaced, renumbered or moved to another product day. Its selected market and side stay recorded. Market settlement and provider corrections can still update its result.GET /api/v1/pick-of-the-day continues to describe the current product day. Use the archive or ledger for historical records.Backward compatible. Request and response formats and field shapes are unchanged. Existing access rules and proof verification still apply.What to change: Nothing. Existing clients need no migration.
Pick of the Day can include additional verified selections
GET /api/v1/pick-of-the-day can now include additional verified selections.Before this change, fewer selections could qualify for publication. A day can still have no published picks.Backward compatible. Request and response fields are unchanged.What to change: Nothing.
Pick of the Day expands market coverage
GET /api/v1/pick-of-the-day and the private scanner feed can now include selections from more markets.Before this change, fewer markets were covered. A day can still have no published selections; 15 is the daily maximum at this release, not a promised count.Backward compatible. Request and response fields are unchanged. Already selected and historical picks keep their recorded rules and frozen evidence.What to change: Nothing. Continue using returned picks and availability rather than assuming 15 picks will publish every day.
Tennis scores add available ATP and WTA singles rankings
Market snapshots, LiveScoreChanged frames in the live stream, and browser feeds now include optional live_score.scores[].ranking for tennis players. The Markdown market context includes the same field.Before this change, these score entries could carry a player profile without a tour ranking.
  • rank is the positive singles ranking, and tour is atp or wta.
  • source: "api_tennis" identifies API-Tennis as the ranking source.
  • observed_at is when the ranking was retrieved, and expires_at is the UTC deadline after which you must hide it, including in cached responses and replayed frames.
This is the latest retrieved ranking, not the player’s ranking at match time. The field is absent when a ranking is unavailable, expired, or ambiguous; a player profile alone does not establish a rank.Backward compatible. This field is additive. Existing score fields and the lean Games response are unchanged.What to change: Nothing for existing clients. To display a ranking, read the optional field and hide it at expires_at; keep an absent ranking unavailable rather than substituting zero.
Pick of the Day total labels include the exact Over/Under threshold
GET /api/v1/pick-of-the-day and the archive can return total selections with an exact pick_outcome_label, such as Over 6.5 or Under 5.5. The label keeps the threshold recorded for that selection.Before this change, some total markets could not appear because their selection labels were incomplete. Other selection labels retain their existing format.Backward compatible. Response fields are unchanged.What to change: Nothing. Render the returned label as supplied instead of reconstructing a total from the market title.
Pick of the Day updates automatic publication timing
GET /api/v1/pick-of-the-day can return automatic selections earlier in the day. A scheduled selection keeps its returned release_at.Before this change, automatic selections had a later scheduled release relative to kickoff.Backward compatible. Response fields and error formats are unchanged. Published prices, lead facts, and public holder records retain their publication basis.What to change: Nothing if you already use returned clocks. Replace fixed calculations from kickoff with release_at, Retry-After, or error.retry_at to schedule the next read; a day can still have no published picks.
Pick of the Day adds the lead wallet's profitable-event count
GET /api/v1/pick-of-the-day now includes lead_backer.profitable_event_count, the number of events with positive realized P&L in the lead wallet’s recorded sport history. It uses the same sample as directional_event_count, realized_pnl_usd, and roi; break-even events do not count as profitable.Before this change, lead_backer returned the total event count, profit, and ROI without a profitable-event count.Backward compatible. This is an additive integer field; existing fields keep their meanings.What to change: Nothing. To display the event record, show profitable_event_count out of directional_event_count with category. Treat a missing count from an older server response as unavailable, not zero, and do not substitute a live wallet win rate.
Pick of the Day can return qualifying picks from previously omitted markets
GET /api/v1/pick-of-the-day can now include a qualifying pick from a market it previously omitted.Before this change, some qualifying markets could be omitted from the day’s picks. A day can still have no published picks.Backward compatible. Response fields and error formats are unchanged.What to change: Nothing.
Pick of the Day display_holders lists every graded holder on certified picks
GET /api/v1/pick-of-the-day now returns an expanded publication roster in display_holders on a pick that carries lead_backer. The OpenAPI document and the TypeScript client describe the same roster.Before this change, the roster could contain fewer wallets.
  • Position values are gross holdings on the backed side and can coexist with holdings on the other side.
  • holders, holder_count, smart_wallet_count, sharp_wallet_count, traders, side_summary and backed_sharp_usd are unchanged. The display roster can include additional wallets, so read those fields rather than deriving them from the roster.
  • Each row carries the same fields as before, including entry_value_usd and the serve-time category win rate.
Backward compatible. No field is added, removed or retyped; display_holders can carry more entries.What to change: Preserve the returned roster order, match lead_backer.address to find the lead, and use returned counts and aggregates. A displayed holding is not an endorsement or a win probability.
Paid profiles can load pUSD wallet observations from Goldsky
The first-party session endpoint GET /api/trader/{address}/funding/supplemental adds manually requested pUSD balances and recent transfers for Pro and Max accounts. It resolves the profile’s stored wallet address; it does not combine owners or proxies.Use POST /api/trader/{address}/funding/supplemental/refresh to request a refresh; GET only reads cached data. These session endpoints are separate from the public /api/v1 API and existing confirmed funding. Before this change, these session endpoints and the balance diagnostic were unavailable.
  • Balances and amounts are raw decimal integer strings with six decimals. A missing balance remains unavailable rather than becoming zero. fetched_at records retrieval; last_changed_at records the last balance change.
  • History covers a fixed window of up to 30 days, capped at four pages of 25 transfers, including settlement and redemption. through_block is the finalized upper block used for the scan, not a guarantee of an atomic provider snapshot. Identical transfer rows can be legitimate; no unique event identifier is supplied.
  • next_cursor reads an immutable stored snapshot for up to one hour; preserve it unchanged. An expired or invalid cursor returns 400; restart without a cursor. A refresh request can return refresh_status: "pending"; use bounded retries and honor the supplied retry time, then stop polling once observations load.
  • Stale successes and source failures remain visible independently. These observations do not define verified funding, spendable trading cash, wallet grades or P&L.
Operators can invoke the balance diagnostic, which changes nothing, by setting GOLDSKY_WALLET_PARITY_ADDRESS before starting the backend. It samples at most four Goldsky conditional-token balance rows and compares full raw integers with Polygon at each supported row’s finalized block.The match_at_row_block verdict confirms only the historical row block, not current freshness. The JSON receipt reports unsupported, unavailable and incomplete coverage explicitly; it performs no reconciliation or database repair.Backward compatible. Existing endpoints, analytics and canonical provider facts are unchanged.What to change: Nothing for existing clients. New session clients should load explicitly, display source and retrieval time, preserve cursors, and distinguish unavailable balances from zero.
Pick of the Day adds available ATP and WTA singles rankings
GET /api/v1/pick-of-the-day now includes an optional ranking on tennis participants in sports_context. Before this change, participant objects had no tour ranking.
  • rank is the positive singles ranking, and tour identifies atp or wta.
  • source: "api_tennis" identifies API-Tennis as the data source.
  • observed_at records when the ranking was retrieved, and expires_at is the UTC deadline after which you must hide it, even in a cached response. Both are UTC timestamps.
API-Tennis does not supply a ranking publication date, so observed_at is not that date. This is the latest retrieved ranking, not the player’s ranking at match time. ranking is absent when a ranking is unavailable or expired, or the participant is unranked, ambiguous, or a doubles entry.Backward compatible. This field is additive.What to change: Nothing. Read ranking to display an available tour ranking.
Pick of the Day retains verified final scores after the live score expires
GET /api/v1/pick-of-the-day now retains a settled pick’s verified final score in its existing sports_context fields after the live score expires. Read each participant’s score, or sets_won and sets for tennis.Before this change, a settled pick could lose its score when the live score expired or the provider stopped returning it. The pick’s recorded outcome remained available independently.Scores remain unavailable when no final result has been verified for that game. A settled market alone does not establish the sporting final.Backward compatible. Response fields and score formats are unchanged.What to change: Nothing.
Large trade detail shows counterparties once a pending receipt is processed
GET /api/v1/large-trades/{id} now returns a trade’s counterparties on the first request after its Polygon receipt is processed, under a new counterparty_analysis.snapshot_id. The deprecated alias GET /api/v1/whale-trades/{id} and the website’s trade page behave the same way.Before this change, a trade first requested before its receipt was processed returned counterparty_analysis.status: "unavailable" with no executions on every request until the next UTC day. A client that reads each new trade as soon as it appears always hit this case.
  • Each snapshot_id still names a fixed set of executions that lives 24 hours. The earlier snapshot does not change when a later request names a new one.
  • Execution and maker cursors stay bound to the snapshot_id and analysis_id they came from, so a client paging the earlier snapshot keeps reading the same set.
Backward compatible. Response fields and paging rules are unchanged.What to change: Nothing. To get the counterparties of a trade that returned none, request its detail again and page with the snapshot_id from that response.
Flow cursors and ETags remain stable when rankings change no rows
GET /api/v1/markets/sharp-money-flows and its deprecated alias GET /api/v1/markets/smart-money-flows now keep next_cursor and ETag unchanged when a ranking update changes none of the rows in the collection.Before this change, an unrelated ranking update could expire a cursor and change the ETag. Cursors still expire when your filters or the rows behind them change.Cursors issued before this change must be restarted from the first page.Backward compatible. Parameters, response fields, and error shapes are unchanged.What to change: Nothing. Keep handling cursor_expired by requesting the first page again.
Pick of the Day updates newly issued entry authorizations
GET /api/v1/pick-of-the-day updates the price permissions in newly issued entry_authorization objects. The TypeScript client accepts the additional opaque authorization version.Before this change, new authorizations used the previous allowance. Existing grants retain their returned ceiling and expiry; this change does not rewrite them.
  • Read entry_authorization.max_entry_price as the API’s price ceiling, not a promised fill or a profit estimate.
  • The auto-buy trader still enforces its independent default MAX_SLIPPAGE_PCT=3 against the published pick price. The lowest price ceiling wins.
  • The trader checks an executable quote for the requested stake, then submits a Fill-and-Kill BUY limited to that quote rounded down to the market’s price increment. Actual fills can be lower or partial; fees are additional.
Breaking for clients that reject the additional authorization version. Response fields are unchanged, and existing grants keep their values. Clients that already support the returned version need no change.What to change: Honor the returned max_entry_price and expiry instead of calculating a limit yourself. Update clients that do not support the returned authorization version, and keep any stricter local price and slippage limits. potd-trader 0.3.1 and later already support this version, so this API change does not require a trader upgrade.
Pick of the Day lead_backer adds the net position of a two-sided lead
GET /api/v1/pick-of-the-day now adds optional lead_backer.net_position_usd when the lead wallet also held the other outcome of the pick’s market at publication. The TypeScript client and the Pick of the Day MCP tool schemas describe the same field.Before this change, lead_backer gave only position_usd, the gross value on the backed outcome, with no sign that the wallet also held the other side.
  • net_position_usd is the backed-outcome shares minus the other outcome’s shares, valued at the backed outcome’s provider price at publication, in USD.
  • The field is omitted for a one-sided lead, whose net equals position_usd. It is never null.
  • position_usd keeps its meaning: the gross provider-reported value on the backed outcome.
Backward compatible. The field is additive and optional.What to change: Nothing. To show how much of a two-sided lead’s position leans toward the pick, read net_position_usd when present and fall back to position_usd when it is absent.
Team-logo images refuse query parameters that do not match the published URL
With this change, team-logo images returned by GET /api/v1/pick-of-the-day and documented by the TypeScript SDK validate the query before immutable caching. Published URLs use no query string, an empty query string, or exactly one v parameter with the published content hash. Canonical team-logo URLs and API response schemas remain unchanged.Before this change, the image route ignored query strings and could serve the same crest with immutable caching under different query strings.The API origin refuses extra parameters, duplicate parameters, malformed parameters, and nonmatching versions without immutable caching. The website also checks query shape before later parameter normalization, although a fixed framework suffix can normalize before that check. Those aliases are not published URLs; this change does not promise how malformed HTTP request targets or existing cache entries behave.Breaking for clients that add query parameters or replace v on a team-logo URL.What to change: Treat each returned logo URL as opaque and preserve it, including v. Resolve a relative URL against the API origin without changing its query string.
MCP tool results return compact JSON text
POST /api/v1/mcp now returns result.content[0].text of a successful tools/call as compact JSON, with no indentation or line breaks. The sandbox endpoint POST /sandbox/api/v1/mcp does the same, and so does the local stdio server in @0xinsider/mcp from version 2.14.1.Before this change, the text was indented JSON, 1.3 to 1.44 times the bytes of the same JSON written compactly on the documented examples. result.structuredContent, every field and value, result.isError, and the text of a failed call are unchanged.Backward compatible. The text parses to the same JSON as before.What to change: Nothing if you parse the text as JSON or read result.structuredContent. If you matched the text’s line breaks or indentation, parse it as JSON instead.
Sandbox MCP discovery describes the current Pick of the Day access rules
POST /sandbox/api/v1/mcp now returns current description and outputSchema metadata for the daily pick, pick ledger entry, and pick archive tools in tools/list.Before this change, the sandbox retained older pick descriptions and schemas after production added Max access and fields describing locked selections. The sandbox now reflects the published production contract; live MCP behavior and tool arguments are unchanged.Backward compatible. This corrects sandbox discovery metadata.What to change: Refresh any locally cached sandbox tool catalog.
Pick of the Day improves the consistency of recorded lead history
GET /api/v1/pick-of-the-day improves the consistency of the lead wallet history recorded with new picks.Before this change, some provider records could produce an unreliable history. Previously published picks retain their recorded history; a wallet record is not a guarantee about a pick’s outcome.Backward compatible. Response fields and account access are unchanged. Previously published picks retain their recorded history.What to change: Nothing.
Pick of the Day updates scheduled publication timing
GET /api/v1/pick-of-the-day moves scheduled automatic publication closer to kickoff. Read the returned release_at for each pick.Before this change, automatic picks had an earlier scheduled release relative to kickoff. Stored schedules remain authoritative, and actual publication can trail the scheduled instant.Backward compatible. Response fields, account access, and pick limits are unchanged. The TypeScript client and MCP tool retain the same response shapes.What to change: Schedule reads from returned release_at, error.retry_at, or Retry-After. Remove fixed calculations from kickoff, and do not poll before the returned time.
Pick of the Day adds recorded lead wallet positions and directional category history
GET /api/v1/pick-of-the-day adds optional full-only lead_backer facts, also described by the TypeScript client and Pick of the Day MCP tool.Before this change, full picks could carry a recorded category specialist and holder roster, but no separate lead position clock or directional realized-history record. Legacy picks retain those fields and omit the new object.
  • address, name, grade, and category identify the recorded lead wallet.
  • position_usd is its provider-reported backed-outcome value at publication, with the start of the provider position fetch in position_observed_at. This conservative observation clock precedes completion. The value is not entry cost or a live balance.
  • directional_event_count, realized_pnl_usd, entry_basis_usd, fractional roi, and recorded_at describe the recorded directional category sample. Entry basis does not assert complete costs or fees.
  • max_realized_drawdown_usd measures realized P&L declines after each event result in that sample, excluding intragame, unrealized, and account equity drawdown.
  • Read the returned display_holders roster, holders projection, and recorded counts and aggregates separately. Their populations can differ; do not reconstruct one from another.
Backward compatible. The new object is optional, account access is unchanged, and legacy picks retain their recorded semantics.What to change: Render lead_backer only when present, label its position and history clocks separately, and use the returned roster rather than reconstructing support. An omitted value is unavailable, and the wallet record is not the pick’s win probability.
Market snapshots and score frames retain unexpired tennis points during detail outages
GET /api/v1/market/{condition_id}/snapshot retains compatible, unexpired sports.live_score.tennis_points when the supplemental snapshot is temporarily unavailable or cannot be read because another refresh holds it. LiveScoreChanged frames on GET /api/v1/stream retain the same live_score.tennis_points detail.Before this change, a failed detail refresh could remove valid current-game points. Points still disappear at expiry or when the player identity, set, game, or live state no longer matches. Their revision remains independent of the enclosing Polymarket score revision.SDK getMarketSnapshot and MCP get_market_snapshot inherit the snapshot behavior.Backward compatible. No response fields were added or retyped.What to change: Nothing. Keep checking expires_at, set_number, and games before displaying the point group.
Market snapshots retain live esports map scores through incomplete updates
GET /api/v1/market/{condition_id}/snapshot, SDK getMarketSnapshot, and MCP get_market_snapshot preserve sports.live_score.scores[].map_score for the same live map when a newer score update omits both sides.Before this change, an incomplete update removed available map detail. A present canonical pair still replaces the retained values, and a map, series score, or live-state change clears them. Series totals keep their existing meaning.Backward compatible. No response fields were added.What to change: Nothing.
Pick stats leave z-scores unavailable when contributing selections share a game
GET /api/pick-of-the-day/stats now returns null for market_expectations.windows[].wins_z, units_z, and their display strings when multiple priced, decided selections share a canonical game. The affected window also returns numeric_unavailable: true.Before this change, the comparison used an independent-outcome variance formula even when selections shared game exposure. Counts, expected_wins, recorded units, and CLV measurements retain their existing calculations. Pending, void, and unpriced selections do not trigger this guard.Backward compatible. These fields were already nullable; the response shape is unchanged.What to change: Treat a null z-score as unavailable, never as zero, and keep reading the other measured values. Same-game selections need not be independent.
Pick of the Day can include multiple selections from one game
GET /api/v1/pick-of-the-day can now return multiple selections from one game, within the release’s 15-pick daily ceiling.Before this change, the automatic slate allowed at most 1 selection per game. Same-game picks share exposure and need not be independent. Response fields, account allowances, and historical picks remain unchanged.Breaking for clients that assume a game can have only 1 pick.What to change: Retain each pick_id instead of deduplicating by game, and treat selections from the same game as related exposure. Keep honoring each selection’s existing entry authorization and expiry.
Full sports board and rail feeds retain verified moneyline kickoff times
GET /api/activity/sports-board and GET /api/activity/sports-board/rail now retain verified Polymarket kickoff in the optional game_start_time field for upcoming single-moneyline games. The full rail hub feed retains the same field.Before this change, these games omitted game_start_time even when Polymarket supplied a valid kickoff.
  • game_start_time is UTC, parsed from the moneyline market’s gameStartTime. Missing or malformed provider values leave it omitted.
  • event_date keeps its existing fallbacks and is not proof of kickoff.
  • Compact rail and rows=board responses continue to omit this field.
  • GET /api/v1/games and GET /api/v1/games/{event_slug} keep the same scheduled_at values and response fields.
A moneyline game’s consensus response also withholds pregame recommendations after its verified kickoff passes, even if the provider still lists it as scheduled.Backward compatible. An existing optional field gains coverage; no field becomes required.What to change: Nothing. Use game_start_time when you need verified kickoff, and keep an omitted value unknown.
Pick of the Day covers more markets within the existing 15-pick daily ceiling
GET /api/v1/pick-of-the-day can now return qualifying selections from a wider range of markets.Before this change, some markets were outside the selection coverage. The daily ceiling remains 15, with at most 1 selection per game. A day with fewer qualifying selections still returns fewer picks.Backward compatible. Response fields, account allowances, and rank and count limits remain unchanged.What to change: Nothing. Read the returned pick counts; the daily ceiling does not guarantee 15 picks.
Game and market score clocks include cached Polymarket event observations
GET /api/v1/games and GET /api/v1/games/{event_slug} now populate freshness.scores_observed_at for scores read from Polymarket’s Gamma events API. GET /api/v1/market/{condition_id}/snapshot carries the same clock in sports.live_score.observed_at, including the JSON embedded in market context as Markdown.Before this change, a score without a Sports WebSocket observation could omit these clocks, so clients could not date that score observation.The timestamp records when 0xinsider successfully read the provider event. Cached responses retain that timestamp; it is not the provider’s score update time or an official score revision. scores_source_at remains absent when the provider supplies no source clock.Backward compatible. Existing optional fields gain observation coverage. No required field or response type changes.What to change: Nothing. Read these optional clocks to date score observations, and keep treating an absent clock as unknown.
potd-trader 0.3.6 enforces authenticated Pro and Max daily pick limits
potd-trader 0.3.6 verifies your Pro or Max allowance from the authenticated feed response and reserves at most 5 daily picks on Pro or 15 on Max. Pro includes the designated free selection, whose presentation slot can be greater than 5.Before this change, the trader relied on the filtered feed and spending cap without its own account pick limit. It also warned Pro accounts against a larger publication maximum.
  • X-Monthly-Quota-Limit must match the current included allowance: 500,000 for Pro or 2,000,000 for Max. Missing or unknown values stop trading. Pay-as-you-go ceilings do not determine the plan.
  • Accepted, submitting, and unknown reservations count toward the daily pick limit using the America/New_York date. The spending cap keeps its independent UTC date and is not raised.
  • A changed allowance, including on 304, discards cached picks and requires a fresh read. Historical wire ranks through 20 remain readable.
Breaking for feeds or proxies that remove the authenticated allowance header. Existing ledger files remain readable, and the API response contract does not change.What to change: Stop older watchers, install 0.3.6, and keep the same local configuration and ledger. Check run --dry-run before enabling live orders yourself. See the setup and upgrade guide.
Developers can create multiple independent live API keys
Developers and POST /api/keys now create independent live API keys without invalidating your existing keys. Each new key carries all scopes and stays valid until revoked.Before this change, an account could have only 1 active default key, and another creation request returned 409. Replacing it from Developers revoked the old key.
  • Create key adds a key; the page shows the full secret once.
  • Revoke and DELETE /api/keys/{id} stop only the selected key.
  • All keys and OAuth tokens still share the account’s request quota and rate limits. Creating more keys adds no allowance.
  • The legacy POST /api/keys/regenerate still revokes every active default key and creates 1 replacement. Named integration keys and OAuth tokens are unaffected.
Backward compatible. Existing keys keep working; the create endpoint now accepts additional keys.What to change: Use POST /api/keys to add a key. Use POST /api/keys/regenerate only when you intend to replace every active default key.
Daily pick OpenAPI descriptions match the 15-pick limit
The OpenAPI operation descriptions for current picks and the pick archive now state that Max opens up to 15 available selections.Before this change, these two descriptions still said 20 after the daily limit and numeric schema maxima had returned to 15. Max features, Pro access to 5 picks, the private feed’s independent 15-pick limit, and historical selections remain unchanged.Backward compatible. Only the two operation descriptions change; numeric bounds, response fields, and historical proof remain unchanged.What to change: Refresh cached OpenAPI documentation. Keep reading the returned pick counts; no day guarantees 15 picks.
Pick of the Day restores the 15-pick ceiling
Pick of the Day limits new daily selections to 15. Current, scheduled, proof-pending, archive, and identity-free locked_picks schemas declare rank or count maxima of 15.Before this change, the Max release declared a daily ceiling of 20. Pro still opens 5 picks in total, including the free selection; Max still opens every available published pick and includes all Pro features. Existing selections keep their identities, order, and historical proof.Breaking for clients that assume a 20-pick daily capacity. Response fields and plan features remain unchanged.What to change: Allow up to 15 new daily selections and read the returned counts. Neither plan guarantees its full daily limit.
Daily pick schemas allow ranks and counts through 15
Pick of the Day now documents pick_rank and pick_count ceilings of 15. Scheduled picks, proof-pending picks, and archive entries also allow ranks through 15.Before this change, the app’s API schema still declared a maximum of 10, although the backend allowed up to 15 daily picks. The ceiling is a limit, not a promise that every day has 15 picks.Backward compatible. The accepted range expands; no existing field is added, removed, or retyped.What to change: Regenerate schema-based clients if they enforce the old maximum of 10.
Sports team logos add official NBA, NHL, and MLB crests
Pick of the Day fields sports_context.yes_team.logo and sports_context.no_team.logo now return official crests for 30 NBA, 32 NHL, and 30 MLB clubs alongside the existing 32 NFL and 15 WNBA clubs.Before this change, NBA, NHL, and MLB club logos used provider-hosted artwork. Novelty and national-team rows outside these club sets keep provider artwork. Vendored crests now also carry measured logo_mark_dark verdicts.Backward compatible. This is additive logo coverage; response fields and provider team IDs are unchanged.What to change: Resolve relative logo paths against the API origin and keep accepting provider-owned absolute URLs. Use a light plate when logo_mark_dark is true. No response schema change is required.
potd-trader 0.3.5 accepts Pro and Max slates through 20 ranks
potd-trader 0.3.5 accepts pick and schedule ranks through 20 and reports identity-free locked_picks as upgrade information, never as trade candidates.Before this release, 0.3.4 rejected an entire slate when a rank exceeded 10. The patch keeps existing spending caps, the 25 pUSD settings default, the init suggestion of 10 stakes, and all order guards unchanged.Backward compatible with existing settings and ledgers. A configured budget can still prevent buying every entitled pick.What to change: Use the updated install pin. Stop every old watcher, preserve the same configuration and ledger, and check status and a dry run before enabling live mode. Do not use 0.3.4 as a Max-compatible consumer.
Pick access adds Max and withholds unresolved game identity
Pick of the Day now supports up to 20 daily picks. Pro opens 5 daily picks in total, including the free selection; Max opens every available published pick up to 20. A day can publish fewer picks.Before this change, the daily limit was 15 and Pro opened all paid picks. Unauthorized pending rows could expose game identity, and public sealed ledger entries included kickoff.
  • locked_picks describes unauthorized unresolved published or scheduled ranks with only pick_rank and required_tier: "max".
  • When only locked ranks have published, a successful response has state: "none", picks: [], and pick_count: 0. This is not a proof-warming error.
  • Public API scheduled_picks retains only entitled rows with release_at and kickoff; unauthorized scheduled ranks move into locked_picks. The website keeps redacted scheduled descriptors without clocks. Unauthorized pending archive rows omit game identity and identifying clocks; required_tier states the access needed.
  • Public sealed ledger entries omit kickoff. Pending uncommitted entries omit matchup and category. Opened proof payloads and historical commitments remain unchanged.
  • Regenerated SDK declarations describe optional archive identity and omitted sealed kickoff. Public schedule rows retain their clocks. This entry does not announce a new published SDK version.
Breaking for clients that require unresolved game identity, sealed kickoff, or Pro access beyond its 5 entitled picks.What to change: Handle state: "none" and locked_picks, allow omitted clocks and identity fields, and preserve unknown values instead of enriching locked rows. Use updated SDK declarations when released, refresh cached MCP descriptors, and use Max credentials to open additional unresolved picks. Keep stable pick IDs and versioned proof verification, and upgrade consumers whose rank validators stop at 10 before using the 20-rank contract.
API monthly allowances increase for Pro and add Max
API usage now reports 500,000 included requests per UTC month on Pro and 2,000,000 on Max. Max inherits Pro API and MCP features; the 100-request and 2,500-batch-item minute limits remain unchanged.Before this change, Pro included 250,000 requests per month and its pay-as-you-go ceiling was 1,000,000. Pay as you go still costs $0.20 per 1,000 additional requests, with a ceiling of up to 4 times the plan’s included allowance: 2,000,000 on Pro or 8,000,000 on Max.The optional nullable monthly_quota.unavailable_reason is usage_price_reconciliation_required when billing must be reconciled before pay as you go can be used. In that state, pay_as_you_go is false; it does not indicate an ordinary opt-out.Backward compatible. Existing keys, scopes, and authentication flows remain available.What to change: Read monthly_quota.limit, ceiling, and X-Monthly-Quota-* rather than hardcoding a quota. Show a Billing or support action for reconciliation, and keep monthly-reset retries in your scheduler.
Pick of the Day can carry up to 15 selections per day instead of 10
GET /api/v1/pick-of-the-day can now carry up to 15 selections per day. The same ceiling applies to Pick of the Day MCP reads and scheduled selections. Each game can still contribute at most one selection, and days with fewer qualifying markets carry fewer picks.Before this change, the daily ceiling was 10. Existing selections keep their identities, order, and historical proof.Backward compatible. No fields or response shapes change.What to change: Allow 15 items if you enforce a fixed ten-item ceiling. Otherwise, nothing.
Live tennis scores add optional current-game points and the serving player
Market snapshots and LiveScoreChanged frames in the live stream and browser feeds now carry optional live_score.tennis_points from API-Tennis. The Markdown market context includes the same optional group.Before this change, tennis scores carried Polymarket’s set scores without current-game points or a serving player.
  • points, player_keys, and games follow the same first/second order as live_score.scores. match_key and player_keys are API-Tennis IDs, separate from Polymarket IDs.
  • serving_side is first or second. It is omitted when the provider does not identify the server. An absent point group means unavailable, never zero points.
  • The group carries its own source_revision, observed_at, expires_at, and set_number. Display it only while the match is live, its current set/games match the enclosing score, and it is before expires_at, 30 seconds after observation. Cached responses and replayed frames can retain expired facts.
  • Subscribe with event=LiveScoreChanged and no market, wallet, grade, or size filters. These frames identify their match by event_slug and resume through the stream’s Last-Event-ID window. The durable event replay route still returns large-trade events only.
Polymarket still supplies the enclosing score, set columns, period, status, and outer revision.Backward compatible. The new group is optional, and existing score fields retain their meaning.What to change: To display points and the serving player, read this group in scoreboard order, compare its revision only with the same match’s point revision, and hide it at expires_at or a set/game mismatch. Keep missing facts unknown. Regenerate your client from the OpenAPI document for the new types.
Private trader feed coverage metadata now matches its existing candidate policy
The private trader feed now reports coverage metadata that agrees with its existing candidate policy.Before this change, coverage metadata could disagree with which markets the feed could consider. Candidate selection, response fields, and the policy version remain unchanged.Backward compatible.What to change: Nothing.
Trader styles add 6 observable labels to profiles and leaderboard filters
GET /api/v1/trader/{address} with expand=strategy, Batch traders, and Leaderboard now support 6 activity labels: two_sided, category_focused, high_activity, diversified, mixed, and unclassified. The leaderboard’s strategy filter, SDK types, and MCP get_leaderboard input accept these values too.Before this change, the classifier chose the first matching archetype from 10 labels. Fill-price patterns and activity spans could imply scalping, automation, or market making, and negative performance could replace a behavior label with speculator.
  • New classifications compare two-sided positions, cost basis by category, and recorded fill counts over stored lifetime history. Profit and win rate no longer determine the style.
  • mixed means usable history has no dominant pattern. unclassified means limited usable history; a wallet without a stored classification can still omit strategy.
  • The 10 historical IDs remain readable and accepted as filters. They select their existing rows until normal reclassification updates them; they are not aliases for the new IDs.
  • Public confidence remains omitted. Internal rule scores describe support for a pattern, not calibrated probabilities.
Backward compatible. The new IDs are additive, and existing filter values remain accepted.What to change: Add the new IDs to closed enums and exhaustive label switches, or regenerate your client from the OpenAPI document. Keep support for historical IDs, and update SDK or local MCP types before sending a new filter value. See Wallet trading styles for the evidence rules and limits.
Tennis photos carry independent revisions and immutable image versions
Tennis competitors in GET /api/v1/pick-of-the-day and sports responses now carry optional headshot_revision beside headshot. A successful new resolution or a change to image bytes increases this integer independently of the sports source_revision. Legacy saved photos use 0; the field is omitted when no photo resolves.Before this change, a resolved portrait was not refreshed from its source, and replacing stored bytes could change what an existing versioned URL returned.
  • A headshot URL with ?v= keeps its original image bytes after a refresh. Unambiguous existing 12-character hexadecimal versions continue to resolve, and new versions use the full SHA-256 content hash.
  • An unversioned image URL revalidates, so it can return the current portrait.
  • A check that finds the same image or updates its attribution leaves the image revision unchanged.
  • Source refresh retains the last good photo when its source fails. Explicitly imported tour portraits remain pinned, and a refreshed photo does not promise a recent photography date.
Backward compatible. headshot_revision is optional, and existing headshot URLs remain supported.What to change: Compare headshot_revision only for the same player; use matching, non-null (tour, provider_id) values as its identity. A greater image revision replaces the portrait, an equal revision can fill a missing URL, and a lower revision must not replace a newer portrait.Keep using source_revision to order score updates; a newer image revision does not make an older score current.
Webhook verification gains durable asynchronous attempts
Start webhook verification now returns 202 with an attempt UUID and status path. Get webhook verification reports its current state and sanitized outcome. SDK 0.17.0 adds createWebhookVerificationAttempt and getWebhookVerificationAttempt.Before this change, Verify a webhook waited for the receiver. That route keeps its 200 activation and 422 failure behavior. The new routes are additive.
  • Admission accepts the current one-time token and an optional Idempotency-Key.
  • Repeated admission for the same endpoint and token recovers the same attempt. A key replay returns the original response; poll status for changes.
  • A signed asynchronous challenge includes a stable attempt ID. Transient failures can retry up to 4 claimed challenges, within 15 minutes or the token’s earlier expiry.
  • Only a successful challenge before expiry activates the unchanged endpoint. Terminal attempts do not restart.
Backward compatible. Existing synchronous clients need no changes. What to change: Upgrade to SDK 0.17.0 and use admission plus polling when receiver latency should not delay your API response. Correlate repeated asynchronous challenges by verification_attempt_id.
Pick of the Day can draw from more sports and esports markets
GET /api/v1/pick-of-the-day can draw published picks from more sports and esports markets. Before this change, some of these markets were excluded.Days with fewer qualifying picks can still return fewer than the daily limit.Backward compatible.What to change: Nothing.
Exports that pass their retention deadline now finish as failed
Trader exports and large-trade datasets now finish as failed if they do not become downloadable before expires_at. The terminal event is export_job_failed, with failure_reason: "expired_before_completion" and next_action: "resubmit".Before this change, work could continue after the deadline and emit export_job_ready even though status and download already reported expiry. The retention window stays the same, including when an export starts shortly before the deadline.Backward compatible. The existing failure status and event describe this outcome; no fields or event types are added.What to change: Submit a new export after expiry. Always check the authorized status and download routes when you receive a ready event, because delivery can arrive after a previously ready export expires.
SDK stream openings and refusal bodies have finite bounds
@0xinsider/sdk 0.16.1 bounds SSE connection opening with openTimeoutMs (15,000 ms by default) and refusal bodies with maxErrorBodyBytes (65,536 bytes by default). Once a readable text/event-stream response is established, the opening deadline is cleared and your cancellation signal remains active for the stream’s full lifetime.Before this change, an opening or stalled refusal body could wait indefinitely, and a large refusal was buffered to its end. The new options are additive and separate from the client’s REST timeoutMs.
  • A header deadline throws RequestTimeoutError for getStream; resilient consumers use their existing bounded reconnect policy.
  • Incomplete refusal bodies retain HTTP status, Retry-After, and X-Request-ID. StreamRefusalBodyError on the HTTP error’s cause distinguishes an absent, empty, invalid JSON, oversized, stalled, or unreadable body without copying raw text.
  • Invalid stream and reconnect limits fail before a request or reconnect callback. Cursor, checkpoint, and healthy stream lifetime behavior are unchanged.
Breaking for consumers that intentionally allow an opening longer than 15 seconds or need JSON refusals larger than 65,536 bytes.What to change: Set openTimeoutMs to a larger supported positive integer, or null to disable its deadline explicitly. Set maxErrorBodyBytes to a larger positive safe integer if you require larger refusals; continue handling HTTP status and retry guidance when the body is incomplete.
Daily picks can release earlier for all games
Pick of the Day can now become available earlier in the day. Before this change, daily publication started later.Use the returned release and retry timestamps. The selected market and side stay fixed.Backward compatible. The response fields are unchanged. What to change: Follow the returned retry_at and next_api_request_at timestamps instead of a hardcoded opening hour.
API usage keeps late accounting in the original UTC day
API usage history and monthly budget reconstruction now include request records committed after their UTC day was first closed. Usage keeps its existing response fields and quota limits.Before this change, a late accounting record could be omitted from closed-day history until the next daily update. It now stays in the day when the request was observed, and current periods remain provisional while accounting finishes.This corrects usage counting without changing request prices or the existing monthly admission counter. It does not claim that a historical invoice was wrong or repaired.Backward compatible. No fields, limits, or prices change.What to change: Nothing.
Selected picks retain a scheduled release time
Pick of the Day automatic selections again keep a scheduled release time instead of becoming public immediately. Each selection keeps its chosen market and side; cancellation or unavailable market data can prevent release.Backward compatible. Response fields keep their shapes. release_at records the scheduled release instant; published_at records actual publication. Historical timestamps and stored schedules are preserved.What to change: Keep using the returned release_at, Retry-After or error.retry_at. Freezing a selection does not make it immediately public.
Automatic picks can become available earlier
Pick of the Day automatic selections can now become available earlier. Previously, they waited for a later release time. Missing market data can prevent release; stored schedules remain supported.Backward compatible. Response fields keep their shapes. release_at records the stored release time; publication can trail it. Historical timestamps and optional execution permission keep their contracts.What to change: Remove fixed calculations from kickoff. Use the returned release_at, Retry-After, or error.retry_at to schedule reads. An earlier publication can precede that advisory retry.
Scheduled picks keep their selected identity through release
Pick of the Day keeps each scheduled selection through release. Ordinary changes after selection no longer replace or cancel it. Cancelled or already-started games remain unavailable, and missing market data can delay publication.Before this change, a scheduled selection could change or disappear before publication.Backward compatible. Response fields and optional execution authorization keep their contracts. A published selection alone does not grant permission for an automated entry.What to change: Nothing. Continue honoring returned execution authorization, its expiry, and the current executable book for your order size.
MCP setup pins the curated 2.14.0 package
MCP setup now pins @0xinsider/mcp@2.14.0. The package uses high-level tool descriptions and the documented customer pick contract, with the same 48 tools.Before this release, the setup examples installed 2.13.0. Published selections, ordinary holder facts, prices, results, identity, access, and execution permission keep their contracts; internal selection diagnostics are no longer part of the customer pick response.Breaking for clients that require internal selection diagnostics. Authentication and client configuration remain unchanged.What to change: Upgrade the package and use documented customer fields. Honor returned entry permission, its expiry, and a current executable book for your order size.
Pick notifications link to stable selection pages
New Pick of the Day email, Discord, and inbox notifications link to the selection’s page at /pick-of-the-day/picks/{pick_id}. A stable link opens the same selection, and a replacement has its own ID and page.Before this change, notification links could identify a date and slot or open the current pick page. Earlier emails and messages keep their original URLs, and dated links continue to work.Backward compatible. Opening a notification keeps the selection’s Free or Pro access requirement. No REST or SDK response fields change.What to change: Keep notification destinations as URLs. Use pick_id for selection identity instead of extracting a date or slot from a link.