2026-07-13 — simmer-sdk 0.22.3: client.get_outcomes() for settlement-accurate skill metrics
Released simmer-sdk 0.22.3 on PyPI. New client.get_outcomes() method returns settlement-accurate skill outcome summaries for autoresearch metric verification and skill-health signals.
The method returns v1 cash-flow fields (trades, pnl, wins, losses) for backward compatibility, plus new v2 settlement-accurate fields sourced from venue-dispatch realized outcomes: settled_pnl (sum of realized P&L across resolved markets), resolved_markets, settled_wins, settled_losses, and confidence_breakdown by data source (settlement, native, mirror). The v2 fields correctly attribute buys held to resolution — a buy-and-hold winner now appears in settled_wins where v1 wins only counted sell rows. Accepts optional skill_slug (defaults to the running skill’s slug) and since (ISO-8601 datetime range filter).
pip install --upgrade simmer-sdk to pick it up.
2026-07-09 — /api/sdk/markets now signals capped discovery windows
GET /api/sdk/markets now makes the discovery cap explicit. The endpoint returns at most 1,000 matching markets for a search window, then applies limit/offset inside that window. When a query hits the ceiling, the raw API response includes truncated: true and capped_at_limit: true; total is the capped window size, not the full Simmer catalog count.
For broad scans, filter before paging: use tags=, q=, venue=, sort=volume|recent, and max_hours_to_resolution= to split the catalog into narrower slices. Each filter is applied before the cap, so tags=world-cup&sort=volume returns the top World Cup markets in that slice. This is a discovery-read limit only; market import flows remain uncapped by this window.
2026-06-29 — simmer-sdk 0.22.0: smart order-type defaults for Polymarket trades
Released simmer-sdk 0.22.0 on PyPI. client.trade() no longer forces order_type="FAK" when you omit it. The omitted type now flows through to Simmer’s backend smart default: GTC for sells, FAK for buys.
If your strategy relied on implicit FAK behavior for every Polymarket order, pass order_type="FAK" explicitly going forward. Otherwise, omitted buy orders keep immediate-fill behavior while omitted sells can rest on the book instead of being killed immediately.
pip install --upgrade simmer-sdk to pick it up.
2026-06-27 — simmer-sdk 0.21.0: fill price, fee field, and exact-share buy guard
Released simmer-sdk 0.21.0 on PyPI. This release adds two new TradeResult fields and tightens the buy-side parameter contract.
TradeResult.fill_price is the effective average fill price per share — equivalent to cost / shares_filled but now surfaced directly. Use it instead of new_price to compute per-share economics without the division. TradeResult.fee_rate_bps exposes the taker fee rate in basis points (currently 0 on Polymarket; previously the field returned None). Both fields are useful for post-trade analysis and for skills that need to verify fill quality on short-window fast markets like crypto Up/Down 5m/15m.
On the buy side, passing shares to client.trade() on a buy now raises ValueError instead of silently ignoring the parameter. Buys are always sized by amount (USDC to spend); shares is valid only on sells. If you want to buy exactly N shares, compute amount = N * price (plus a small buffer for tick rounding) and pass an explicit price limit — see Trading Guide > Sizing a buy for the exact pattern.
2026-06-26 — DOGE and BNB fast markets now auto-indexed
DOGE and BNB Up/Down fast markets, across both 5-minute and 15-minute windows, are now auto-discovered and indexed alongside BTC, ETH, SOL, and XRP. They appear inclient.get_fast_markets(), find_markets(), and check_market_exists() without manual slug construction.
This is a server-side catalogue update; no SDK upgrade is required as long as your client is already calling the existing fast-market and discovery methods.
2026-06-23 — New market_source field on trades
client.get_trades() and GET /api/sdk/trades now include a market_source field on every trade row: "polymarket", "kalshi", or null for native Simmer markets. This is the origin venue of the mirrored market, not the venue where the trade was recorded.
The field matters most for sim-venue entries. A sim trade still has venue="sim", so market_source is the way to tell whether that simulated trade mirrored a Polymarket market, a Kalshi market, or a native Simmer market. Existing clients receive the field automatically in the response payload.
2026-06-18 — simmer-sdk 0.20.3: Deposit-wallet combo trading
Released simmer-sdk 0.20.3 on PyPI. Agents using a deposit wallet (the default funding model for V2 trading) can now place combo (parlay) orders. Previously only plain-EOA / self-custody wallets could place combos; DW users received a confusing error at settlement.
To enable: call client.activate_combo_dw() once before your first combo order. This is a gasless one-time approval that runs through Simmer’s relayer — it adds the combo exchange as an approved spender on your deposit wallet. Per-agent scoping is also supported via client.activate_combo_dw(agent_id="..."). The SDK checks for the approval on every place_combo() call and surfaces a clear "run activate_combo_dw() first" error if the activation step was skipped.
pip install --upgrade simmer-sdk to pick it up.
2026-06-16 — Portfolio now includes Polymarket combo positions
client.get_portfolio() and GET /api/sdk/portfolio now return a combos array containing any open Polymarket combo/parlay positions alongside the existing flat CTF positions. Each combo includes its legs, size, payout fields, status, timestamps, and holder address.
Combo count and exposure are included in the Polymarket venue bucket while legacy flat position counts remain unchanged. Agents using the combo trading flow can now track those positions through the standard portfolio endpoint instead of a separate manual lookup.
2026-06-16 — simmer-sdk 0.20.0: V2 orders now attributed to Simmer’s builder code
Released simmer-sdk 0.20.0 on PyPI. V2 orders placed through the SDK now default to Simmer’s Polymarket builder code for attribution instead of zero bytes. Prior to this release the builder field defaulted to zero unless the operator set POLY_BUILDER_CODE, so external and self-custody operators — roughly half of all SDK volume — were shipping unattributed orders. The managed-wallet (server-side) path was already attributed; this release closes the external cohort.
Attribution precedence is: explicit builder_code argument → POLY_BUILDER_CODE environment variable → Simmer’s default. To attribute to your own builder profile, pass builder_code=... or set POLY_BUILDER_CODE. Pass ZERO_BYTES32 to opt out entirely. The builder code is a public on-chain attribution identifier, not a secret, and Simmer’s builder profile carries 0% maker/taker fees — attribution adds no cost to operators’ trades. Because orders are signed client-side, old installs keep current behavior until upgraded.
pip install --upgrade simmer-sdk to pick it up.
2026-06-16 — simmer-sdk 0.19.2: trade() rounds to venue precision instead of rejecting full-precision floats
Released simmer-sdk 0.19.2 on PyPI. client.trade() previously raised ValueError when amount had more than 2 decimal places or shares more than 5, requiring every skill to add a round(cost, 2) workaround. Planner and Kelly sizing routinely produces values like 16.489550245148255; without this fix, those trades silently dropped on live runs — the World Cup copytrader lost 3 of 10 trades to this bug alone.
trade() now quantizes amount to 2 decimals and shares to 5 before submission, logging at debug level when it rounds. Sub-precision values that quantize to 0 are still rejected — a $0 order is never valid. This is input-precision quantization only; the tick-aware rounding of on-chain maker/taker amounts in signing.py is unchanged and the two layers never double-round.
pip install --upgrade simmer-sdk to pick it up.
2026-06-15 — simmer-sdk 0.19.1: find_markets() now reaches the full active catalogue
Released simmer-sdk 0.19.1 on PyPI. find_markets(query) previously fetched an unfiltered get_markets(limit=100) window and filtered client-side, so any market outside the newest-N server window was invisible — most visibly a large portion of live World Cup markets that agents could see on the dashboard but not discover via find_markets(). It now pushes the query to the server-side q filter, which is applied before the window cap, so older-but-active markets are found. Queries shorter than 2 characters fall back to the previous windowed scan.
Trading was never affected — this is a discovery-only fix, and get_markets(tags=..., q=..., sort="volume") already reached these markets. The companion MCP tool simmer_get_markets (simmer-mcp 3.4.3) also gains a tool-description note clarifying that unfiltered browse is windowed and to pass tags/q/sort to reach a full category.
pip install --upgrade simmer-sdk to pick it up.
2026-06-15 — /api/sdk/markets default ordering is now liquidity-first
The default ordering of get_markets() (and GET /api/sdk/markets) when you don’t pass a sort parameter is now liquidity-first: active markets come back ordered by 24h trading volume (volume_24h DESC, ties broken by recency), the same as sort="volume". A plain get_markets() call now surfaces liquid, tradeable markets instead of the newest imports.
This is the change the 0.17.31 note below (2026-06-12) flagged as coming “after June 19” — it shipped a few days ahead of that. If your strategy depends on newest-first ordering, pin sort="recent" (or the legacy alias sort="created") and your results are unchanged; that pin has been available since 0.17.31. Filtered discovery is unaffected — q= and tags= have always applied before the result window, regardless of sort.
2026-06-14 — simmer-sdk 0.19.0: simmer backtest self-serve tape download
Released simmer-sdk 0.19.0 on PyPI. simmer backtest no longer requires a local tape. Omit --tape and pass --window 30d (or --t0/--t1) and the engine fetches the appropriate slice from Simmer’s backend tape service (POST /api/backtest/tape), slices the canonical Polymarket dataset server-side, and caches it under ~/.simmer/tapes/. The public Hugging Face dump’s CDN serves at ~0.44 MB/s — too slow for practical client-side slicing; the backend stages the dataset into fast object storage and slices intra-datacenter.
--max-markets and --min-volume clamp the server-side slice (server caps at 1000 markets); --base-url defaults to SIMMER_API_URL or production. The programmatic API run_backtest(...) now accepts tape=None to trigger a fetch, plus max_markets, min_volume, and base_url kwargs. --tape <local> stays as a BYO escape hatch. Data coverage currently ends around 2026-05-05.
pip install --upgrade simmer-sdk to pick it up.
2026-06-13 — simmer-sdk 0.18.0: simmer backtest — local historical backtesting, plus Hyperliquid signing (preview)
Released simmer-sdk 0.18.0 on PyPI. The new simmer backtest console command replays an unmodified skill bundle against historical prediction-market data before you risk capital — the missing historical leg alongside the existing live-forward modes (sim-venue, dry-run, paper-trade). Install the extra and run it:
config_hash. There’s a programmatic mirror at simmer_sdk.backtest.run_backtest(...). Self-serve tape download (--window) lands in a follow-up; for now pass --tape <local-slice> or --demo.
This release also adds an opt-in Hyperliquid venue adapter (pip install 'simmer-sdk[hyperliquid]', reached via client.hyperliquid) for HIP-4 outcome-market signing. It is preview-only: signing is validated offline, but end-to-end funded trading is still pending and default trading behavior is unchanged.
pip install --upgrade simmer-sdk to pick it up.
2026-06-12 — simmer-sdk 0.17.32: Binance-trio skills read signals from Simmer’s data plane
Released simmer-sdk 0.17.32 on PyPI. The three Binance-momentum skills — polymarket-fast-loop, polymarket-fast-scaler, and polymarket-btc-up-down-trader — now read their BTC momentum signal from Simmer’s data plane via client.get_candles() instead of calling api.binance.com directly. They use closed candles only, and under the backtest replay harness the same call is clamped to the frozen tick — so these skills are now backtestable with simmer backtest (0.18.0) rather than silently fetching live, future-relative data during a replay.
pip install --upgrade simmer-sdk to pick it up.
2026-06-12 — simmer-sdk 0.17.31: venue/sort/tags discovery filters, and an upcoming default-ordering change
Released simmer-sdk 0.17.31 on PyPI. client.get_markets() gains three keyword-only arguments for market discovery. sort="volume" ranks results by 24h trading volume, so liquid, tradeable markets come first; this is now the recommended way to browse for trading candidates. tags="world-cup" filters by market tags (comma-separated, all tags must match). venue="sim", venue="polymarket", or venue="kalshi" filters by trading venue. Positional call sites from earlier versions are unaffected.
The venue filter also fixes a server-side bug: GET /api/sdk/markets?venue=sim previously mapped to an internal source filter that matched almost nothing, so it silently returned a near-empty list. venue=sim now correctly returns all active markets, since every market is paper-tradeable on the sim venue. The same fix applies to /api/sdk/fast-markets. Unrecognized venue or sort values now return a warning field in the response instead of failing silently.
One behavior to know about: unfiltered get_markets() browse returns a server-capped slice of the catalog (the newest ~1,000 of all active markets), not the full set. To reach a specific older market, filter with q= or tags=. Planned change: in a release after June 19, the default ordering of unfiltered browse will flip from newest-first to liquidity-first (equivalent to sort="volume"), so a plain get_markets() call surfaces tradeable markets instead of the newest imports. If your strategy depends on newest-first ordering, pin sort="recent" now and nothing will change for you. Update (2026-06-15): this shipped a few days early — the liquidity-first default is now live (see the 2026-06-15 entry above). The sort="recent" pin still preserves newest-first.
pip install --upgrade simmer-sdk to pick it up.
2026-06-12 — Two new Polymarket skills on ClawHub: World Cup Copytrader and Fast Scaler
Alongside the 0.17.31 SDK release, two new trading skills published to ClawHub.polymarket-worldcup-copytrader copies the auto-curated top World Cup traders on Polymarket. Unlike the base polymarket-copytrading skill, which needs a manually maintained wallet list, this one fetches its leader set automatically from Simmer’s daily World Cup curation — the top copyable WC sharps, screened by slippage-adjusted copy-PnL. It aggregates positions across all leaders size-weighted, detects conflicting signals, and filters stale or drifting wallets. It defaults to dry-run and sim-first (--venue sim); point it at real USDC only once you’ve watched it on the synthetic venue. Because copytrading executes without per-trade approval, treat it as novel-risk automation. Install with clawhub install polymarket-worldcup-copytrader.
polymarket-fast-scaler (v1.0.0) is a magnitude-gated BTC 5-minute fast-market strategy. It fires only when short-term BTC momentum clears its magnitude gate — the regime its backtest found EV-positive — and scales position size across three conviction tiers. It was live-tested for 48 hours on a real Polymarket wallet, honoring its budget cap. Install with clawhub install polymarket-fast-scaler.
pip install --upgrade simmer-sdk for the SDK; browse published skills with clawhub search polymarket.
2026-06-10 — simmer-sdk 0.17.29: security hardening for signing flows
Released simmer-sdk 0.17.29 on PyPI. This release adds client-side validation for server-supplied EIP-712 signing batches before local wallets sign activation, redemption, or wrap transactions. The SDK now refuses unexpected batch payloads instead of asking external wallets, OWS, or per-agent wallets to sign them.
The validation checks that each prepared batch targets pinned Polymarket contracts, uses an allowed selector, and names a pinned spender. The SDK also rejects non-HTTPS base_url values except for loopback development URLs, and adds upper version bounds on signing-critical dependencies so fresh installs do not silently pick up incompatible signing libraries.
Upgrade is recommended for anyone signing locally, including external-wallet, OWS, and per-agent wallet flows:
2026-06-08 — simmer-sdk 0.17.28: get_markets(q=...) keyword search
Released simmer-sdk 0.17.28 on PyPI. client.get_markets() now accepts a q keyword-search argument that filters active markets by question (min 2 chars, case-insensitive). The backend /api/sdk/markets endpoint already supported q; this release brings the SDK signature in line with the documented get_markets(q="bitcoin", limit=5) example in the Quickstart and Trading Guide. Existing callers without q continue to receive all active markets.
pip install --upgrade simmer-sdk to pick it up.
2026-06-06 — simmer-sdk 0.17.27: truthful venue logging and per-agent raw-key setup
Released simmer-sdk 0.17.27 on PyPI. The SDK no longer reads or mentions TRADING_VENUE during client initialization as if that environment variable selected where trades go. The active venue is set by SimmerClient(..., venue=...) or SimmerClient.from_env(venue=...), still defaults to sim, and live Polymarket trading still requires explicitly passing venue="polymarket". The startup log now calls out PAPER mode for sim and LIVE mode for real-funds venues.
This release also adds raw-private-key support for per-agent Polymarket CLOB credential caching. Browser-backed per-agent wallets can now run client.update_agent_wallet_creds(agent_id="...") with WALLET_PRIVATE_KEY set; the SDK derives CLOB API credentials locally with py-clob-client and uploads the encrypted credential payload through the existing agent-wallet endpoint. OWS callers keep using client.update_agent_wallet_creds(ows_wallet_name="...").
pip install --upgrade simmer-sdk to pick up both fixes.
2026-06-02 — Trade-path reliability sweep
Several Polymarket trade and redemption paths have been tightened after live-user failures. The SDK settings endpoint now reports the correct V2 deposit-wallet balance for pUSD users instead of showingpolymarket_usdc_balance = 0, and a stale sdk_user_settings_safe view was resynced so trade-path queries no longer fail with column s.portfolio_cap_pct does not exist.
Redemption handling is also stricter around edge cases users could see in the dashboard or SDK. External deposit-wallet redemption prepare calls now check on-chain payout readiness before returning signable typed data, so markets in the neg_risk_not_determined window surface as not-yet-redeemable instead of failing later at the relayer. Portfolio redeemable_count now excludes losing neg-risk legs that would redeem for $0, and managed-wallet sweep logic now double-checks zero balances before writing a skip marker.
No SDK upgrade is required for the server-side fixes. If your agent cached settings or portfolio responses during the affected window, refresh them before making a sizing or redemption decision.
2026-06-01 — Per-agent and Elite auth hardening
Per-agent API keys now scope/agents/me, /trades, /positions, /portfolio, and /positions/expiring to the agent’s own wallet and account context. This fixes cases where per-agent calls could reflect parent-user data instead of the agent-specific view, which was confusing for multi-strategy Elite setups and unsafe for clean per-agent accounting.
Tier gates now consistently treat Elite as including Pro access, auth caches are invalidated when agent-wallet rows change, and wallet status checks no longer trust stale allowance flags. Per-agent wallets also track spender-version state, so Simmer only re-checks on-chain approvals when the spender set changes instead of repeatedly doing the same RPC work.
If you run Elite agents with separate wallets, no migration step is needed. Re-authenticate or restart long-running agents if they were started before this hardening pass and still hold old cached auth state.
2026-05-31 — Dashboard onboarding and creator surfaces
The dashboard now has a clearer path for users who already have an agent runtime, such as Hermes, OpenClaw, or a custom host. The start flow separates “create a new agent” from “connect an existing runtime”, and wallet activation now checks actual trading readiness: deposit wallet deployed, CLOB allowances set, and usable balance funded. Creator and discovery surfaces also got more practical. Utility-skill trend charts now show cumulative installs instead of an empty trading-volume line, the Skills page has Official/Community plus category filters matching the Markets layout, the start page install banner has Any Agent / ClawHub / MCP tabs, and Markets can show per-category featured-skill banners. These changes are dashboard-only. If you are connecting an existing runtime, start from the connect-existing path and complete the wallet readiness checklist before expecting live Polymarket orders to pass preflight.2026-05-30 — simmer-sdk 0.17.25: news-recency guard and DCA scaffold
Released simmer-sdk 0.17.25 on PyPI. The new simmer_sdk.guards.news_recency_veto module gives fast Polymarket strategies a defensive check for short-dated markets immediately after known macro-news events such as CPI, FOMC, nonfarm payrolls, and earnings. The guard is wired into polymarket-fast-loop and polymarket-mert-sniper by default; set enable_news_veto=false only if your strategy intentionally handles that window.
This release also adds a polymarket-dca-eval-trader scaffold in the SDK repo’s skills/ directory. It is a paper-safe staged-entry template with three tranches, per-market and daily exposure caps, and an eval-envelope simulator for drawdown-shaped constraints. It is marked as a scaffold and is not yet published to ClawHub or included in the pip wheel.
Upgrade with pip install --upgrade simmer-sdk. Existing fast-loop and mert-sniper users should leave the news veto enabled unless they have their own event-timing controls.
2026-05-30 — Polymarket positions now use PolyNode on-chain data
Simmer moved Polymarket position source-of-truth from the Polymarket CLOB data API to PolyNode’s on-chain indexer. Positions now have better coverage around pre-resolution and post-redemption states, including awaiting-resolution UI pills, per-agent deposit-wallet routing, and cost-basis handling for redeemed wins. This reduces dependence on a single vendor feed for position visibility. Users should see fewer missing or stale Polymarket positions in Portfolio, and per-agent wallets get a cleaner position book that matches the wallet actually trading. No API shape migration is required for ordinaryclient.get_positions() callers. Treat the improved position records as the same endpoint with a stronger data source underneath.
2026-05-29 — simmer-sdk 0.17.24: bulk top-of-book quotes
Released simmer-sdk 0.17.24 on PyPI. client.get_markets() and client.get_positions() now expose best_bid, best_ask, best_bid_size, best_ask_size, spread, and quote_ts, so agents can scan candidates and monitor held positions without calling executable-price once per market.
The quote fields are sourced from Simmer’s existing order-book cache, with quote_ts indicating the snapshot time (typically up to about 30 seconds old). Position quotes use held-side semantics: pure NO-side holders receive the NO token’s best_bid as their exit price, while YES-only and dual-held positions use the YES side. Use executable-price when you need depth-aware fill estimates for a specific order size.
2026-05-28 — Per-agent wallets (Elite)
Elite users can now run each Simmer agent from its own dedicated on-chain wallet. Every agent gets its own balance, position book, and risk envelope — strategies no longer share an account. Free and Pro tiers continue to use a single user-primary wallet across all agents. The “one wallet per strategy” pattern is how profitable Polymarket market-makers already work. It gives you three things at once: performance attribution (per-strategy PnL is measurable on its own, not muddied by the other agents trading from the same address), risk isolation (when one strategy bleeds, the damage stays inside that agent’s wallet), and copytrade-legible history (a clean one-strategy-per-wallet on-chain footprint that’s independently readable, the green-flag pattern copytraders look for). The per-agent EOA is custodied on your agent host viaopenwallet.sh — Simmer never holds the key. Activation runs from the SDK on the agent’s machine: client.update_agent_wallet_creds(ows_wallet_name=...). The dashboard wizard at Agents → Wallet → Fund and activate trading walks you through funding the deposit wallet and setting CLOB allowances. See the per-agent wallets guide for the full setup.
2026-05-24 — Hyperliquid HIP-4 catalog (read-only Stage 1)
Simmer now ingests Hyperliquid HIP-4 prediction markets into the market catalog. This is the first venue expansion beyond Polymarket and Kalshi: agents can discover Hyperliquid markets through the same market listing surfaces, and the dashboard shows Hyperliquid venue chips so those markets are easy to distinguish. This stage is read-only. Hyperliquid markets may appear inclient.get_markets() responses with Hyperliquid-specific identifiers such as hyperliquid_outcome_id and hyperliquid_question_id, but trade execution is not wired yet. Trading paths will land in a later stage; for now, treat Hyperliquid records as catalog and research data, not executable venues.
2026-05-24 — simmer-mcp listed on the official MCP Registry
simmer-mcp is now discoverable on the official MCP Registry as io.github.adlai88/simmer-mcp. MCP clients that pull from the registry (Claude Desktop, Claude Code, Cursor, and others) can find and install it directly. The install config hasn’t changed — npx -y simmer-mcp with an optional SIMMER_API_KEY for Pro tools.
2026-05-19 — Aligned auto risk monitor defaults to documented behavior
Thesdk_user_settings table shipped in April with default_stop_loss_pct = 0.20 and default_take_profit_pct = 0.50 — values that pre-dated a March policy update and were never reconciled. For approximately six weeks, the auto risk monitor (auto_risk_monitor_enabled = true) was attaching stop-loss at -20% and take-profit at +50% to new positions, while the Settings reference said SL=50% and TP=off (prediction markets resolve naturally).
The DB column defaults and SDK code constants now match the documented values: stop-loss 50%, take-profit off, max position $100. Existing monitors are not touched — open positions keep their original thresholds until they close. Customized settings are preserved — if you previously set your own values via PATCH /api/sdk/user/settings, they stand.
If you’d been relying on the implicit -20% stop-loss as a tighter exit, set it explicitly: client.update_settings(default_stop_loss_pct=0.20, default_take_profit_pct=0.50). See the Settings reference for the full schema.
2026-05-01 — simmer-sdk 0.13.0: ergonomic constructors
Released simmer-sdk 0.13.0 on PyPI. Adds two classmethods so callers never have to read os.environ directly: SimmerClient.from_env() reads SIMMER_API_KEY from the environment and auto-detects WALLET_PRIVATE_KEY and OWS_WALLET if set. SimmerClient.with_ows_wallet(name) is the same idea with the OWS wallet name passed explicitly.
SimmerClient(api_key=..., ...) constructor — these are sugar. They exist so skill bundles and bots can keep import os out of their entrypoints, which helps the ClawHub scanner verdict on community-installed skills.
pip install --upgrade simmer-sdk to pick them up. See the SDK Initialization section for the full pattern.
2026-04-26 — Heads-up: Polymarket V2 migration on April 28
Polymarket is upgrading its CLOB exchange on April 28, 2026 at ~11:00 UTC. The new V2 exchange uses pUSD (a 1:1-backed wrapper around USDC.e) as the collateral token. Every pUSD is redeemable for one USDC.e, on-chain, with no deadline. For most Simmer users this is a one-click migration: log in, click Migrate to V2 on the dashboard banner, done. Your USDC.e balance becomes the same dollar amount in pUSD, and Polymarket trading continues normally. Kalshi, sim, and your already-resolved positions are unaffected. After cutover, V1 orders are rejected withorder_version_mismatch. There is no deadline to migrate — your USDC.e remains safe and convertible at any time. You only need to migrate before your next Polymarket trade.
Full detail, including the external-wallet path and FAQ, lives in the V2 Migration guide.
2026-04-25 — simmer-sdk 0.12.1: OWS unregistered users fix
Released simmer-sdk 0.12.1 on PyPI. Patch release.
The SDK was injecting wallet_address into every trade payload when OWS_WALLET was set. The server then routed the trade through the per-agent-wallet validation path, which requires a row in user_agent_wallets. OWS-configured users who hadn’t gone through dashboard agent registration saw Agent wallet not found or not owned by you on every trade. The SDK now only sends wallet_address when the wallet is actually registered for per-agent isolation; the user-level linked-wallet path handles everyone else.
pip install --upgrade simmer-sdk to pick up the fix.