Kalshi Event Contract Tracker
by @rsquaredsolutions2026
Track Kalshi event contract prices, order book depth, and recent trades. Covers sports, politics, economics, and weather markets. Converts contract prices to...
clawhub install kalshi-trackerπ About This Skill
name: kalshi-tracker description: "Track Kalshi event contract prices, order book depth, and recent trades. Covers sports, politics, economics, and weather markets. Converts contract prices to American odds for cross-platform comparison. Read-only β no trade execution." metadata: openclaw: emoji: "π" requires: bins: ["curl", "jq"] credentials: - id: "kalshi-api-key" name: "Kalshi API Key" description: "API key from your Kalshi account at https://kalshi.com/" env: "KALSHI_API_KEY"
Kalshi Event Contract Tracker
Monitor Kalshi prediction market contracts β prices, order books, and trade history.
When to Use
Use this skill when the user asks about:
Event Categories
Common Kalshi event categories:
| Category | Series Prefix | Examples | |----------|--------------|----------| | Sports | SPORTS- | NBA winners, NFL spreads, World Cup | | Politics | POL- | Elections, policy decisions | | Economics | ECON-, FED- | GDP, inflation, Fed rate decisions | | Weather | WEATHER- | Temperature records, hurricane landfalls | | Finance | FINANCE- | Stock prices, crypto prices | | Entertainment | ENT- | Award show winners, box office |
Operations
1. List Active Events
Browse events with optional category filtering:
curl -s "https://api.elections.kalshi.com/trade-api/v2/events?status=open&limit=50" \
-H "Authorization: Bearer $KALSHI_API_KEY" \
| jq '[.events[] | {
ticker: .event_ticker,
title: .title,
category: .category,
markets_count: (.markets | length),
volume: .volume
}] | sort_by(-.volume) | .[:20]'
To filter by category (e.g., sports):
curl -s "https://api.elections.kalshi.com/trade-api/v2/events?status=open&limit=50&series_ticker=SPORTS" \
-H "Authorization: Bearer $KALSHI_API_KEY" \
| jq '[.events[] | {
ticker: .event_ticker,
title: .title,
markets_count: (.markets | length),
volume: .volume,
close_time: .close_time
}] | sort_by(-.volume)'
2. Get Contract Prices
Fetch current Yes/No prices, volume, and status for a specific event's markets. Replace EVENT_TICKER with the event ticker from operation 1:
curl -s "https://api.elections.kalshi.com/trade-api/v2/events/EVENT_TICKER" \
-H "Authorization: Bearer $KALSHI_API_KEY" \
| jq '{
event: .event.title,
category: .event.category,
markets: [.event.markets[] | {
ticker: .ticker,
subtitle: .subtitle,
yes_price: (.yes_bid // "no bid"),
no_price: (.no_bid // "no bid"),
yes_ask: (.yes_ask // "no ask"),
no_ask: (.no_ask // "no ask"),
last_price: .last_price,
volume: .volume,
open_interest: .open_interest,
status: .status,
close_time: .close_time
}]
}'
3. Convert Contract Prices to American Odds
After fetching prices, convert to American odds for sportsbook comparison:
curl -s "https://api.elections.kalshi.com/trade-api/v2/events/EVENT_TICKER" \
-H "Authorization: Bearer $KALSHI_API_KEY" \
| jq -r '.event.markets[] | "\(.subtitle)\t\(.last_price)"' \
| python3 -c "
import sys
for line in sys.stdin:
parts = line.strip().split('\t')
if len(parts) != 2:
continue
name, price_str = parts
try:
price = float(price_str) / 100
except (ValueError, TypeError):
print(f'{name}: no price available')
continue
if price <= 0 or price >= 1:
print(f'{name}: {price_str}c (off the board)')
elif price > 0.5:
odds = -(price / (1 - price)) * 100
print(f'{name}: {price_str}c β {int(odds):+d} (implied {price:.1%})')
elif price < 0.5:
odds = ((1 - price) / price) * 100
print(f'{name}: {price_str}c β +{int(odds)} (implied {price:.1%})')
else:
print(f'{name}: {price_str}c β +100/-100 (implied 50.0%)')
"
4. Check Order Book Depth
View resting orders to assess liquidity for a specific market. Replace MARKET_TICKER with the market ticker from operation 2:
curl -s "https://api.elections.kalshi.com/trade-api/v2/markets/MARKET_TICKER/orderbook" \
-H "Authorization: Bearer $KALSHI_API_KEY" \
| jq '{
ticker: .ticker,
yes_orders: [.orderbook.yes[]? | "price: \(.[0])c qty: \(.[1])"],
no_orders: [.orderbook.no[]? | "price: \(.[0])c qty: \(.[1])"],
spread: ((.orderbook.yes[0]?[0] // 0) + (.orderbook.no[0]?[0] // 0) - 100),
depth_yes_top3: ([.orderbook.yes[:3]?[]?[1]] | add // 0),
depth_no_top3: ([.orderbook.no[:3]?[]?[1]] | add // 0)
}'
5. Fetch Recent Trades
See the last trades executed on a market for momentum and volume analysis:
curl -s "https://api.elections.kalshi.com/trade-api/v2/markets/MARKET_TICKER/trades?limit=20" \
-H "Authorization: Bearer $KALSHI_API_KEY" \
| jq '[.trades[] | {
time: .created_time,
price: .yes_price,
count: .count,
taker_side: .taker_side
}]'
Output Rules
1. Always show the event title, market subtitle, and contract ticker 2. Show contract prices in cents (e.g., 45c for $0.45) 3. When showing American odds conversion, include both the cent price and the converted odds 4. For order books, report the bid/ask spread and top-3 depth on each side 5. Flag markets with fewer than 5 contracts of top-of-book depth as "thin liquidity" 6. Flag markets with bid/ask spread > 10c as "wide spread β use limit orders" 7. Always show volume and open interest for context 8. Note the market close time so the agent knows time-to-expiry
Error Handling
About
Built by AgentBets β full tutorial at agentbets.ai/guides/openclaw-kalshi-tracker-skill/.
Part of the OpenClaw Skills series for the Agent Betting Stack.