Pro & Elite feature. Reactor is available on Simmer Pro and Elite plans (Elite includes everything in Pro).
GET /api/sdk/reactor/pending, branch on payload.type, act, and DELETE the signal on success. Skills subscribe to specific signal types — a copytrading skill ignores shock signals and vice versa.
How it works
- Detect — A producer (relay or detector) monitors on-chain or order-flow data in real time
- Resolve — Server-side: market IDs mapped, sizes computed, payload assembled
- Queue — Typed signal written to your pending feed with a 120s expiry window
- Consume — Your skill polls the endpoint, reads
payload.type, and acts accordingly - Acknowledge — DELETE on success clears the signal; unacknowledged signals expire automatically
Signal-type catalog
Reactor currently delivers two signal types. Your skill filters bypayload.type on every poll.
copytrading — Whale trade mirroring
Emitted by Simmer’s copytrading relay when a watched wallet settles a trade on-chain. The signal is pre-resolved: market ID mapped, mirror size computed, ready to trade. The polymarket-copytrading skill consumes this type.
Arm copytrading signals:
Signal payload fields:
Skill: Install
polymarket-copytrading from ClawHub. The skill’s built-in reactor mode handles the full poll → filter → trade → DELETE pipeline.
Polling mode — how the copytrading endpoint works
Thepolymarket-copytrading skill also has a free-tier polling mode that doesn’t use the reactor bus. Understanding its endpoint pattern is useful if you’re building a custom copytrading flow:
copytrading_execute() method on SimmerClient — the server-side planning and the client-side signing are deliberately split. Reading other wallets’ positions, running conflict detection, and computing trade sizes all happen server-side via that endpoint. The client only executes the resulting plan.
polymarket-worldcup-copytrader uses GET /api/sdk/wc/copy-leaders to fetch a daily-curated leader set, then passes those wallets into the same POST /api/sdk/copytrading/execute flow. See World Cup Copytrader.
shock_ladder — Soccer in-play shock fader
Emitted by Simmer’s shock detector when a Polymarket World Cup market’s price drops sharply during a live match. The server detects the shock, classifies it (by favoritism, order-book depth, match minute), and emits a pre-sized signal with rung prices and sizes derived from historical depth percentiles. The polymarket-soccer-shock-ladder skill consumes this type.
Currently scoped to 2026 World Cup markets during live match windows.
Arm shock-ladder signals (opt-in, Pro required):
{"shock_ladder_enabled": true}. The server starts delivering World Cup shock signals to your reactor pending feed within ~5 minutes. Check or disarm anytime:
polymarket-soccer-shock-ladder from ClawHub. Arm first (above), then run the skill.
Risk alerts: a sibling mechanism
Risk alerts are not on the reactor bus. They travel on a separaterisk_alert:* channel with their own consumer endpoint (GET /api/sdk/risk-alerts) and a 3600s TTL. They’re emitted when your server-side risk monitor (stop-loss / take-profit) triggers on an external wallet position — the SDK picks them up on the next get_briefing() call or SimmerClient init and executes the exit.
See Risk Management for the full consumer pattern and configuration.
Consuming signals
Both skills follow the same consumer loop:Monitoring
All reactor activity — signals received, trades executed, skipped signals, and failures — appears in the Reactor tab on your dashboard. You can label whale wallets in the copytrading watchlist for easier identification; labels appear in the Reaction Log.Reactor activity appears in the Reactor tab, not the Observability tab. Observability tracks executed trades across all skills. The Reactor tab tracks the full signal pipeline — including signals your agent correctly skipped.
Safety features
- Circuit breaker — 5 consecutive trade failures triggers a pause. Signals are skipped until the issue is resolved. The circuit auto-resets after 1 hour, or reset manually from the Reactor tab.
- Signal expiry — Unprocessed signals expire after 120s. No stale trades.
- Server-side filtering — Copytrading signals only generate for wallets on your watchlist above
min_size. Shock signals only generate when you’ve opted in. Your skill doesn’t see noise. - Per-config caps —
max_sizeanddaily_cap(copytrading) limit exposure.
Cross-runtime
Reactor works with any agent runtime — OpenClaw, Hermes, Claude Code, or plain Python scripts. The pending endpoint is a standard REST call; your skill trades viaSimmerClient.trade(), which handles both managed and external wallets.
Requirements
- Simmer Pro plan
SIMMER_API_KEYenvironment variablesimmer-sdkPython package, 0.20.0 or newer:
