List your trades
cursor
echoed back as nextCursor. limit is capped at 200 (default 50).
Response:
Pagination
This feed is keyset-paginated — the same scheme as/api/me/orders/open
and /api/me/portfolio/positions.
- Each response carries a
nextCursor— an opaque token. Pass it back as?cursor=<nextCursor>to fetch the next (older) page. Treat it as a black box; don’t parse or construct it. nextCursorisnullonly on the last page — never a silent truncation. Keep requesting until it’snull.limitcaps the page size (max 200, default 50).- The legacy
?before=<ISO-8601>parameter still works for backward compatibility, but prefercursor— it carries a unique tiebreaker so rows sharing the samecreatedAt(common when one match writes several rows) are never skipped or duplicated at a page boundary.
Fields
Lifecycle
A trade row is created on the matcher confirming a cross and progresses through a small set of public statuses until the chain-side settlement lands.
The
settlement_failed state is not exposed on this feed — that’s
an ops-only signal for chain reverts and is filtered server-side. If
your integration relies on txHash finality, gate on
status === "settled" and settledAt != null.
Adjustment
adjustment reflects the chain mechanism that backed the trade:
MINT / BURN are produced exclusively on is_binary=true markets
where the matcher canonicalises every order onto the YES book and
treats opposite-side BUYs (or opposite-side SELLs) as cross-outcome
matches. On non-binary markets every fill is NONE. On a binary
market where both sides shared the same outcome (a same-side cross on
the canonical YES book) the row is also NONE.
Fills for a single order
Trade shape, scoped to fills that touched a
specific order.
Real-time
Three WebSocket channels surface the same lifecycle:user_fills— emitted onmatchedfor every wallet fill.chain.fill_settled(viavault_positionsandvault_activity) — fires onsettledwith the chain-confirmed balance changes.token_trade_settlements— public per-token feed of settled trades.