Skip to main content
The mempool feed is Bravado’s low-latency fills stream. Settlements are decoded directly from the Polygon public mempool, so a fill reaches you ~1–2s before the venue’s own real-time feed reports it (measured against Polymarket RTDS: earlier on ~100% of trades, ~1.5–2s median). Every fill carries the full on-chain lifecycle — pending → mined → settled, and the negative states (reverted / dropped / replaced) — plus the owner wallet (EOA) behind the trading proxy.
This is a partner tier. Connect to wss://stream.bravadotrade.com/ws with a Bravado feed token (provisioned during onboarding). The public Live Trades feed mirrors the venue’s push feed and needs no credentials; this feed adds the mempool lead, the settlement-truth lifecycle, and inline identity. Coverage today is Polymarket.
This feed is served directly from the feed edge (stream.bravadotrade.com), not proxied through partner-api.bravadotrade.com like the other APIs. That is deliberate: an extra proxy hop would add relay latency and erode the mempool lead that is the whole point of this feed. Connect to the edge host directly.

Connect

Pass an initial stream set and (optionally) a mode and replay count on the query string, and present your token as a Bearer header or a ?token= parameter.
All amounts are integer base units as decimal strings — 6-decimal micro-USDC and 6-decimal share units; token_id is an exact decimal string and price_micro is usdc * 1e6 / shares. Never parse these as floats.

Streams

Subscribe to the firehose or narrow to a token, market, or wallet. One connection may hold 120 streams.
A wallet matches a fill if it is any leg’s maker or signer, any leg’s on-chain taker, or the transaction sender — the operator rotates senders, so identity is never keyed on the sender alone. Related resolution and collateral streams (resolutions:polymarket:*, collateral:polymarket:*) and the UMA resolution lifecycle (uma:polymarket:*) are available over the same socket.

The fill lifecycle

A fill is not one event — it is a sequence of status transitions for the same transaction. This is the “did it actually settle?” signal no post-block feed can give you. A matched signal upgrades to pending when the settle tx hits the mempool, or expires as a ghost fill if it never settles. Track a transaction by tx_hash, and dedupe by (tx_hash, status) — the same tx legitimately arrives once per transition.

The fill frame

string
The lifecycle transition (see the table above).
boolean
false for provisional (matched/pending) amounts from calldata; true once log-derived (mined).
boolean
Whether we observed the settle tx in the mempool before the block.
string
Which upstream produced this frame: polymarket-clob (a matched signal) or mempool.
string
The Polygon transaction hash — the key you track a fill by.
integer
Per-stream sequence, increasing within a connection; resets when a stream is re-established (a fresh status frame marks the reset).
integer
First mempool observation (unix ms).
integer
When we emitted the frame (unix ms). Subtract from ts_seen to measure your own delivery latency.
array
integer
On mined/reverted: how far ahead of the block we saw the tx in the mempool.
integer
On mined/finalized/reverted: the Polygon block.
boolean
true if re-sent from the recent buffer because you connected with replay=N. Backfill of what you missed; may interleave with the first live frames — dedupe by (tx_hash, status).
Modes. compact (default) omits from/nonce/gas/source and the per-leg signer/fee/order_hash/log_index; request mode=full for those. owner is present in both modes when known.

Subscribe, unsubscribe, and replay in band

Beyond the query string, manage subscriptions over the socket. replay=N (0–500) backfills up to N recent fills per stream before live frames — so a reconnecting client recovers what it missed.

Stream health and errors

A status frame is sent on subscribe and whenever a stream’s health changes:
state is live or degraded; on degraded, reason is one of upstream_disconnected, heads_stale, pending_silent, reorg_depth_exceeded. error frames carry a code: TOO_MANY_STREAMS, BAD_STREAM, UNAUTHORIZED, SLOW_CONSUMER, BAD_MESSAGE. A client whose send queue backs up is disconnected (SLOW_CONSUMER, close 1013) rather than buffered — one slow consumer never delays another.
  • Live Trades — the public, venue-mirrored trade feed
  • UMA Resolution — the uma:polymarket:* lifecycle over REST + WebSocket
  • Order Books — live books for outcome tokens
  • Trader Data — cross-reference the owner wallet’s PnL, positions, and history