Skip to main content
Pro & Elite feature. Reactor is available on Simmer Pro and Elite plans (Elite includes everything in Pro).
Reactor is Simmer’s signal bus. Producers (Simmer’s server-side relay and detector services) detect on-chain events and write typed signals. Consumer skills poll 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

  1. Detect — A producer (relay or detector) monitors on-chain or order-flow data in real time
  2. Resolve — Server-side: market IDs mapped, sizes computed, payload assembled
  3. Queue — Typed signal written to your pending feed with a 120s expiry window
  4. Consume — Your skill polls the endpoint, reads payload.type, and acts accordingly
  5. Acknowledge — DELETE on success clears the signal; unacknowledged signals expire automatically
Signals expire 120 seconds after they’re generated. Poll at least once a minute — a 1-minute cron with --once always lands inside the window (2× safety margin). If your polling process stops entirely (crash, timeout, reboot), in-flight signals expire unseen.

Signal-type catalog

Reactor currently delivers two signal types. Your skill filters by payload.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:
Config fields: Signal payload fields: Skill: Install polymarket-copytrading from ClawHub. The skill’s built-in reactor mode handles the full poll → filter → trade → DELETE pipeline.
Buys only (MVP). Reactor currently mirrors whale buys only. Sell signals are filtered server-side. Sell mirroring is planned for a future release.

Polling mode — how the copytrading endpoint works

The polymarket-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:
There is no 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.
World Cup variant: 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):
Returns {"shock_ladder_enabled": true}. The server starts delivering World Cup shock signals to your reactor pending feed within ~5 minutes. Check or disarm anytime:
Skill: Install 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 separate risk_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:
Skills installed from ClawHub include this loop; you don’t need to write it yourself.

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 capsmax_size and daily_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 via SimmerClient.trade(), which handles both managed and external wallets.

Requirements

  • Simmer Pro plan
  • SIMMER_API_KEY environment variable
  • simmer-sdk Python package, 0.20.0 or newer:
Have a skill idea that needs real-time on-chain data? Tell us in Telegram or Discord.