Skip to main content
Trade endpoints (markets.getTrades, trader.getTraderTrades) return a single discriminated union covering every on-chain event type the API surfaces. The discriminant field is trade_type.
import type { Trade, TradeEventType } from "@structbuild/sdk";

const { data: trades } = await client.markets.getTrades({
  condition_ids: "0xabc...",
});

for (const trade of trades) {
  switch (trade.trade_type) {
    case "OrderFilled":
    case "OrdersMatched":
      console.log(trade.price, trade.usd_amount, trade.shares_amount);
      break;
    case "Redemption":
      console.log(trade.winning_outcome_index, trade.position_details);
      break;
    case "Merge":
    case "Split":
      console.log(trade.usd_amount, trade.position_details);
      break;
    case "Resolution":
      console.log(trade.condition_id, trade.settled_price);
      break;
  }
}

Convenience unions

The SDK exports a few sub-unions for common filtering patterns:
TypeCovers
TradeEvery possible trade event (parent union).
MarketTradeActual on-chain trades: OrderFilled, OrdersMatched, Redemption, Merge, Split, PositionsConverted, Cancelled, RegisterToken, Approval.
OracleEventProtocol lifecycle events: Initialization, Proposal, Dispute, Settled, Resolution, ConditionResolution, Reset, Flag, Unflag, Pause, Unpause, ManualResolution, NegRiskOutcomeReported.
TradeEventTypeString literal union of every trade_type value (useful for autocomplete and filter building).
import type { MarketTrade, OracleEvent } from "@structbuild/sdk";

function isMarketTrade(trade: Trade): trade is MarketTrade {
  return trade.trade_type !== "Initialization"
    && trade.trade_type !== "Proposal"
    && trade.trade_type !== "Resolution";
}

Individual variants

Each trade_type also ships as its own exported schema, which is handy when you want a precise param type without switching:
import type {
  OrderFilledTrade,
  RedemptionTrade,
  MergeTrade,
  SplitTrade,
  CancelledTrade,
  PositionsConvertedTrade,
  RegisterTokenTrade,
  ApprovalTrade,
} from "@structbuild/sdk";

function priceOf(trade: OrderFilledTrade): number {
  return trade.price;
}
Oracle lifecycle events are exported under *Event names: QuestionInitializedEvent, AssertionMadeEvent, AssertionDisputedEvent, AssertionSettledEvent, QuestionResolvedEvent, ConditionResolutionEvent, QuestionResetEvent, QuestionFlaggedEvent, QuestionUnflaggedEvent, QuestionPausedEvent, QuestionUnpausedEvent, QuestionEmergencyResolvedEvent, and NegRiskOutcomeReportedEvent.

Filtering server-side

Most trade endpoints accept a trade_types query parameter. Pass a comma-separated list to avoid filtering client-side:
const { data: fills } = await client.markets.getTrades({
  condition_ids: "0xabc...",
  trade_types: "OrderFilled,OrdersMatched",
});
The same filter is available on the polymarket_trades websocket room. See WebSockets.
Last modified on April 14, 2026