Search and discover markets on Polymarket, Kalshi, Limitless, Alpaca, and IBKR. Find markets by keyword, category, volume, and more. Returns Market objects ready for hz.run().
Horizon provides built-in market discovery for Polymarket, Kalshi, Limitless, Alpaca, and IBKR. Search by keyword, filter by volume or category, and get back Market objects ready to use with hz.run().
Discovery queries are public API calls - no exchange credentials needed. The returned Market objects include token IDs, condition IDs, and all metadata needed for trading.
query matches market question text and slugs (client-side filtering on /markets endpoint)
category uses server-side tag filtering via the /events endpoint (e.g., "crypto", "politics", "sports"). Returns all markets from matching events. This is the recommended way to browse by topic.
min_volume filters markets below the USD threshold
Returns Market objects with yes_token_id, no_token_id, and condition_id
Kalshi:
query with an uppercase ticker prefix (e.g., "KXBTC") uses server-side series filtering for fast results. Lowercase text queries use client-side matching over paginated results, which may miss markets deep in the listing.
category is the recommended way to search Kalshi. Maps to series tickers (e.g., "KXBTC" for all BTC markets, "KXETH" for ETH, "INX" for S&P 500).
min_volume is not supported (Kalshi API limitation)
Returns Market objects with ticker field
For Kalshi, prefer category over query for reliable results. Kalshi’s API doesn’t support server-side text search, so text queries only scan a limited number of markets.
Alpaca:
Searches the Alpaca assets API (/v2/assets) for US equities
query matches symbol or company name (client-side)
Returns Market objects with exchange="alpaca" and asset_class="equity"
Requires APCA_API_KEY_ID and APCA_API_SECRET_KEY environment variables
IBKR:
Searches via the IBKR symbol search endpoint
query matches symbol or company name
Returns Market objects with exchange="ibkr" and contract ID as the market ID
Requires IBKR Client Portal or TWS running locally
Convenience wrapper to get the highest-volume active markets.
Copy
# Top 10 Polymarket markets by volumemarkets = hz.top_markets(limit=10)# Top Kalshi markets in crypto categorymarkets = hz.top_markets(exchange="kalshi", category="KXBTC", limit=5)
Parameter
Type
Default
Description
exchange
str
"polymarket"
Exchange to query
limit
int
10
Number of markets
category
str
""
Category filter
Equivalent to discover_markets(active=True, sort_by="volume", ...).
import horizon as hzevents = hz.discover_events(query="bitcoin", limit=1)event = events[0]# Register the event and trade all outcomesmarkets = event.to_markets()market_ids = [m.id for m in markets]hz.run( name="event_strategy", markets=markets, feeds={m.id: hz.PolymarketBook(m.id) for m in markets}, pipeline=[fair_value, quoter], risk=hz.Risk(max_position=100),)
import horizon as hz# Find liquid markets on both exchangespoly_markets = hz.top_markets("polymarket", limit=20)kalshi_markets = hz.top_markets("kalshi", limit=20)print("=== Polymarket ===")for m in poly_markets: print(f" {m.name[:60]} ({m.id})")print("\n=== Kalshi ===")for m in kalshi_markets: print(f" {m.name[:60]} ({m.ticker})")
import horizon as hz# Find matching markets on both exchangespoly = hz.discover_markets("polymarket", query="bitcoin", limit=5)kalshi = hz.discover_markets("kalshi", query="KXBTC", limit=5)print("Polymarket:")for m in poly: print(f" {m.id}: {m.name}")print("Kalshi:")for m in kalshi: print(f" {m.ticker}: {m.name}")# Use for cross-exchange arb# hz.run(markets=[poly[0], kalshi[0]], exchanges=[...], ...)
import horizon as hz# Search for stocks on Alpacastocks = hz.discover_markets(exchange="alpaca", query="AAPL", limit=5)for s in stocks: print(f"{s.ticker}: {s.name} (asset_class={s.asset_class})")# Search IBKR for optionscontracts = hz.discover_markets(exchange="ibkr", query="AAPL", limit=10)
Discovery results depend on exchange API availability. If the Polymarket Gamma API or Kalshi API is down, functions return empty lists and log an error. Always check the returned list length before indexing.