Skip to main content
GET
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.

Parameters

has_more and next_cursor describe the filtered result, so a full page always holds limit matching trades.

Key response fields

Poll for new trades

Poll with since and If-None-Match instead of downloading the whole list each time:
  1. Call the route once without since. Keep the ETag header and the first trade’s id.
  2. 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.
  3. 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.

Example

Basketball trades of $10,000 or more by wallets that held an S or A grade when the trade filled:

What it does not return

  • 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.

Caching

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.

Authorizations

Authorization
string
header
required

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).

Headers

If-None-Match
string

Conditional GET validator from a previous ETag. Matching values return 304 Not Modified with an empty body.

Query Parameters

limit
integer
default:20

Maximum number of recent large trades to return. Out-of-range values are clamped to 1..100.

Required range: 1 <= x <= 100
cursor
string

Pagination cursor from previous response's next_cursor.

min_size
number
default:5000

Minimum trade size in USD.

category
string

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).

min_grade
enum<string>

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.

Available options:
S,
A,
B,
C,
D,
F
min_grade_at_trade
enum<string>

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.

Available options:
S,
A,
B,
C,
D,
F
suspicious_only
boolean
default:false

When true, return only rows with persisted suspicion_score >= 60. The filter is applied before SQL-backed limit + 1 pagination.

min_market_volume_share
number

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.

Required range: 0 <= x <= 1
sort
enum<string>
default:recent

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.

Available options:
recent,
market_volume_share
since
string

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.

condition_id
string

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.

event_slug
string

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.

Response

List of large trades

object
string
required
Allowed value: "list"
data
object[]
required
data_quality
object
required

Writer-backed age and coverage for this page; it is part of the representation and the ETag, while transport cache facts remain in meta.

has_more
boolean
required
meta
object
required
next_cursor
string
total
integer

Total matching rows when the read model exposes a count; absent (or null) when it does not.