Skip to main content
The simmer-sdk package wraps the REST API with an authenticated client and typed data classes. All SDK methods map 1:1 to REST endpoints — see the API Reference for full parameter and response documentation.

Installation

Run pip install -U simmer-sdk to get the latest version. These examples were verified against simmer-sdk 0.21.0. Versions before 0.21.0 are missing TradeResult.fill_price and TradeResult.fee_rate_bps, and silently ignore a shares argument on buy orders instead of raising ValueError.

Initialization

SimmerClient.from_env() reads SIMMER_API_KEY from the environment and auto-detects WALLET_PRIVATE_KEY (external EVM wallet) and OWS_WALLET (OWS-managed wallet) when set. It raises RuntimeError with a dashboard pointer if SIMMER_API_KEY is missing. SimmerClient.with_ows_wallet(name) is the same idea but takes the OWS wallet name explicitly — useful when the same agent process talks to multiple wallets. These classmethods are sugar over the regular SimmerClient(api_key=..., ...) constructor. They exist so skill bundles and bots never have to read os.environ directly — keeping import os out of skill code helps the ClawHub scanner.

Quick example

See the Trading Guide for the full workflow.

Market discovery filters

get_markets() supports keyword-only filters for discovery (SDK 0.17.31+):
get_markets() and GET /api/sdk/markets are discovery reads, not full-catalog dumps. The server returns at most 1,000 matching markets for the requested window, then applies limit/offset within that capped window. In the raw API response, total is the window size rather than the full catalog count; when the ceiling is hit, the response includes truncated: true and capped_at_limit: true. Always filter before paging. SDK filters q=, tags=, venue=, and sort= are applied server-side before the cap, so tags="world-cup", sort="volume" gives you the most liquid World Cup markets inside that slice. The REST endpoint also accepts max_hours_to_resolution= for time-window slices. To enumerate beyond 1,000, split the catalog by category, venue, keyword, or time-to-resolution windows and page each slice. Imports are uncapped: if a market is live on Polymarket or Kalshi but absent from discovery, use check_market_exists() / import flows rather than treating the capped browse result as authoritative. The default ordering is liquidity-first as of 2026-06-15; pass sort="recent" for newest-first.

Data classes

Market

polymarket_condition_id is None for Kalshi markets, some new imports, and edge cases. For cross-referencing Polymarket markets, polymarket_token_id and polymarket_no_token_id are the more reliable keys — they’re populated for any market with an active CLOB.

TradeResult

Position

Environment variables

Error handling

All error responses include a fix field with actionable resolution steps. See Errors for the full reference.