{ "object": "list", "data": [], "data_quality": { "status": "partial", "field_groups": [ { "group": "alert", "owner": "whale_alerts.inserted_xid", "status": "unknown", "reason": "whale_alerts.inserted_xid is a transaction identifier rather than a timestamp" }, { "group": "trade", "owner": "trades.ingested_at", "status": "unknown", "reason": "the page returned no large-trade row from which to read this writer clock" }, { "group": "trader", "owner": "traders.last_synced", "status": "unknown", "reason": "the page returned no large-trade row from which to read this writer clock" }, { "group": "ranking", "owner": "trader_rankings.computed_at", "status": "unknown", "reason": "the page returned no large-trade row from which to read this writer clock" }, { "group": "market", "owner": "market_canonical.last_refreshed_at", "status": "unknown", "reason": "the page returned no large-trade row from which to read this writer clock" }, { "group": "volume", "owner": "market_live_stats.volume_request_observed_at", "status": "unknown", "reason": "the page returned no large-trade row from which to read this writer clock" } ] }, "has_more": false, "total": 0, "meta": { "request_id": "req_example", "cached": false, "cost": 1 }}
{ "object": "list", "data": [], "data_quality": { "status": "partial", "field_groups": [ { "group": "alert", "owner": "whale_alerts.inserted_xid", "status": "unknown", "reason": "whale_alerts.inserted_xid is a transaction identifier rather than a timestamp" }, { "group": "trade", "owner": "trades.ingested_at", "status": "unknown", "reason": "the page returned no large-trade row from which to read this writer clock" }, { "group": "trader", "owner": "traders.last_synced", "status": "unknown", "reason": "the page returned no large-trade row from which to read this writer clock" }, { "group": "ranking", "owner": "trader_rankings.computed_at", "status": "unknown", "reason": "the page returned no large-trade row from which to read this writer clock" }, { "group": "market", "owner": "market_canonical.last_refreshed_at", "status": "unknown", "reason": "the page returned no large-trade row from which to read this writer clock" }, { "group": "volume", "owner": "market_live_stats.volume_request_observed_at", "status": "unknown", "reason": "the page returned no large-trade row from which to read this writer clock" } ] }, "has_more": false, "total": 0, "meta": { "request_id": "req_example", "cached": false, "cost": 1 }}
Use this endpoint for a feed of recorded large trades. 0xinsider records fills of at least $10,000 below price `0.97`, or at least $1,000 below 0.99 in Earnings markets.To filter by time range, market, or wallet, use Large trades history. To inspect one trade’s counterparties, use Large trade.
The smallest trade size to return, in USD. It filters trades already recorded, and defaults to 5000.
min_grade
The lowest wallet grade to return. A returns S and A wallets, and S returns S only. It reads the wallet’s grade when you read the page, not when the trade filled, so a wallet graded again after a trade enters or leaves the result. For the grade at the fill, send min_grade_at_trade instead.
min_grade_at_trade
The lowest grade the wallet held when the trade filled, read from trader.grade_at_trade. A returns trades by S and A wallets. Only a trade whose trader.grade_at_trade_status is graded can match, so a trade before 23:00 UTC on September 19, 2026, or one made while the wallet’s grade was changing, never does. It is the same basis as min_grade_at_trade on Stream and on webhook trade_filters, so a client that catches up here and then streams gets the same trades. It works with since, condition_id, event_slug, and both sorts. Sending it with min_grade returns 400 with error.param set to min_grade_at_trade.
category
A market category, matched without regard to case. A bucket name such as Basketball matches every league inside it, including NBA, WNBA, and NCAAB. A raw provider value such as NBA resolves to its bucket.
suspicious_only
true returns only trades whose suspicion_score is 60 or more. The default is false.
min_market_volume_share
The smallest share of its own market a trade must be to come back. It is a fraction, not a percent: 0.01 means one percent of the market’s traded volume. A value outside 0 to 1 is rejected. A trade whose market_volume_share is absent never comes back when you send this.
sort
recent returns newest first and is the default. market_volume_share returns the biggest share of its own market first, with trades that have no share last, and reads the last 30 days.
limit
How many trades to return, from 1 to 100. The default is 20.
cursor
The next_cursor value from the previous response. See Pagination. A cursor belongs to the sort it was returned under, so sending it with the other sort is rejected.
since
The id of a trade this API returned, such as wt_12267817 or 12267817. Only the trades recorded after it come back, newest first, and cursor pages through them. It works with sort=recent only. An id that names no trade, or one more than 10,000 trades behind the newest, is rejected with 400 and error.param set to since.
condition_id
One market’s raw condition_id. Only that market’s large trades come back, newest first, and cursor pages through them. It cannot be sent with since or event_slug.
event_slug
A game ID from List games. Only the large trades in that game’s markets come back, newest first, the moneyline, spreads, totals, and props. It works with sort=recent only, and it cannot be sent with since or condition_id. An unknown game is a 404 with error.param set to event_slug.
has_more and next_cursor describe the filtered result, so a full page always holds limit matching trades.
BUY or SELL. This is the direction of the trade, and it is a separate question from which outcome was traded.
outcome
The outcome the trade was on: Yes, No, or a team name. It is null on a market with more than two outcomes, and on a market 0xinsider has not matched to Polymarket’s own market record. It is also null on a trade recorded before April 2, 2026 unless 0xinsider verified its outcome against the fill’s own trade records.
token_id
The Polymarket CLOB token for that outcome, as a decimal string. It is null in the same cases as outcome.
market_volume_share
The trade’s share count (size_usd / price) divided by the shares its market has traded, as recorded at or after the trade, so it always reads between 0 and 1. Polymarket records market volume in shares, not dollars, so both sides of the ratio count shares. A 20,000-share fill is 0.00005 of a market that has traded 400 million shares and 0.125 of one that has traded 160,000, which size_usd alone cannot tell apart. It is absent, never 0, when no volume figure recorded at or after the trade is stored, or when that figure is smaller than the trade. The market keeps trading, so an old trade reports a smaller share over time. Filter on it with min_market_volume_share and rank by it with sort=market_volume_share.
review_score
The current review-priority score, from 0 to 1. A higher score means review this fill earlier. Read it alongside the observed trade and wallet record. See Scores.
recorded_review_score
The review-priority score stored when the trade was recorded. It is null on rows stored before the field existed. Compare it with review_score to see how the current assessment differs. It reads the wallet’s win rate over every Polymarket market at that moment, so it can differ from review_score by more than the trade’s age.
signal_score, recorded_signal_score
The older names of review_score and recorded_review_score. They carry the same values, stay in every response, and are marked deprecated.
suspicion_score
How much this fill looks like a pattern worth reviewing, from 0 to 100, written by the scorer when the trade was stored. It rises with a new wallet, a large size, a price far from the crowd, and several new wallets buying the same side of a quiet market. It is null when no score was stored.
suspicion_track
Which scorer produced suspicion_score: whale, fresh_conviction, or sliced_position. It is null on an old row with no stored track.
data_quality
Page-level age and coverage beside data. The groups are alert, trade, trader, ranking, market, and volume. trades.ingested_at, traders.last_synced, trader_rankings.computed_at, market_canonical.last_refreshed_at, and market_live_stats.volume_request_observed_at provide the measurable clocks; whale_alerts.inserted_xid is a transaction identifier, so alert is unknown. trader and ranking are stale past their max_age_s of 604800 seconds; the other clocks keep no schedule, carry no max_age_s, and are never stale. The stored clocks are part of the ETag; cache facts remain in meta.
trader.grade
The wallet’s grade, S through F. It is absent when the wallet has none yet. See Grades.
The grade the wallet held when the trade filled, and whether it is known. The status is graded, ungraded (the wallet had no grade then), or unknown (no record covers that moment: every trade before 23:00 UTC on September 19, 2026, and a trade made while a grade change was unconfirmed). trader.grade_at_trade is null unless the status is graded.
Poll with since and If-None-Match instead of downloading the whole list each time:
Call the route once without since. Keep the ETag header and the first trade’s id.
Call it again with since set to that id and If-None-Match set to that ETag. When no trade was recorded since, the server returns 304 Not Modified with no body.
When trades come back, handle them, keep the new ETag, and move since to the first trade of that response. If has_more is true, read the rest with cursor and the same since before you move it.
since follows the order trades were recorded in, not traded_at. A trade recorded late, with an earlier traded_at, still comes back, and a trade that is still being written comes back on a later poll instead of being skipped. A late trade can come back twice, so deduplicate on id.
A trade under min_size, which defaults to 5000. Lowering it does not reach fills below the size at which 0xinsider records a trade at all.
A trade whose grade at the fill is not known, when you send min_grade_at_trade. Every trade before 23:00 UTC on September 19, 2026 is unknown, so it never matches.
A side, condition_id, trader, from, or to filter. Large trades history has the last four.
The wallets on the other side of a trade. Open one row with Large trade for its makers.
A prediction. review_score reads the fill’s size, its price, the wallet’s win rate on sports and esports markets, and the trade’s age. It says nothing about how the market will resolve.
Proof of insider trading. A high suspicion_score marks a trade for review, which is what Suspicious trades is for.
Save the response’s ETag and send it in If-None-Match on your next request. If the list has not changed, the server returns 304 Not Modified with no body. With since, a poll that finds no new trade gets that 304, because an empty answer does not change between polls. data_quality is part of the representation and its stored clocks are included in the ETag; meta.cached and meta.cache_age_s describe the transport cache.
Legacy default or named integration API key, or OAuth 2.1 access token, in the Authorization header as Bearer oxi_sk_live_... or Bearer oxi_at_.... Default keys retain full access; integration keys are limited to their approved read, webhooks, export and usage scopes and expire within 90 days. All credentials share the owner's account limits. Data calls require an active Pro subscription and return live data. A 401 carries WWW-Authenticate: Bearer resource_metadata="https://api.0xinsider.com/.well-known/oauth-protected-resource" (RFC 6750 section 3, RFC 9728).
Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, matches every sport but Esports, the provider's catch-all Sports category (cycling, lacrosse) included: use esports for Esports alone, or omit category for both (#32657).
Minimum trader grade now (trader.grade), the wallet's grade when this page is read, not when the trade filled. A wallet re-graded after a trade enters or leaves the result, so a catch-up read can disagree with GET /api/v1/stream and webhooks. For the grade at the fill, send min_grade_at_trade instead. A means S or A, B means S, A or B.
Minimum grade the trader held when the trade filled (trader.grade_at_trade). Only rows whose trader.grade_at_trade_status is graded can match, so a trade before 2026-09-19T23:00Z, or one made while the wallet's grade was changing, never does. The same basis as min_grade_at_trade on GET /api/v1/stream and on webhook trade_filters, so a client that catches up here and then streams gets one answer. Applies to every path: recent, since, sort=market_volume_share, condition_id and event_slug. Sending it with min_grade is 400. A means S or A, B means S, A or B.
Keep only trades whose market_volume_share is known and at least this. A fraction, not a percent: 0.01 is one percent of the market's traded volume. A trade whose share is unavailable is never returned by a non-zero value, because an unavailable share cannot be said to clear a floor.
Order of the returned page. recent is newest first and is the default. market_volume_share ranks by each trade's share of its market's traded volume, biggest first, with a trade whose share is unavailable last. That ranking reads the last 30 days, because the share is computed for each request and an unbounded ranking cannot be served inside the documented latency budget. A cursor is bound to the order it was minted in, so a continuation cannot cross from one order into the other.
Return only the trades recorded after this one. Pass the id of a large trade this API returned (wt_, or the bare integer). The answer keeps the list shape and newest-first order, and next_cursor pages within it. After means commit order: a trade recorded late with an earlier traded_at is still returned, and a trade whose write has not committed yet is returned on a later poll, never skipped. To poll, send the id of the first trade on the first page of your last answer that had trades, with If-None-Match set to the ETag you last received; when nothing new was recorded the answer is 304 with an empty body. A late trade can come back once, so deduplicate on id. Only with sort=recent. An id that names no trade, or one more than 10000 trades behind the newest, answers 400 with error.param since; request the list without since and continue from its first trade.
Only this market's large trades: an exact raw provider condition_id. The page is read from the market's own index, newest first, and pages with cursor; it cannot be combined with since or with event_slug (400). An unknown market returns an empty list.
Only the large trades in one game: every market of the game behind this event slug, the moneyline, spreads, totals and props, as GET /api/v1/games/{event_slug}/trades reads them. Matched case-insensitively. Newest first only (sort=market_volume_share answers 400), pages with cursor, and cannot be combined with since or with condition_id (400). An unknown slug answers 404 not_found with error.param event_slug.
Total matching rows when the read model exposes a count; absent (or null) when it does not.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"0xinsider API","colors":{"primary":"#000000","light":"#000000","dark":"#ffffff"},"logo":{"light":"https://mintcdn.com/0xinsider/D5OLZi_kq06wJPfv/logo/light.svg?fit=max\u0026auto=format\u0026n=D5OLZi_kq06wJPfv\u0026q=85\u0026s=5a737b3d5f5bace7059eb57500f3c8ef","dark":"https://mintcdn.com/0xinsider/D5OLZi_kq06wJPfv/logo/dark.svg?fit=max\u0026auto=format\u0026n=D5OLZi_kq06wJPfv\u0026q=85\u0026s=2039a645e8826fe146e6cd8e15498ca5"},"favicon":"https://mintcdn.com/0xinsider/D5OLZi_kq06wJPfv/favicon.svg?fit=max\u0026auto=format\u0026n=D5OLZi_kq06wJPfv\u0026q=85\u0026s=06727454da2da854b5cdd4a0b06075fb","api":{"openapi":"api-reference/openapi.json"},"navbar":{"links":[{"href":"mailto:support@0xinsider.com","label":"Support"}],"primary":{"type":"button","label":"Get API key","href":"https://0xinsider.com/developers"}},"footer":{"socials":{"x":"https://x.com/0xinsiderdotcom","github":"https://github.com/0xinsider","linkedin":"https://linkedin.com/company/0xinsider-com"}},"seo":{"metatags":{"msvalidate.01":"46E18D97E322917120999977418630DE"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity"],"display":"header"},"markdown":{"schema":false,"instructions":["The Markdown of an API reference page leaves out the OpenAPI schema.","Every object an endpoint returns or a webhook carries, with each field's type, presence and meaning, is on https://docs.0xinsider.com/api-reference/objects.md.","The full OpenAPI 3.1 spec names each operation's and each webhook's exact parameters, request body and response schema: https://docs.0xinsider.com/api-reference/openapi.json."]},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Terminal","icon":"chart-line","href":"https://0xinsider.com"},{"anchor":"Product changelog","icon":"list","href":"https://0xinsider.com/changelog"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"0xinsider","hasAudioNarration":false,"actualSubdomain":"0xinsider","customDomains":["docs.0xinsider.com"],"gitSource":{"type":"github","owner":"0xinsider","repo":"docs.0xinsider.com","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true,"edits":false,"issues":false},"entitlements":{},"buildId":"6aefaa7d3729d361787eee68","clientVersion":"0.0.4087","searchFilterCounts":[{"language":"default","tag":"API reference","count":131},{"language":"default","tag":"Traders","count":26},{"language":"default","tag":"Documentation","count":24},{"language":"default","tag":"Webhook events","count":18},{"language":"default","tag":"Changelog","count":18},{"language":"default","tag":"API updates","count":18},{"language":"default","tag":"Older entries","count":17},{"language":"default","tag":"Markets","count":16},{"language":"default","tag":"Webhooks","count":15},{"language":"default","tag":"Whale trades","count":10}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"custom.css","content":"[data-active],[data-active] a,[role=\"tab\"],[class*=\"playground\"] button,[class*=\"try-it\"],.bg-primary-dark,a[class*=\"anchor\"],a[class*=\"group\"],li a,nav a{transition:color 150ms ease, background-color 150ms ease, border-color 150ms ease, opacity 150ms ease, transform 150ms ease}[class*=\"badge\"],[data-testid*=\"badge\"]{--tw-bg-opacity: 1 !important}:root{--primary: 0 0 0;--primary-light: 0 0 0;--primary-dark: 0 0 0;--primary-foreground: 255 255 255}.dark{--primary-light: 255 255 255;--primary-dark: 255 255 255}.dark .bg-primary-dark~* .text-white,.dark .bg-primary-dark~* svg,.dark .bg-primary-dark~svg{color:#000000!important}.dark [data-active=\"true\"],.dark [data-active=\"true\"] a{color:#ffffff!important}[data-active=\"true\"],[data-active=\"true\"] a{color:#000000!important}.dark [class*=\"GET\"],.dark [class*=\"get\"]{background-color:rgba(255, 255, 255, 0.15)!important;color:#ffffff!important}[class*=\"GET\"],[class*=\"get\"]{background-color:rgba(0, 0, 0, 0.08)!important;color:#000000!important}.dark [class*=\"POST\"],.dark [class*=\"post\"]{background-color:rgba(255, 255, 255, 0.15)!important;color:#ffffff!important}[class*=\"POST\"],[class*=\"post\"]{background-color:rgba(0, 0, 0, 0.08)!important;color:#000000!important}.dark [class*=\"PUT\"],.dark [class*=\"put\"]{background-color:rgba(255, 255, 255, 0.15)!important;color:#ffffff!important}[class*=\"PUT\"],[class*=\"put\"]{background-color:rgba(0, 0, 0, 0.08)!important;color:#000000!important}.dark [class*=\"DELETE\"],.dark [class*=\"delete\"]{background-color:rgba(255, 255, 255, 0.15)!important;color:#ffffff!important}[class*=\"DELETE\"],[class*=\"delete\"]{background-color:rgba(0, 0, 0, 0.08)!important;color:#000000!important}.dark [class*=\"playground\"] button,.dark [class*=\"try-it\"]{background-color:#ffffff!important;color:#000000!important}[class*=\"playground\"] button,[class*=\"try-it\"]{background-color:#000000!important;color:#ffffff!important}.dark [role=\"tab\"][aria-selected=\"true\"],.dark [role=\"tab\"][data-state=\"active\"]{border-color:#ffffff!important;color:#ffffff!important}[role=\"tab\"][aria-selected=\"true\"],[role=\"tab\"][data-state=\"active\"]{border-color:#000000!important;color:#000000!important}"}],"page":{"pagePath":"api-reference/endpoint/get-large-trades","slug":"/api-reference/endpoint/get-large-trades","pageMetadata":{"title":"Large trades","description":"List recent large Polymarket trades with wallet grades and review scores.","openapi":"GET /api/v1/large-trades","href":"/api-reference/endpoint/get-large-trades"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"List recent large Polymarket trades with wallet grades and review scores.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Use this endpoint for a feed of recorded large trades. 0xinsider records fills of at least `,\"$10,000 below price `0.97`, or at least $\",`1,000 below `,_jsx(_components.code,{children:`0.99`}),` in `,_jsx(_components.code,{children:`Earnings`}),` markets.`]}),`\n`,_jsxs(_components.p,{children:[`To filter by time range, market, or wallet, use `,_jsx(_components.a,{href:`/api-reference/endpoint/get-large-trades-history`,children:`Large trades history`}),`. To inspect one trade’s counterparties, use `,_jsx(_components.a,{href:`/api-reference/endpoint/get-large-trade`,children:`Large trade`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`parameters`,children:`Parameters`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Parameter`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`min_size`})}),_jsxs(_components.td,{children:[`The smallest trade size to return, in USD. It filters trades already recorded, and defaults to `,_jsx(_components.code,{children:`5000`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`min_grade`})}),_jsxs(_components.td,{children:[`The lowest wallet grade to return. `,_jsx(_components.code,{children:`A`}),` returns S and A wallets, and `,_jsx(_components.code,{children:`S`}),` returns S only. It reads the wallet’s grade when you read the page, not when the trade filled, so a wallet graded again after a trade enters or leaves the result. For the grade at the fill, send `,_jsx(_components.code,{children:`min_grade_at_trade`}),` instead.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`min_grade_at_trade`})}),_jsxs(_components.td,{children:[`The lowest grade the wallet held when the trade filled, read from `,_jsx(_components.code,{children:`trader.grade_at_trade`}),`. `,_jsx(_components.code,{children:`A`}),` returns trades by S and A wallets. Only a trade whose `,_jsx(_components.code,{children:`trader.grade_at_trade_status`}),` is `,_jsx(_components.code,{children:`graded`}),` can match, so a trade before 23:00 UTC on September 19, 2026, or one made while the wallet’s grade was changing, never does. It is the same basis as `,_jsx(_components.code,{children:`min_grade_at_trade`}),` on `,_jsx(_components.a,{href:`/api-reference/endpoint/get-stream`,children:`Stream`}),` and on webhook `,_jsx(_components.code,{children:`trade_filters`}),`, so a client that catches up here and then streams gets the same trades. It works with `,_jsx(_components.code,{children:`since`}),`, `,_jsx(_components.code,{children:`condition_id`}),`, `,_jsx(_components.code,{children:`event_slug`}),`, and both sorts. Sending it with `,_jsx(_components.code,{children:`min_grade`}),` returns `,_jsx(_components.code,{children:`400`}),` with `,_jsx(_components.code,{children:`error.param`}),` set to `,_jsx(_components.code,{children:`min_grade_at_trade`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`category`})}),_jsxs(_components.td,{children:[`A market category, matched without regard to case. A bucket name such as `,_jsx(_components.code,{children:`Basketball`}),` matches every league inside it, including NBA, WNBA, and NCAAB. A raw provider value such as `,_jsx(_components.code,{children:`NBA`}),` resolves to its bucket.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`suspicious_only`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`true`}),` returns only trades whose `,_jsx(_components.code,{children:`suspicion_score`}),` is 60 or more. The default is `,_jsx(_components.code,{children:`false`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`min_market_volume_share`})}),_jsxs(_components.td,{children:[`The smallest share of its own market a trade must be to come back. It is a fraction, not a percent: `,_jsx(_components.code,{children:`0.01`}),` means one percent of the market’s traded volume. A value outside `,_jsx(_components.code,{children:`0`}),` to `,_jsx(_components.code,{children:`1`}),` is rejected. A trade whose `,_jsx(_components.code,{children:`market_volume_share`}),` is absent never comes back when you send this.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sort`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`recent`}),` returns newest first and is the default. `,_jsx(_components.code,{children:`market_volume_share`}),` returns the biggest share of its own market first, with trades that have no share last, and reads the last 30 days.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`limit`})}),_jsxs(_components.td,{children:[`How many trades to return, from 1 to 100. The default is `,_jsx(_components.code,{children:`20`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`cursor`})}),_jsxs(_components.td,{children:[`The `,_jsx(_components.code,{children:`next_cursor`}),` value from the previous response. See `,_jsx(_components.a,{href:`/concepts/pagination`,children:`Pagination`}),`. A cursor belongs to the `,_jsx(_components.code,{children:`sort`}),` it was returned under, so sending it with the other `,_jsx(_components.code,{children:`sort`}),` is rejected.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`since`})}),_jsxs(_components.td,{children:[`The `,_jsx(_components.code,{children:`id`}),` of a trade this API returned, such as `,_jsx(_components.code,{children:`wt_12267817`}),` or `,_jsx(_components.code,{children:`12267817`}),`. Only the trades recorded after it come back, newest first, and `,_jsx(_components.code,{children:`cursor`}),` pages through them. It works with `,_jsx(_components.code,{children:`sort=recent`}),` only. An `,_jsx(_components.code,{children:`id`}),` that names no trade, or one more than 10,000 trades behind the newest, is rejected with `,_jsx(_components.code,{children:`400`}),` and `,_jsx(_components.code,{children:`error.param`}),` set to `,_jsx(_components.code,{children:`since`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`condition_id`})}),_jsxs(_components.td,{children:[`One market’s raw `,_jsx(_components.code,{children:`condition_id`}),`. Only that market’s large trades come back, newest first, and `,_jsx(_components.code,{children:`cursor`}),` pages through them. It cannot be sent with `,_jsx(_components.code,{children:`since`}),` or `,_jsx(_components.code,{children:`event_slug`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`event_slug`})}),_jsxs(_components.td,{children:[`A game ID from `,_jsx(_components.a,{href:`/api-reference/endpoint/list-games`,children:`List games`}),`. Only the large trades in that game’s markets come back, newest first, the moneyline, spreads, totals, and props. It works with `,_jsx(_components.code,{children:`sort=recent`}),` only, and it cannot be sent with `,_jsx(_components.code,{children:`since`}),` or `,_jsx(_components.code,{children:`condition_id`}),`. An unknown game is a `,_jsx(_components.code,{children:`404`}),` with `,_jsx(_components.code,{children:`error.param`}),` set to `,_jsx(_components.code,{children:`event_slug`}),`.`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`has_more`}),` and `,_jsx(_components.code,{children:`next_cursor`}),` describe the filtered result, so a full page always holds `,_jsx(_components.code,{children:`limit`}),` matching trades.`]}),`\n`,_jsx(Heading,{level:`2`,id:`key-response-fields`,children:`Key response fields`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Meaning`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`side`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`BUY`}),` or `,_jsx(_components.code,{children:`SELL`}),`. This is the direction of the trade, and it is a separate question from which outcome was traded.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`outcome`})}),_jsxs(_components.td,{children:[`The outcome the trade was on: `,_jsx(_components.code,{children:`Yes`}),`, `,_jsx(_components.code,{children:`No`}),`, or a team name. It is `,_jsx(_components.code,{children:`null`}),` on a market with more than two outcomes, and on a market 0xinsider has not matched to Polymarket’s own market record. It is also `,_jsx(_components.code,{children:`null`}),` on a trade recorded before April 2, 2026 unless 0xinsider verified its outcome against the fill’s own trade records.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`token_id`})}),_jsxs(_components.td,{children:[`The Polymarket CLOB token for that outcome, as a decimal string. It is `,_jsx(_components.code,{children:`null`}),` in the same cases as `,_jsx(_components.code,{children:`outcome`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`market_volume_share`})}),_jsxs(_components.td,{children:[`The trade’s share count (`,_jsx(_components.code,{children:`size_usd / price`}),`) divided by the shares its market has traded, as recorded at or after the trade, so it always reads between 0 and 1. Polymarket records market volume in shares, not dollars, so both sides of the ratio count shares. A 20,000-share fill is 0.00005 of a market that has traded 400 million shares and 0.125 of one that has traded 160,000, which `,_jsx(_components.code,{children:`size_usd`}),` alone cannot tell apart. It is absent, never `,_jsx(_components.code,{children:`0`}),`, when no volume figure recorded at or after the trade is stored, or when that figure is smaller than the trade. The market keeps trading, so an old trade reports a smaller share over time. Filter on it with `,_jsx(_components.code,{children:`min_market_volume_share`}),` and rank by it with `,_jsx(_components.code,{children:`sort=market_volume_share`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`review_score`})}),_jsxs(_components.td,{children:[`The current review-priority score, from 0 to 1. A higher score means review this fill earlier. Read it alongside the observed trade and wallet record. See `,_jsx(_components.a,{href:`/concepts/signal-scoring`,children:`Scores`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`recorded_review_score`})}),_jsxs(_components.td,{children:[`The review-priority score stored when the trade was recorded. It is `,_jsx(_components.code,{children:`null`}),` on rows stored before the field existed. Compare it with `,_jsx(_components.code,{children:`review_score`}),` to see how the current assessment differs. It reads the wallet’s win rate over every Polymarket market at that moment, so it can differ from `,_jsx(_components.code,{children:`review_score`}),` by more than the trade’s age.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`signal_score`}),`, `,_jsx(_components.code,{children:`recorded_signal_score`})]}),_jsxs(_components.td,{children:[`The older names of `,_jsx(_components.code,{children:`review_score`}),` and `,_jsx(_components.code,{children:`recorded_review_score`}),`. They carry the same values, stay in every response, and are marked deprecated.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`suspicion_score`})}),_jsxs(_components.td,{children:[`How much this fill looks like a pattern worth reviewing, from 0 to 100, written by the scorer when the trade was stored. It rises with a new wallet, a large size, a price far from the crowd, and several new wallets buying the same side of a quiet market. It is `,_jsx(_components.code,{children:`null`}),` when no score was stored.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`suspicion_track`})}),_jsxs(_components.td,{children:[`Which scorer produced `,_jsx(_components.code,{children:`suspicion_score`}),`: `,_jsx(_components.code,{children:`whale`}),`, `,_jsx(_components.code,{children:`fresh_conviction`}),`, or `,_jsx(_components.code,{children:`sliced_position`}),`. It is `,_jsx(_components.code,{children:`null`}),` on an old row with no stored track.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`data_quality`})}),_jsxs(_components.td,{children:[`Page-level age and coverage beside `,_jsx(_components.code,{children:`data`}),`. The groups are `,_jsx(_components.code,{children:`alert`}),`, `,_jsx(_components.code,{children:`trade`}),`, `,_jsx(_components.code,{children:`trader`}),`, `,_jsx(_components.code,{children:`ranking`}),`, `,_jsx(_components.code,{children:`market`}),`, and `,_jsx(_components.code,{children:`volume`}),`. `,_jsx(_components.code,{children:`trades.ingested_at`}),`, `,_jsx(_components.code,{children:`traders.last_synced`}),`, `,_jsx(_components.code,{children:`trader_rankings.computed_at`}),`, `,_jsx(_components.code,{children:`market_canonical.last_refreshed_at`}),`, and `,_jsx(_components.code,{children:`market_live_stats.volume_request_observed_at`}),` provide the measurable clocks; `,_jsx(_components.code,{children:`whale_alerts.inserted_xid`}),` is a transaction identifier, so `,_jsx(_components.code,{children:`alert`}),` is `,_jsx(_components.code,{children:`unknown`}),`. `,_jsx(_components.code,{children:`trader`}),` and `,_jsx(_components.code,{children:`ranking`}),` are `,_jsx(_components.code,{children:`stale`}),` past their `,_jsx(_components.code,{children:`max_age_s`}),` of 604800 seconds; the other clocks keep no schedule, carry no `,_jsx(_components.code,{children:`max_age_s`}),`, and are never `,_jsx(_components.code,{children:`stale`}),`. The stored clocks are part of the `,_jsx(_components.code,{children:`ETag`}),`; cache facts remain in `,_jsx(_components.code,{children:`meta`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`trader.grade`})}),_jsxs(_components.td,{children:[`The wallet’s grade, `,_jsx(_components.code,{children:`S`}),` through `,_jsx(_components.code,{children:`F`}),`. It is absent when the wallet has none yet. See `,_jsx(_components.a,{href:`/concepts/grades`,children:`Grades`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`trader.grade_at_trade`}),`, `,_jsx(_components.code,{children:`trader.grade_at_trade_status`})]}),_jsxs(_components.td,{children:[`The grade the wallet held when the trade filled, and whether it is known. The status is `,_jsx(_components.code,{children:`graded`}),`, `,_jsx(_components.code,{children:`ungraded`}),` (the wallet had no grade then), or `,_jsx(_components.code,{children:`unknown`}),` (no record covers that moment: every trade before 23:00 UTC on September 19, 2026, and a trade made while a grade change was unconfirmed). `,_jsx(_components.code,{children:`trader.grade_at_trade`}),` is `,_jsx(_components.code,{children:`null`}),` unless the status is `,_jsx(_components.code,{children:`graded`}),`.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`poll-for-new-trades`,children:`Poll for new trades`}),`\n`,_jsxs(_components.p,{children:[`Poll with `,_jsx(_components.code,{children:`since`}),` and `,_jsx(_components.code,{children:`If-None-Match`}),` instead of downloading the whole list each time:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Call the route once without `,_jsx(_components.code,{children:`since`}),`. Keep the `,_jsx(_components.code,{children:`ETag`}),` header and the first trade’s `,_jsx(_components.code,{children:`id`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Call it again with `,_jsx(_components.code,{children:`since`}),` set to that `,_jsx(_components.code,{children:`id`}),` and `,_jsx(_components.code,{children:`If-None-Match`}),` set to that `,_jsx(_components.code,{children:`ETag`}),`. When no trade was recorded since, the server returns `,_jsx(_components.code,{children:`304 Not Modified`}),` with no body.`]}),`\n`,_jsxs(_components.li,{children:[`When trades come back, handle them, keep the new `,_jsx(_components.code,{children:`ETag`}),`, and move `,_jsx(_components.code,{children:`since`}),` to the first trade of that response. If `,_jsx(_components.code,{children:`has_more`}),` is `,_jsx(_components.code,{children:`true`}),`, read the rest with `,_jsx(_components.code,{children:`cursor`}),` and the same `,_jsx(_components.code,{children:`since`}),` before you move it.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`since`}),` follows the order trades were recorded in, not `,_jsx(_components.code,{children:`traded_at`}),`. A trade recorded late, with an earlier `,_jsx(_components.code,{children:`traded_at`}),`, still comes back, and a trade that is still being written comes back on a later poll instead of being skipped. A late trade can come back twice, so deduplicate on `,_jsx(_components.code,{children:`id`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$OXINSIDER_API_KEY`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"If-None-Match: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$LAST_ETAG`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://api.0xinsider.com/api/v1/large-trades?since=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$NEWEST_TRADE_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`example`,children:`Example`}),`\n`,_jsx(_components.p,{children:`Basketball trades of $10,000 or more by wallets that held an S or A grade when the trade filled:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$OXINSIDER_API_KEY`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://api.0xinsider.com/api/v1/large-trades?min_grade_at_trade=A\u0026category=Basketball\u0026min_size=10000\u0026limit=50\"`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`what-it-does-not-return`,children:`What it does not return`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A trade under `,_jsx(_components.code,{children:`min_size`}),`, which defaults to `,_jsx(_components.code,{children:`5000`}),`. Lowering it does not reach fills below the size at which 0xinsider records a trade at all.`]}),`\n`,_jsxs(_components.li,{children:[`A trade whose grade at the fill is not known, when you send `,_jsx(_components.code,{children:`min_grade_at_trade`}),`. Every trade before 23:00 UTC on September 19, 2026 is `,_jsx(_components.code,{children:`unknown`}),`, so it never matches.`]}),`\n`,_jsxs(_components.li,{children:[`A `,_jsx(_components.code,{children:`side`}),`, `,_jsx(_components.code,{children:`condition_id`}),`, `,_jsx(_components.code,{children:`trader`}),`, `,_jsx(_components.code,{children:`from`}),`, or `,_jsx(_components.code,{children:`to`}),` filter. `,_jsx(_components.a,{href:`/api-reference/endpoint/get-large-trades-history`,children:`Large trades history`}),` has the last four.`]}),`\n`,_jsxs(_components.li,{children:[`The wallets on the other side of a trade. Open one row with `,_jsx(_components.a,{href:`/api-reference/endpoint/get-large-trade`,children:`Large trade`}),` for its makers.`]}),`\n`,_jsxs(_components.li,{children:[`A prediction. `,_jsx(_components.code,{children:`review_score`}),` reads the fill’s size, its price, the wallet’s win rate on sports and esports markets, and the trade’s age. It says nothing about how the market will resolve.`]}),`\n`,_jsxs(_components.li,{children:[`Proof of insider trading. A high `,_jsx(_components.code,{children:`suspicion_score`}),` marks a trade for review, which is what `,_jsx(_components.a,{href:`/api-reference/endpoint/get-suspicious-trades`,children:`Suspicious trades`}),` is for.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`caching`,children:`Caching`}),`\n`,_jsxs(_components.p,{children:[`Save the response’s `,_jsx(_components.code,{children:`ETag`}),` and send it in `,_jsx(_components.code,{children:`If-None-Match`}),` on your next request. If the list has not changed, the server returns `,_jsx(_components.code,{children:`304 Not Modified`}),` with no body. With `,_jsx(_components.code,{children:`since`}),`, a poll that finds no new trade gets that `,_jsx(_components.code,{children:`304`}),`, because an empty answer does not change between polls. `,_jsx(_components.code,{children:`data_quality`}),` is part of the representation and its stored clocks are included in the `,_jsx(_components.code,{children:`ETag`}),`; `,_jsx(_components.code,{children:`meta.cached`}),` and `,_jsx(_components.code,{children:`meta.cache_age_s`}),` describe the transport cache.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Large trades","description":"List recent large Polymarket trades with wallet grades and review scores.","openapi":"GET /api/v1/large-trades","href":"/api-reference/endpoint/get-large-trades"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Parameters","slug":"parameters","depth":2,"children":[]},{"title":"Key response fields","slug":"key-response-fields","depth":2,"children":[]},{"title":"Poll for new trades","slug":"poll-for-new-trades","depth":2,"children":[]},{"title":"Example","slug":"example","depth":2,"children":[]},{"title":"What it does not return","slug":"what-it-does-not-return","depth":2,"children":[]},{"title":"Caching","slug":"caching","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/0xinsider/127d3f7931557afe/changelog-anchors.js"],"openApiReferenceData":{"operation":{"operationId":"listLargeTrades","summary":"List large trades","description":"List recent large Polymarket trades with wallet grades and review scores.","tags":["Large trades"],"parameters":["e3c08c89-5f0e-42a3-a05c-ce6b1bf7e7bd","8982d9db-26f3-4c65-a0c7-cd0348b96144","d90cbe60-5b6f-46ae-921f-30bcb6741ad7","bb5c6b58-1a66-4647-b42d-0f73b3d00118","7de2fc32-9c9f-426c-9b70-b996bd668392","ca04b488-7d89-463a-807a-be32cfe8d72f","98112143-2d5d-494b-9385-aed5b3e40caf","4cea5607-910a-4646-8cae-0685dc5cf7de","6c945384-dbc4-42f9-8404-6753afdd4f6c","507a8004-cf09-4e07-b2ef-5b64a3cea3ad","8f8c19f6-1cbc-4608-bbd7-4cb26000c626","83c1cd9c-3639-4291-851b-856409c86ede","92a6251e-c2d2-4109-b59d-e505f492c911"],"responses":{"200":"eb18f6be-36f3-4b70-b482-a3885a44eae4","304":"d52eacb8-4b66-4874-a21d-2d4936a7e9ba","400":"608ddb09-6bc6-4d94-b38d-2e14944e3e83","401":"cbe9382e-a1e7-45cc-a9f4-d3221f09ad3b","402":"0495b705-c06e-4aac-94d7-82e7c7899c7d","403":"aa0fc34b-6ad1-40a6-9f94-d9f7255e3acf","408":"71798042-e7e2-40ad-a3d2-d3a1fcbc4df8","423":"2089fa43-7d05-4365-b2c0-a038570426db","429":"99c3685a-ced5-4123-a4a0-f8abae714b80","500":"0f3a05a4-10ab-4a0e-8369-eeb25dc8f098","503":"40bb7f73-8ea8-47bb-aa8c-db16343d1e98"},"x-codeSamples":[{"lang":"curl","label":"cURL","source":"curl -sS \\\n -H \"Authorization: Bearer $OXINSIDER_API_KEY\" \\\n 'https://api.0xinsider.com/api/v1/large-trades'"},{"lang":"curl","label":"cURL (poll for new trades)","source":"curl -sS \\\n -H \"Authorization: Bearer $OXINSIDER_API_KEY\" \\\n -H \"If-None-Match: $LAST_ETAG\" \\\n \"https://api.0xinsider.com/api/v1/large-trades?since=$NEWEST_TRADE_ID\""}],"x-examples":{"success":{"object":"list","data":[],"data_quality":{"status":"partial","field_groups":[{"group":"alert","owner":"whale_alerts.inserted_xid","status":"unknown","reason":"whale_alerts.inserted_xid is a transaction identifier rather than a timestamp"},{"group":"trade","owner":"trades.ingested_at","status":"unknown","reason":"the page returned no large-trade row from which to read this writer clock"},{"group":"trader","owner":"traders.last_synced","status":"unknown","reason":"the page returned no large-trade row from which to read this writer clock"},{"group":"ranking","owner":"trader_rankings.computed_at","status":"unknown","reason":"the page returned no large-trade row from which to read this writer clock"},{"group":"market","owner":"market_canonical.last_refreshed_at","status":"unknown","reason":"the page returned no large-trade row from which to read this writer clock"},{"group":"volume","owner":"market_live_stats.volume_request_observed_at","status":"unknown","reason":"the page returned no large-trade row from which to read this writer clock"}]},"has_more":false,"next_cursor":null,"total":0,"meta":{"request_id":"req_example","cached":false,"cost":1}}},"x-latency-budget":{"milliseconds":250,"measurement":"response-ready","requirement":"engineering-budget"},"method":"get","type":"path","servers":["2ad484fe-94b7-439b-b221-8af155051f3d","5cd2ef08-5581-43fd-8c8b-afbd9f40fc58"],"security":["492b753b-ea58-4928-9009-99bfe0a64119","0870948c-5b42-42f1-9c39-ec6dc389730e"],"path":"/api/v1/large-trades","baseUrlOptions":["https://api.0xinsider.com","https://0xinsider.com/sandbox"],"title":"List large trades","codeSamples":[{"label":"cURL","lang":"curl","source":"curl -sS \\\n -H \"Authorization: Bearer $OXINSIDER_API_KEY\" \\\n 'https://api.0xinsider.com/api/v1/large-trades'"},{"label":"cURL (poll for new trades)","lang":"curl","source":"curl -sS \\\n -H \"Authorization: Bearer $OXINSIDER_API_KEY\" \\\n -H \"If-None-Match: $LAST_ETAG\" \\\n \"https://api.0xinsider.com/api/v1/large-trades?since=$NEWEST_TRADE_ID\""}],"requiredOnlyExamples":false,"requestExampleType":"codeSamples","responseExampleType":"generated"},"dependencies":{"parameters":{"e3c08c89-5f0e-42a3-a05c-ce6b1bf7e7bd":{"name":"limit","in":"query","description":"Maximum number of recent large trades to return. Out-of-range values are clamped to 1..100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Maximum number of recent large trades to return. Out-of-range values are clamped to 1..100.","uniqueKey":"","typeLabel":"integer"}},"8982d9db-26f3-4c65-a0c7-cd0348b96144":{"name":"cursor","in":"query","description":"Pagination cursor from previous response's next_cursor.","schema":{"type":"string","description":"Pagination cursor from previous response's next_cursor.","uniqueKey":"","typeLabel":"string"}},"d90cbe60-5b6f-46ae-921f-30bcb6741ad7":{"name":"min_size","in":"query","description":"Minimum trade size in USD.","schema":{"type":"number","default":5000,"description":"Minimum trade size in USD.","uniqueKey":"","typeLabel":"number"}},"bb5c6b58-1a66-4647-b42d-0f73b3d00118":{"name":"category","in":"query","description":"Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, matches every sport but Esports, the provider's catch-all Sports category (cycling, lacrosse) included: use esports for Esports alone, or omit category for both (#32657).","schema":{"type":"string","description":"Filter by market category (case-insensitive). A canonical bucket name (e.g. Basketball) matches every provider member that folds into it (NBA, WNBA, NCAAB); a raw provider value also resolves to its bucket. Sports and esports only (#27430): a category outside them returns 400 bad_request with param category and names the accepted buckets. The word sports, in any casing, matches every sport but Esports, the provider's catch-all Sports category (cycling, lacrosse) included: use esports for Esports alone, or omit category for both (#32657).","uniqueKey":"","typeLabel":"string"}},"7de2fc32-9c9f-426c-9b70-b996bd668392":{"name":"min_grade","in":"query","description":"Minimum trader grade now (trader.grade), the wallet's grade when this page is read, not when the trade filled. A wallet re-graded after a trade enters or leaves the result, so a catch-up read can disagree with GET /api/v1/stream and webhooks. For the grade at the fill, send min_grade_at_trade instead. A means S or A, B means S, A or B.","schema":{"type":"string","enum":["S","A","B","C","D","F"],"description":"Minimum trader grade now (trader.grade), the wallet's grade when this page is read, not when the trade filled. A wallet re-graded after a trade enters or leaves the result, so a catch-up read can disagree with GET /api/v1/stream and webhooks. For the grade at the fill, send min_grade_at_trade instead. A means S or A, B means S, A or B.","uniqueKey":"","typeLabel":"enum\u003cstring>"}},"ca04b488-7d89-463a-807a-be32cfe8d72f":{"name":"min_grade_at_trade","in":"query","description":"Minimum grade the trader held when the trade filled (trader.grade_at_trade). Only rows whose trader.grade_at_trade_status is graded can match, so a trade before 2026-09-19T23:00Z, or one made while the wallet's grade was changing, never does. The same basis as min_grade_at_trade on GET /api/v1/stream and on webhook trade_filters, so a client that catches up here and then streams gets one answer. Applies to every path: recent, since, sort=market_volume_share, condition_id and event_slug. Sending it with min_grade is 400. A means S or A, B means S, A or B.","schema":{"type":"string","enum":["S","A","B","C","D","F"],"description":"Minimum grade the trader held when the trade filled (trader.grade_at_trade). Only rows whose trader.grade_at_trade_status is graded can match, so a trade before 2026-09-19T23:00Z, or one made while the wallet's grade was changing, never does. The same basis as min_grade_at_trade on GET /api/v1/stream and on webhook trade_filters, so a client that catches up here and then streams gets one answer. Applies to every path: recent, since, sort=market_volume_share, condition_id and event_slug. Sending it with min_grade is 400. A means S or A, B means S, A or B.","uniqueKey":"","typeLabel":"enum\u003cstring>"}},"98112143-2d5d-494b-9385-aed5b3e40caf":{"name":"suspicious_only","in":"query","description":"When true, return only rows with persisted suspicion_score >= 60. The filter is applied before SQL-backed limit + 1 pagination.","schema":{"type":"boolean","default":false,"description":"When true, return only rows with persisted suspicion_score >= 60. The filter is applied before SQL-backed limit + 1 pagination.","uniqueKey":"","typeLabel":"boolean"}},"4cea5607-910a-4646-8cae-0685dc5cf7de":{"name":"min_market_volume_share","in":"query","description":"Keep only trades whose market_volume_share is known and at least this. A fraction, not a percent: 0.01 is one percent of the market's traded volume. A trade whose share is unavailable is never returned by a non-zero value, because an unavailable share cannot be said to clear a floor.","schema":{"type":"number","minimum":0,"maximum":1,"description":"Keep only trades whose market_volume_share is known and at least this. A fraction, not a percent: 0.01 is one percent of the market's traded volume. A trade whose share is unavailable is never returned by a non-zero value, because an unavailable share cannot be said to clear a floor.","uniqueKey":"","typeLabel":"number"}},"6c945384-dbc4-42f9-8404-6753afdd4f6c":{"name":"sort","in":"query","description":"Order of the returned page. recent is newest first and is the default. market_volume_share ranks by each trade's share of its market's traded volume, biggest first, with a trade whose share is unavailable last. That ranking reads the last 30 days, because the share is computed for each request and an unbounded ranking cannot be served inside the documented latency budget. A cursor is bound to the order it was minted in, so a continuation cannot cross from one order into the other.","schema":{"type":"string","enum":["recent","market_volume_share"],"default":"recent","description":"Order of the returned page. recent is newest first and is the default. market_volume_share ranks by each trade's share of its market's traded volume, biggest first, with a trade whose share is unavailable last. That ranking reads the last 30 days, because the share is computed for each request and an unbounded ranking cannot be served inside the documented latency budget. A cursor is bound to the order it was minted in, so a continuation cannot cross from one order into the other.","uniqueKey":"","typeLabel":"enum\u003cstring>"}},"507a8004-cf09-4e07-b2ef-5b64a3cea3ad":{"name":"since","in":"query","description":"Return only the trades recorded after this one. Pass the id of a large trade this API returned (wt_\u003cn>, or the bare integer). The answer keeps the list shape and newest-first order, and next_cursor pages within it. After means commit order: a trade recorded late with an earlier traded_at is still returned, and a trade whose write has not committed yet is returned on a later poll, never skipped. To poll, send the id of the first trade on the first page of your last answer that had trades, with If-None-Match set to the ETag you last received; when nothing new was recorded the answer is 304 with an empty body. A late trade can come back once, so deduplicate on id. Only with sort=recent. An id that names no trade, or one more than 10000 trades behind the newest, answers 400 with error.param since; request the list without since and continue from its first trade.","schema":{"type":"string","description":"Return only the trades recorded after this one. Pass the id of a large trade this API returned (wt_\u003cn>, or the bare integer). The answer keeps the list shape and newest-first order, and next_cursor pages within it. After means commit order: a trade recorded late with an earlier traded_at is still returned, and a trade whose write has not committed yet is returned on a later poll, never skipped. To poll, send the id of the first trade on the first page of your last answer that had trades, with If-None-Match set to the ETag you last received; when nothing new was recorded the answer is 304 with an empty body. A late trade can come back once, so deduplicate on id. Only with sort=recent. An id that names no trade, or one more than 10000 trades behind the newest, answers 400 with error.param since; request the list without since and continue from its first trade.","uniqueKey":"","typeLabel":"string"}},"8f8c19f6-1cbc-4608-bbd7-4cb26000c626":{"name":"condition_id","in":"query","description":"Only this market's large trades: an exact raw provider condition_id. The page is read from the market's own index, newest first, and pages with cursor; it cannot be combined with since or with event_slug (400). An unknown market returns an empty list.","schema":{"type":"string","description":"Only this market's large trades: an exact raw provider condition_id. The page is read from the market's own index, newest first, and pages with cursor; it cannot be combined with since or with event_slug (400). An unknown market returns an empty list.","uniqueKey":"","typeLabel":"string"}},"83c1cd9c-3639-4291-851b-856409c86ede":{"name":"event_slug","in":"query","description":"Only the large trades in one game: every market of the game behind this event slug, the moneyline, spreads, totals and props, as GET /api/v1/games/{event_slug}/trades reads them. Matched case-insensitively. Newest first only (sort=market_volume_share answers 400), pages with cursor, and cannot be combined with since or with condition_id (400). An unknown slug answers 404 not_found with error.param event_slug.","schema":{"type":"string","description":"Only the large trades in one game: every market of the game behind this event slug, the moneyline, spreads, totals and props, as GET /api/v1/games/{event_slug}/trades reads them. Matched case-insensitively. Newest first only (sort=market_volume_share answers 400), pages with cursor, and cannot be combined with since or with condition_id (400). An unknown slug answers 404 not_found with error.param event_slug.","uniqueKey":"","typeLabel":"string"}},"92a6251e-c2d2-4109-b59d-e505f492c911":{"name":"If-None-Match","in":"header","required":false,"description":"Conditional GET validator from a previous ETag. Matching values return 304 Not Modified with an empty body.","schema":{"type":"string","isRequired":false,"description":"Conditional GET validator from a previous ETag. Matching values return 304 Not Modified with an empty body.","uniqueKey":"","typeLabel":"string"}}},"responses":{"eb18f6be-36f3-4b70-b482-a3885a44eae4":{"description":"List of large trades","content":{"application/json":{"schema":{"type":"object","required":["object","data","data_quality","has_more","meta"],"properties":{"object":{"type":"string","const":"list","isRequired":true,"uniqueKey":"object","typeLabel":"string"},"data":{"type":"array","items":{"type":"object","required":["id","traded_at","size_usd","side","outcome","token_id","price","review_score","signal_score","recorded_review_score","recorded_signal_score","suspicion_score","suspicion_track","trader","market","clv"],"properties":{"id":{"type":"string","description":"Prefixed ID (wt_...).","isRequired":true,"uniqueKey":"data.items.[INDEX].id","typeLabel":"string"},"traded_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"data.items.[INDEX].traded_at","typeLabel":"string\u003cdate-time>"},"size_usd":{"type":"number","isRequired":true,"uniqueKey":"data.items.[INDEX].size_usd","typeLabel":"number"},"side":{"type":"string","enum":["BUY","SELL"],"isRequired":true,"uniqueKey":"data.items.[INDEX].side","typeLabel":"enum\u003cstring>"},"outcome":{"oneOf":[{"type":"string","description":"Traded outcome label (e.g. \"Yes\"/\"No\"/team name), resolved provider-first from the trade's outcome_index against market_canonical (index 0 -> yes, 1 -> no). Distinct axis from side (BUY/SELL): side is the trade direction, outcome is which leg was traded. null for multi-outcome (outcome_index >= 2) or unsynced markets, and for a Polymarket trade recorded before 2026-04-02T00:00:00Z unless its stored outcome_index was verified against the fill's own trade records (before that date the stored index was wrong for a large share of trades; an unverified side is unknown, not defaulted).","isRequired":true,"uniqueKey":"data.items.[INDEX].outcome.oneOf.0","typeLabel":"string"},{"type":"null","description":"Traded outcome label (e.g. \"Yes\"/\"No\"/team name), resolved provider-first from the trade's outcome_index against market_canonical (index 0 -> yes, 1 -> no). Distinct axis from side (BUY/SELL): side is the trade direction, outcome is which leg was traded. null for multi-outcome (outcome_index >= 2) or unsynced markets, and for a Polymarket trade recorded before 2026-04-02T00:00:00Z unless its stored outcome_index was verified against the fill's own trade records (before that date the stored index was wrong for a large share of trades; an unverified side is unknown, not defaulted).","isRequired":true,"uniqueKey":"data.items.[INDEX].outcome.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].outcome","typeLabel":"string | null"},"token_id":{"oneOf":[{"type":"string","description":"The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the traded outcome; null when unavailable (e.g. unsynced markets) and for a Polymarket trade recorded before 2026-04-02T00:00:00Z whose traded side is not verified (the same rule as outcome).","isRequired":true,"uniqueKey":"data.items.[INDEX].token_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The Polymarket CLOB token id (ERC1155 asset id, decimal string) for the traded outcome; null when unavailable (e.g. unsynced markets) and for a Polymarket trade recorded before 2026-04-02T00:00:00Z whose traded side is not verified (the same rule as outcome).","isRequired":true,"uniqueKey":"data.items.[INDEX].token_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].token_id","typeLabel":"string | null"},"price":{"type":"number","isRequired":true,"uniqueKey":"data.items.[INDEX].price","typeLabel":"number"},"review_score":{"type":"number","description":"Current trade review score on a 0..1 scale; higher values indicate a stronger review signal. This is the current response value and can differ from the recorded score. Missing measurements remain unavailable.","isRequired":true,"uniqueKey":"data.items.[INDEX].review_score","typeLabel":"number"},"signal_score":{"deprecated":true,"type":"number","description":"Deprecated alias of review_score with the same current value and 0..1 scale. Sunset 2027-02-01 (#29352): removed from V1 on that date; read review_score.","isRequired":true,"uniqueKey":"data.items.[INDEX].signal_score","typeLabel":"number"},"recorded_review_score":{"oneOf":[{"type":"number","description":"0.0–1.0 review score written once when the trade row is inserted, from the trader's statistics at that moment. Populated from 2026-08-03T11:59Z; older rows return null and are never backfilled, because a backfill could only read today's statistics. If a trade is added later, its time-sensitive recorded score reflects that delay. Canonical since #16311; recorded_signal_score carries the same value.","isRequired":true,"uniqueKey":"data.items.[INDEX].recorded_review_score.oneOf.0","typeLabel":"number"},{"type":"null","description":"0.0–1.0 review score written once when the trade row is inserted, from the trader's statistics at that moment. Populated from 2026-08-03T11:59Z; older rows return null and are never backfilled, because a backfill could only read today's statistics. If a trade is added later, its time-sensitive recorded score reflects that delay. Canonical since #16311; recorded_signal_score carries the same value.","isRequired":true,"uniqueKey":"data.items.[INDEX].recorded_review_score.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].recorded_review_score","typeLabel":"number | null"},"recorded_signal_score":{"oneOf":[{"deprecated":true,"type":"number","description":"0.0–1.0 review score written once when the trade row is inserted; null before 2026-08-03T11:59Z. Deprecated (#16311): `recorded_review_score` is the canonical spelling and carries the same value; this key stays on the wire until its sunset on 2027-02-01 (#29352), when it is removed.","isRequired":true,"uniqueKey":"data.items.[INDEX].recorded_signal_score.oneOf.0","typeLabel":"number"},{"deprecated":true,"type":"null","description":"0.0–1.0 review score written once when the trade row is inserted; null before 2026-08-03T11:59Z. Deprecated (#16311): `recorded_review_score` is the canonical spelling and carries the same value; this key stays on the wire until its sunset on 2027-02-01 (#29352), when it is removed.","isRequired":true,"uniqueKey":"data.items.[INDEX].recorded_signal_score.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].recorded_signal_score","typeLabel":"number | null"},"suspicion_score":{"oneOf":[{"type":"integer","minimum":0,"maximum":100,"description":"Persisted live suspicion score from the scorer. Null when the row has no persisted score.","isRequired":true,"uniqueKey":"data.items.[INDEX].suspicion_score.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"maximum":100,"description":"Persisted live suspicion score from the scorer. Null when the row has no persisted score.","isRequired":true,"uniqueKey":"data.items.[INDEX].suspicion_score.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].suspicion_score","typeLabel":"integer | null"},"suspicion_track":{"oneOf":[{"type":"string","enum":["whale","fresh_conviction","sliced_position",null],"description":"Persisted scorer track. Null when a legacy row has no stored track label.","isRequired":true,"uniqueKey":"data.items.[INDEX].suspicion_track.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["whale","fresh_conviction","sliced_position",null],"description":"Persisted scorer track. Null when a legacy row has no stored track label.","isRequired":true,"uniqueKey":"data.items.[INDEX].suspicion_track.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].suspicion_track","typeLabel":"enum\u003cstring> | null"},"trader":{"type":"object","required":["id","address","grade_at_trade","grade_at_trade_status"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"data.items.[INDEX].trader.id","typeLabel":"string"},"address":{"type":"string","isRequired":true,"uniqueKey":"data.items.[INDEX].trader.address","typeLabel":"string"},"grade_at_trade":{"oneOf":[{"type":"string","enum":["S","A","B","C","D","F",null],"description":"The grade the trader held when the trade happened, from recorded grade history (recorded from 2026-09-19T23:00Z). Null unless grade_at_trade_status is graded. Never today's grade projected backward.","isRequired":true,"uniqueKey":"data.items.[INDEX].trader.grade_at_trade.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["S","A","B","C","D","F",null],"description":"The grade the trader held when the trade happened, from recorded grade history (recorded from 2026-09-19T23:00Z). Null unless grade_at_trade_status is graded. Never today's grade projected backward.","isRequired":true,"uniqueKey":"data.items.[INDEX].trader.grade_at_trade.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].trader.grade_at_trade","typeLabel":"enum\u003cstring> | null"},"grade_at_trade_status":{"type":"string","enum":["graded","ungraded","unknown"],"description":"graded: grade_at_trade holds the recorded grade. ungraded: the trader was recorded without a grade at that moment. unknown: no record covers the moment, which is every trade before 2026-09-19T23:00Z and a trade that fell between a grade change and its confirmation. unknown never means ungraded.","isRequired":true,"uniqueKey":"data.items.[INDEX].trader.grade_at_trade_status","typeLabel":"enum\u003cstring>"},"username":{"type":"string","uniqueKey":"data.items.[INDEX].trader.username","typeLabel":"string"},"grade":{"type":"string","description":"The trader's grade today, on every row however old. For what the grade was when the trade happened, read grade_at_trade.","enum":["S","A","B","C","D","F"],"uniqueKey":"data.items.[INDEX].trader.grade","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"data.items.[INDEX].trader","typeLabel":"object"},"market":{"type":"object","required":["id","condition_id","title"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"data.items.[INDEX].market.id","typeLabel":"string"},"condition_id":{"type":"string","isRequired":true,"uniqueKey":"data.items.[INDEX].market.condition_id","typeLabel":"string"},"title":{"type":"string","isRequired":true,"uniqueKey":"data.items.[INDEX].market.title","typeLabel":"string"},"slug":{"type":"string","uniqueKey":"data.items.[INDEX].market.slug","typeLabel":"string"},"category":{"type":"string","description":"Provider-backed market_canonical category.","uniqueKey":"data.items.[INDEX].market.category","typeLabel":"string"}},"isRequired":true,"uniqueKey":"data.items.[INDEX].market","typeLabel":"object"},"clv":{"type":"object","required":["status","unavailable_reason","pre_kickoff","close_anchor_at","close_price","clv_cents","basis_version","taker_fee_cents","clv_after_fees_cents"],"properties":{"basis_version":{"type":"string","description":"The CLV definition, clv@v1.","isRequired":true,"uniqueKey":"data.items.[INDEX].clv.basis_version","typeLabel":"string"},"close_anchor_at":{"oneOf":[{"type":"string","format":"date-time","description":"The anchor pre_kickoff was judged against: the stored close's anchor, else the market's kickoff.","isRequired":true,"uniqueKey":"data.items.[INDEX].clv.close_anchor_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"The anchor pre_kickoff was judged against: the stored close's anchor, else the market's kickoff.","isRequired":true,"uniqueKey":"data.items.[INDEX].clv.close_anchor_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].clv.close_anchor_at","typeLabel":"string\u003cdate-time> | null"},"close_price":{"oneOf":[{"type":"number","description":"The traded outcome's closing price, 0 to 1, whenever a usable close is stored and the outcome is known, in play included.","isRequired":true,"uniqueKey":"data.items.[INDEX].clv.close_price.oneOf.0","typeLabel":"number"},{"type":"null","description":"The traded outcome's closing price, 0 to 1, whenever a usable close is stored and the outcome is known, in play included.","isRequired":true,"uniqueKey":"data.items.[INDEX].clv.close_price.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].clv.close_price","typeLabel":"number | null"},"clv_cents":{"oneOf":[{"type":"number","description":"Cents per share, positive when the trade beat the close: buy is (close_price - price) * 100, sell is (price - close_price) * 100. Gross of fees. Computed from the trade's exact stored price; price on the wire is rounded to 4 places, so a recomputation from it agrees within 0.005 cents. Set exactly when status is measured.","isRequired":true,"uniqueKey":"data.items.[INDEX].clv.clv_cents.oneOf.0","typeLabel":"number"},{"type":"null","description":"Cents per share, positive when the trade beat the close: buy is (close_price - price) * 100, sell is (price - close_price) * 100. Gross of fees. Computed from the trade's exact stored price; price on the wire is rounded to 4 places, so a recomputation from it agrees within 0.005 cents. Set exactly when status is measured.","isRequired":true,"uniqueKey":"data.items.[INDEX].clv.clv_cents.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].clv.clv_cents","typeLabel":"number | null"},"pre_kickoff":{"oneOf":[{"type":"boolean","description":"Whether the trade filled before close_anchor_at. null when the market has no anchor.","isRequired":true,"uniqueKey":"data.items.[INDEX].clv.pre_kickoff.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether the trade filled before close_anchor_at. null when the market has no anchor.","isRequired":true,"uniqueKey":"data.items.[INDEX].clv.pre_kickoff.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].clv.pre_kickoff","typeLabel":"boolean | null"},"status":{"type":"string","enum":["measured","in_play","pending","unavailable"],"description":"measured: clv_cents is set. in_play: traded at or after the close anchor (kickoff), no CLV is defined. pending: traded before kickoff and the market's close is not stored yet. unavailable: see unavailable_reason.","isRequired":true,"uniqueKey":"data.items.[INDEX].clv.status","typeLabel":"enum\u003cstring>"},"unavailable_reason":{"oneOf":[{"type":"string","description":"Set exactly when status is unavailable. The market's reasons (see MarketClose.unavailable_reason), plus anchor_stale (the kickoff moved after the close was captured) and outcome_unknown (the traded outcome is not known for this trade).","enum":["no_observation_in_lookback","provider_empty_window","provider_invalid_contract","capture_window_closed","no_game_start_time","not_one_sided_resolution","not_captured","close_token_mismatch","anchor_stale","outcome_unknown"],"isRequired":true,"uniqueKey":"data.items.[INDEX].clv.unavailable_reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Set exactly when status is unavailable. The market's reasons (see MarketClose.unavailable_reason), plus anchor_stale (the kickoff moved after the close was captured) and outcome_unknown (the traded outcome is not known for this trade).","isRequired":true,"uniqueKey":"data.items.[INDEX].clv.unavailable_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].clv.unavailable_reason","typeLabel":"enum\u003cstring> | null"},"clv_after_fees_cents":{"oneOf":[{"type":"number","description":"clv_cents - taker_fee_cents: the CLV after the fee the fill paid, cents per share. Set exactly when both are set.","isRequired":true,"uniqueKey":"data.items.[INDEX].clv.clv_after_fees_cents.oneOf.0","typeLabel":"number"},{"type":"null","description":"clv_cents - taker_fee_cents: the CLV after the fee the fill paid, cents per share. Set exactly when both are set.","isRequired":true,"uniqueKey":"data.items.[INDEX].clv.clv_after_fees_cents.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].clv.clv_after_fees_cents","typeLabel":"number | null"},"taker_fee_cents":{"oneOf":[{"type":"number","description":"The fee the fill paid as taker, cents per share, from the exchange's on-chain record of the fill (the OrderFilled event in its Polygon receipt); the trader is its taker. Polymarket charges only takers, so a buy's fee adds to its cost and a sell's comes out of its proceeds, and either way it lowers the CLV by this amount. Includes any builder fee an app added; excludes maker and taker rebates, which Polymarket pays later and no fill records. Set whatever status is; null until the record is decoded (about a minute after the trade) and for trades before 2026-08-16.","isRequired":true,"uniqueKey":"data.items.[INDEX].clv.taker_fee_cents.oneOf.0","typeLabel":"number"},{"type":"null","description":"The fee the fill paid as taker, cents per share, from the exchange's on-chain record of the fill (the OrderFilled event in its Polygon receipt); the trader is its taker. Polymarket charges only takers, so a buy's fee adds to its cost and a sell's comes out of its proceeds, and either way it lowers the CLV by this amount. Includes any builder fee an app added; excludes maker and taker rebates, which Polymarket pays later and no fill records. Set whatever status is; null until the record is decoded (about a minute after the trade) and for trades before 2026-08-16.","isRequired":true,"uniqueKey":"data.items.[INDEX].clv.taker_fee_cents.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.items.[INDEX].clv.taker_fee_cents","typeLabel":"number | null"}},"description":"Closing line value against the market's stored close (GET /api/v1/market/{condition_id}/close). Always present; status says whether it is measured.","isRequired":true,"uniqueKey":"data.items.[INDEX].clv","typeLabel":"object"},"market_volume_share":{"type":"number","minimum":0,"maximum":1,"description":"This fill's size relative to its market: its share count (size_usd / price) divided by the shares the market has traded, Polymarket's recorded volume, which counts shares rather than dollars, as observed at or after the trade, so the value always falls between 0 and 1 inclusive. A 20,000-share fill is 0.00005 of a market that has traded 400M shares and 0.125 of one that has traded 160,000, which size_usd alone cannot distinguish. Absent when no volume figure recorded at or after the trade is available, or when that figure is smaller than the fill; never 0 as a stand-in and never capped at 1, because a denominator we cannot trust publishes nothing rather than a trimmed number. A market's volume keeps growing, so the same trade reports a smaller share as the market trades on.","uniqueKey":"data.items.[INDEX].market_volume_share","typeLabel":"number"}},"uniqueKey":"data.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"data","typeLabel":"object[]"},"data_quality":{"type":"object","description":"Writer-backed age and coverage for this page; it is part of the representation and the ETag, while transport cache facts remain in meta.","required":["status","field_groups"],"properties":{"status":{"type":"string","enum":["fresh","stale","partial","unknown","untracked","unavailable"],"description":"fresh when every group is fresh, unavailable when every group is unavailable, stale when every group is fresh or stale and at least one is stale, and partial in every other case.","isRequired":true,"uniqueKey":"data_quality.status","typeLabel":"enum\u003cstring>"},"field_groups":{"type":"array","items":{"type":"object","description":"One group of response fields that share a writer and therefore share a clock.","required":["group","owner","status"],"properties":{"group":{"type":"string","description":"Stable snake_case group name. Names are additive across releases, so match on the ones you know and ignore the rest.","isRequired":true,"uniqueKey":"data_quality.field_groups.items.[INDEX].group","typeLabel":"string"},"owner":{"type":"string","description":"The table and column that write this group, named so the verdict can be audited (for example trader_rankings.computed_at).","isRequired":true,"uniqueKey":"data_quality.field_groups.items.[INDEX].owner","typeLabel":"string"},"status":{"type":"string","enum":["fresh","stale","partial","unknown","untracked","unavailable"],"description":"fresh: served, as_of carries this group's real observation or computation clock, and that clock is no older than max_age_s when the group carries one. stale: served and clocked, but as_of is older than max_age_s, so the writer has missed a refresh its schedule promises. partial: some of the group's fields are served and some are missing. unknown: served, and this read has no clock for it, so no age may be inferred. untracked: 0xinsider does not track this group for this subject, by design. unavailable: the group could not be served. New values may be added; treat one you do not recognize as unknown. Neither fresh nor stale is a tolerance for your use: compare as_of against your own.","isRequired":true,"uniqueKey":"data_quality.field_groups.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"as_of":{"type":"string","format":"date-time","description":"When this group's values were observed or computed. Omitted whenever the read cannot measure it, and never filled with the serialization time, the cache time, or another group's clock.","uniqueKey":"data_quality.field_groups.items.[INDEX].as_of","typeLabel":"string\u003cdate-time>"},"reason":{"type":"string","description":"Why the status is not fresh. Omitted when it is.","uniqueKey":"data_quality.field_groups.items.[INDEX].reason","typeLabel":"string"},"max_age_s":{"type":"integer","minimum":0,"description":"The longest gap in seconds this group's writer leaves between refreshes on its schedule: the age past which the group reads stale instead of fresh. Omitted when the writer keeps no schedule its clock could fall behind (a clock stamped once, only on a change, or when a reader asks), and such a group is never stale. It is the writer's promise, not a tolerance for your use.","uniqueKey":"data_quality.field_groups.items.[INDEX].max_age_s","typeLabel":"integer"}},"uniqueKey":"data_quality.field_groups.items.[INDEX]","typeLabel":"object"},"description":"One entry per field group. Entries may be added in later releases, so match on group rather than on position or length.","isRequired":true,"uniqueKey":"data_quality.field_groups","typeLabel":"object[]"},"as_of":{"type":"string","format":"date-time","description":"The oldest as_of among the groups that carry one: the age of the weakest clock this body rests on. Omitted when no group carries a clock.","uniqueKey":"data_quality.as_of","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"data_quality","typeLabel":"object"},"has_more":{"type":"boolean","isRequired":true,"uniqueKey":"has_more","typeLabel":"boolean"},"meta":{"type":"object","required":["request_id","cached","cost"],"properties":{"request_id":{"type":"string","description":"Unique request ID (req_ prefix). The same value as the X-Request-Id response header, the request's usage accounting row and its log lines.","isRequired":true,"uniqueKey":"meta.request_id","typeLabel":"string"},"cached":{"type":"boolean","isRequired":true,"uniqueKey":"meta.cached","typeLabel":"boolean"},"cost":{"type":"integer","description":"Advisory request weight (relative compute cost). 1 for simple reads; higher for heavier endpoints. Not a credit/price.","isRequired":true,"uniqueKey":"meta.cost","typeLabel":"integer"},"cache_age_s":{"type":"integer","description":"Cache age in seconds. Omitted when the response was not cached, and also when it was cached but its age cannot be established (an entry stored before its cache carried a computed instant). Never a placeholder: an unknown age is reported as no value rather than as the cache TTL.","uniqueKey":"meta.cache_age_s","typeLabel":"integer"},"ranking_generation":{"type":"integer","description":"Committed PostgreSQL-owned leaderboard generation for the returned rows and cursor. Present on GET /api/v1/leaderboard; omitted on endpoints that do not read this ranking.","uniqueKey":"meta.ranking_generation","typeLabel":"integer"},"ranking_as_of":{"type":"string","format":"date-time","description":"Authoritative RFC3339 timestamp from cache_generations.updated_at for ranking_generation. It is read in the same repeatable-read snapshot as the leaderboard rows and is not request time, cache write time, or row insertion order.","uniqueKey":"meta.ranking_as_of","typeLabel":"string\u003cdate-time>"},"continued_from_generation":{"type":"integer","description":"GET /api/v1/leaderboard only. The cursor's ranking_generation, set when this page continued a cursor from an earlier ranking that moved under it: the rows follow the cursor's boundary in the ranking named by ranking_generation, so a trader who crossed the boundary can repeat a row you already hold or be missing from the walk. De-duplicate by id, or restart from the first page for an exact walk. Omitted on a first page and on an exact continuation, including a newer generation in which nothing a page of that order reads moved. It can equal ranking_generation when the ranking moved within one generation: on the default order, sort=rank and sort=grade when the rank keys changed, and on every other sort whenever the projection republished (about once a minute; since 2026-11-07).","uniqueKey":"meta.continued_from_generation","typeLabel":"integer"},"directional_source":{"type":"string","enum":["live","degraded"],"description":"Directional evidence provenance for Edge Hunter signals collections. The default board carries this provenance in data.directional_source and omits this optional meta field.","uniqueKey":"meta.directional_source","typeLabel":"enum\u003cstring>"},"ranking_source":{"type":"string","enum":["live","db_only"],"description":"Ranking evidence provenance for Edge Hunter signals collections. The default board carries this clock/provenance in data.ranking_source and omits this optional meta field.","uniqueKey":"meta.ranking_source","typeLabel":"enum\u003cstring>"},"category_skill_source":{"type":"string","enum":["live","partial","degraded","unavailable"],"description":"Whole filtered snapshot category-evidence status before pagination. Operational live always remains partial source coverage.","uniqueKey":"meta.category_skill_source","typeLabel":"enum\u003cstring>"},"category_skill_model_version":{"type":"string","uniqueKey":"meta.category_skill_model_version","typeLabel":"string"},"category_skill_taxonomy_version":{"type":"string","uniqueKey":"meta.category_skill_taxonomy_version","typeLabel":"string"},"category_skill_platform":{"type":"string","const":"polymarket","uniqueKey":"meta.category_skill_platform","typeLabel":"string"},"category_skill_scope":{"type":"string","const":"observed_goldsky_primary_taker_fill","uniqueKey":"meta.category_skill_scope","typeLabel":"string"},"category_skill_source_coverage":{"type":"string","enum":["partial_whale_threshold_fills","graded_wallet_fills"],"uniqueKey":"meta.category_skill_source_coverage","typeLabel":"enum\u003cstring>"},"category_skill_observation_started_at":{"type":"string","format":"date-time","uniqueKey":"meta.category_skill_observation_started_at","typeLabel":"string\u003cdate-time>"},"category_skill_model_operationally_degraded":{"type":"boolean","description":"Whole-model operational readiness captured with the category model snapshot. Present on category-enriched responses even when the filtered signal list is empty. When true, category_skill_source is degraded and Edge Hunter signals uses the shorter degraded cache TTL.","uniqueKey":"meta.category_skill_model_operationally_degraded","typeLabel":"boolean"},"category_skill_status_counts":{"type":"object","required":["live","insufficient","stale","unknown","degraded"],"properties":{"live":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.live","typeLabel":"integer"},"insufficient":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.insufficient","typeLabel":"integer"},"stale":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.stale","typeLabel":"integer"},"unknown":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.unknown","typeLabel":"integer"},"degraded":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.degraded","typeLabel":"integer"}},"uniqueKey":"meta.category_skill_status_counts","typeLabel":"object"},"category_skill_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"SHA-256 of the funded signal membership/order/rank/cursor vector immediately before category-skill enrichment. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_base_payload_hash","typeLabel":"string"},"category_skill_enriched_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Independent SHA-256 recomputation over the same base fields immediately after category-skill enrichment. Equality with category_skill_base_payload_hash proves category-skill enrichment did not change funded inputs. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_enriched_base_payload_hash","typeLabel":"string"}},"isRequired":true,"uniqueKey":"meta","typeLabel":"object"},"next_cursor":{"type":"string","uniqueKey":"next_cursor","typeLabel":"string"},"total":{"type":"integer","description":"Total matching rows when the read model exposes a count; absent (or null) when it does not.","uniqueKey":"total","typeLabel":"integer"}},"uniqueKey":"","typeLabel":"object"},"examples":{"success":{"title":"success","value":{"object":"list","data":[],"data_quality":{"status":"partial","field_groups":[{"group":"alert","owner":"whale_alerts.inserted_xid","status":"unknown","reason":"whale_alerts.inserted_xid is a transaction identifier rather than a timestamp"},{"group":"trade","owner":"trades.ingested_at","status":"unknown","reason":"the page returned no large-trade row from which to read this writer clock"},{"group":"trader","owner":"traders.last_synced","status":"unknown","reason":"the page returned no large-trade row from which to read this writer clock"},{"group":"ranking","owner":"trader_rankings.computed_at","status":"unknown","reason":"the page returned no large-trade row from which to read this writer clock"},{"group":"market","owner":"market_canonical.last_refreshed_at","status":"unknown","reason":"the page returned no large-trade row from which to read this writer clock"},{"group":"volume","owner":"market_live_stats.volume_request_observed_at","status":"unknown","reason":"the page returned no large-trade row from which to read this writer clock"}]},"has_more":false,"total":0,"meta":{"request_id":"req_example","cached":false,"cost":1}}}},"exampleType":"examples"}},"headers":{"RateLimit-Limit":{"description":"Request limit of the budget this request was counted against, for its current window: the API key's per-minute sliding window on an authenticated call, at its plan's limit (100 requests on Pro, 200 on Max); the control-plane bucket GET /api/v1/me and GET /api/v1/usage share, the same on every plan, on a 429 from either; and the per-IP budget on a public route, on a refused credential (401, 402, 403, 423), and on a remote MCP message other than tools/call, none of which reaches the per-key limiter. Standard RateLimit header spelling.","schema":{"type":"integer","example":100}},"RateLimit-Remaining":{"description":"Requests remaining in that budget's current window after this response. Standard RateLimit header spelling.","schema":{"type":"integer","example":84}},"RateLimit-Reset":{"description":"Seconds until that budget's current window resets. Standard RateLimit header spelling.","schema":{"type":"integer","example":42}},"X-RateLimit-Limit":{"description":"Request limit of the budget this request was counted against, for its current window: the API key's per-minute sliding window on an authenticated call, at its plan's limit (100 requests on Pro, 200 on Max); the control-plane bucket GET /api/v1/me and GET /api/v1/usage share, the same on every plan, on a 429 from either; and the per-IP budget on a public route, on a refused credential (401, 402, 403, 423), and on a remote MCP message other than tools/call.","schema":{"type":"integer","example":100}},"X-RateLimit-Remaining":{"description":"Requests remaining in that budget's current window after this response.","schema":{"type":"integer","example":84}},"X-RateLimit-Reset":{"description":"Unix timestamp when that budget's current window resets.","schema":{"type":"integer","example":1710772860}},"X-Request-Id":{"description":"Server-generated request identifier for support and tracing. On every /api/v1 response, including 304, 408, CORS preflights and every error, and always equal to meta.request_id in the body. It is the key of the request's usage accounting row and of every log line the request emitted, so quote either form to support. A client-supplied X-Request-Id request header is ignored: the value is never adopted or echoed.","schema":{"type":"string","example":"req_550e8400"}},"ETag":{"description":"Weak semantic validator for conditional GET. Request-specific response metadata is excluded; send as If-None-Match to receive 304 when the stable payload is unchanged.","schema":{"type":"string","example":"W/\"8f14e45fceea167a5a36dedd4bea2543\""}},"X-Usage-Accounting":{"description":"Usage-record persistence for a protected V1 handler response. persisted: confirmed row; failed: write failed; unknown: completion could not be confirmed. Independent of handler success; do not replay successful mutations to repair accounting. Absent before accounting admission and on public routes. The zero-cost /api/v1/usage route also omits it.","schema":{"type":"string","enum":["persisted","failed","unknown"]}},"Server-Timing":{"description":"Processing time in milliseconds, for example api;dur=12.345. Includes API authentication, quota admission, handler work and response construction. Excludes network transit and streamed body or export-file transfer. The engineering budget is strictly below 250 ms; this header reports observations, not a latency guarantee or a new timeout.","schema":{"type":"string"},"example":"api;dur=12.345"}},"exampleType":"examples"},"d52eacb8-4b66-4874-a21d-2d4936a7e9ba":{"description":"Not Modified. Returned when If-None-Match matches the current payload.","headers":{"ETag":{"description":"Weak semantic validator for conditional GET. Request-specific response metadata is excluded; send as If-None-Match to receive 304 when the stable payload is unchanged.","schema":{"type":"string","example":"W/\"8f14e45fceea167a5a36dedd4bea2543\""}},"RateLimit-Limit":{"description":"Request limit of the budget this request was counted against, for its current window: the API key's per-minute sliding window on an authenticated call, at its plan's limit (100 requests on Pro, 200 on Max); the control-plane bucket GET /api/v1/me and GET /api/v1/usage share, the same on every plan, on a 429 from either; and the per-IP budget on a public route, on a refused credential (401, 402, 403, 423), and on a remote MCP message other than tools/call, none of which reaches the per-key limiter. Standard RateLimit header spelling.","schema":{"type":"integer","example":100}},"RateLimit-Remaining":{"description":"Requests remaining in that budget's current window after this response. Standard RateLimit header spelling.","schema":{"type":"integer","example":84}},"RateLimit-Reset":{"description":"Seconds until that budget's current window resets. Standard RateLimit header spelling.","schema":{"type":"integer","example":42}},"X-RateLimit-Limit":{"description":"Request limit of the budget this request was counted against, for its current window: the API key's per-minute sliding window on an authenticated call, at its plan's limit (100 requests on Pro, 200 on Max); the control-plane bucket GET /api/v1/me and GET /api/v1/usage share, the same on every plan, on a 429 from either; and the per-IP budget on a public route, on a refused credential (401, 402, 403, 423), and on a remote MCP message other than tools/call.","schema":{"type":"integer","example":100}},"X-RateLimit-Remaining":{"description":"Requests remaining in that budget's current window after this response.","schema":{"type":"integer","example":84}},"X-RateLimit-Reset":{"description":"Unix timestamp when that budget's current window resets.","schema":{"type":"integer","example":1710772860}},"X-Request-Id":{"description":"Server-generated request identifier for support and tracing. On every /api/v1 response, including 304, 408, CORS preflights and every error, and always equal to meta.request_id in the body. It is the key of the request's usage accounting row and of every log line the request emitted, so quote either form to support. A client-supplied X-Request-Id request header is ignored: the value is never adopted or echoed.","schema":{"type":"string","example":"req_550e8400"}},"X-Usage-Accounting":{"description":"Usage-record persistence for a protected V1 handler response. persisted: confirmed row; failed: write failed; unknown: completion could not be confirmed. Independent of handler success; do not replay successful mutations to repair accounting. Absent before accounting admission and on public routes. The zero-cost /api/v1/usage route also omits it.","schema":{"type":"string","enum":["persisted","failed","unknown"]}},"Server-Timing":{"description":"Processing time in milliseconds, for example api;dur=12.345. Includes API authentication, quota admission, handler work and response construction. Excludes network transit and streamed body or export-file transfer. The engineering budget is strictly below 250 ms; this header reports observations, not a latency guarantee or a new timeout.","schema":{"type":"string"},"example":"api;dur=12.345"}},"x-empty-body":true,"content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"608ddb09-6bc6-4d94-b38d-2e14944e3e83":{"description":"Invalid request parameter","content":{"application/json":{"schema":{"type":"object","required":["object","error","meta"],"properties":{"object":{"type":"string","const":"error","isRequired":true,"uniqueKey":"object","typeLabel":"string"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"FROZEN: an existing value never changes meaning. request_timeout (408, #16146) was added the way insufficient_scope was: the handler did not answer inside the server's 30-second timeout. Retry-After and retry_at ride on it only for a safe method (GET, HEAD); a timed-out mutation may have completed, so check its state and reuse its Idempotency-Key.","enum":["bad_request","invalid_api_key","subscription_required","forbidden","insufficient_scope","not_found","account_locked","rate_limited","rate_limit_unavailable","internal_error","request_timeout","endpoint_retired"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"},"retry_at":{"type":"string","format":"date-time","description":"The recommended next request instant (RFC3339), always in the future. Present on every retryable error: `pick_not_released`, `rate_limited`, `rate_limit_unavailable`, and `read_model_warming`. Omitted otherwise. The absolute twin of `Retry-After`; prefer the header for the sleep duration. For `pick_not_released`, the earliest of the next scheduled release, the next automatic selector attempt, the operating-window start, or about 60 seconds. See that response.","uniqueKey":"error.retry_at","typeLabel":"string\u003cdate-time>"},"freshness":{"type":"object","required":["max_age_s","data_quality_status"],"properties":{"max_age_s":{"type":"integer","format":"int64","minimum":0,"description":"The caller's requested whole-response freshness ceiling in seconds.","isRequired":true,"uniqueKey":"error.freshness.max_age_s","typeLabel":"integer\u003cint64>"},"data_quality_status":{"type":"string","enum":["fresh","stale","partial","unknown","untracked","unavailable"],"description":"The trader body's whole-response data-quality status. Only fresh or stale can satisfy max_age_s: the ceiling replaces each writer's own budget, so a stale body inside it is answered.","isRequired":true,"uniqueKey":"error.freshness.data_quality_status","typeLabel":"enum\u003cstring>"},"actual_age_s":{"type":"integer","format":"int64","minimum":0,"description":"Age in seconds of the oldest stored data_quality.as_of clock, when one is available.","uniqueKey":"error.freshness.actual_age_s","typeLabel":"integer\u003cint64>"},"as_of":{"type":"string","format":"date-time","description":"The oldest stored data-quality clock used to calculate actual_age_s, when one is available.","uniqueKey":"error.freshness.as_of","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"error.freshness","typeLabel":"object"},"billing_url":{"type":"string","format":"uri","description":"Where a person clears this 402 (#32592): pays the overdue invoice (reason payment_overdue) or reactivates the plan (reason subscription_inactive). Present on every 402 subscription_required, omitted on every other error. The message names the same URL; link this field instead of parsing the message.","uniqueKey":"error.billing_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","enum":["cursor_expired","unknown_endpoint","pick_not_released","trader_not_tracked","market_out_of_scope","fill_history_too_large","read_model_warming","database_unavailable","request_accounting_unavailable","idempotency_in_progress","webhook_delivery_in_progress","webhook_secret_rotation_not_prepared","webhook_secret_rotation_overlap_active","sandbox_api_key","api_key_in_query","subscription_inactive","payment_overdue","monthly_quota_exceeded","invalid_query","unknown_query_parameter","invalid_path","invalid_body","unsupported_media_type","payload_too_large","method_not_allowed","ip_rate_limited","ip_throttled","cold_read_limited","export_expired","freshness_ceiling_unsatisfied","max_plan_required","endpoint_retired"],"description":"ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. fill_history_too_large (404 not_found, #33245): the wallet and market are tracked, but the position timeline sums every earlier fill into its running totals and this wallet has more than 20,000 fills on the market before the requested page -- stop asking for this pair; neither a retry nor another page can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. payment_overdue (402 subscription_required, #32592): the key is valid and the account still has its plan, but its latest subscription invoice is unpaid (Stripe past_due or unpaid), so paid access is paused; permanent until a person pays at billing_url (https://0xinsider.com/billing) -- stop retrying on a schedule and surface the link. The key works again the moment the invoice is paid. GET /api/v1/me and GET /api/v1/usage keep answering. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. cold_read_limited (429 rate_limited, #28752): the account has used its share of cold reads on GET /api/v1/market/{condition_id}/holders, requests for a market whose roster is not cached, each of which walks Polymarket (6 a minute, in bursts of up to 400); not the per-minute window, so a cached market still answers, and the next cold read is admitted at Retry-After. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed.","uniqueKey":"error.reason","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"type":"object","required":["request_id","cached","cost"],"properties":{"request_id":{"type":"string","description":"Unique request ID (req_ prefix). The same value as the X-Request-Id response header, the request's usage accounting row and its log lines.","isRequired":true,"uniqueKey":"meta.request_id","typeLabel":"string"},"cached":{"type":"boolean","isRequired":true,"uniqueKey":"meta.cached","typeLabel":"boolean"},"cost":{"type":"integer","description":"Advisory request weight (relative compute cost). 1 for simple reads; higher for heavier endpoints. Not a credit/price.","isRequired":true,"uniqueKey":"meta.cost","typeLabel":"integer"},"cache_age_s":{"type":"integer","description":"Cache age in seconds. Omitted when the response was not cached, and also when it was cached but its age cannot be established (an entry stored before its cache carried a computed instant). Never a placeholder: an unknown age is reported as no value rather than as the cache TTL.","uniqueKey":"meta.cache_age_s","typeLabel":"integer"},"ranking_generation":{"type":"integer","description":"Committed PostgreSQL-owned leaderboard generation for the returned rows and cursor. Present on GET /api/v1/leaderboard; omitted on endpoints that do not read this ranking.","uniqueKey":"meta.ranking_generation","typeLabel":"integer"},"ranking_as_of":{"type":"string","format":"date-time","description":"Authoritative RFC3339 timestamp from cache_generations.updated_at for ranking_generation. It is read in the same repeatable-read snapshot as the leaderboard rows and is not request time, cache write time, or row insertion order.","uniqueKey":"meta.ranking_as_of","typeLabel":"string\u003cdate-time>"},"continued_from_generation":{"type":"integer","description":"GET /api/v1/leaderboard only. The cursor's ranking_generation, set when this page continued a cursor from an earlier ranking that moved under it: the rows follow the cursor's boundary in the ranking named by ranking_generation, so a trader who crossed the boundary can repeat a row you already hold or be missing from the walk. De-duplicate by id, or restart from the first page for an exact walk. Omitted on a first page and on an exact continuation, including a newer generation in which nothing a page of that order reads moved. It can equal ranking_generation when the ranking moved within one generation: on the default order, sort=rank and sort=grade when the rank keys changed, and on every other sort whenever the projection republished (about once a minute; since 2026-11-07).","uniqueKey":"meta.continued_from_generation","typeLabel":"integer"},"directional_source":{"type":"string","enum":["live","degraded"],"description":"Directional evidence provenance for Edge Hunter signals collections. The default board carries this provenance in data.directional_source and omits this optional meta field.","uniqueKey":"meta.directional_source","typeLabel":"enum\u003cstring>"},"ranking_source":{"type":"string","enum":["live","db_only"],"description":"Ranking evidence provenance for Edge Hunter signals collections. The default board carries this clock/provenance in data.ranking_source and omits this optional meta field.","uniqueKey":"meta.ranking_source","typeLabel":"enum\u003cstring>"},"category_skill_source":{"type":"string","enum":["live","partial","degraded","unavailable"],"description":"Whole filtered snapshot category-evidence status before pagination. Operational live always remains partial source coverage.","uniqueKey":"meta.category_skill_source","typeLabel":"enum\u003cstring>"},"category_skill_model_version":{"type":"string","uniqueKey":"meta.category_skill_model_version","typeLabel":"string"},"category_skill_taxonomy_version":{"type":"string","uniqueKey":"meta.category_skill_taxonomy_version","typeLabel":"string"},"category_skill_platform":{"type":"string","const":"polymarket","uniqueKey":"meta.category_skill_platform","typeLabel":"string"},"category_skill_scope":{"type":"string","const":"observed_goldsky_primary_taker_fill","uniqueKey":"meta.category_skill_scope","typeLabel":"string"},"category_skill_source_coverage":{"type":"string","enum":["partial_whale_threshold_fills","graded_wallet_fills"],"uniqueKey":"meta.category_skill_source_coverage","typeLabel":"enum\u003cstring>"},"category_skill_observation_started_at":{"type":"string","format":"date-time","uniqueKey":"meta.category_skill_observation_started_at","typeLabel":"string\u003cdate-time>"},"category_skill_model_operationally_degraded":{"type":"boolean","description":"Whole-model operational readiness captured with the category model snapshot. Present on category-enriched responses even when the filtered signal list is empty. When true, category_skill_source is degraded and Edge Hunter signals uses the shorter degraded cache TTL.","uniqueKey":"meta.category_skill_model_operationally_degraded","typeLabel":"boolean"},"category_skill_status_counts":{"type":"object","required":["live","insufficient","stale","unknown","degraded"],"properties":{"live":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.live","typeLabel":"integer"},"insufficient":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.insufficient","typeLabel":"integer"},"stale":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.stale","typeLabel":"integer"},"unknown":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.unknown","typeLabel":"integer"},"degraded":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.degraded","typeLabel":"integer"}},"uniqueKey":"meta.category_skill_status_counts","typeLabel":"object"},"category_skill_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"SHA-256 of the funded signal membership/order/rank/cursor vector immediately before category-skill enrichment. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_base_payload_hash","typeLabel":"string"},"category_skill_enriched_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Independent SHA-256 recomputation over the same base fields immediately after category-skill enrichment. Equality with category_skill_base_payload_hash proves category-skill enrichment did not change funded inputs. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_enriched_base_payload_hash","typeLabel":"string"}},"isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"object":"error","error":{"code":"bad_request","message":"\u003cstring>","doc_url":"\u003cstring>","param":"\u003cstring>","retry_at":"2023-11-07T05:31:56Z","freshness":{"max_age_s":1,"data_quality_status":"fresh","actual_age_s":1,"as_of":"2023-11-07T05:31:56Z"},"billing_url":"\u003cstring>","reason":"cursor_expired"},"meta":{"request_id":"\u003cstring>","cached":true,"cost":123,"cache_age_s":123,"ranking_generation":123,"ranking_as_of":"2023-11-07T05:31:56Z","continued_from_generation":123,"directional_source":"live","ranking_source":"live","category_skill_source":"live","category_skill_model_version":"\u003cstring>","category_skill_taxonomy_version":"\u003cstring>","category_skill_platform":"polymarket","category_skill_scope":"observed_goldsky_primary_taker_fill","category_skill_source_coverage":"partial_whale_threshold_fills","category_skill_observation_started_at":"2023-11-07T05:31:56Z","category_skill_model_operationally_degraded":true,"category_skill_status_counts":{"live":1,"insufficient":1,"stale":1,"unknown":1,"degraded":1},"category_skill_base_payload_hash":"\u003cstring>","category_skill_enriched_base_payload_hash":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"cbe9382e-a1e7-45cc-a9f4-d3221f09ad3b":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","required":["object","error","meta"],"properties":{"object":{"type":"string","const":"error","isRequired":true,"uniqueKey":"object","typeLabel":"string"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"FROZEN: an existing value never changes meaning. request_timeout (408, #16146) was added the way insufficient_scope was: the handler did not answer inside the server's 30-second timeout. Retry-After and retry_at ride on it only for a safe method (GET, HEAD); a timed-out mutation may have completed, so check its state and reuse its Idempotency-Key.","enum":["bad_request","invalid_api_key","subscription_required","forbidden","insufficient_scope","not_found","account_locked","rate_limited","rate_limit_unavailable","internal_error","request_timeout","endpoint_retired"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"},"retry_at":{"type":"string","format":"date-time","description":"The recommended next request instant (RFC3339), always in the future. Present on every retryable error: `pick_not_released`, `rate_limited`, `rate_limit_unavailable`, and `read_model_warming`. Omitted otherwise. The absolute twin of `Retry-After`; prefer the header for the sleep duration. For `pick_not_released`, the earliest of the next scheduled release, the next automatic selector attempt, the operating-window start, or about 60 seconds. See that response.","uniqueKey":"error.retry_at","typeLabel":"string\u003cdate-time>"},"freshness":{"type":"object","required":["max_age_s","data_quality_status"],"properties":{"max_age_s":{"type":"integer","format":"int64","minimum":0,"description":"The caller's requested whole-response freshness ceiling in seconds.","isRequired":true,"uniqueKey":"error.freshness.max_age_s","typeLabel":"integer\u003cint64>"},"data_quality_status":{"type":"string","enum":["fresh","stale","partial","unknown","untracked","unavailable"],"description":"The trader body's whole-response data-quality status. Only fresh or stale can satisfy max_age_s: the ceiling replaces each writer's own budget, so a stale body inside it is answered.","isRequired":true,"uniqueKey":"error.freshness.data_quality_status","typeLabel":"enum\u003cstring>"},"actual_age_s":{"type":"integer","format":"int64","minimum":0,"description":"Age in seconds of the oldest stored data_quality.as_of clock, when one is available.","uniqueKey":"error.freshness.actual_age_s","typeLabel":"integer\u003cint64>"},"as_of":{"type":"string","format":"date-time","description":"The oldest stored data-quality clock used to calculate actual_age_s, when one is available.","uniqueKey":"error.freshness.as_of","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"error.freshness","typeLabel":"object"},"billing_url":{"type":"string","format":"uri","description":"Where a person clears this 402 (#32592): pays the overdue invoice (reason payment_overdue) or reactivates the plan (reason subscription_inactive). Present on every 402 subscription_required, omitted on every other error. The message names the same URL; link this field instead of parsing the message.","uniqueKey":"error.billing_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","enum":["cursor_expired","unknown_endpoint","pick_not_released","trader_not_tracked","market_out_of_scope","fill_history_too_large","read_model_warming","database_unavailable","request_accounting_unavailable","idempotency_in_progress","webhook_delivery_in_progress","webhook_secret_rotation_not_prepared","webhook_secret_rotation_overlap_active","sandbox_api_key","api_key_in_query","subscription_inactive","payment_overdue","monthly_quota_exceeded","invalid_query","unknown_query_parameter","invalid_path","invalid_body","unsupported_media_type","payload_too_large","method_not_allowed","ip_rate_limited","ip_throttled","cold_read_limited","export_expired","freshness_ceiling_unsatisfied","max_plan_required","endpoint_retired"],"description":"ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. fill_history_too_large (404 not_found, #33245): the wallet and market are tracked, but the position timeline sums every earlier fill into its running totals and this wallet has more than 20,000 fills on the market before the requested page -- stop asking for this pair; neither a retry nor another page can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. payment_overdue (402 subscription_required, #32592): the key is valid and the account still has its plan, but its latest subscription invoice is unpaid (Stripe past_due or unpaid), so paid access is paused; permanent until a person pays at billing_url (https://0xinsider.com/billing) -- stop retrying on a schedule and surface the link. The key works again the moment the invoice is paid. GET /api/v1/me and GET /api/v1/usage keep answering. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. cold_read_limited (429 rate_limited, #28752): the account has used its share of cold reads on GET /api/v1/market/{condition_id}/holders, requests for a market whose roster is not cached, each of which walks Polymarket (6 a minute, in bursts of up to 400); not the per-minute window, so a cached market still answers, and the next cold read is admitted at Retry-After. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed.","uniqueKey":"error.reason","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"type":"object","required":["request_id","cached","cost"],"properties":{"request_id":{"type":"string","description":"Unique request ID (req_ prefix). The same value as the X-Request-Id response header, the request's usage accounting row and its log lines.","isRequired":true,"uniqueKey":"meta.request_id","typeLabel":"string"},"cached":{"type":"boolean","isRequired":true,"uniqueKey":"meta.cached","typeLabel":"boolean"},"cost":{"type":"integer","description":"Advisory request weight (relative compute cost). 1 for simple reads; higher for heavier endpoints. Not a credit/price.","isRequired":true,"uniqueKey":"meta.cost","typeLabel":"integer"},"cache_age_s":{"type":"integer","description":"Cache age in seconds. Omitted when the response was not cached, and also when it was cached but its age cannot be established (an entry stored before its cache carried a computed instant). Never a placeholder: an unknown age is reported as no value rather than as the cache TTL.","uniqueKey":"meta.cache_age_s","typeLabel":"integer"},"ranking_generation":{"type":"integer","description":"Committed PostgreSQL-owned leaderboard generation for the returned rows and cursor. Present on GET /api/v1/leaderboard; omitted on endpoints that do not read this ranking.","uniqueKey":"meta.ranking_generation","typeLabel":"integer"},"ranking_as_of":{"type":"string","format":"date-time","description":"Authoritative RFC3339 timestamp from cache_generations.updated_at for ranking_generation. It is read in the same repeatable-read snapshot as the leaderboard rows and is not request time, cache write time, or row insertion order.","uniqueKey":"meta.ranking_as_of","typeLabel":"string\u003cdate-time>"},"continued_from_generation":{"type":"integer","description":"GET /api/v1/leaderboard only. The cursor's ranking_generation, set when this page continued a cursor from an earlier ranking that moved under it: the rows follow the cursor's boundary in the ranking named by ranking_generation, so a trader who crossed the boundary can repeat a row you already hold or be missing from the walk. De-duplicate by id, or restart from the first page for an exact walk. Omitted on a first page and on an exact continuation, including a newer generation in which nothing a page of that order reads moved. It can equal ranking_generation when the ranking moved within one generation: on the default order, sort=rank and sort=grade when the rank keys changed, and on every other sort whenever the projection republished (about once a minute; since 2026-11-07).","uniqueKey":"meta.continued_from_generation","typeLabel":"integer"},"directional_source":{"type":"string","enum":["live","degraded"],"description":"Directional evidence provenance for Edge Hunter signals collections. The default board carries this provenance in data.directional_source and omits this optional meta field.","uniqueKey":"meta.directional_source","typeLabel":"enum\u003cstring>"},"ranking_source":{"type":"string","enum":["live","db_only"],"description":"Ranking evidence provenance for Edge Hunter signals collections. The default board carries this clock/provenance in data.ranking_source and omits this optional meta field.","uniqueKey":"meta.ranking_source","typeLabel":"enum\u003cstring>"},"category_skill_source":{"type":"string","enum":["live","partial","degraded","unavailable"],"description":"Whole filtered snapshot category-evidence status before pagination. Operational live always remains partial source coverage.","uniqueKey":"meta.category_skill_source","typeLabel":"enum\u003cstring>"},"category_skill_model_version":{"type":"string","uniqueKey":"meta.category_skill_model_version","typeLabel":"string"},"category_skill_taxonomy_version":{"type":"string","uniqueKey":"meta.category_skill_taxonomy_version","typeLabel":"string"},"category_skill_platform":{"type":"string","const":"polymarket","uniqueKey":"meta.category_skill_platform","typeLabel":"string"},"category_skill_scope":{"type":"string","const":"observed_goldsky_primary_taker_fill","uniqueKey":"meta.category_skill_scope","typeLabel":"string"},"category_skill_source_coverage":{"type":"string","enum":["partial_whale_threshold_fills","graded_wallet_fills"],"uniqueKey":"meta.category_skill_source_coverage","typeLabel":"enum\u003cstring>"},"category_skill_observation_started_at":{"type":"string","format":"date-time","uniqueKey":"meta.category_skill_observation_started_at","typeLabel":"string\u003cdate-time>"},"category_skill_model_operationally_degraded":{"type":"boolean","description":"Whole-model operational readiness captured with the category model snapshot. Present on category-enriched responses even when the filtered signal list is empty. When true, category_skill_source is degraded and Edge Hunter signals uses the shorter degraded cache TTL.","uniqueKey":"meta.category_skill_model_operationally_degraded","typeLabel":"boolean"},"category_skill_status_counts":{"type":"object","required":["live","insufficient","stale","unknown","degraded"],"properties":{"live":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.live","typeLabel":"integer"},"insufficient":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.insufficient","typeLabel":"integer"},"stale":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.stale","typeLabel":"integer"},"unknown":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.unknown","typeLabel":"integer"},"degraded":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.degraded","typeLabel":"integer"}},"uniqueKey":"meta.category_skill_status_counts","typeLabel":"object"},"category_skill_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"SHA-256 of the funded signal membership/order/rank/cursor vector immediately before category-skill enrichment. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_base_payload_hash","typeLabel":"string"},"category_skill_enriched_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Independent SHA-256 recomputation over the same base fields immediately after category-skill enrichment. Equality with category_skill_base_payload_hash proves category-skill enrichment did not change funded inputs. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_enriched_base_payload_hash","typeLabel":"string"}},"isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"object":"error","error":{"code":"bad_request","message":"\u003cstring>","doc_url":"\u003cstring>","param":"\u003cstring>","retry_at":"2023-11-07T05:31:56Z","freshness":{"max_age_s":1,"data_quality_status":"fresh","actual_age_s":1,"as_of":"2023-11-07T05:31:56Z"},"billing_url":"\u003cstring>","reason":"cursor_expired"},"meta":{"request_id":"\u003cstring>","cached":true,"cost":123,"cache_age_s":123,"ranking_generation":123,"ranking_as_of":"2023-11-07T05:31:56Z","continued_from_generation":123,"directional_source":"live","ranking_source":"live","category_skill_source":"live","category_skill_model_version":"\u003cstring>","category_skill_taxonomy_version":"\u003cstring>","category_skill_platform":"polymarket","category_skill_scope":"observed_goldsky_primary_taker_fill","category_skill_source_coverage":"partial_whale_threshold_fills","category_skill_observation_started_at":"2023-11-07T05:31:56Z","category_skill_model_operationally_degraded":true,"category_skill_status_counts":{"live":1,"insufficient":1,"stale":1,"unknown":1,"degraded":1},"category_skill_base_payload_hash":"\u003cstring>","category_skill_enriched_base_payload_hash":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"0495b705-c06e-4aac-94d7-82e7c7899c7d":{"description":"Active Pro subscription required. The key is valid but the account has no paid access: error.reason is subscription_inactive when the Pro subscription has lapsed, or payment_overdue when the plan stands but its latest invoice is unpaid (#32592). error.billing_url and error.message name where a person clears it (https://0xinsider.com/billing). Permanent until a person acts: no Retry-After, never retry on a schedule.","content":{"application/json":{"schema":{"type":"object","required":["object","error","meta"],"properties":{"object":{"type":"string","const":"error","isRequired":true,"uniqueKey":"object","typeLabel":"string"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"FROZEN: an existing value never changes meaning. request_timeout (408, #16146) was added the way insufficient_scope was: the handler did not answer inside the server's 30-second timeout. Retry-After and retry_at ride on it only for a safe method (GET, HEAD); a timed-out mutation may have completed, so check its state and reuse its Idempotency-Key.","enum":["bad_request","invalid_api_key","subscription_required","forbidden","insufficient_scope","not_found","account_locked","rate_limited","rate_limit_unavailable","internal_error","request_timeout","endpoint_retired"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"},"retry_at":{"type":"string","format":"date-time","description":"The recommended next request instant (RFC3339), always in the future. Present on every retryable error: `pick_not_released`, `rate_limited`, `rate_limit_unavailable`, and `read_model_warming`. Omitted otherwise. The absolute twin of `Retry-After`; prefer the header for the sleep duration. For `pick_not_released`, the earliest of the next scheduled release, the next automatic selector attempt, the operating-window start, or about 60 seconds. See that response.","uniqueKey":"error.retry_at","typeLabel":"string\u003cdate-time>"},"freshness":{"type":"object","required":["max_age_s","data_quality_status"],"properties":{"max_age_s":{"type":"integer","format":"int64","minimum":0,"description":"The caller's requested whole-response freshness ceiling in seconds.","isRequired":true,"uniqueKey":"error.freshness.max_age_s","typeLabel":"integer\u003cint64>"},"data_quality_status":{"type":"string","enum":["fresh","stale","partial","unknown","untracked","unavailable"],"description":"The trader body's whole-response data-quality status. Only fresh or stale can satisfy max_age_s: the ceiling replaces each writer's own budget, so a stale body inside it is answered.","isRequired":true,"uniqueKey":"error.freshness.data_quality_status","typeLabel":"enum\u003cstring>"},"actual_age_s":{"type":"integer","format":"int64","minimum":0,"description":"Age in seconds of the oldest stored data_quality.as_of clock, when one is available.","uniqueKey":"error.freshness.actual_age_s","typeLabel":"integer\u003cint64>"},"as_of":{"type":"string","format":"date-time","description":"The oldest stored data-quality clock used to calculate actual_age_s, when one is available.","uniqueKey":"error.freshness.as_of","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"error.freshness","typeLabel":"object"},"billing_url":{"type":"string","format":"uri","description":"Where a person clears this 402 (#32592): pays the overdue invoice (reason payment_overdue) or reactivates the plan (reason subscription_inactive). Present on every 402 subscription_required, omitted on every other error. The message names the same URL; link this field instead of parsing the message.","uniqueKey":"error.billing_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","enum":["cursor_expired","unknown_endpoint","pick_not_released","trader_not_tracked","market_out_of_scope","fill_history_too_large","read_model_warming","database_unavailable","request_accounting_unavailable","idempotency_in_progress","webhook_delivery_in_progress","webhook_secret_rotation_not_prepared","webhook_secret_rotation_overlap_active","sandbox_api_key","api_key_in_query","subscription_inactive","payment_overdue","monthly_quota_exceeded","invalid_query","unknown_query_parameter","invalid_path","invalid_body","unsupported_media_type","payload_too_large","method_not_allowed","ip_rate_limited","ip_throttled","cold_read_limited","export_expired","freshness_ceiling_unsatisfied","max_plan_required","endpoint_retired"],"description":"ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. fill_history_too_large (404 not_found, #33245): the wallet and market are tracked, but the position timeline sums every earlier fill into its running totals and this wallet has more than 20,000 fills on the market before the requested page -- stop asking for this pair; neither a retry nor another page can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. payment_overdue (402 subscription_required, #32592): the key is valid and the account still has its plan, but its latest subscription invoice is unpaid (Stripe past_due or unpaid), so paid access is paused; permanent until a person pays at billing_url (https://0xinsider.com/billing) -- stop retrying on a schedule and surface the link. The key works again the moment the invoice is paid. GET /api/v1/me and GET /api/v1/usage keep answering. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. cold_read_limited (429 rate_limited, #28752): the account has used its share of cold reads on GET /api/v1/market/{condition_id}/holders, requests for a market whose roster is not cached, each of which walks Polymarket (6 a minute, in bursts of up to 400); not the per-minute window, so a cached market still answers, and the next cold read is admitted at Retry-After. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed.","uniqueKey":"error.reason","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"type":"object","required":["request_id","cached","cost"],"properties":{"request_id":{"type":"string","description":"Unique request ID (req_ prefix). The same value as the X-Request-Id response header, the request's usage accounting row and its log lines.","isRequired":true,"uniqueKey":"meta.request_id","typeLabel":"string"},"cached":{"type":"boolean","isRequired":true,"uniqueKey":"meta.cached","typeLabel":"boolean"},"cost":{"type":"integer","description":"Advisory request weight (relative compute cost). 1 for simple reads; higher for heavier endpoints. Not a credit/price.","isRequired":true,"uniqueKey":"meta.cost","typeLabel":"integer"},"cache_age_s":{"type":"integer","description":"Cache age in seconds. Omitted when the response was not cached, and also when it was cached but its age cannot be established (an entry stored before its cache carried a computed instant). Never a placeholder: an unknown age is reported as no value rather than as the cache TTL.","uniqueKey":"meta.cache_age_s","typeLabel":"integer"},"ranking_generation":{"type":"integer","description":"Committed PostgreSQL-owned leaderboard generation for the returned rows and cursor. Present on GET /api/v1/leaderboard; omitted on endpoints that do not read this ranking.","uniqueKey":"meta.ranking_generation","typeLabel":"integer"},"ranking_as_of":{"type":"string","format":"date-time","description":"Authoritative RFC3339 timestamp from cache_generations.updated_at for ranking_generation. It is read in the same repeatable-read snapshot as the leaderboard rows and is not request time, cache write time, or row insertion order.","uniqueKey":"meta.ranking_as_of","typeLabel":"string\u003cdate-time>"},"continued_from_generation":{"type":"integer","description":"GET /api/v1/leaderboard only. The cursor's ranking_generation, set when this page continued a cursor from an earlier ranking that moved under it: the rows follow the cursor's boundary in the ranking named by ranking_generation, so a trader who crossed the boundary can repeat a row you already hold or be missing from the walk. De-duplicate by id, or restart from the first page for an exact walk. Omitted on a first page and on an exact continuation, including a newer generation in which nothing a page of that order reads moved. It can equal ranking_generation when the ranking moved within one generation: on the default order, sort=rank and sort=grade when the rank keys changed, and on every other sort whenever the projection republished (about once a minute; since 2026-11-07).","uniqueKey":"meta.continued_from_generation","typeLabel":"integer"},"directional_source":{"type":"string","enum":["live","degraded"],"description":"Directional evidence provenance for Edge Hunter signals collections. The default board carries this provenance in data.directional_source and omits this optional meta field.","uniqueKey":"meta.directional_source","typeLabel":"enum\u003cstring>"},"ranking_source":{"type":"string","enum":["live","db_only"],"description":"Ranking evidence provenance for Edge Hunter signals collections. The default board carries this clock/provenance in data.ranking_source and omits this optional meta field.","uniqueKey":"meta.ranking_source","typeLabel":"enum\u003cstring>"},"category_skill_source":{"type":"string","enum":["live","partial","degraded","unavailable"],"description":"Whole filtered snapshot category-evidence status before pagination. Operational live always remains partial source coverage.","uniqueKey":"meta.category_skill_source","typeLabel":"enum\u003cstring>"},"category_skill_model_version":{"type":"string","uniqueKey":"meta.category_skill_model_version","typeLabel":"string"},"category_skill_taxonomy_version":{"type":"string","uniqueKey":"meta.category_skill_taxonomy_version","typeLabel":"string"},"category_skill_platform":{"type":"string","const":"polymarket","uniqueKey":"meta.category_skill_platform","typeLabel":"string"},"category_skill_scope":{"type":"string","const":"observed_goldsky_primary_taker_fill","uniqueKey":"meta.category_skill_scope","typeLabel":"string"},"category_skill_source_coverage":{"type":"string","enum":["partial_whale_threshold_fills","graded_wallet_fills"],"uniqueKey":"meta.category_skill_source_coverage","typeLabel":"enum\u003cstring>"},"category_skill_observation_started_at":{"type":"string","format":"date-time","uniqueKey":"meta.category_skill_observation_started_at","typeLabel":"string\u003cdate-time>"},"category_skill_model_operationally_degraded":{"type":"boolean","description":"Whole-model operational readiness captured with the category model snapshot. Present on category-enriched responses even when the filtered signal list is empty. When true, category_skill_source is degraded and Edge Hunter signals uses the shorter degraded cache TTL.","uniqueKey":"meta.category_skill_model_operationally_degraded","typeLabel":"boolean"},"category_skill_status_counts":{"type":"object","required":["live","insufficient","stale","unknown","degraded"],"properties":{"live":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.live","typeLabel":"integer"},"insufficient":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.insufficient","typeLabel":"integer"},"stale":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.stale","typeLabel":"integer"},"unknown":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.unknown","typeLabel":"integer"},"degraded":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.degraded","typeLabel":"integer"}},"uniqueKey":"meta.category_skill_status_counts","typeLabel":"object"},"category_skill_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"SHA-256 of the funded signal membership/order/rank/cursor vector immediately before category-skill enrichment. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_base_payload_hash","typeLabel":"string"},"category_skill_enriched_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Independent SHA-256 recomputation over the same base fields immediately after category-skill enrichment. Equality with category_skill_base_payload_hash proves category-skill enrichment did not change funded inputs. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_enriched_base_payload_hash","typeLabel":"string"}},"isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"object":"error","error":{"code":"bad_request","message":"\u003cstring>","doc_url":"\u003cstring>","param":"\u003cstring>","retry_at":"2023-11-07T05:31:56Z","freshness":{"max_age_s":1,"data_quality_status":"fresh","actual_age_s":1,"as_of":"2023-11-07T05:31:56Z"},"billing_url":"\u003cstring>","reason":"cursor_expired"},"meta":{"request_id":"\u003cstring>","cached":true,"cost":123,"cache_age_s":123,"ranking_generation":123,"ranking_as_of":"2023-11-07T05:31:56Z","continued_from_generation":123,"directional_source":"live","ranking_source":"live","category_skill_source":"live","category_skill_model_version":"\u003cstring>","category_skill_taxonomy_version":"\u003cstring>","category_skill_platform":"polymarket","category_skill_scope":"observed_goldsky_primary_taker_fill","category_skill_source_coverage":"partial_whale_threshold_fills","category_skill_observation_started_at":"2023-11-07T05:31:56Z","category_skill_model_operationally_degraded":true,"category_skill_status_counts":{"live":1,"insufficient":1,"stale":1,"unknown":1,"degraded":1},"category_skill_base_payload_hash":"\u003cstring>","category_skill_enriched_base_payload_hash":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"aa0fc34b-6ad1-40a6-9f94-d9f7255e3acf":{"description":"Account access denied","content":{"application/json":{"schema":{"type":"object","required":["object","error","meta"],"properties":{"object":{"type":"string","const":"error","isRequired":true,"uniqueKey":"object","typeLabel":"string"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"FROZEN: an existing value never changes meaning. request_timeout (408, #16146) was added the way insufficient_scope was: the handler did not answer inside the server's 30-second timeout. Retry-After and retry_at ride on it only for a safe method (GET, HEAD); a timed-out mutation may have completed, so check its state and reuse its Idempotency-Key.","enum":["bad_request","invalid_api_key","subscription_required","forbidden","insufficient_scope","not_found","account_locked","rate_limited","rate_limit_unavailable","internal_error","request_timeout","endpoint_retired"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"},"retry_at":{"type":"string","format":"date-time","description":"The recommended next request instant (RFC3339), always in the future. Present on every retryable error: `pick_not_released`, `rate_limited`, `rate_limit_unavailable`, and `read_model_warming`. Omitted otherwise. The absolute twin of `Retry-After`; prefer the header for the sleep duration. For `pick_not_released`, the earliest of the next scheduled release, the next automatic selector attempt, the operating-window start, or about 60 seconds. See that response.","uniqueKey":"error.retry_at","typeLabel":"string\u003cdate-time>"},"freshness":{"type":"object","required":["max_age_s","data_quality_status"],"properties":{"max_age_s":{"type":"integer","format":"int64","minimum":0,"description":"The caller's requested whole-response freshness ceiling in seconds.","isRequired":true,"uniqueKey":"error.freshness.max_age_s","typeLabel":"integer\u003cint64>"},"data_quality_status":{"type":"string","enum":["fresh","stale","partial","unknown","untracked","unavailable"],"description":"The trader body's whole-response data-quality status. Only fresh or stale can satisfy max_age_s: the ceiling replaces each writer's own budget, so a stale body inside it is answered.","isRequired":true,"uniqueKey":"error.freshness.data_quality_status","typeLabel":"enum\u003cstring>"},"actual_age_s":{"type":"integer","format":"int64","minimum":0,"description":"Age in seconds of the oldest stored data_quality.as_of clock, when one is available.","uniqueKey":"error.freshness.actual_age_s","typeLabel":"integer\u003cint64>"},"as_of":{"type":"string","format":"date-time","description":"The oldest stored data-quality clock used to calculate actual_age_s, when one is available.","uniqueKey":"error.freshness.as_of","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"error.freshness","typeLabel":"object"},"billing_url":{"type":"string","format":"uri","description":"Where a person clears this 402 (#32592): pays the overdue invoice (reason payment_overdue) or reactivates the plan (reason subscription_inactive). Present on every 402 subscription_required, omitted on every other error. The message names the same URL; link this field instead of parsing the message.","uniqueKey":"error.billing_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","enum":["cursor_expired","unknown_endpoint","pick_not_released","trader_not_tracked","market_out_of_scope","fill_history_too_large","read_model_warming","database_unavailable","request_accounting_unavailable","idempotency_in_progress","webhook_delivery_in_progress","webhook_secret_rotation_not_prepared","webhook_secret_rotation_overlap_active","sandbox_api_key","api_key_in_query","subscription_inactive","payment_overdue","monthly_quota_exceeded","invalid_query","unknown_query_parameter","invalid_path","invalid_body","unsupported_media_type","payload_too_large","method_not_allowed","ip_rate_limited","ip_throttled","cold_read_limited","export_expired","freshness_ceiling_unsatisfied","max_plan_required","endpoint_retired"],"description":"ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. fill_history_too_large (404 not_found, #33245): the wallet and market are tracked, but the position timeline sums every earlier fill into its running totals and this wallet has more than 20,000 fills on the market before the requested page -- stop asking for this pair; neither a retry nor another page can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. payment_overdue (402 subscription_required, #32592): the key is valid and the account still has its plan, but its latest subscription invoice is unpaid (Stripe past_due or unpaid), so paid access is paused; permanent until a person pays at billing_url (https://0xinsider.com/billing) -- stop retrying on a schedule and surface the link. The key works again the moment the invoice is paid. GET /api/v1/me and GET /api/v1/usage keep answering. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. cold_read_limited (429 rate_limited, #28752): the account has used its share of cold reads on GET /api/v1/market/{condition_id}/holders, requests for a market whose roster is not cached, each of which walks Polymarket (6 a minute, in bursts of up to 400); not the per-minute window, so a cached market still answers, and the next cold read is admitted at Retry-After. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed.","uniqueKey":"error.reason","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"type":"object","required":["request_id","cached","cost"],"properties":{"request_id":{"type":"string","description":"Unique request ID (req_ prefix). The same value as the X-Request-Id response header, the request's usage accounting row and its log lines.","isRequired":true,"uniqueKey":"meta.request_id","typeLabel":"string"},"cached":{"type":"boolean","isRequired":true,"uniqueKey":"meta.cached","typeLabel":"boolean"},"cost":{"type":"integer","description":"Advisory request weight (relative compute cost). 1 for simple reads; higher for heavier endpoints. Not a credit/price.","isRequired":true,"uniqueKey":"meta.cost","typeLabel":"integer"},"cache_age_s":{"type":"integer","description":"Cache age in seconds. Omitted when the response was not cached, and also when it was cached but its age cannot be established (an entry stored before its cache carried a computed instant). Never a placeholder: an unknown age is reported as no value rather than as the cache TTL.","uniqueKey":"meta.cache_age_s","typeLabel":"integer"},"ranking_generation":{"type":"integer","description":"Committed PostgreSQL-owned leaderboard generation for the returned rows and cursor. Present on GET /api/v1/leaderboard; omitted on endpoints that do not read this ranking.","uniqueKey":"meta.ranking_generation","typeLabel":"integer"},"ranking_as_of":{"type":"string","format":"date-time","description":"Authoritative RFC3339 timestamp from cache_generations.updated_at for ranking_generation. It is read in the same repeatable-read snapshot as the leaderboard rows and is not request time, cache write time, or row insertion order.","uniqueKey":"meta.ranking_as_of","typeLabel":"string\u003cdate-time>"},"continued_from_generation":{"type":"integer","description":"GET /api/v1/leaderboard only. The cursor's ranking_generation, set when this page continued a cursor from an earlier ranking that moved under it: the rows follow the cursor's boundary in the ranking named by ranking_generation, so a trader who crossed the boundary can repeat a row you already hold or be missing from the walk. De-duplicate by id, or restart from the first page for an exact walk. Omitted on a first page and on an exact continuation, including a newer generation in which nothing a page of that order reads moved. It can equal ranking_generation when the ranking moved within one generation: on the default order, sort=rank and sort=grade when the rank keys changed, and on every other sort whenever the projection republished (about once a minute; since 2026-11-07).","uniqueKey":"meta.continued_from_generation","typeLabel":"integer"},"directional_source":{"type":"string","enum":["live","degraded"],"description":"Directional evidence provenance for Edge Hunter signals collections. The default board carries this provenance in data.directional_source and omits this optional meta field.","uniqueKey":"meta.directional_source","typeLabel":"enum\u003cstring>"},"ranking_source":{"type":"string","enum":["live","db_only"],"description":"Ranking evidence provenance for Edge Hunter signals collections. The default board carries this clock/provenance in data.ranking_source and omits this optional meta field.","uniqueKey":"meta.ranking_source","typeLabel":"enum\u003cstring>"},"category_skill_source":{"type":"string","enum":["live","partial","degraded","unavailable"],"description":"Whole filtered snapshot category-evidence status before pagination. Operational live always remains partial source coverage.","uniqueKey":"meta.category_skill_source","typeLabel":"enum\u003cstring>"},"category_skill_model_version":{"type":"string","uniqueKey":"meta.category_skill_model_version","typeLabel":"string"},"category_skill_taxonomy_version":{"type":"string","uniqueKey":"meta.category_skill_taxonomy_version","typeLabel":"string"},"category_skill_platform":{"type":"string","const":"polymarket","uniqueKey":"meta.category_skill_platform","typeLabel":"string"},"category_skill_scope":{"type":"string","const":"observed_goldsky_primary_taker_fill","uniqueKey":"meta.category_skill_scope","typeLabel":"string"},"category_skill_source_coverage":{"type":"string","enum":["partial_whale_threshold_fills","graded_wallet_fills"],"uniqueKey":"meta.category_skill_source_coverage","typeLabel":"enum\u003cstring>"},"category_skill_observation_started_at":{"type":"string","format":"date-time","uniqueKey":"meta.category_skill_observation_started_at","typeLabel":"string\u003cdate-time>"},"category_skill_model_operationally_degraded":{"type":"boolean","description":"Whole-model operational readiness captured with the category model snapshot. Present on category-enriched responses even when the filtered signal list is empty. When true, category_skill_source is degraded and Edge Hunter signals uses the shorter degraded cache TTL.","uniqueKey":"meta.category_skill_model_operationally_degraded","typeLabel":"boolean"},"category_skill_status_counts":{"type":"object","required":["live","insufficient","stale","unknown","degraded"],"properties":{"live":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.live","typeLabel":"integer"},"insufficient":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.insufficient","typeLabel":"integer"},"stale":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.stale","typeLabel":"integer"},"unknown":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.unknown","typeLabel":"integer"},"degraded":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.degraded","typeLabel":"integer"}},"uniqueKey":"meta.category_skill_status_counts","typeLabel":"object"},"category_skill_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"SHA-256 of the funded signal membership/order/rank/cursor vector immediately before category-skill enrichment. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_base_payload_hash","typeLabel":"string"},"category_skill_enriched_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Independent SHA-256 recomputation over the same base fields immediately after category-skill enrichment. Equality with category_skill_base_payload_hash proves category-skill enrichment did not change funded inputs. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_enriched_base_payload_hash","typeLabel":"string"}},"isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"object":"error","error":{"code":"bad_request","message":"\u003cstring>","doc_url":"\u003cstring>","param":"\u003cstring>","retry_at":"2023-11-07T05:31:56Z","freshness":{"max_age_s":1,"data_quality_status":"fresh","actual_age_s":1,"as_of":"2023-11-07T05:31:56Z"},"billing_url":"\u003cstring>","reason":"cursor_expired"},"meta":{"request_id":"\u003cstring>","cached":true,"cost":123,"cache_age_s":123,"ranking_generation":123,"ranking_as_of":"2023-11-07T05:31:56Z","continued_from_generation":123,"directional_source":"live","ranking_source":"live","category_skill_source":"live","category_skill_model_version":"\u003cstring>","category_skill_taxonomy_version":"\u003cstring>","category_skill_platform":"polymarket","category_skill_scope":"observed_goldsky_primary_taker_fill","category_skill_source_coverage":"partial_whale_threshold_fills","category_skill_observation_started_at":"2023-11-07T05:31:56Z","category_skill_model_operationally_degraded":true,"category_skill_status_counts":{"live":1,"insufficient":1,"stale":1,"unknown":1,"degraded":1},"category_skill_base_payload_hash":"\u003cstring>","category_skill_enriched_base_payload_hash":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"71798042-e7e2-40ad-a3d2-d3a1fcbc4df8":{"description":"The handler did not answer inside the server's 30-second timeout. error.code is request_timeout. On GET and HEAD the response carries Retry-After and error.retry_at; on a mutation it carries neither, because the request may have completed on the server: check its state before repeating it, and reuse its Idempotency-Key.","content":{"application/json":{"schema":{"type":"object","required":["object","error","meta"],"properties":{"object":{"type":"string","const":"error","isRequired":true,"uniqueKey":"object","typeLabel":"string"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"FROZEN: an existing value never changes meaning. request_timeout (408, #16146) was added the way insufficient_scope was: the handler did not answer inside the server's 30-second timeout. Retry-After and retry_at ride on it only for a safe method (GET, HEAD); a timed-out mutation may have completed, so check its state and reuse its Idempotency-Key.","enum":["bad_request","invalid_api_key","subscription_required","forbidden","insufficient_scope","not_found","account_locked","rate_limited","rate_limit_unavailable","internal_error","request_timeout","endpoint_retired"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"},"retry_at":{"type":"string","format":"date-time","description":"The recommended next request instant (RFC3339), always in the future. Present on every retryable error: `pick_not_released`, `rate_limited`, `rate_limit_unavailable`, and `read_model_warming`. Omitted otherwise. The absolute twin of `Retry-After`; prefer the header for the sleep duration. For `pick_not_released`, the earliest of the next scheduled release, the next automatic selector attempt, the operating-window start, or about 60 seconds. See that response.","uniqueKey":"error.retry_at","typeLabel":"string\u003cdate-time>"},"freshness":{"type":"object","required":["max_age_s","data_quality_status"],"properties":{"max_age_s":{"type":"integer","format":"int64","minimum":0,"description":"The caller's requested whole-response freshness ceiling in seconds.","isRequired":true,"uniqueKey":"error.freshness.max_age_s","typeLabel":"integer\u003cint64>"},"data_quality_status":{"type":"string","enum":["fresh","stale","partial","unknown","untracked","unavailable"],"description":"The trader body's whole-response data-quality status. Only fresh or stale can satisfy max_age_s: the ceiling replaces each writer's own budget, so a stale body inside it is answered.","isRequired":true,"uniqueKey":"error.freshness.data_quality_status","typeLabel":"enum\u003cstring>"},"actual_age_s":{"type":"integer","format":"int64","minimum":0,"description":"Age in seconds of the oldest stored data_quality.as_of clock, when one is available.","uniqueKey":"error.freshness.actual_age_s","typeLabel":"integer\u003cint64>"},"as_of":{"type":"string","format":"date-time","description":"The oldest stored data-quality clock used to calculate actual_age_s, when one is available.","uniqueKey":"error.freshness.as_of","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"error.freshness","typeLabel":"object"},"billing_url":{"type":"string","format":"uri","description":"Where a person clears this 402 (#32592): pays the overdue invoice (reason payment_overdue) or reactivates the plan (reason subscription_inactive). Present on every 402 subscription_required, omitted on every other error. The message names the same URL; link this field instead of parsing the message.","uniqueKey":"error.billing_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","enum":["cursor_expired","unknown_endpoint","pick_not_released","trader_not_tracked","market_out_of_scope","fill_history_too_large","read_model_warming","database_unavailable","request_accounting_unavailable","idempotency_in_progress","webhook_delivery_in_progress","webhook_secret_rotation_not_prepared","webhook_secret_rotation_overlap_active","sandbox_api_key","api_key_in_query","subscription_inactive","payment_overdue","monthly_quota_exceeded","invalid_query","unknown_query_parameter","invalid_path","invalid_body","unsupported_media_type","payload_too_large","method_not_allowed","ip_rate_limited","ip_throttled","cold_read_limited","export_expired","freshness_ceiling_unsatisfied","max_plan_required","endpoint_retired"],"description":"ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. fill_history_too_large (404 not_found, #33245): the wallet and market are tracked, but the position timeline sums every earlier fill into its running totals and this wallet has more than 20,000 fills on the market before the requested page -- stop asking for this pair; neither a retry nor another page can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. payment_overdue (402 subscription_required, #32592): the key is valid and the account still has its plan, but its latest subscription invoice is unpaid (Stripe past_due or unpaid), so paid access is paused; permanent until a person pays at billing_url (https://0xinsider.com/billing) -- stop retrying on a schedule and surface the link. The key works again the moment the invoice is paid. GET /api/v1/me and GET /api/v1/usage keep answering. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. cold_read_limited (429 rate_limited, #28752): the account has used its share of cold reads on GET /api/v1/market/{condition_id}/holders, requests for a market whose roster is not cached, each of which walks Polymarket (6 a minute, in bursts of up to 400); not the per-minute window, so a cached market still answers, and the next cold read is admitted at Retry-After. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed.","uniqueKey":"error.reason","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"type":"object","required":["request_id","cached","cost"],"properties":{"request_id":{"type":"string","description":"Unique request ID (req_ prefix). The same value as the X-Request-Id response header, the request's usage accounting row and its log lines.","isRequired":true,"uniqueKey":"meta.request_id","typeLabel":"string"},"cached":{"type":"boolean","isRequired":true,"uniqueKey":"meta.cached","typeLabel":"boolean"},"cost":{"type":"integer","description":"Advisory request weight (relative compute cost). 1 for simple reads; higher for heavier endpoints. Not a credit/price.","isRequired":true,"uniqueKey":"meta.cost","typeLabel":"integer"},"cache_age_s":{"type":"integer","description":"Cache age in seconds. Omitted when the response was not cached, and also when it was cached but its age cannot be established (an entry stored before its cache carried a computed instant). Never a placeholder: an unknown age is reported as no value rather than as the cache TTL.","uniqueKey":"meta.cache_age_s","typeLabel":"integer"},"ranking_generation":{"type":"integer","description":"Committed PostgreSQL-owned leaderboard generation for the returned rows and cursor. Present on GET /api/v1/leaderboard; omitted on endpoints that do not read this ranking.","uniqueKey":"meta.ranking_generation","typeLabel":"integer"},"ranking_as_of":{"type":"string","format":"date-time","description":"Authoritative RFC3339 timestamp from cache_generations.updated_at for ranking_generation. It is read in the same repeatable-read snapshot as the leaderboard rows and is not request time, cache write time, or row insertion order.","uniqueKey":"meta.ranking_as_of","typeLabel":"string\u003cdate-time>"},"continued_from_generation":{"type":"integer","description":"GET /api/v1/leaderboard only. The cursor's ranking_generation, set when this page continued a cursor from an earlier ranking that moved under it: the rows follow the cursor's boundary in the ranking named by ranking_generation, so a trader who crossed the boundary can repeat a row you already hold or be missing from the walk. De-duplicate by id, or restart from the first page for an exact walk. Omitted on a first page and on an exact continuation, including a newer generation in which nothing a page of that order reads moved. It can equal ranking_generation when the ranking moved within one generation: on the default order, sort=rank and sort=grade when the rank keys changed, and on every other sort whenever the projection republished (about once a minute; since 2026-11-07).","uniqueKey":"meta.continued_from_generation","typeLabel":"integer"},"directional_source":{"type":"string","enum":["live","degraded"],"description":"Directional evidence provenance for Edge Hunter signals collections. The default board carries this provenance in data.directional_source and omits this optional meta field.","uniqueKey":"meta.directional_source","typeLabel":"enum\u003cstring>"},"ranking_source":{"type":"string","enum":["live","db_only"],"description":"Ranking evidence provenance for Edge Hunter signals collections. The default board carries this clock/provenance in data.ranking_source and omits this optional meta field.","uniqueKey":"meta.ranking_source","typeLabel":"enum\u003cstring>"},"category_skill_source":{"type":"string","enum":["live","partial","degraded","unavailable"],"description":"Whole filtered snapshot category-evidence status before pagination. Operational live always remains partial source coverage.","uniqueKey":"meta.category_skill_source","typeLabel":"enum\u003cstring>"},"category_skill_model_version":{"type":"string","uniqueKey":"meta.category_skill_model_version","typeLabel":"string"},"category_skill_taxonomy_version":{"type":"string","uniqueKey":"meta.category_skill_taxonomy_version","typeLabel":"string"},"category_skill_platform":{"type":"string","const":"polymarket","uniqueKey":"meta.category_skill_platform","typeLabel":"string"},"category_skill_scope":{"type":"string","const":"observed_goldsky_primary_taker_fill","uniqueKey":"meta.category_skill_scope","typeLabel":"string"},"category_skill_source_coverage":{"type":"string","enum":["partial_whale_threshold_fills","graded_wallet_fills"],"uniqueKey":"meta.category_skill_source_coverage","typeLabel":"enum\u003cstring>"},"category_skill_observation_started_at":{"type":"string","format":"date-time","uniqueKey":"meta.category_skill_observation_started_at","typeLabel":"string\u003cdate-time>"},"category_skill_model_operationally_degraded":{"type":"boolean","description":"Whole-model operational readiness captured with the category model snapshot. Present on category-enriched responses even when the filtered signal list is empty. When true, category_skill_source is degraded and Edge Hunter signals uses the shorter degraded cache TTL.","uniqueKey":"meta.category_skill_model_operationally_degraded","typeLabel":"boolean"},"category_skill_status_counts":{"type":"object","required":["live","insufficient","stale","unknown","degraded"],"properties":{"live":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.live","typeLabel":"integer"},"insufficient":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.insufficient","typeLabel":"integer"},"stale":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.stale","typeLabel":"integer"},"unknown":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.unknown","typeLabel":"integer"},"degraded":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.degraded","typeLabel":"integer"}},"uniqueKey":"meta.category_skill_status_counts","typeLabel":"object"},"category_skill_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"SHA-256 of the funded signal membership/order/rank/cursor vector immediately before category-skill enrichment. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_base_payload_hash","typeLabel":"string"},"category_skill_enriched_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Independent SHA-256 recomputation over the same base fields immediately after category-skill enrichment. Equality with category_skill_base_payload_hash proves category-skill enrichment did not change funded inputs. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_enriched_base_payload_hash","typeLabel":"string"}},"isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"object":"error","error":{"code":"bad_request","message":"\u003cstring>","doc_url":"\u003cstring>","param":"\u003cstring>","retry_at":"2023-11-07T05:31:56Z","freshness":{"max_age_s":1,"data_quality_status":"fresh","actual_age_s":1,"as_of":"2023-11-07T05:31:56Z"},"billing_url":"\u003cstring>","reason":"cursor_expired"},"meta":{"request_id":"\u003cstring>","cached":true,"cost":123,"cache_age_s":123,"ranking_generation":123,"ranking_as_of":"2023-11-07T05:31:56Z","continued_from_generation":123,"directional_source":"live","ranking_source":"live","category_skill_source":"live","category_skill_model_version":"\u003cstring>","category_skill_taxonomy_version":"\u003cstring>","category_skill_platform":"polymarket","category_skill_scope":"observed_goldsky_primary_taker_fill","category_skill_source_coverage":"partial_whale_threshold_fills","category_skill_observation_started_at":"2023-11-07T05:31:56Z","category_skill_model_operationally_degraded":true,"category_skill_status_counts":{"live":1,"insufficient":1,"stale":1,"unknown":1,"degraded":1},"category_skill_base_payload_hash":"\u003cstring>","category_skill_enriched_base_payload_hash":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"2089fa43-7d05-4365-b2c0-a038570426db":{"description":"Account is locked","content":{"application/json":{"schema":{"type":"object","required":["object","error","meta"],"properties":{"object":{"type":"string","const":"error","isRequired":true,"uniqueKey":"object","typeLabel":"string"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"FROZEN: an existing value never changes meaning. request_timeout (408, #16146) was added the way insufficient_scope was: the handler did not answer inside the server's 30-second timeout. Retry-After and retry_at ride on it only for a safe method (GET, HEAD); a timed-out mutation may have completed, so check its state and reuse its Idempotency-Key.","enum":["bad_request","invalid_api_key","subscription_required","forbidden","insufficient_scope","not_found","account_locked","rate_limited","rate_limit_unavailable","internal_error","request_timeout","endpoint_retired"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"},"retry_at":{"type":"string","format":"date-time","description":"The recommended next request instant (RFC3339), always in the future. Present on every retryable error: `pick_not_released`, `rate_limited`, `rate_limit_unavailable`, and `read_model_warming`. Omitted otherwise. The absolute twin of `Retry-After`; prefer the header for the sleep duration. For `pick_not_released`, the earliest of the next scheduled release, the next automatic selector attempt, the operating-window start, or about 60 seconds. See that response.","uniqueKey":"error.retry_at","typeLabel":"string\u003cdate-time>"},"freshness":{"type":"object","required":["max_age_s","data_quality_status"],"properties":{"max_age_s":{"type":"integer","format":"int64","minimum":0,"description":"The caller's requested whole-response freshness ceiling in seconds.","isRequired":true,"uniqueKey":"error.freshness.max_age_s","typeLabel":"integer\u003cint64>"},"data_quality_status":{"type":"string","enum":["fresh","stale","partial","unknown","untracked","unavailable"],"description":"The trader body's whole-response data-quality status. Only fresh or stale can satisfy max_age_s: the ceiling replaces each writer's own budget, so a stale body inside it is answered.","isRequired":true,"uniqueKey":"error.freshness.data_quality_status","typeLabel":"enum\u003cstring>"},"actual_age_s":{"type":"integer","format":"int64","minimum":0,"description":"Age in seconds of the oldest stored data_quality.as_of clock, when one is available.","uniqueKey":"error.freshness.actual_age_s","typeLabel":"integer\u003cint64>"},"as_of":{"type":"string","format":"date-time","description":"The oldest stored data-quality clock used to calculate actual_age_s, when one is available.","uniqueKey":"error.freshness.as_of","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"error.freshness","typeLabel":"object"},"billing_url":{"type":"string","format":"uri","description":"Where a person clears this 402 (#32592): pays the overdue invoice (reason payment_overdue) or reactivates the plan (reason subscription_inactive). Present on every 402 subscription_required, omitted on every other error. The message names the same URL; link this field instead of parsing the message.","uniqueKey":"error.billing_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","enum":["cursor_expired","unknown_endpoint","pick_not_released","trader_not_tracked","market_out_of_scope","fill_history_too_large","read_model_warming","database_unavailable","request_accounting_unavailable","idempotency_in_progress","webhook_delivery_in_progress","webhook_secret_rotation_not_prepared","webhook_secret_rotation_overlap_active","sandbox_api_key","api_key_in_query","subscription_inactive","payment_overdue","monthly_quota_exceeded","invalid_query","unknown_query_parameter","invalid_path","invalid_body","unsupported_media_type","payload_too_large","method_not_allowed","ip_rate_limited","ip_throttled","cold_read_limited","export_expired","freshness_ceiling_unsatisfied","max_plan_required","endpoint_retired"],"description":"ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. fill_history_too_large (404 not_found, #33245): the wallet and market are tracked, but the position timeline sums every earlier fill into its running totals and this wallet has more than 20,000 fills on the market before the requested page -- stop asking for this pair; neither a retry nor another page can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. payment_overdue (402 subscription_required, #32592): the key is valid and the account still has its plan, but its latest subscription invoice is unpaid (Stripe past_due or unpaid), so paid access is paused; permanent until a person pays at billing_url (https://0xinsider.com/billing) -- stop retrying on a schedule and surface the link. The key works again the moment the invoice is paid. GET /api/v1/me and GET /api/v1/usage keep answering. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. cold_read_limited (429 rate_limited, #28752): the account has used its share of cold reads on GET /api/v1/market/{condition_id}/holders, requests for a market whose roster is not cached, each of which walks Polymarket (6 a minute, in bursts of up to 400); not the per-minute window, so a cached market still answers, and the next cold read is admitted at Retry-After. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed.","uniqueKey":"error.reason","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"type":"object","required":["request_id","cached","cost"],"properties":{"request_id":{"type":"string","description":"Unique request ID (req_ prefix). The same value as the X-Request-Id response header, the request's usage accounting row and its log lines.","isRequired":true,"uniqueKey":"meta.request_id","typeLabel":"string"},"cached":{"type":"boolean","isRequired":true,"uniqueKey":"meta.cached","typeLabel":"boolean"},"cost":{"type":"integer","description":"Advisory request weight (relative compute cost). 1 for simple reads; higher for heavier endpoints. Not a credit/price.","isRequired":true,"uniqueKey":"meta.cost","typeLabel":"integer"},"cache_age_s":{"type":"integer","description":"Cache age in seconds. Omitted when the response was not cached, and also when it was cached but its age cannot be established (an entry stored before its cache carried a computed instant). Never a placeholder: an unknown age is reported as no value rather than as the cache TTL.","uniqueKey":"meta.cache_age_s","typeLabel":"integer"},"ranking_generation":{"type":"integer","description":"Committed PostgreSQL-owned leaderboard generation for the returned rows and cursor. Present on GET /api/v1/leaderboard; omitted on endpoints that do not read this ranking.","uniqueKey":"meta.ranking_generation","typeLabel":"integer"},"ranking_as_of":{"type":"string","format":"date-time","description":"Authoritative RFC3339 timestamp from cache_generations.updated_at for ranking_generation. It is read in the same repeatable-read snapshot as the leaderboard rows and is not request time, cache write time, or row insertion order.","uniqueKey":"meta.ranking_as_of","typeLabel":"string\u003cdate-time>"},"continued_from_generation":{"type":"integer","description":"GET /api/v1/leaderboard only. The cursor's ranking_generation, set when this page continued a cursor from an earlier ranking that moved under it: the rows follow the cursor's boundary in the ranking named by ranking_generation, so a trader who crossed the boundary can repeat a row you already hold or be missing from the walk. De-duplicate by id, or restart from the first page for an exact walk. Omitted on a first page and on an exact continuation, including a newer generation in which nothing a page of that order reads moved. It can equal ranking_generation when the ranking moved within one generation: on the default order, sort=rank and sort=grade when the rank keys changed, and on every other sort whenever the projection republished (about once a minute; since 2026-11-07).","uniqueKey":"meta.continued_from_generation","typeLabel":"integer"},"directional_source":{"type":"string","enum":["live","degraded"],"description":"Directional evidence provenance for Edge Hunter signals collections. The default board carries this provenance in data.directional_source and omits this optional meta field.","uniqueKey":"meta.directional_source","typeLabel":"enum\u003cstring>"},"ranking_source":{"type":"string","enum":["live","db_only"],"description":"Ranking evidence provenance for Edge Hunter signals collections. The default board carries this clock/provenance in data.ranking_source and omits this optional meta field.","uniqueKey":"meta.ranking_source","typeLabel":"enum\u003cstring>"},"category_skill_source":{"type":"string","enum":["live","partial","degraded","unavailable"],"description":"Whole filtered snapshot category-evidence status before pagination. Operational live always remains partial source coverage.","uniqueKey":"meta.category_skill_source","typeLabel":"enum\u003cstring>"},"category_skill_model_version":{"type":"string","uniqueKey":"meta.category_skill_model_version","typeLabel":"string"},"category_skill_taxonomy_version":{"type":"string","uniqueKey":"meta.category_skill_taxonomy_version","typeLabel":"string"},"category_skill_platform":{"type":"string","const":"polymarket","uniqueKey":"meta.category_skill_platform","typeLabel":"string"},"category_skill_scope":{"type":"string","const":"observed_goldsky_primary_taker_fill","uniqueKey":"meta.category_skill_scope","typeLabel":"string"},"category_skill_source_coverage":{"type":"string","enum":["partial_whale_threshold_fills","graded_wallet_fills"],"uniqueKey":"meta.category_skill_source_coverage","typeLabel":"enum\u003cstring>"},"category_skill_observation_started_at":{"type":"string","format":"date-time","uniqueKey":"meta.category_skill_observation_started_at","typeLabel":"string\u003cdate-time>"},"category_skill_model_operationally_degraded":{"type":"boolean","description":"Whole-model operational readiness captured with the category model snapshot. Present on category-enriched responses even when the filtered signal list is empty. When true, category_skill_source is degraded and Edge Hunter signals uses the shorter degraded cache TTL.","uniqueKey":"meta.category_skill_model_operationally_degraded","typeLabel":"boolean"},"category_skill_status_counts":{"type":"object","required":["live","insufficient","stale","unknown","degraded"],"properties":{"live":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.live","typeLabel":"integer"},"insufficient":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.insufficient","typeLabel":"integer"},"stale":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.stale","typeLabel":"integer"},"unknown":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.unknown","typeLabel":"integer"},"degraded":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.degraded","typeLabel":"integer"}},"uniqueKey":"meta.category_skill_status_counts","typeLabel":"object"},"category_skill_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"SHA-256 of the funded signal membership/order/rank/cursor vector immediately before category-skill enrichment. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_base_payload_hash","typeLabel":"string"},"category_skill_enriched_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Independent SHA-256 recomputation over the same base fields immediately after category-skill enrichment. Equality with category_skill_base_payload_hash proves category-skill enrichment did not change funded inputs. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_enriched_base_payload_hash","typeLabel":"string"}},"isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"object":"error","error":{"code":"bad_request","message":"\u003cstring>","doc_url":"\u003cstring>","param":"\u003cstring>","retry_at":"2023-11-07T05:31:56Z","freshness":{"max_age_s":1,"data_quality_status":"fresh","actual_age_s":1,"as_of":"2023-11-07T05:31:56Z"},"billing_url":"\u003cstring>","reason":"cursor_expired"},"meta":{"request_id":"\u003cstring>","cached":true,"cost":123,"cache_age_s":123,"ranking_generation":123,"ranking_as_of":"2023-11-07T05:31:56Z","continued_from_generation":123,"directional_source":"live","ranking_source":"live","category_skill_source":"live","category_skill_model_version":"\u003cstring>","category_skill_taxonomy_version":"\u003cstring>","category_skill_platform":"polymarket","category_skill_scope":"observed_goldsky_primary_taker_fill","category_skill_source_coverage":"partial_whale_threshold_fills","category_skill_observation_started_at":"2023-11-07T05:31:56Z","category_skill_model_operationally_degraded":true,"category_skill_status_counts":{"live":1,"insufficient":1,"stale":1,"unknown":1,"degraded":1},"category_skill_base_payload_hash":"\u003cstring>","category_skill_enriched_base_payload_hash":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"99c3685a-ced5-4123-a4a0-f8abae714b80":{"description":"Rate limit exceeded. Three independent budgets. (1) 100 requests/minute per user on Pro, 200 on Max (sliding window), on every authenticated route; RateLimit-Limit reports the caller's. On the remote MCP endpoint /api/v1/mcp only tools/call is counted: initialize, ping, tools/list, notifications, and the GET, HEAD and DELETE the endpoint answers 405 spend no per-minute request, no monthly quota and no pay-as-you-go usage, with or without a key. (2) On the BATCH routes only: 2500 batch item units/minute per user on Pro, 5000 on Max, reserved before any item is executed. A batch with N requested items costs N item units, including duplicate and invalid items. 2500 = 100 requests x 25 items per batch on Pro, 5000 = 200 x 25 on Max, which is the most item work a key can buy through the request limiter at all: a caller may spend their plan's entire request minute on full 25-item batches without the item budget being what stops them. The REQUEST budget is the effective ceiling, and batching is never the more expensive choice. The item budget can still deny at a sliding-window boundary (both counters carry the previous window forward with a floor, and the item counter runs 25x the request counter), so honor a 429 from either. Over-quota batches return 429 with Retry-After plus RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset before any item work is done. (3) The monthly quota: Pro includes 500,000 and Max includes 2,000,000 authenticated requests per UTC calendar month. Over the plan's included requests: with pay as you go on, the excess bills at USD 0.20 per 1,000 on a monthly invoice, up to four times the included allowance (2,000,000 requests for Pro); without it, from October 1, 2026, the next request answers 429 rate_limited with error.reason monthly_quota_exceeded and a Retry-After to the month's reset. Pay-as-you-go accounts receive the same refusal at their ceiling. A refused request is not counted. X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining, and X-Monthly-Quota-Reset (unix seconds, the first of next month) are on every response a route answers for a counted request, on the monthly-quota 429, and on GET /api/v1/me and GET /api/v1/usage, which read the month without spending it. Any other refusal or failure before the route runs, such as a per-minute 429 or a 401, carries none, nor does a remote MCP message other than tools/call. (4) The per-address budget: 1200 requests/minute per IP, shared by every caller behind one address and counted before authentication, on every route. A 429 from it carries error.reason ip_rate_limited and describes that bucket in RateLimit-*; a throttled address (sustained over-limit traffic) carries error.reason ip_throttled with a Retry-After of minutes to days, and a request before it does not shorten the cooldown. Every 429 is the standard error envelope with meta.request_id equal to X-Request-Id.","headers":{"Retry-After":{"description":"Seconds until rate limit resets.","schema":{"type":"integer"}},"RateLimit-Limit":{"description":"Request limit of the budget this request was counted against, for its current window: the API key's per-minute sliding window on an authenticated call, at its plan's limit (100 requests on Pro, 200 on Max); the control-plane bucket GET /api/v1/me and GET /api/v1/usage share, the same on every plan, on a 429 from either; and the per-IP budget on a public route, on a refused credential (401, 402, 403, 423), and on a remote MCP message other than tools/call, none of which reaches the per-key limiter. Standard RateLimit header spelling.","schema":{"type":"integer","example":100}},"RateLimit-Remaining":{"description":"Requests remaining in that budget's current window after this response. Standard RateLimit header spelling.","schema":{"type":"integer","example":84}},"RateLimit-Reset":{"description":"Seconds until that budget's current window resets. Standard RateLimit header spelling.","schema":{"type":"integer","example":42}},"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"}},"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["object","error","meta"],"properties":{"object":{"type":"string","const":"error","isRequired":true,"uniqueKey":"object","typeLabel":"string"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"FROZEN: an existing value never changes meaning. request_timeout (408, #16146) was added the way insufficient_scope was: the handler did not answer inside the server's 30-second timeout. Retry-After and retry_at ride on it only for a safe method (GET, HEAD); a timed-out mutation may have completed, so check its state and reuse its Idempotency-Key.","enum":["bad_request","invalid_api_key","subscription_required","forbidden","insufficient_scope","not_found","account_locked","rate_limited","rate_limit_unavailable","internal_error","request_timeout","endpoint_retired"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"},"retry_at":{"type":"string","format":"date-time","description":"The recommended next request instant (RFC3339), always in the future. Present on every retryable error: `pick_not_released`, `rate_limited`, `rate_limit_unavailable`, and `read_model_warming`. Omitted otherwise. The absolute twin of `Retry-After`; prefer the header for the sleep duration. For `pick_not_released`, the earliest of the next scheduled release, the next automatic selector attempt, the operating-window start, or about 60 seconds. See that response.","uniqueKey":"error.retry_at","typeLabel":"string\u003cdate-time>"},"freshness":{"type":"object","required":["max_age_s","data_quality_status"],"properties":{"max_age_s":{"type":"integer","format":"int64","minimum":0,"description":"The caller's requested whole-response freshness ceiling in seconds.","isRequired":true,"uniqueKey":"error.freshness.max_age_s","typeLabel":"integer\u003cint64>"},"data_quality_status":{"type":"string","enum":["fresh","stale","partial","unknown","untracked","unavailable"],"description":"The trader body's whole-response data-quality status. Only fresh or stale can satisfy max_age_s: the ceiling replaces each writer's own budget, so a stale body inside it is answered.","isRequired":true,"uniqueKey":"error.freshness.data_quality_status","typeLabel":"enum\u003cstring>"},"actual_age_s":{"type":"integer","format":"int64","minimum":0,"description":"Age in seconds of the oldest stored data_quality.as_of clock, when one is available.","uniqueKey":"error.freshness.actual_age_s","typeLabel":"integer\u003cint64>"},"as_of":{"type":"string","format":"date-time","description":"The oldest stored data-quality clock used to calculate actual_age_s, when one is available.","uniqueKey":"error.freshness.as_of","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"error.freshness","typeLabel":"object"},"billing_url":{"type":"string","format":"uri","description":"Where a person clears this 402 (#32592): pays the overdue invoice (reason payment_overdue) or reactivates the plan (reason subscription_inactive). Present on every 402 subscription_required, omitted on every other error. The message names the same URL; link this field instead of parsing the message.","uniqueKey":"error.billing_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","enum":["cursor_expired","unknown_endpoint","pick_not_released","trader_not_tracked","market_out_of_scope","fill_history_too_large","read_model_warming","database_unavailable","request_accounting_unavailable","idempotency_in_progress","webhook_delivery_in_progress","webhook_secret_rotation_not_prepared","webhook_secret_rotation_overlap_active","sandbox_api_key","api_key_in_query","subscription_inactive","payment_overdue","monthly_quota_exceeded","invalid_query","unknown_query_parameter","invalid_path","invalid_body","unsupported_media_type","payload_too_large","method_not_allowed","ip_rate_limited","ip_throttled","cold_read_limited","export_expired","freshness_ceiling_unsatisfied","max_plan_required","endpoint_retired"],"description":"ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. fill_history_too_large (404 not_found, #33245): the wallet and market are tracked, but the position timeline sums every earlier fill into its running totals and this wallet has more than 20,000 fills on the market before the requested page -- stop asking for this pair; neither a retry nor another page can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. payment_overdue (402 subscription_required, #32592): the key is valid and the account still has its plan, but its latest subscription invoice is unpaid (Stripe past_due or unpaid), so paid access is paused; permanent until a person pays at billing_url (https://0xinsider.com/billing) -- stop retrying on a schedule and surface the link. The key works again the moment the invoice is paid. GET /api/v1/me and GET /api/v1/usage keep answering. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. cold_read_limited (429 rate_limited, #28752): the account has used its share of cold reads on GET /api/v1/market/{condition_id}/holders, requests for a market whose roster is not cached, each of which walks Polymarket (6 a minute, in bursts of up to 400); not the per-minute window, so a cached market still answers, and the next cold read is admitted at Retry-After. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed.","uniqueKey":"error.reason","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"type":"object","required":["request_id","cached","cost"],"properties":{"request_id":{"type":"string","description":"Unique request ID (req_ prefix). The same value as the X-Request-Id response header, the request's usage accounting row and its log lines.","isRequired":true,"uniqueKey":"meta.request_id","typeLabel":"string"},"cached":{"type":"boolean","isRequired":true,"uniqueKey":"meta.cached","typeLabel":"boolean"},"cost":{"type":"integer","description":"Advisory request weight (relative compute cost). 1 for simple reads; higher for heavier endpoints. Not a credit/price.","isRequired":true,"uniqueKey":"meta.cost","typeLabel":"integer"},"cache_age_s":{"type":"integer","description":"Cache age in seconds. Omitted when the response was not cached, and also when it was cached but its age cannot be established (an entry stored before its cache carried a computed instant). Never a placeholder: an unknown age is reported as no value rather than as the cache TTL.","uniqueKey":"meta.cache_age_s","typeLabel":"integer"},"ranking_generation":{"type":"integer","description":"Committed PostgreSQL-owned leaderboard generation for the returned rows and cursor. Present on GET /api/v1/leaderboard; omitted on endpoints that do not read this ranking.","uniqueKey":"meta.ranking_generation","typeLabel":"integer"},"ranking_as_of":{"type":"string","format":"date-time","description":"Authoritative RFC3339 timestamp from cache_generations.updated_at for ranking_generation. It is read in the same repeatable-read snapshot as the leaderboard rows and is not request time, cache write time, or row insertion order.","uniqueKey":"meta.ranking_as_of","typeLabel":"string\u003cdate-time>"},"continued_from_generation":{"type":"integer","description":"GET /api/v1/leaderboard only. The cursor's ranking_generation, set when this page continued a cursor from an earlier ranking that moved under it: the rows follow the cursor's boundary in the ranking named by ranking_generation, so a trader who crossed the boundary can repeat a row you already hold or be missing from the walk. De-duplicate by id, or restart from the first page for an exact walk. Omitted on a first page and on an exact continuation, including a newer generation in which nothing a page of that order reads moved. It can equal ranking_generation when the ranking moved within one generation: on the default order, sort=rank and sort=grade when the rank keys changed, and on every other sort whenever the projection republished (about once a minute; since 2026-11-07).","uniqueKey":"meta.continued_from_generation","typeLabel":"integer"},"directional_source":{"type":"string","enum":["live","degraded"],"description":"Directional evidence provenance for Edge Hunter signals collections. The default board carries this provenance in data.directional_source and omits this optional meta field.","uniqueKey":"meta.directional_source","typeLabel":"enum\u003cstring>"},"ranking_source":{"type":"string","enum":["live","db_only"],"description":"Ranking evidence provenance for Edge Hunter signals collections. The default board carries this clock/provenance in data.ranking_source and omits this optional meta field.","uniqueKey":"meta.ranking_source","typeLabel":"enum\u003cstring>"},"category_skill_source":{"type":"string","enum":["live","partial","degraded","unavailable"],"description":"Whole filtered snapshot category-evidence status before pagination. Operational live always remains partial source coverage.","uniqueKey":"meta.category_skill_source","typeLabel":"enum\u003cstring>"},"category_skill_model_version":{"type":"string","uniqueKey":"meta.category_skill_model_version","typeLabel":"string"},"category_skill_taxonomy_version":{"type":"string","uniqueKey":"meta.category_skill_taxonomy_version","typeLabel":"string"},"category_skill_platform":{"type":"string","const":"polymarket","uniqueKey":"meta.category_skill_platform","typeLabel":"string"},"category_skill_scope":{"type":"string","const":"observed_goldsky_primary_taker_fill","uniqueKey":"meta.category_skill_scope","typeLabel":"string"},"category_skill_source_coverage":{"type":"string","enum":["partial_whale_threshold_fills","graded_wallet_fills"],"uniqueKey":"meta.category_skill_source_coverage","typeLabel":"enum\u003cstring>"},"category_skill_observation_started_at":{"type":"string","format":"date-time","uniqueKey":"meta.category_skill_observation_started_at","typeLabel":"string\u003cdate-time>"},"category_skill_model_operationally_degraded":{"type":"boolean","description":"Whole-model operational readiness captured with the category model snapshot. Present on category-enriched responses even when the filtered signal list is empty. When true, category_skill_source is degraded and Edge Hunter signals uses the shorter degraded cache TTL.","uniqueKey":"meta.category_skill_model_operationally_degraded","typeLabel":"boolean"},"category_skill_status_counts":{"type":"object","required":["live","insufficient","stale","unknown","degraded"],"properties":{"live":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.live","typeLabel":"integer"},"insufficient":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.insufficient","typeLabel":"integer"},"stale":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.stale","typeLabel":"integer"},"unknown":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.unknown","typeLabel":"integer"},"degraded":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.degraded","typeLabel":"integer"}},"uniqueKey":"meta.category_skill_status_counts","typeLabel":"object"},"category_skill_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"SHA-256 of the funded signal membership/order/rank/cursor vector immediately before category-skill enrichment. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_base_payload_hash","typeLabel":"string"},"category_skill_enriched_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Independent SHA-256 recomputation over the same base fields immediately after category-skill enrichment. Equality with category_skill_base_payload_hash proves category-skill enrichment did not change funded inputs. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_enriched_base_payload_hash","typeLabel":"string"}},"isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"object":"error","error":{"code":"bad_request","message":"\u003cstring>","doc_url":"\u003cstring>","param":"\u003cstring>","retry_at":"2023-11-07T05:31:56Z","freshness":{"max_age_s":1,"data_quality_status":"fresh","actual_age_s":1,"as_of":"2023-11-07T05:31:56Z"},"billing_url":"\u003cstring>","reason":"cursor_expired"},"meta":{"request_id":"\u003cstring>","cached":true,"cost":123,"cache_age_s":123,"ranking_generation":123,"ranking_as_of":"2023-11-07T05:31:56Z","continued_from_generation":123,"directional_source":"live","ranking_source":"live","category_skill_source":"live","category_skill_model_version":"\u003cstring>","category_skill_taxonomy_version":"\u003cstring>","category_skill_platform":"polymarket","category_skill_scope":"observed_goldsky_primary_taker_fill","category_skill_source_coverage":"partial_whale_threshold_fills","category_skill_observation_started_at":"2023-11-07T05:31:56Z","category_skill_model_operationally_degraded":true,"category_skill_status_counts":{"live":1,"insufficient":1,"stale":1,"unknown":1,"degraded":1},"category_skill_base_payload_hash":"\u003cstring>","category_skill_enriched_base_payload_hash":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"0f3a05a4-10ab-4a0e-8369-eeb25dc8f098":{"description":"Unexpected server error","content":{"application/json":{"schema":{"type":"object","required":["object","error","meta"],"properties":{"object":{"type":"string","const":"error","isRequired":true,"uniqueKey":"object","typeLabel":"string"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"FROZEN: an existing value never changes meaning. request_timeout (408, #16146) was added the way insufficient_scope was: the handler did not answer inside the server's 30-second timeout. Retry-After and retry_at ride on it only for a safe method (GET, HEAD); a timed-out mutation may have completed, so check its state and reuse its Idempotency-Key.","enum":["bad_request","invalid_api_key","subscription_required","forbidden","insufficient_scope","not_found","account_locked","rate_limited","rate_limit_unavailable","internal_error","request_timeout","endpoint_retired"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"},"retry_at":{"type":"string","format":"date-time","description":"The recommended next request instant (RFC3339), always in the future. Present on every retryable error: `pick_not_released`, `rate_limited`, `rate_limit_unavailable`, and `read_model_warming`. Omitted otherwise. The absolute twin of `Retry-After`; prefer the header for the sleep duration. For `pick_not_released`, the earliest of the next scheduled release, the next automatic selector attempt, the operating-window start, or about 60 seconds. See that response.","uniqueKey":"error.retry_at","typeLabel":"string\u003cdate-time>"},"freshness":{"type":"object","required":["max_age_s","data_quality_status"],"properties":{"max_age_s":{"type":"integer","format":"int64","minimum":0,"description":"The caller's requested whole-response freshness ceiling in seconds.","isRequired":true,"uniqueKey":"error.freshness.max_age_s","typeLabel":"integer\u003cint64>"},"data_quality_status":{"type":"string","enum":["fresh","stale","partial","unknown","untracked","unavailable"],"description":"The trader body's whole-response data-quality status. Only fresh or stale can satisfy max_age_s: the ceiling replaces each writer's own budget, so a stale body inside it is answered.","isRequired":true,"uniqueKey":"error.freshness.data_quality_status","typeLabel":"enum\u003cstring>"},"actual_age_s":{"type":"integer","format":"int64","minimum":0,"description":"Age in seconds of the oldest stored data_quality.as_of clock, when one is available.","uniqueKey":"error.freshness.actual_age_s","typeLabel":"integer\u003cint64>"},"as_of":{"type":"string","format":"date-time","description":"The oldest stored data-quality clock used to calculate actual_age_s, when one is available.","uniqueKey":"error.freshness.as_of","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"error.freshness","typeLabel":"object"},"billing_url":{"type":"string","format":"uri","description":"Where a person clears this 402 (#32592): pays the overdue invoice (reason payment_overdue) or reactivates the plan (reason subscription_inactive). Present on every 402 subscription_required, omitted on every other error. The message names the same URL; link this field instead of parsing the message.","uniqueKey":"error.billing_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","enum":["cursor_expired","unknown_endpoint","pick_not_released","trader_not_tracked","market_out_of_scope","fill_history_too_large","read_model_warming","database_unavailable","request_accounting_unavailable","idempotency_in_progress","webhook_delivery_in_progress","webhook_secret_rotation_not_prepared","webhook_secret_rotation_overlap_active","sandbox_api_key","api_key_in_query","subscription_inactive","payment_overdue","monthly_quota_exceeded","invalid_query","unknown_query_parameter","invalid_path","invalid_body","unsupported_media_type","payload_too_large","method_not_allowed","ip_rate_limited","ip_throttled","cold_read_limited","export_expired","freshness_ceiling_unsatisfied","max_plan_required","endpoint_retired"],"description":"ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. fill_history_too_large (404 not_found, #33245): the wallet and market are tracked, but the position timeline sums every earlier fill into its running totals and this wallet has more than 20,000 fills on the market before the requested page -- stop asking for this pair; neither a retry nor another page can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. payment_overdue (402 subscription_required, #32592): the key is valid and the account still has its plan, but its latest subscription invoice is unpaid (Stripe past_due or unpaid), so paid access is paused; permanent until a person pays at billing_url (https://0xinsider.com/billing) -- stop retrying on a schedule and surface the link. The key works again the moment the invoice is paid. GET /api/v1/me and GET /api/v1/usage keep answering. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. cold_read_limited (429 rate_limited, #28752): the account has used its share of cold reads on GET /api/v1/market/{condition_id}/holders, requests for a market whose roster is not cached, each of which walks Polymarket (6 a minute, in bursts of up to 400); not the per-minute window, so a cached market still answers, and the next cold read is admitted at Retry-After. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed.","uniqueKey":"error.reason","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"type":"object","required":["request_id","cached","cost"],"properties":{"request_id":{"type":"string","description":"Unique request ID (req_ prefix). The same value as the X-Request-Id response header, the request's usage accounting row and its log lines.","isRequired":true,"uniqueKey":"meta.request_id","typeLabel":"string"},"cached":{"type":"boolean","isRequired":true,"uniqueKey":"meta.cached","typeLabel":"boolean"},"cost":{"type":"integer","description":"Advisory request weight (relative compute cost). 1 for simple reads; higher for heavier endpoints. Not a credit/price.","isRequired":true,"uniqueKey":"meta.cost","typeLabel":"integer"},"cache_age_s":{"type":"integer","description":"Cache age in seconds. Omitted when the response was not cached, and also when it was cached but its age cannot be established (an entry stored before its cache carried a computed instant). Never a placeholder: an unknown age is reported as no value rather than as the cache TTL.","uniqueKey":"meta.cache_age_s","typeLabel":"integer"},"ranking_generation":{"type":"integer","description":"Committed PostgreSQL-owned leaderboard generation for the returned rows and cursor. Present on GET /api/v1/leaderboard; omitted on endpoints that do not read this ranking.","uniqueKey":"meta.ranking_generation","typeLabel":"integer"},"ranking_as_of":{"type":"string","format":"date-time","description":"Authoritative RFC3339 timestamp from cache_generations.updated_at for ranking_generation. It is read in the same repeatable-read snapshot as the leaderboard rows and is not request time, cache write time, or row insertion order.","uniqueKey":"meta.ranking_as_of","typeLabel":"string\u003cdate-time>"},"continued_from_generation":{"type":"integer","description":"GET /api/v1/leaderboard only. The cursor's ranking_generation, set when this page continued a cursor from an earlier ranking that moved under it: the rows follow the cursor's boundary in the ranking named by ranking_generation, so a trader who crossed the boundary can repeat a row you already hold or be missing from the walk. De-duplicate by id, or restart from the first page for an exact walk. Omitted on a first page and on an exact continuation, including a newer generation in which nothing a page of that order reads moved. It can equal ranking_generation when the ranking moved within one generation: on the default order, sort=rank and sort=grade when the rank keys changed, and on every other sort whenever the projection republished (about once a minute; since 2026-11-07).","uniqueKey":"meta.continued_from_generation","typeLabel":"integer"},"directional_source":{"type":"string","enum":["live","degraded"],"description":"Directional evidence provenance for Edge Hunter signals collections. The default board carries this provenance in data.directional_source and omits this optional meta field.","uniqueKey":"meta.directional_source","typeLabel":"enum\u003cstring>"},"ranking_source":{"type":"string","enum":["live","db_only"],"description":"Ranking evidence provenance for Edge Hunter signals collections. The default board carries this clock/provenance in data.ranking_source and omits this optional meta field.","uniqueKey":"meta.ranking_source","typeLabel":"enum\u003cstring>"},"category_skill_source":{"type":"string","enum":["live","partial","degraded","unavailable"],"description":"Whole filtered snapshot category-evidence status before pagination. Operational live always remains partial source coverage.","uniqueKey":"meta.category_skill_source","typeLabel":"enum\u003cstring>"},"category_skill_model_version":{"type":"string","uniqueKey":"meta.category_skill_model_version","typeLabel":"string"},"category_skill_taxonomy_version":{"type":"string","uniqueKey":"meta.category_skill_taxonomy_version","typeLabel":"string"},"category_skill_platform":{"type":"string","const":"polymarket","uniqueKey":"meta.category_skill_platform","typeLabel":"string"},"category_skill_scope":{"type":"string","const":"observed_goldsky_primary_taker_fill","uniqueKey":"meta.category_skill_scope","typeLabel":"string"},"category_skill_source_coverage":{"type":"string","enum":["partial_whale_threshold_fills","graded_wallet_fills"],"uniqueKey":"meta.category_skill_source_coverage","typeLabel":"enum\u003cstring>"},"category_skill_observation_started_at":{"type":"string","format":"date-time","uniqueKey":"meta.category_skill_observation_started_at","typeLabel":"string\u003cdate-time>"},"category_skill_model_operationally_degraded":{"type":"boolean","description":"Whole-model operational readiness captured with the category model snapshot. Present on category-enriched responses even when the filtered signal list is empty. When true, category_skill_source is degraded and Edge Hunter signals uses the shorter degraded cache TTL.","uniqueKey":"meta.category_skill_model_operationally_degraded","typeLabel":"boolean"},"category_skill_status_counts":{"type":"object","required":["live","insufficient","stale","unknown","degraded"],"properties":{"live":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.live","typeLabel":"integer"},"insufficient":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.insufficient","typeLabel":"integer"},"stale":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.stale","typeLabel":"integer"},"unknown":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.unknown","typeLabel":"integer"},"degraded":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.degraded","typeLabel":"integer"}},"uniqueKey":"meta.category_skill_status_counts","typeLabel":"object"},"category_skill_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"SHA-256 of the funded signal membership/order/rank/cursor vector immediately before category-skill enrichment. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_base_payload_hash","typeLabel":"string"},"category_skill_enriched_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Independent SHA-256 recomputation over the same base fields immediately after category-skill enrichment. Equality with category_skill_base_payload_hash proves category-skill enrichment did not change funded inputs. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_enriched_base_payload_hash","typeLabel":"string"}},"isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"object":"error","error":{"code":"bad_request","message":"\u003cstring>","doc_url":"\u003cstring>","param":"\u003cstring>","retry_at":"2023-11-07T05:31:56Z","freshness":{"max_age_s":1,"data_quality_status":"fresh","actual_age_s":1,"as_of":"2023-11-07T05:31:56Z"},"billing_url":"\u003cstring>","reason":"cursor_expired"},"meta":{"request_id":"\u003cstring>","cached":true,"cost":123,"cache_age_s":123,"ranking_generation":123,"ranking_as_of":"2023-11-07T05:31:56Z","continued_from_generation":123,"directional_source":"live","ranking_source":"live","category_skill_source":"live","category_skill_model_version":"\u003cstring>","category_skill_taxonomy_version":"\u003cstring>","category_skill_platform":"polymarket","category_skill_scope":"observed_goldsky_primary_taker_fill","category_skill_source_coverage":"partial_whale_threshold_fills","category_skill_observation_started_at":"2023-11-07T05:31:56Z","category_skill_model_operationally_degraded":true,"category_skill_status_counts":{"live":1,"insufficient":1,"stale":1,"unknown":1,"degraded":1},"category_skill_base_payload_hash":"\u003cstring>","category_skill_enriched_base_payload_hash":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"40bb7f73-8ea8-47bb-aa8c-db16343d1e98":{"description":"Redis-backed authenticated rate limiter unavailable; retry after the per-process outage cooldown","headers":{"Retry-After":{"description":"Seconds until the middleware will probe the Redis-backed rate limiter again.","schema":{"type":"integer"}},"X-Request-Id":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["object","error","meta"],"properties":{"object":{"type":"string","const":"error","isRequired":true,"uniqueKey":"object","typeLabel":"string"},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"FROZEN: an existing value never changes meaning. request_timeout (408, #16146) was added the way insufficient_scope was: the handler did not answer inside the server's 30-second timeout. Retry-After and retry_at ride on it only for a safe method (GET, HEAD); a timed-out mutation may have completed, so check its state and reuse its Idempotency-Key.","enum":["bad_request","invalid_api_key","subscription_required","forbidden","insufficient_scope","not_found","account_locked","rate_limited","rate_limit_unavailable","internal_error","request_timeout","endpoint_retired"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","uniqueKey":"error.doc_url","typeLabel":"string"},"param":{"type":"string","uniqueKey":"error.param","typeLabel":"string"},"retry_at":{"type":"string","format":"date-time","description":"The recommended next request instant (RFC3339), always in the future. Present on every retryable error: `pick_not_released`, `rate_limited`, `rate_limit_unavailable`, and `read_model_warming`. Omitted otherwise. The absolute twin of `Retry-After`; prefer the header for the sleep duration. For `pick_not_released`, the earliest of the next scheduled release, the next automatic selector attempt, the operating-window start, or about 60 seconds. See that response.","uniqueKey":"error.retry_at","typeLabel":"string\u003cdate-time>"},"freshness":{"type":"object","required":["max_age_s","data_quality_status"],"properties":{"max_age_s":{"type":"integer","format":"int64","minimum":0,"description":"The caller's requested whole-response freshness ceiling in seconds.","isRequired":true,"uniqueKey":"error.freshness.max_age_s","typeLabel":"integer\u003cint64>"},"data_quality_status":{"type":"string","enum":["fresh","stale","partial","unknown","untracked","unavailable"],"description":"The trader body's whole-response data-quality status. Only fresh or stale can satisfy max_age_s: the ceiling replaces each writer's own budget, so a stale body inside it is answered.","isRequired":true,"uniqueKey":"error.freshness.data_quality_status","typeLabel":"enum\u003cstring>"},"actual_age_s":{"type":"integer","format":"int64","minimum":0,"description":"Age in seconds of the oldest stored data_quality.as_of clock, when one is available.","uniqueKey":"error.freshness.actual_age_s","typeLabel":"integer\u003cint64>"},"as_of":{"type":"string","format":"date-time","description":"The oldest stored data-quality clock used to calculate actual_age_s, when one is available.","uniqueKey":"error.freshness.as_of","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"error.freshness","typeLabel":"object"},"billing_url":{"type":"string","format":"uri","description":"Where a person clears this 402 (#32592): pays the overdue invoice (reason payment_overdue) or reactivates the plan (reason subscription_inactive). Present on every 402 subscription_required, omitted on every other error. The message names the same URL; link this field instead of parsing the message.","uniqueKey":"error.billing_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","enum":["cursor_expired","unknown_endpoint","pick_not_released","trader_not_tracked","market_out_of_scope","fill_history_too_large","read_model_warming","database_unavailable","request_accounting_unavailable","idempotency_in_progress","webhook_delivery_in_progress","webhook_secret_rotation_not_prepared","webhook_secret_rotation_overlap_active","sandbox_api_key","api_key_in_query","subscription_inactive","payment_overdue","monthly_quota_exceeded","invalid_query","unknown_query_parameter","invalid_path","invalid_body","unsupported_media_type","payload_too_large","method_not_allowed","ip_rate_limited","ip_throttled","cold_read_limited","export_expired","freshness_ceiling_unsatisfied","max_plan_required","endpoint_retired"],"description":"ADDITIVE (#7209). The specific, actionable cause behind `code`, when there is one more specific than the code itself. `code` keeps its published values, so existing clients are unaffected; new clients branch on `reason`. Omitted when the code already says everything we know. pick_not_released: no Pick of the Day is published for the current product day; schedule one request against retry_at instead of polling. unknown_endpoint: the PATH is not a route on this API -- read GET /api/v1, do not retry. trader_not_tracked: the wallet is real and the URL is right, but the trader is not on the warm sync tier (the wallets we sync most often) -- stop asking for this wallet. market_out_of_scope (404 not_found, #27303): the market or event is real and the URL is right, but 0xinsider serves sports and esports markets only -- stop asking for this market; neither a retry nor another URL for it can succeed. fill_history_too_large (404 not_found, #33245): the wallet and market are tracked, but the position timeline sums every earlier fill into its running totals and this wallet has more than 20,000 fills on the market before the requested page -- stop asking for this pair; neither a retry nor another page can succeed. cursor_expired: pagination went stale mid-walk -- re-request the first page and continue. read_model_warming: the requested endpoint cannot serve its read model yet; exact causes are endpoint-specific and can include a cold or contended refresh or a dependency that prevented refresh. database_unavailable: the API's database or its connection pool is temporarily unreachable (a connection-class failure, not a query fault); code stays rate_limit_unavailable, nothing is rate-limited, retry after Retry-After / retry_at. idempotency_in_progress: retain the exact Idempotency-Key and request body, then retry shortly. webhook_delivery_in_progress: retry the URL or signing-secret configuration change after the destination's active request completes. request_accounting_unavailable: accounting capacity is unavailable before the handler executes; retry after Retry-After / retry_at. sandbox_api_key: the credential is a sandbox key (oxi_sk_test_) from POST /api/v1/agents/register, which only the sandbox server accepts -- call the sandbox base URL with it, or get a live key or OAuth access token; do not retry it here. api_key_in_query: the key was sent as a ?token= query parameter, which no route reads because URLs land in logs and history; the key itself was not checked -- resend it as Authorization: Bearer. subscription_inactive: the key is valid but the account's Pro subscription has lapsed (402 subscription_required); permanent until a person reactivates at https://0xinsider.com/billing, which the message names -- stop retrying on a schedule and surface the link. The key owner is emailed once per lapse. payment_overdue (402 subscription_required, #32592): the key is valid and the account still has its plan, but its latest subscription invoice is unpaid (Stripe past_due or unpaid), so paid access is paused; permanent until a person pays at billing_url (https://0xinsider.com/billing) -- stop retrying on a schedule and surface the link. The key works again the moment the invoice is paid. GET /api/v1/me and GET /api/v1/usage keep answering. monthly_quota_exceeded: the account has used the requests its plan includes for the UTC calendar month (429 rate_limited); retry_at and Retry-After name the first of next month, the only retry that can succeed, and the message names https://0xinsider.com/developers, where pay as you go for requests over the quota is turned on. The X-Monthly-Quota-Limit, X-Monthly-Quota-Remaining and X-Monthly-Quota-Reset headers on every authenticated response say how close the account is. invalid_query, invalid_path, invalid_body (400 bad_request, #16146): a query parameter, a path segment or the JSON body did not parse or does not fit the route's schema, so no handler ran; param names the field when the parser named one (a query key, a path segment, a JSON path such as traders[0], or body); fix the request, never retry it as sent. unsupported_media_type (415 bad_request, param content-type): send the body with Content-Type: application/json. payload_too_large (413 bad_request, param body): the body is over 1048576 bytes. method_not_allowed (405 bad_request): the path is a route but not with this method; the Allow header names the methods it serves. ip_rate_limited (429 rate_limited, #16380): the per-address budget every caller behind one IP shares, counted before authentication, is spent; not the key's own window, and the RateLimit-* headers describe that bucket. ip_throttled (429 rate_limited): the address is in a cooldown after sustained over-limit traffic; Retry-After is minutes to days, and a request before it does not shorten the cooldown. cold_read_limited (429 rate_limited, #28752): the account has used its share of cold reads on GET /api/v1/market/{condition_id}/holders, requests for a market whose roster is not cached, each of which walks Polymarket (6 a minute, in bursts of up to 400); not the per-minute window, so a cached market still answers, and the next cold read is admitted at Retry-After. max_plan_required (403 forbidden, #23085): the key is valid and its account is on Pro, but the route is part of Max (GET /api/v1/edge-hunter); every Pro route keeps working with the same key, so do not disable it. The message names https://0xinsider.com/pricing, where the account upgrades; a retry never clears it. endpoint_retired (410): this legacy sports endpoint no longer serves data. Migrate to GET /api/v1/edge-hunter; retrying the retired path cannot succeed.","uniqueKey":"error.reason","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"meta":{"type":"object","required":["request_id","cached","cost"],"properties":{"request_id":{"type":"string","description":"Unique request ID (req_ prefix). The same value as the X-Request-Id response header, the request's usage accounting row and its log lines.","isRequired":true,"uniqueKey":"meta.request_id","typeLabel":"string"},"cached":{"type":"boolean","isRequired":true,"uniqueKey":"meta.cached","typeLabel":"boolean"},"cost":{"type":"integer","description":"Advisory request weight (relative compute cost). 1 for simple reads; higher for heavier endpoints. Not a credit/price.","isRequired":true,"uniqueKey":"meta.cost","typeLabel":"integer"},"cache_age_s":{"type":"integer","description":"Cache age in seconds. Omitted when the response was not cached, and also when it was cached but its age cannot be established (an entry stored before its cache carried a computed instant). Never a placeholder: an unknown age is reported as no value rather than as the cache TTL.","uniqueKey":"meta.cache_age_s","typeLabel":"integer"},"ranking_generation":{"type":"integer","description":"Committed PostgreSQL-owned leaderboard generation for the returned rows and cursor. Present on GET /api/v1/leaderboard; omitted on endpoints that do not read this ranking.","uniqueKey":"meta.ranking_generation","typeLabel":"integer"},"ranking_as_of":{"type":"string","format":"date-time","description":"Authoritative RFC3339 timestamp from cache_generations.updated_at for ranking_generation. It is read in the same repeatable-read snapshot as the leaderboard rows and is not request time, cache write time, or row insertion order.","uniqueKey":"meta.ranking_as_of","typeLabel":"string\u003cdate-time>"},"continued_from_generation":{"type":"integer","description":"GET /api/v1/leaderboard only. The cursor's ranking_generation, set when this page continued a cursor from an earlier ranking that moved under it: the rows follow the cursor's boundary in the ranking named by ranking_generation, so a trader who crossed the boundary can repeat a row you already hold or be missing from the walk. De-duplicate by id, or restart from the first page for an exact walk. Omitted on a first page and on an exact continuation, including a newer generation in which nothing a page of that order reads moved. It can equal ranking_generation when the ranking moved within one generation: on the default order, sort=rank and sort=grade when the rank keys changed, and on every other sort whenever the projection republished (about once a minute; since 2026-11-07).","uniqueKey":"meta.continued_from_generation","typeLabel":"integer"},"directional_source":{"type":"string","enum":["live","degraded"],"description":"Directional evidence provenance for Edge Hunter signals collections. The default board carries this provenance in data.directional_source and omits this optional meta field.","uniqueKey":"meta.directional_source","typeLabel":"enum\u003cstring>"},"ranking_source":{"type":"string","enum":["live","db_only"],"description":"Ranking evidence provenance for Edge Hunter signals collections. The default board carries this clock/provenance in data.ranking_source and omits this optional meta field.","uniqueKey":"meta.ranking_source","typeLabel":"enum\u003cstring>"},"category_skill_source":{"type":"string","enum":["live","partial","degraded","unavailable"],"description":"Whole filtered snapshot category-evidence status before pagination. Operational live always remains partial source coverage.","uniqueKey":"meta.category_skill_source","typeLabel":"enum\u003cstring>"},"category_skill_model_version":{"type":"string","uniqueKey":"meta.category_skill_model_version","typeLabel":"string"},"category_skill_taxonomy_version":{"type":"string","uniqueKey":"meta.category_skill_taxonomy_version","typeLabel":"string"},"category_skill_platform":{"type":"string","const":"polymarket","uniqueKey":"meta.category_skill_platform","typeLabel":"string"},"category_skill_scope":{"type":"string","const":"observed_goldsky_primary_taker_fill","uniqueKey":"meta.category_skill_scope","typeLabel":"string"},"category_skill_source_coverage":{"type":"string","enum":["partial_whale_threshold_fills","graded_wallet_fills"],"uniqueKey":"meta.category_skill_source_coverage","typeLabel":"enum\u003cstring>"},"category_skill_observation_started_at":{"type":"string","format":"date-time","uniqueKey":"meta.category_skill_observation_started_at","typeLabel":"string\u003cdate-time>"},"category_skill_model_operationally_degraded":{"type":"boolean","description":"Whole-model operational readiness captured with the category model snapshot. Present on category-enriched responses even when the filtered signal list is empty. When true, category_skill_source is degraded and Edge Hunter signals uses the shorter degraded cache TTL.","uniqueKey":"meta.category_skill_model_operationally_degraded","typeLabel":"boolean"},"category_skill_status_counts":{"type":"object","required":["live","insufficient","stale","unknown","degraded"],"properties":{"live":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.live","typeLabel":"integer"},"insufficient":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.insufficient","typeLabel":"integer"},"stale":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.stale","typeLabel":"integer"},"unknown":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.unknown","typeLabel":"integer"},"degraded":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"meta.category_skill_status_counts.degraded","typeLabel":"integer"}},"uniqueKey":"meta.category_skill_status_counts","typeLabel":"object"},"category_skill_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"SHA-256 of the funded signal membership/order/rank/cursor vector immediately before category-skill enrichment. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_base_payload_hash","typeLabel":"string"},"category_skill_enriched_base_payload_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Independent SHA-256 recomputation over the same base fields immediately after category-skill enrichment. Equality with category_skill_base_payload_hash proves category-skill enrichment did not change funded inputs. Edge Hunter signals view only.","uniqueKey":"meta.category_skill_enriched_base_payload_hash","typeLabel":"string"}},"isRequired":true,"uniqueKey":"meta","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"object":"error","error":{"code":"bad_request","message":"\u003cstring>","doc_url":"\u003cstring>","param":"\u003cstring>","retry_at":"2023-11-07T05:31:56Z","freshness":{"max_age_s":1,"data_quality_status":"fresh","actual_age_s":1,"as_of":"2023-11-07T05:31:56Z"},"billing_url":"\u003cstring>","reason":"cursor_expired"},"meta":{"request_id":"\u003cstring>","cached":true,"cost":123,"cache_age_s":123,"ranking_generation":123,"ranking_as_of":"2023-11-07T05:31:56Z","continued_from_generation":123,"directional_source":"live","ranking_source":"live","category_skill_source":"live","category_skill_model_version":"\u003cstring>","category_skill_taxonomy_version":"\u003cstring>","category_skill_platform":"polymarket","category_skill_scope":"observed_goldsky_primary_taker_fill","category_skill_source_coverage":"partial_whale_threshold_fills","category_skill_observation_started_at":"2023-11-07T05:31:56Z","category_skill_model_operationally_degraded":true,"category_skill_status_counts":{"live":1,"insufficient":1,"stale":1,"unknown":1,"degraded":1},"category_skill_base_payload_hash":"\u003cstring>","category_skill_enriched_base_payload_hash":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"492b753b-ea58-4928-9009-99bfe0a64119":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Legacy default or named integration API key, or OAuth 2.1 access token, in the Authorization header as `Bearer oxi_sk_live_...` or `Bearer oxi_at_...`. Default keys retain full access; integration keys are limited to their approved read, webhooks, export and usage scopes and expire within 90 days. All credentials share the owner's account limits. Data calls require an active Pro subscription and return live data. A 401 carries WWW-Authenticate: Bearer resource_metadata=\"https://api.0xinsider.com/.well-known/oauth-protected-resource\" (RFC 6750 section 3, RFC 9728).","scopes":[],"schemeName":"bearerAuth"}},"0870948c-5b42-42f1-9c39-ec6dc389730e":{"oauth2":{"type":"oauth2","description":"OAuth 2.1 authorization code flow with PKCE S256 for apps and MCP clients acting for a user. Public clients only (no client secret): register with RFC 7591 at https://api.0xinsider.com/oauth/register or present an https client ID metadata document URL as client_id. Authorization server metadata: https://api.0xinsider.com/.well-known/oauth-authorization-server. The access token (oxi_at_..., one hour) is sent as `Authorization: Bearer`; refresh tokens rotate on every use. A route outside the token's scopes answers 403 insufficient_scope. Walkthrough: https://0xinsider.com/auth.md.","flows":{"authorizationCode":{"authorizationUrl":"https://0xinsider.com/oauth/authorize","tokenUrl":"https://api.0xinsider.com/oauth/token","refreshUrl":"https://api.0xinsider.com/oauth/token","scopes":{"read":"Read markets, traders, large trades, positions, reports, search, the event stream and every MCP tool","webhooks":"Create, list, verify, rotate and delete webhook endpoints","export":"Start, poll and download trader exports","usage":"Read the caller's API usage counters"}}},"scopes":["read"],"schemeName":"oauth2"}}},"servers":{"2ad484fe-94b7-439b-b221-8af155051f3d":{"url":"https://api.0xinsider.com","description":"Production (live data). Authenticate with a live key (oxi_sk_live_...); requires an active Pro subscription. A sandbox key (oxi_sk_test_...) is answered with 401 invalid_api_key and error.reason sandbox_api_key."},"5cd2ef08-5581-43fd-8c8b-afbd9f40fc58":{"url":"https://0xinsider.com/sandbox","description":"Sandbox. No credential required and no production data: every documented operation answers with its documented example or a deterministic sample of its response schema. GET /api/v1/stream is the one exclusion and answers 400 there, because a Server-Sent Events stream is a live connection rather than a body. Add ?sandbox_status=\u003ccode> to receive one of the error responses the operation documents (for example 429 with Retry-After). Documented query parameters and JSON request bodies are checked against this document, the two context.md routes answer 200 text/markdown, GET /api/v1/trader/{address}/export/download answers its 302 with a Location the sandbox serves itself rather than an object store, and nothing is stored between requests. A sandbox key (oxi_sk_test_..., issued with no account by POST https://api.0xinsider.com/api/v1/agents/register) is optional: on an operation that requires a credential, a well-formed key is answered with X-Oxi-Sandbox-Key: valid and a malformed one with 401 invalid_api_key."}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Legacy default or named integration API key, or OAuth 2.1 access token, in the Authorization header as `Bearer oxi_sk_live_...` or `Bearer oxi_at_...`. Default keys retain full access; integration keys are limited to their approved read, webhooks, export and usage scopes and expire within 90 days. All credentials share the owner's account limits. Data calls require an active Pro subscription and return live data. A 401 carries WWW-Authenticate: Bearer resource_metadata=\"https://api.0xinsider.com/.well-known/oauth-protected-resource\" (RFC 6750 section 3, RFC 9728).","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Legacy default or named integration API key, or OAuth 2.1 access token, in the Authorization header as `Bearer oxi_sk_live_...` or `Bearer oxi_at_...`. Default keys retain full access; integration keys are limited to their approved read, webhooks, export and usage scopes and expire within 90 days. All credentials share the owner's account limits. Data calls require an active Pro subscription and return live data. A 401 carries WWW-Authenticate: Bearer resource_metadata=\"https://api.0xinsider.com/.well-known/oauth-protected-resource\" (RFC 6750 section 3, RFC 9728).","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"},{"schemes":[{"scheme":{"type":"oauth2","description":"OAuth 2.1 authorization code flow with PKCE S256 for apps and MCP clients acting for a user. Public clients only (no client secret): register with RFC 7591 at https://api.0xinsider.com/oauth/register or present an https client ID metadata document URL as client_id. Authorization server metadata: https://api.0xinsider.com/.well-known/oauth-authorization-server. The access token (oxi_at_..., one hour) is sent as `Authorization: Bearer`; refresh tokens rotate on every use. A route outside the token's scopes answers 403 insufficient_scope. Walkthrough: https://0xinsider.com/auth.md.","flows":{"authorizationCode":{"authorizationUrl":"https://0xinsider.com/oauth/authorize","tokenUrl":"https://api.0xinsider.com/oauth/token","refreshUrl":"https://api.0xinsider.com/oauth/token","scopes":{"read":"Read markets, traders, large trades, positions, reports, search, the event stream and every MCP tool","webhooks":"Create, list, verify, rotate and delete webhook endpoints","export":"Start, poll and download trader exports","usage":"Read the caller's API usage counters"}}},"scopes":["read"],"schemeName":"oauth2"},"schema":{"title":"OAuth2 Auth","type":"string","isRequired":true,"description":"OAuth 2.1 authorization code flow with PKCE S256 for apps and MCP clients acting for a user. Public clients only (no client secret): register with RFC 7591 at https://api.0xinsider.com/oauth/register or present an https client ID metadata document URL as client_id. Authorization server metadata: https://api.0xinsider.com/.well-known/oauth-authorization-server. The access token (oxi_at_..., one hour) is sent as `Authorization: Bearer`; refresh tokens rotate on every use. A route outside the token's scopes answers 403 insufficient_scope. Walkthrough: https://0xinsider.com/auth.md.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"oauth2","name":"Authorization"}],"title":"oauth2"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"0xinsider","siteName":"0xinsider API","title":"Large trades - 0xinsider API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-04T04:10:46.067Z","originalFileLocation":"api-reference/endpoint/get-large-trades.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"List recent large Polymarket trades with wallet grades and review scores.\">\u003cmeta data-mint-head name=\"application-name\" content=\"0xinsider API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/0xinsider/iPhECHy4zq6L0ogA/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/0xinsider/iPhECHy4zq6L0ogA/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/0xinsider/iPhECHy4zq6L0ogA/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/0xinsider/iPhECHy4zq6L0ogA/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/0xinsider/iPhECHy4zq6L0ogA/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/0xinsider/iPhECHy4zq6L0ogA/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/0xinsider/iPhECHy4zq6L0ogA/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/0xinsider/iPhECHy4zq6L0ogA/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/0xinsider/iPhECHy4zq6L0ogA/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Large trades - 0xinsider API\">\u003cmeta data-mint-head property=\"og:description\" content=\"List recent large Polymarket trades with wallet grades and review scores.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"0xinsider API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.0xinsider.com/api-reference/endpoint/get-large-trades\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://0xinsider.mintlify.site/_mintlify/api/og/v2?division=Whale+trades\u0026amp;title=Large+trades\u0026amp;description=List+recent+large+Polymarket+trades+with+wallet+grades+and+review+scores.\u0026amp;theme=f60be7b65c9764d9e284b0d8\u0026amp;signature=f199000af4c8f96afe2e613ac2dd0e2b78178ffde68154c9d5330b48952f7fa1\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Large trades - 0xinsider API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"List recent large Polymarket trades with wallet grades and review scores.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://0xinsider.mintlify.site/_mintlify/api/og/v2?division=Whale+trades\u0026amp;title=Large+trades\u0026amp;description=List+recent+large+Polymarket+trades+with+wallet+grades+and+review+scores.\u0026amp;theme=f60be7b65c9764d9e284b0d8\u0026amp;signature=f199000af4c8f96afe2e613ac2dd0e2b78178ffde68154c9d5330b48952f7fa1\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/0xinsider/iPhECHy4zq6L0ogA/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"0xinsider API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#000000\">\u003cmeta data-mint-head name=\"msvalidate.01\" content=\"46E18D97E322917120999977418630DE\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.0xinsider.com/api-reference/endpoint/get-large-trades\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/endpoint/get-large-trades.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.0xinsider.com/#organization\",\"name\":\"0xinsider API\",\"url\":\"https://docs.0xinsider.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/0xinsider/D5OLZi_kq06wJPfv/logo/light.svg?fit=max\u0026auto=format\u0026n=D5OLZi_kq06wJPfv\u0026q=85\u0026s=5a737b3d5f5bace7059eb57500f3c8ef\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.0xinsider.com#website\",\"name\":\"0xinsider API\",\"url\":\"https://docs.0xinsider.com\",\"publisher\":{\"@id\":\"https://docs.0xinsider.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.0xinsider.com/api-reference/endpoint/get-large-trades#webpage\",\"url\":\"https://docs.0xinsider.com/api-reference/endpoint/get-large-trades\",\"name\":\"Large trades\",\"description\":\"List recent large Polymarket trades with wallet grades and review scores.\",\"dateModified\":\"2026-11-04T04:10:46.067Z\",\"isPartOf\":{\"@id\":\"https://docs.0xinsider.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.0xinsider.com/api-reference/endpoint/get-large-trades#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.0xinsider.com/api-reference/endpoint/get-large-trades#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"0xinsider API\",\"item\":\"https://docs.0xinsider.com\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Large trades\",\"item\":\"https://docs.0xinsider.com/api-reference/endpoint/get-large-trades\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.0xinsider.com/api-reference/endpoint/get-large-trades#apireference\",\"headline\":\"Large trades\",\"name\":\"Large trades\",\"description\":\"List recent large Polymarket trades with wallet grades and review scores.\",\"url\":\"https://docs.0xinsider.com/api-reference/endpoint/get-large-trades\",\"mainEntityOfPage\":{\"@id\":\"https://docs.0xinsider.com/api-reference/endpoint/get-large-trades#webpage\"},\"dateModified\":\"2026-11-04T04:10:46.067Z\",\"publisher\":{\"@id\":\"https://docs.0xinsider.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.0xinsider.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"0xinsider API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"0xinsider API","nav":{"global":{"anchors":[{"anchor":"Terminal","icon":"chart-line","href":"https://0xinsider.com"},{"anchor":"Product changelog","icon":"list","href":"https://0xinsider.com/changelog"}]},"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":""}]},{"tab":"API reference","groups":[{"group":"Overview","pages":[{"title":"0xinsider API reference","sidebarTitle":"Overview","href":"/api-reference/introduction"}]},{"group":"Edge Hunter","pages":[{"title":"Edge Hunter","sidebarTitle":"Edge Hunter","openapi":"GET /api/v1/edge-hunter","href":"/api-reference/endpoint/get-edge-hunter"}]},{"group":"Objects","pages":[{"title":"Objects","href":"/api-reference/objects"}]},{"group":"Discovery","pages":[{"title":"API discovery","openapi":"GET /api/v1","href":"/api-reference/endpoint/get-api-discovery"},{"title":"Register an agent","openapi":"POST /api/v1/agents/register","href":"/api-reference/endpoint/register-agent"},{"title":"Coverage","openapi":"GET /api/v1/coverage","href":"/api-reference/endpoint/get-coverage"},{"title":"Platforms (deprecated)","openapi":"GET /api/v1/platforms","href":"/api-reference/endpoint/get-platforms"},{"title":"OpenAPI spec","openapi":"GET /api/v1/openapi.json","href":"/api-reference/endpoint/redirect-api-openapi-spec"}]},{"group":"Traders","pages":[{"title":"Trader","openapi":"GET /api/v1/trader/{address}","href":"/api-reference/endpoint/get-trader"},{"title":"Trader context","openapi":"GET /api/v1/trader/{address}/context","href":"/api-reference/endpoint/get-trader-context"},{"title":"Trader context as Markdown","openapi":"GET /api/v1/trader/{address}/context.md","href":"/api-reference/endpoint/get-trader-context-markdown"},{"title":"Trader category records","openapi":"GET /api/v1/trader/{address}/categories","href":"/api-reference/endpoint/get-trader-category-records"},{"title":"Trader grade at a past time","openapi":"GET /api/v1/trader/{address}/grade-at","href":"/api-reference/endpoint/get-trader-grade-at"},{"title":"Trader closing line value","openapi":"GET /api/v1/trader/{address}/clv","href":"/api-reference/endpoint/get-trader-clv"},{"title":"Batch traders","openapi":"POST /api/v1/traders/batch","href":"/api-reference/endpoint/batch-get-traders"},{"title":"Trader P\u0026L","openapi":"GET /api/v1/trader/{address}/pnl","href":"/api-reference/endpoint/get-trader-pnl"},{"title":"Position timeline","openapi":"GET /api/v1/trader/{address}/position-timeline","href":"/api-reference/endpoint/get-position-timeline"},{"title":"Position timeline by trader","openapi":"GET /api/v1/traders/{trader}/position-timeline","href":"/api-reference/endpoint/get-trader-position-timeline"},{"title":"Large positions","openapi":"GET /api/v1/large-positions","href":"/api-reference/endpoint/list-large-positions"},{"title":"Trader export snapshot","openapi":"GET /api/v1/trader/{address}/export","href":"/api-reference/endpoint/get-trader-export-snapshot"},{"title":"Submit a whale dataset","openapi":"POST /api/v1/datasets/whale-trades","href":"/api-reference/endpoint/submit-whale-dataset"},{"title":"Read a whale dataset job","openapi":"GET /api/v1/datasets/whale-trades/{job_id}","href":"/api-reference/endpoint/get-whale-dataset-status"},{"title":"Download a whale dataset","openapi":"GET /api/v1/datasets/whale-trades/{job_id}/download","href":"/api-reference/endpoint/download-whale-dataset"},{"title":"Cancel a whale dataset job","openapi":"POST /api/v1/datasets/whale-trades/{job_id}/cancel","href":"/api-reference/endpoint/cancel-whale-dataset"},{"title":"Submit a trader export","openapi":"POST /api/v1/trader/{address}/export","href":"/api-reference/endpoint/submit-trader-export"},{"title":"Trader export status","openapi":"GET /api/v1/trader/{address}/export/status","href":"/api-reference/endpoint/get-trader-export-status"},{"title":"Download a trader export","openapi":"GET /api/v1/trader/{address}/export/download","href":"/api-reference/endpoint/download-trader-export"},{"title":"Cancel a trader export","openapi":"POST /api/v1/trader/{address}/export/cancel","href":"/api-reference/endpoint/cancel-trader-export"},{"title":"Leaderboard","openapi":"GET /api/v1/leaderboard","href":"/api-reference/endpoint/get-leaderboard"},{"title":"Trending wallets","openapi":"GET /api/v1/leaderboard/trending","href":"/api-reference/endpoint/list-trending-wallets"},{"title":"Leaderboard leagues","openapi":"GET /api/v1/leaderboard/leagues","href":"/api-reference/endpoint/list-leaderboard-leagues"},{"title":"Sport leaderboard","openapi":"GET /api/v1/leaderboard/sports/{sport}","href":"/api-reference/endpoint/get-sport-leaderboard"},{"title":"Category leaderboard","openapi":"GET /api/v1/leaderboard/categories/{slug}","href":"/api-reference/endpoint/get-category-leaderboard"},{"title":"Category leaders","openapi":"GET /api/v1/leaderboard/categories","href":"/api-reference/endpoint/list-category-leaders"}]},{"group":"Positions","pages":[{"title":"Positions","openapi":"GET /api/v1/positions","href":"/api-reference/endpoint/get-positions"}]},{"group":"Combos","pages":[{"title":"Combo fills","openapi":"GET /api/v1/combos/fills","href":"/api-reference/endpoint/list-combo-fills"},{"title":"Combos summary","openapi":"GET /api/v1/combos/summary","href":"/api-reference/endpoint/get-combos-summary"},{"title":"Combo","openapi":"GET /api/v1/combos/{condition_id}","href":"/api-reference/endpoint/get-combo"}]},{"group":"Games","pages":[{"title":"List games","openapi":"GET /api/v1/games","href":"/api-reference/endpoint/list-games"},{"title":"Game","openapi":"GET /api/v1/games/{event_slug}","href":"/api-reference/endpoint/get-game"},{"title":"List game markets","openapi":"GET /api/v1/games/{event_slug}/markets","href":"/api-reference/endpoint/list-game-markets"},{"title":"List props","openapi":"GET /api/v1/props","href":"/api-reference/endpoint/list-props"},{"title":"List settled markets","openapi":"GET /api/v1/markets/settled","href":"/api-reference/endpoint/list-settled-markets"},{"title":"Game sharp money","openapi":"GET /api/v1/games/{event_slug}/sharp-money","href":"/api-reference/endpoint/get-game-sharp-money"},{"title":"Game trades","openapi":"GET /api/v1/games/{event_slug}/trades","href":"/api-reference/endpoint/list-game-trades"},{"title":"Game holders","openapi":"GET /api/v1/games/{event_slug}/holders","href":"/api-reference/endpoint/get-game-holders"}]},{"group":"Markets","pages":[{"title":"Search markets","openapi":"GET /api/v1/markets/search","href":"/api-reference/endpoint/search-markets"},{"title":"Explore markets","openapi":"GET /api/v1/markets/explore","href":"/api-reference/endpoint/explore-markets"},{"title":"Sharp money flows","openapi":"GET /api/v1/markets/sharp-money-flows","href":"/api-reference/endpoint/sharp-money-flows"},{"title":"Smart money flows","openapi":"GET /api/v1/markets/smart-money-flows","href":"/api-reference/endpoint/smart-money-flows"},{"title":"Market flow","openapi":"GET /api/v1/market/{condition_id}/flow","href":"/api-reference/endpoint/get-market-flow"},{"title":"Batch market flow","openapi":"POST /api/v1/markets/flow/batch","href":"/api-reference/endpoint/batch-get-market-flow"},{"title":"Market intel (deprecated)","openapi":"GET /api/v1/market/{condition_id}/intel","href":"/api-reference/endpoint/get-market-intel"},{"title":"Batch market intel (deprecated)","openapi":"POST /api/v1/markets/intel/batch","href":"/api-reference/endpoint/batch-get-market-intel"},{"title":"Market snapshot","openapi":"GET /api/v1/market/{condition_id}/snapshot","href":"/api-reference/endpoint/get-market-snapshot"},{"title":"Market context as Markdown","openapi":"GET /api/v1/market/{condition_id}/context.md","href":"/api-reference/endpoint/get-market-context-markdown"},{"title":"Market holders","openapi":"GET /api/v1/market/{condition_id}/holders","href":"/api-reference/endpoint/get-market-holders"},{"title":"Market top holders","openapi":"GET /api/v1/market/{condition_id}/top-holders","href":"/api-reference/endpoint/get-market-top-holders"},{"title":"Market closing line","openapi":"GET /api/v1/market/{condition_id}/close","href":"/api-reference/endpoint/get-market-close"},{"title":"Batch market closing lines","openapi":"POST /api/v1/markets/close/batch","href":"/api-reference/endpoint/batch-get-market-close"},{"title":"Market candles","openapi":"GET /api/v1/market/{condition_id}/candles","href":"/api-reference/endpoint/get-market-candles"},{"title":"Market wallets in and out","openapi":"GET /api/v1/market/{condition_id}/wallets-in-out","href":"/api-reference/endpoint/get-market-wallets-in-out"}]},{"group":"Content","pages":[{"title":"Search content","openapi":"GET /api/v1/content/search","href":"/api-reference/endpoint/search-content"}]},{"group":"Pick of the Day","pages":[{"title":"Pick of the Day","openapi":"GET /api/v1/pick-of-the-day","href":"/api-reference/endpoint/get-pick-of-the-day"},{"title":"Pick of the Day archive","openapi":"GET /api/v1/pick-of-the-day/archive","href":"/api-reference/endpoint/get-pick-of-the-day-archive"},{"title":"Pick of the Day stats","openapi":"GET /api/v1/pick-of-the-day/stats","href":"/api-reference/endpoint/get-pick-of-the-day-stats"},{"title":"Pick of the Day ledger","openapi":"GET /api/v1/pick-of-the-day/ledger","href":"/api-reference/endpoint/get-pick-of-the-day-ledger"},{"title":"Pick of the Day ledger entry","description":"Read one pick's commitment, proof state, and revealed payload using its pick ID.","openapi":"GET /api/v1/pick-of-the-day/ledger/{pick_id}","href":"/api-reference/endpoint/get-pick-of-the-day-ledger-entry"}]},{"group":"Whale trades","pages":[{"title":"Large trades","openapi":"GET /api/v1/large-trades","href":"/api-reference/endpoint/get-large-trades"},{"title":"Large trade","description":"Get one large trade and the Polygon order matches and wallets behind it.","openapi":"GET /api/v1/large-trades/{id}","href":"/api-reference/endpoint/get-large-trade"},{"title":"Large trades history","openapi":"GET /api/v1/large-trades/history","href":"/api-reference/endpoint/get-large-trades-history"},{"title":"Counterparty executions","openapi":"GET /api/v1/large-trades/{id}/counterparties/executions","href":"/api-reference/endpoint/get-large-trade-counterparty-executions"},{"title":"Counterparty makers","openapi":"GET /api/v1/large-trades/{id}/counterparties/executions/{execution_id}/makers","href":"/api-reference/endpoint/get-large-trade-counterparty-makers"},{"title":"Whale trades (deprecated)","openapi":"GET /api/v1/whale-trades","href":"/api-reference/endpoint/get-whale-trades"},{"title":"Whale trade (deprecated)","openapi":"GET /api/v1/whale-trades/{id}","href":"/api-reference/endpoint/get-whale-trade"},{"title":"Whale trades history (deprecated)","openapi":"GET /api/v1/whale-trades/history","href":"/api-reference/endpoint/get-whale-trades-history"},{"title":"Counterparty executions (deprecated)","openapi":"GET /api/v1/whale-trades/{id}/counterparties/executions","href":"/api-reference/endpoint/get-whale-trade-counterparty-executions"},{"title":"Counterparty makers (deprecated)","openapi":"GET /api/v1/whale-trades/{id}/counterparties/executions/{execution_id}/makers","href":"/api-reference/endpoint/get-whale-trade-counterparty-makers"}]},{"group":"Suspicious trades","pages":[{"title":"Suspicious trades","openapi":"GET /api/v1/suspicious-trades","href":"/api-reference/endpoint/get-suspicious-trades"},{"title":"Suspicious trade","openapi":"GET /api/v1/suspicious-trades/{id}","href":"/api-reference/endpoint/get-suspicious-trade"},{"title":"Insider Radar","openapi":"GET /api/v1/insider-radar","href":"/api-reference/endpoint/get-insider-radar"},{"title":"Insider Radar flag","openapi":"GET /api/v1/insider-radar/{id}","href":"/api-reference/endpoint/get-insider-radar-flag"}]},{"group":"Events","pages":[{"title":"Event replay","openapi":"GET /api/v1/events/feed/since","href":"/api-reference/endpoint/get-event-replay-since"}]},{"group":"Streaming","pages":[{"title":"Stream","openapi":"GET /api/v1/stream","href":"/api-reference/endpoint/get-stream"}]},{"group":"Usage","pages":[{"title":"Account identity","openapi":"GET /api/v1/me","href":"/api-reference/endpoint/get-account-identity"},{"title":"Usage","openapi":"GET /api/v1/usage","href":"/api-reference/endpoint/get-usage"}]},{"group":"Webhooks","pages":[{"title":"Webhooks","openapi":"GET /api/v1/webhooks","href":"/api-reference/endpoint/list-webhooks"},{"title":"Webhook events","openapi":"GET /api/v1/webhooks/events","href":"/api-reference/endpoint/list-webhook-events"},{"title":"Create a webhook","openapi":"POST /api/v1/webhooks","href":"/api-reference/endpoint/create-webhook"},{"title":"Webhook","openapi":"GET /api/v1/webhooks/{id}","href":"/api-reference/endpoint/get-webhook"},{"title":"Update a webhook","openapi":"PATCH /api/v1/webhooks/{id}","href":"/api-reference/endpoint/update-webhook"},{"title":"Delete a webhook","openapi":"DELETE /api/v1/webhooks/{id}","href":"/api-reference/endpoint/delete-webhook"},{"title":"Verify a webhook","openapi":"POST /api/v1/webhooks/{id}/verify","href":"/api-reference/endpoint/verify-webhook"},{"title":"Start webhook verification","openapi":"POST /api/v1/webhooks/{id}/verification-attempts","href":"/api-reference/endpoint/create-webhook-verification-attempt"},{"title":"Get webhook verification","openapi":"GET /api/v1/webhooks/{id}/verification-attempts/{attempt_id}","href":"/api-reference/endpoint/get-webhook-verification-attempt"},{"title":"Rotate a webhook secret","openapi":"POST /api/v1/webhooks/{id}/rotate-secret","href":"/api-reference/endpoint/rotate-webhook-secret"},{"title":"Prepare a staged webhook secret","openapi":"POST /api/v1/webhooks/{id}/rotate-secret/prepare","href":"/api-reference/endpoint/prepare-webhook-secret"},{"title":"Activate a staged webhook secret","openapi":"POST /api/v1/webhooks/{id}/rotate-secret/activate","href":"/api-reference/endpoint/activate-webhook-secret"},{"title":"Retire a staged webhook secret","openapi":"POST /api/v1/webhooks/{id}/rotate-secret/retire","href":"/api-reference/endpoint/retire-webhook-secret"},{"title":"Webhook deliveries","openapi":"GET /api/v1/webhooks/{id}/deliveries","href":"/api-reference/endpoint/list-webhook-deliveries"},{"title":"Redeliver a webhook delivery","openapi":"POST /api/v1/webhooks/{id}/deliveries/{delivery_id}/redeliver","href":"/api-reference/endpoint/redeliver-webhook-delivery"}]},{"group":"Webhook events","pages":[{"title":"large_trade_inserted_v2","openapi":"api-reference/openapi.json webhook large_trade_inserted_v2","href":"/api-reference/webhooks/large-trade-inserted-v2"},{"title":"large_trades_inserted","openapi":"api-reference/openapi.json webhook large_trades_inserted","href":"/api-reference/webhooks/large-trades-inserted"},{"title":"whale_trades_inserted","openapi":"api-reference/openapi.json webhook whale_trades_inserted","href":"/api-reference/webhooks/whale-trades-inserted"},{"title":"live_sports_updated","openapi":"api-reference/openapi.json webhook live_sports_updated","href":"/api-reference/webhooks/live-sports-updated"},{"title":"trader_synced","openapi":"api-reference/openapi.json webhook trader_synced","href":"/api-reference/webhooks/trader-synced"},{"title":"whale_trader_synced","openapi":"api-reference/openapi.json webhook whale_trader_synced","href":"/api-reference/webhooks/whale-trader-synced"},{"title":"large_positions_updated","openapi":"api-reference/openapi.json webhook large_positions_updated","href":"/api-reference/webhooks/large-positions-updated"},{"title":"wallet_grade_changed","openapi":"api-reference/openapi.json webhook wallet_grade_changed","href":"/api-reference/webhooks/wallet-grade-changed"},{"title":"suspicious_trade_flagged","openapi":"api-reference/openapi.json webhook suspicious_trade_flagged","href":"/api-reference/webhooks/suspicious-trade-flagged"},{"title":"insider_radar_flag_raised","openapi":"api-reference/openapi.json webhook insider_radar_flag_raised","href":"/api-reference/webhooks/insider-radar-flag-raised"},{"title":"sharp_money_flow_detected","openapi":"api-reference/openapi.json webhook sharp_money_flow_detected","href":"/api-reference/webhooks/sharp-money-flow-detected"},{"title":"smart_money_flow_detected","openapi":"api-reference/openapi.json webhook smart_money_flow_detected","href":"/api-reference/webhooks/smart-money-flow-detected"},{"title":"export_job_ready","openapi":"api-reference/openapi.json webhook export_job_ready","href":"/api-reference/webhooks/export-job-ready"},{"title":"export_job_failed","openapi":"api-reference/openapi.json webhook export_job_failed","href":"/api-reference/webhooks/export-job-failed"},{"title":"export_job_expired","openapi":"api-reference/openapi.json webhook export_job_expired","href":"/api-reference/webhooks/export-job-expired"},{"title":"export_job_cancelled","openapi":"api-reference/openapi.json webhook export_job_cancelled","href":"/api-reference/webhooks/export-job-cancelled"},{"title":"market_price_moved","openapi":"api-reference/openapi.json webhook market_price_moved","href":"/api-reference/webhooks/market-price-moved"},{"title":"market_settled","openapi":"api-reference/openapi.json webhook market_settled","href":"/api-reference/webhooks/market-settled"}]},{"group":"Reports","pages":[{"title":"Reports","openapi":"GET /api/v1/reports","href":"/api-reference/endpoint/get-reports"},{"title":"Daily report snapshot","openapi":"GET /api/v1/reports/daily","href":"/api-reference/endpoint/get-daily-report-snapshot"},{"title":"Weekly report snapshot","openapi":"GET /api/v1/reports/weekly","href":"/api-reference/endpoint/get-weekly-report-snapshot"},{"title":"Monthly report snapshot","openapi":"GET /api/v1/reports/monthly","href":"/api-reference/endpoint/get-monthly-report-snapshot"},{"title":"Resolution report","openapi":"GET /api/v1/reports/resolutions","href":"/api-reference/endpoint/get-resolution-report"}]},{"group":"System","pages":[{"title":"Health","openapi":"GET /api/v1/health","href":"/api-reference/endpoint/health"},{"title":"Remote MCP","sidebarTitle":"Remote MCP","openapi":"POST /api/v1/mcp","href":"/api-reference/endpoint/remote-mcp"},{"title":"Remote MCP GET","sidebarTitle":"Remote MCP GET","openapi":"GET /api/v1/mcp","href":"/api-reference/endpoint/remote-mcp-stream"}]},{"group":"Retired endpoints","pages":[{"title":"Sports edge signals (retired)","openapi":"GET /api/v1/sports-edge-signals","href":"/api-reference/endpoint/get-sports-edge-signals"},{"title":"Sports edge observations (retired)","openapi":"GET /api/v1/sports-edge-observations","href":"/api-reference/endpoint/get-sports-edge-observations"},{"title":"Pre-game sides (retired)","openapi":"GET /api/v1/sports/pre-game-sides","href":"/api-reference/endpoint/get-pre-game-sides"},{"title":"Pre-game side observations (retired)","openapi":"GET /api/v1/sports/pre-game-side-observations","href":"/api-reference/endpoint/get-pre-game-side-observations"}]}]},{"tab":"Recipes","pages":[{"title":"Recipes","href":"/recipes/copy-trade"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]}]},"basePath":"","title":"Large trades - 0xinsider API","buildId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","deploymentId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CBsVopKK.js","utils-DZAk68jJ.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-D32AYZrP.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-D_A5_cny.js","snippetPresets-xNRfS9th.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BIB25-tq.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-CydJ4w4j.js","shallow-CYPBeQSG.js","getApiPlaygroundDisplay-A5xJVBOu.js","CodeSnippet-BVRTgi3m.js","CodeSnippets-DjD6BSlt.js","Page-Dr40SSJq.js","getPastedJson-D4V4JyrR.js","icon-uhcnG22T.js","MethodPill-CM-ZQdGH.js","DuplicateIcon-B_WnOiNf.js","createIcon-CJsb8utt.js","DynamicMarkdown-D-2HDKEp.js","SectionHeading-KP5xmMgQ.js","axios-vUo_bRtp.js","Markdown-D_k0dg6k.js","clsx-DK3K4Z1S.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DE3EVdvd.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-fN9H9n9g.js"]}