The Pick of the Day record is now stated at a flat $1,000 a pick instead of $100, for every pick ever published. The TypeScript SDK gains a keyless sandbox client, and its batch trader lookup now sends the required request shape; remote MCP acknowledges supported notifications without a JSON-RPC reply and tells a client on GET that it offers no server-to-client stream, so clients stop reconnecting every second. Every API response carries one request ID in the header and the body, and every API failure answers the error envelope. GET /api/v1/events/feed/since no longer skips a large trade that lands out of order. Pay as you go gains a 1,000,000 request monthly ceiling. A report is final only once it is built after its period ends.
Pick of the Day
- The public record now states every result at a flat $1,000 a pick instead of $100, for every pick ever published: a win returns $1,000 divided by the frozen price, a loss forfeits the $1,000. Profit, total staked and each pick's payout read ten times larger; win rate, ROI and units are the same numbers as before. The verifiable ledger at github.com/0xinsider/picks recomputes on the same basis.Was
$100 a picknow$1,000 a pick - RemovedPick of the Day cards no longer show the redundant Why explanation; the side, price, result and holders remain on every current and historical pick.
Pages
- RemovedThe Earnings markets page is retired:
/earningsnow sends you to the Polymarket hub. The Earnings category stays in the terminal and in category P&L.
API
- New
GET /api/v1/pick-of-the-dayandGET /api/v1/pick-of-the-day/archiveaddstake_usd(1000) andreturn_usdbesidereturn_per_100on every priced pick, andhit_rateaddsstake_usd;payout_display,profit_display,net_profit_usdandstaked_usdare now stated on the $1,000 stake, whilereturn_per_100,unit_score,roi_pctand the hit rate are unchanged. Additive: a client that readsreturn_per_100needs no change (@0xinsider/sdk0.2.6). - NewThe TypeScript SDK's
OxinsiderApiClient.sandbox()calls the API sandbox athttps://0xinsider.com/sandbox/api/v1with no key, lifts itsX-Oxi-Sandboxheader tometa.sandbox, turnssandbox_statusinto the same typed error production would throw, and refuses a live key; abaseUrlwith a path now keeps that path (@0xinsider/sdk0.2.2). - NewEvery
/api/v1response adds the browser-readableServer-Timingheader with its processing time in milliseconds; existing clients need no changes. - New
GET /api/v1/meaddscredential_statusandentitlement.paid_data_access/entitlement.recovery_action, and a valid credential with lapsed paid access can readGET /api/v1/usageto inspect its budget. Additive: paid-data routes still return402 subscription_required, and existing clients can ignore the new fields. - NewV1 query handling stays compatible by default while successful responses expose
X-Query-IgnoredandX-Effective-Query; clients can sendX-Query-Validation: strictto receive400witherror.reason=unknown_query_parameterfor an unsupported name. Additive: existing callers need no change. GET /api/v1/leaderboard/trendingbinds itscursorto the originallimit,windowand ranked board; a changed board or pagination scope returns400witherror.reason=cursor_expired, and legacy page-only cursors restart from page one.WasPage-only cursornowBoard- and scope-bound cursor- New
GET /api/v1/insider-radaracceptsmode=stablefor a bounded walk over one published scoring generation; its cursor carries the limit and filters, and a republished score set returns400witherror.reason=cursor_expiredso clients restart from the first page.mode=liveremains the default. - NewThe Go SDK's
OpenStreamreadsGET /api/v1/streamframe by frame with a 1 MiB ceiling per frame and closes on context cancel, fails visibly withStreamProtocolErroron a frame that is not JSON, not an envelope, has no usable sequence or is a malformedresyncmarker, and a client fromNewrefuses the generatedGetStreamWithResponse, which read the stream to its end and never returned (github.com/0xinsider/0xinsider-go0.2.0). - NewThe Python and Go SDKs send an API key or OAuth token over
https://only, or overhttp://tolocalhost,127.0.0.1or[::1]for a backend you run yourself; a base URL that would send it anywhere else raisesInsecureTransportErrorbefore any request, and a redirect to plainhttp://never carries the credential (0xinsider0.2.0 on PyPI,github.com/0xinsider/0xinsider-go0.2.0). - NewThe Python and Go SDKs now carry every one of the 64 API operations, adding
POST /api/v1/agents/register,GET /api/v1/trader/{address}/categories,GET /api/v1/pick-of-the-day/ledger,GET /api/v1/market/{condition_id}/holders,POST /api/v1/webhooks/{id}/deliveries/{delivery_id}/redeliver,GET /api/v1/market/{condition_id}/context.mdandGET /api/v1/me, and each release states the OpenAPI document it was generated from (OPENAPI_SHA256andAPP_COMMITin Python,OpenAPISHA256andAppCommitin Go;0xinsider0.2.0 on PyPI,github.com/0xinsider/0xinsider-go0.2.0). - NewThe agent discovery catalog also answers at
/.well-known/ard.json, the Agentic Resource Discovery path, and now lists both MCP servers and all seven skills (the two under/.well-known/agent-skills/and the five in the Agent Plugin) with sample queries a registry can search on; the OpenAPI document,developers.json, the plugin manifest andAGENTS.mdare linked from the entries, and every page's<head>names the catalog withrel="ard". - NewBuilder webhooks add staged signing-secret rotation through
POST /api/v1/webhooks/{id}/rotate-secret/prepare,/activate, and/retire: deploy the prepared secret before activation, accept both signatures for one hour, then retire the previous secret. The existing immediate rotation endpoint remains available for emergency replacement; existing webhook clients continue to work.
Bug Fixes
API
- The Python SDK's
download_trader_exportnow followsGET /api/v1/trader/{address}/export/download's redirect to the finished file and returns a streamingDownloadwith the file's content type, size, filename and a SHA-256 of whatsavewrote, sending the API key to the API only and never to the file host; before, the redirect was raised as an error (0xinsider0.2.0 on PyPI). - The TypeScript SDK's
batchGetTradersnow sends thetradersarrayPOST /api/v1/traders/batchrequires and acceptsexpand(strategy,categories,quant_metrics,trust) for every item, so the call answers with the ordered batch instead of atradersmissing error (@0xinsider/sdk0.2.1). GET /api/v1/reportsand the daily, weekly and monthly routes call a reportfinalonly once it was built after the period ended plus 2 hours 5 minutes, so a body built before the close no longer counts as final; until thensnapshot.statusstaysrollingwith the newsnapshot.period_closedandsnapshot.final_aftersaying when it will be,snapshot.source_read_started_atsays when the body was read, andsnapshot.mutable_untilnames the date the final body can first be built.WasFinal at the UTC closenowFinal 2 h 5 min after the close- Weekly report requests using an ISO week remain durable canonical snapshots; an explicit
from/torange returns the exact requested UTC range for up to 31 inclusive days withsnapshot.storage=ephemeral, and a wider range returns400 invalid_query. - The TypeScript SDK's
streamFeedResilientno longer reconnects at once when a429asks for a wait longer than about 24.8 days; aRetry-AfterpastmaxRetryAfterMs(60 s by default) now throwsStreamRetryDeferredErrorwithretryAtandlastSeqfor you to schedule, and both the stream and REST retries read an HTTP-dateRetry-Afteras well as seconds (@0xinsider/sdk0.2.3). - The TypeScript SDK's
paginate,paginatePagesandcollectnow throwPaginationErroron a page that sayshas_more: truewithout anext_cursoror repeats a cursor already requested, instead of ending as if the list were complete or requesting the same page again;maxPagesis checked before the first request, and aprogressoption reports whether a walk stopped atmaxPagesor at the end of the list, with the cursor to continue from (@0xinsider/sdk0.2.4). - The TypeScript SDK's
streamFeedandstreamFeedResilientnow throwStreamProtocolErroron aGET /api/v1/streamframe that is not JSON, not an envelope, has no usable sequence, or is a malformedresyncmarker, on a successful response that is nottext/event-stream, and on a frame pastmaxFrameBytes(1 MiB by default), instead of skipping the frame and moving the resume cursor past it; the error nameslastSeqandframeId, and the reconnect loop does not retry it (@0xinsider/sdk0.2.5). - The TypeScript SDK now retries a failed write only on the five operations that honour
Idempotency-Key(createWebhook,updateWebhook,deleteWebhook,rotateWebhookSecret,redeliverWebhookDelivery) and only with a key, refusesidempotencyKeyon any other operation before sending, and retries the read-onlyPOST /api/v1/traders/batchandPOST /api/v1/markets/intel/batchlike aGET; a key onverifyWebhookorsubmitTraderExportused to make the SDK retry a request the API would repeat (@0xinsider/sdk0.2.6). - The TypeScript SDK's
verifySignaturenow throws on atoleranceSecondsthat isNaN, infinite or negative instead of accepting a correctly signed webhook delivery of any age; the 300-second default and the boundary (exactly 300 seconds passes) are unchanged (@0xinsider/sdk0.2.7). - Webhook delivery logs now include
next_attempt_atand nullableretry_schedule_reason, so receivers can see whether the next attempt follows a boundedRetry-After, a transient failure, a permanent or auth response, a manual redelivery, or a configuration change. POST /api/v1/mcpanswers supported notifications with HTTP 202 and no body; a request with an ID still receives one matching JSON-RPC reply.Was`id: null` replynowEmpty HTTP 202- A remote MCP
tools/callonPOST /api/v1/mcpwhose arguments fall outside the tool's advertisedinputSchema(a non-object, an unknown key, a wrong type, a number out of range, a value outside an enum, or both of two exclusive arguments) now answers a tool result withisErrornaming the field, instead of running with the arguments that fit. GET /api/v1/mcpwith a credential now answers HTTP 405 withAllow: POST, the MCP answer for a server that offers no server-to-client stream, so an MCP client connects once and stops reconnecting every second; the TypeScript SDK drops theopenMcpEventStreamrow from its operation table (@0xinsider/sdk0.2.4).Was200, stream closed at oncenow405, `Allow: POST`- The
search_marketsMCP tool, onPOST /api/v1/mcpand in@0xinsider/mcp, now takescursorand answersdata,has_moreandnext_cursor, so a search with more than one page can be read to the end; the stdio tool answered a bare array with no cursor before.WasFirst page onlynowEvery page by cursor - Pay as you go now stops at 1,000,000 API requests a month: past it an account answers 429
monthly_quota_exceededuntil the month resets, the same as an account without pay as you go does at 250,000, from 1 October 2026, and one email says so when it happens;GET /api/v1/usagemonthly_quotagainsceiling, the number that binds the account.WasNo upper boundnow1,000,000 a month - Every
/api/v1response now carries the same request ID in theX-Request-Idheader and inmeta.request_id, and that one ID is what support and usage records are keyed by; before, the header and the body carried two different IDs. The header now also appears on304,408and CORS preflight responses. A client-suppliedX-Request-Idrequest header is never echoed.WasTwo IDs per responsenowOne ID per response - Every
/api/v1failure now answers the standard error envelope, including a request that never reached a handler: a body that is not JSON or misses a required field (400,error.reasoninvalid_body,error.paramnaming the field), a query or path value that does not parse (400,invalid_queryorinvalid_path), a body withoutContent-Type: application/json(415,unsupported_media_type), a body over 1 MiB (413,payload_too_large), a method the path does not serve (405,method_not_allowed), and the 30-second timeout (408,error.coderequest_timeout, withRetry-AfteronGET). Before, these answered plain text or an empty body with nometa.request_id. The TypeScript SDK throwsServerTimeoutErroron a408and retries it like a503(@0xinsider/sdk0.2.5).WasPlain text or empty bodynowError envelope with code, reason, param - A
429from the per-address budget on/api/v1(the 1,200 requests a minute every caller behind one IP shares, counted before authentication) now answers the standard error envelope witherror.coderate_limited,error.reasonip_rate_limited,error.retry_atandmeta.request_id, keepingRetry-Afterand theRateLimit-*headers; a throttled address answers the same envelope witherror.reasonip_throttled. Before, both answered a flat body with no request ID and noretry_at, which the API reference had never described. The TypeScript SDK'sAPI_ERROR_REASONScarries both values (@0xinsider/sdk0.2.6).WasFlat body, no request IDnowError envelope with reason and retry_at GET /api/v1/events/feed/sincenow delivers every large trade after your cursor, including one recorded out of order that a stored cursor used to skip for good;meta.replay.orderingreadscommit_visibility_then_id_asc,data.sequencecan step backwards, the newmeta.replay.pending_beyond_horizonsays when a caught-up page still has trades on the way, and cursors you already hold keep working.Waswhale_alerts_id_ascnowcommit_visibility_then_id_ascGET /api/v1/markets/sharp-money-flowsand its deprecatedsmart-money-flowsalias now returncursor_expiredwhen the effective filters or collection revision changes, so clients restart from the first page instead of silently walking a different result set; cursors issued before this change receive the same recovery response./api/v1/mcpnow answers400to anMCP-Protocol-Versionheader naming a revision it does not serve (it serves2025-11-25,2025-06-18,2025-03-26and2024-11-05; no header still works), a browser's preflight may send the header, andhttps://0xinsider.com/api/v1/mcpechoes theMcp-Session-Ida client sends instead of minting a new one.WasAny header value acceptednowUnsupported value answers 400- Every MCP tool result, on
POST /api/v1/mcpand in@0xinsider/mcp, now carries the samemetathe REST route returns (request_id,cached,cost, and a route'ssource,completeness,ranking_sourceordirectional_source) beside the payload, and a failed tool call carries the REST error fields (code,reason,param,doc_url,retry_at) plusretry_after_seconds,request_idandstatusunderstructuredContent.errorbeside its text. - An open
GET /api/v1/streamconnection now ends within 40 seconds of its API key being revoked, expiring or being rotated, or of its account being deleted, locked or losing its subscription, with one finalevent: errorframe whoseerror.codenames the cause (invalid_api_key,subscription_required,forbidden,account_lockedorinsufficient_scope) andretry: false; a stream whose key cannot be confirmed for 90 seconds ends withdatabase_unavailableandretry: true, and a reconnect aftererror.retry_atresumes from the frame'sid. GET /api/v1/market/{condition_id}/candlesnow URL-decodes its recognized time bounds, keepstoinclusive, and returns400whenfromis afterto.
