Install
openclaw skills install @0xastraea/forecast-os-liteForecastOS Lite is a read-only prediction-market skill for AI agents. Use it to answer questions about future events with live public market data from Polymarket, Kalshi, and Precog instead of guessing. It discovers open markets, compares market-implied probabilities, and browses upcoming Precog lau
openclaw skills install @0xastraea/forecast-os-liteForecastOS Lite is the read-only edition of ForecastOS, a prediction-market toolkit for AI agents. It helps an agent answer questions about future events by checking live markets on Polymarket, Kalshi, and Precog before responding, instead of guessing.
A prediction market is a market where contract prices reflect the crowd's
implied probability of an outcome. A price of 0.62 for an outcome means the
market currently implies about a 62% chance. This skill finds relevant markets,
reports those market-implied probabilities, and includes the market source and
a freshness timestamp. It reports what the market implies, not its own forecast.
This edition can discover open markets and upcoming markets. It cannot create or fund markets, place or manage trades, handle wallets or keys, or change local configuration. When a request needs any of those actions, use the full ForecastOS skill.
Use this skill for:
Do not use it for quotes, trades, market creation, funding, claims, positions,
setup, or updates. Point those requests at the full forecast-os skill.
Show market-implied probabilities only:
outcomePriceslast_price_dollarsbuy_pricesDo not show bid/ask, order books, size-aware prices, fees, or slippage. Do not calculate position sizes, expected returns, or trade recommendations. If the user asks for a quote, an executable price, or what an order would cost, stop and say: "This skill is read-only. Use the full ForecastOS skill for a quote or trade."
Use curl or the host's HTTP GET tool. Parse JSON with the host's JSON parser.
Do not write response bodies to disk.
Search:
curl -sG 'https://gamma-api.polymarket.com/public-search' \
--data-urlencode 'q=<query>' \
--data-urlencode 'limit_per_type=5' \
--data-urlencode 'events_status=active'
Trending markets:
curl -s 'https://gamma-api.polymarket.com/markets?limit=10&active=true&closed=false&order=volume24hr&ascending=false'
Direct lookup by slug or id:
curl -s 'https://gamma-api.polymarket.com/markets?slug=<slug>&closed=any'
curl -s 'https://gamma-api.polymarket.com/markets?id=<id>&closed=any'
Use events[].title, events[].slug, events[].endDate, and
markets[].question, outcomes, outcomePrices, volume24hr, updatedAt,
closed, active. Filter to closed == false and active == true.
outcomes and outcomePrices are JSON strings; parse them. Cap results at 3
events and 5 markets per event.
Series discovery:
curl -s 'https://external-api.kalshi.com/trade-api/v2/series'
The series response is large. Do not display it. Filter series[] by ticker,
title, category, and tags using the query's key terms. For a Fed/rates query,
keep series whose title contains fed and one of meeting, decision,
rate cut, combo, or funds rate. Then fetch open events for the top 5
matching series:
curl -s 'https://external-api.kalshi.com/trade-api/v2/events?series_ticker=<ticker>&status=open&with_nested_markets=true'
Open events across all series, as a fallback:
curl -s 'https://external-api.kalshi.com/trade-api/v2/events?status=open&limit=200&with_nested_markets=true'
Direct lookups:
curl -s 'https://external-api.kalshi.com/trade-api/v2/markets?event_ticker=<event_ticker>&status=open'
curl -s 'https://external-api.kalshi.com/trade-api/v2/markets/<ticker>'
Use series[].ticker, series[].title, series[].category, and
series[].tags. Use events[].event_ticker, events[].title, and
markets[].ticker, title, yes_sub_title, no_sub_title,
last_price_dollars, volume_fp, volume_24h_fp, close_time,
updated_time, status.
Kalshi event status is open; nested market status is active. Filter nested
markets to status == "active". last_price_dollars is the last trade price,
not a live quote; label it "last trade" in the output. If it is 0.0000 and
volume is zero, say "no trades yet."
Kalshi has no public full-text search endpoint. Prefer series discovery when
the query is not a ticker. If no series match, fall back to filtering up to 2
pages of open events (200 each, following cursor) by event and market titles.
Show the top 5 matching markets. If there is still no match, say Kalshi's
public API has no full-text search and suggest a narrower query.
curl -sG 'https://service.precog.markets/api/v1/markets/' \
--data-urlencode 'chain_id=8453' \
--data-urlencode 'status=OPEN' \
--data-urlencode 'search=<query>' \
--data-urlencode 'ordering=end_at'
curl -sG 'https://service.precog.markets/api/v1/markets/' \
--data-urlencode 'chain_id=42161' \
--data-urlencode 'status=OPEN' \
--data-urlencode 'search=<query>' \
--data-urlencode 'ordering=end_at'
If the user provides a master market id, add
--data-urlencode 'market_id=<id>' and omit search.
Use id, chain_id, question, resolution_criteria, category, status,
end_at, outcomes, buy_prices, overround, collateral_symbol,
collateral_funding, market. id is the master market id and market is
the market contract address. outcomes and buy_prices are comma-separated
strings; pair them by index.
search filters the question name case-insensitively. The service returns
matching rows; still drop any row whose status is not OPEN. The response may
be a list or { "count": ..., "results": [...] }; handle both. This endpoint
does not return an updated_at field, so use the current fetch time when
reporting freshness.
Precog can have many outcomes. For the default table, rank outcomes by
buy_prices and show only the highest-priced outcome. Show the full outcome
list only when the user asks for that market's detail.
curl -sG 'https://service.precog.markets/api/v1/upcoming-markets/' \
--data-urlencode 'status=VALIDATED' \
--data-urlencode 'status=FUNDED' \
--data-urlencode 'chain_id=8453' \
--data-urlencode 'search=<query>' \
--data-urlencode 'ordering=end_at'
curl -sG 'https://service.precog.markets/api/v1/upcoming-markets/' \
--data-urlencode 'status=VALIDATED' \
--data-urlencode 'status=FUNDED' \
--data-urlencode 'chain_id=42161' \
--data-urlencode 'search=<query>' \
--data-urlencode 'ordering=end_at'
Use id, chain_id, question, status, collateral_symbol,
collateral_funding, min_funding_amount, max_funding_amount, end_at,
market_id, master. id is the upcoming market id; market_id and master
are the deployed market id and master address when available. The response may
be a list or { "count": ..., "results": [...] }; handle both. Keep only
chain_id 8453 or 42161.
Hide markets whose end_at is in the past. Ignore funders, tx_hash, and
claimable_* fields. Treat this as discovery only; funding and claiming belong
to the full skill.
closed == false and active == true;
Kalshi nested markets status == "active"; Precog status=OPEN in the
request.forecast-os skill.Default market table, one row per market:
| Platform | Market | Outcome | Market-implied | Close |
|---|
overround field.If the user explicitly asks for all outcomes of one market, show a separate detail table for that market only:
Platform - Market (close: ...)
| Outcome | Market-implied |
|---|
Launchpad table:
| Upcoming market | Status | Current funding |
|---|
collateral_funding as current funding, with the collateral_symbol.VALIDATED means funding is open. FUNDED means at least the minimum was
reached.forecast-os skill.Redirect to the full ForecastOS skill (forecast-os) for:
Suggested wording:
This skill is read-only. Use the full ForecastOS skill for that action.
Do not install or run the full skill yourself. Point the user to
npx skills add precog-markets/forecast-os or
https://skills.sh/precog-markets/forecast-os if they ask how to get it.
forecast-os skill.forecast-os skill.