Overview
Engine B detects a Big Hand — the moment a tracked wallet's cumulative buying in one market first crosses a multiple of that wallet's own average per-market bet.
The threshold is relative, not absolute. A $5,000 buy is only a Big Hand if it is large for that wallet. This adapts to each wallet's typical position size instead of using a fixed dollar floor, so the same signal works for both small and large wallets.
Engine B emits BIG_HAND signals. They are delivered over the WebSocket stream as they fire and are retrievable through the REST signal endpoints.
How It Works
Tracking unit
Signals are tracked per wallet + market. Both sides of a market count toward the same total — a wallet's YES and NO buys in one market are summed together, since both express conviction that the market will move.
Average bet (baseline)
The baseline is the wallet's average buy across all of its other markets:
average_bet = sum(cumulative buys in every OTHER market)
─────────────────────────────────────────────
count of those OTHER marketsThe market currently being evaluated is excluded from both the numerator and the denominator. This prevents a growing position from inflating its own baseline.
A wallet with no prior market history has no baseline, so it cannot produce a Big Hand on its very first market.
Signal condition
A BIG_HAND fires when:
new_cumulative_buy ≥ average_bet × multipleThe default multiple is 4×. The signal fires only the first time a (wallet, market) pair crosses this threshold. Additional buys into the same market afterward do not re-fire.
Processing order
On each new buy from a tracked wallet:
- Compute the average bet from the wallet's other markets.
- Add the buy to this market's running cumulative total.
- If the new cumulative crosses
average × multipleand this pair has not fired before, emit the signal. - Record the last fill price.
Retrieving Big Hand Signals
BIG_HAND signals flow through the same delivery surfaces as Engine A:
| Surface | How to receive Big Hand |
|---|---|
wss://.../v1/ws/signals | Live — filter messages on signal_type === "BIG_HAND" |
GET /v1/signals/latest | Pass ?type=BIG_HAND (defaults to Smart Money otherwise) |
GET /v1/signals/market/{id} | Pass ?type=BIG_HAND |
GET /v1/signals/{signal_id} | Returns an eligible stored Big Hand by ID |
The /signals/latest and /signals/market endpoints default to SMART_MONEY_FLOW when no type is supplied, so you must request BIG_HAND explicitly.
REST endpoints only include Big Hand records that have enough wallet history to present a reliable average-bet context.
Live Payload (WebSocket)
When a Big Hand fires, the live broadcast carries the engine's native shape:
{
"signal_id": "9b4d3f7a-1c2e-4e8a-b1f2-c3d4e5f6a7b8",
"signal_type": "BIG_HAND",
"timestamp": "2026-04-01T09:03:11Z",
"signal_expiry": "2026-04-01T15:03:11Z",
"market": {
"platform": "polymarket",
"market_id": "0x...",
"question": "Will ETH reach $5000 before June?",
"category": "CRYPTO",
"volume_24h": 215000,
"market_closes_at": "2026-06-01T00:00:00Z"
},
"signal": {
"direction": "YES",
"wallet_address": "0xabc...",
"cumulative_buy_usd": 18000,
"average_bet_usd": 4200.0,
"multiple": 4,
"last_fill_price": 0.47
},
"analysis": {
"average_bet_usd": 4200.0,
"threshold_multiple": 4
},
"context": {
"narrative": "",
"x_pulse_score": 0.0
}
}signal
| Field | Type | Description |
|---|---|---|
direction | String | Side of the triggering buy: YES or NO |
wallet_address | String | The tracked wallet that placed the Big Hand |
cumulative_buy_usd | Int | Wallet's total buying in this market at the moment of firing |
average_bet_usd | Float | Wallet's average per-market bet across its other markets (the baseline) |
multiple | Int | Threshold multiple applied to the baseline (default 4) |
last_fill_price | Float | Market probability at the wallet's most recent fill |
analysis
| Field | Type | Description |
|---|---|---|
average_bet_usd | Float | The baseline the threshold was measured against |
threshold_multiple | Int | The multiple in effect when the signal fired |
REST Payload
For consistency across the API, the REST endpoints serialize BIG_HAND using the shared signal shape (the same envelope as SMART_MONEY_FLOW). The Big Hand values map onto it as follows:
{
"signal_id": "...",
"signal_type": "BIG_HAND",
"timestamp": "2026-04-01T09:03:11Z",
"signal_expiry": "2026-04-01T15:03:11Z",
"market": { ... },
"signal": {
"direction": "YES",
"total_flow_usd": 18000,
"price_before": 0.47,
"price_after": 0.47,
"average_entry_price": 0.47
},
"analysis": {
"consensus_wallet_count": 1,
"wallet_historical_win_rate": 0.0,
"decay_applied": false
}
}| Shared field | Big Hand meaning |
|---|---|
signal.total_flow_usd | The wallet's cumulative_buy_usd in the market |
signal.direction | Side of the triggering buy (YES / NO) |
signal.price_before | Last fill price (Big Hand carries a single price, not a window) |
signal.price_after | Last fill price (same value) |
analysis.consensus_wallet_count | Always 1 — a Big Hand is a single-wallet event |
Premium fields follow the same tier rules as Engine A: anonymous-tier responses mask total_flow_usd, average_entry_price, and other premium fields. Use GET /v1/signals/{signal_id}/entities with an API key to retrieve the wallet behind a Big Hand, including its score, win rate, and average bet size.
Engine A vs Engine B
| Engine A — Smart Money | Engine B — Big Hand | |
|---|---|---|
| Signal type | SMART_MONEY_FLOW | BIG_HAND |
| Trigger | Multiple wallets converge on one side | One wallet bets outsized for itself |
| Wallet count | MIN_WALLET_COUNT (consensus) | Always 1 |
| Threshold | Cluster size + flow | Per-wallet average × multiple |
| Fires | Once per active cluster | Once per (wallet, market) |
See Engine A for shared market and envelope field descriptions.