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:
| Type | Covers |
|---|
Trade | Every possible trade event (parent union). |
MarketTrade | Actual on-chain trades: OrderFilled, OrdersMatched, Redemption, Merge, Split, PositionsConverted, Cancelled, RegisterToken, Approval. |
OracleEvent | Protocol lifecycle events: Initialization, Proposal, Dispute, Settled, Resolution, ConditionResolution, Reset, Flag, Unflag, Pause, Unpause, ManualResolution, NegRiskOutcomeReported. |
TradeEventType | String 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