MARKETS & FINANCE
Kalshi Market Monitor
Monitor live Kalshi prediction markets in one run: yes/no prices, bid-ask spreads, volume, liquidity and open interest, plus close dates and market status.
About this data
Monitor live Kalshi prediction markets in one run: yes/no prices, bid-ask spreads, volume, liquidity and open interest, plus close dates and market status. Filter by status, series or event prefix and a creation window. Every run returns a fresh full-board snapshot; no account is needed.
From the actor’s Apify Store listing. The per-call endpoint may return a bounded subset; its own description is below.
Buy per call over x402
One endpoint at api.ssh.autos. Each call is one JSON POST, paid in USDC with no account or API key, and answered in the same HTTP response.
POST /v1/markets/kalshi/snapshot
Default: the most active market of each of Kalshi's highest-activity open events (event title, question, indicative probability from a bid/ask midpoint or traded last, quotes, volume), never zero-activity combo shards.
With a series, event-prefix, lookback or non-open status filter: up to ten market rows from one source page of at most twenty markets.
Missing data is null, never a sentinel.
No cross-venue mapping, alerts, Telegram or stored state.
Input
Send a JSON body to POST https://api.ssh.autos/v1/markets/kalshi/snapshot.
| Field | Type | Required | Notes |
|---|---|---|---|
status | string | optional | one of open, unopened, closed, settled, all; default "open" |
seriesTicker | string | optional | up to 80 characters; pattern ^[A-Z0-9-]+$ |
eventTickerPrefix | string | optional | up to 80 characters; pattern ^[A-Z0-9-]+$ |
lookbackHours | integer | optional | 0–168; default 0 |
maxResults | integer | optional | 1–10; default 5 |
Returned fields
The answer is JSON: records, a list of up to 10, and summary, the run status and counts. Each record has these 30 fields; a field the source does not publish comes back null.
30 fields per record
| Field | Type | Notes |
|---|---|---|
recordKey | string | — |
source | string | always kalshi |
kind | string | one of market |
collectedAt | string | — |
sourceUrl | string | — |
ticker | string | The Kalshi market ticker — the venue's own market identity; rows de-duplicate by it. |
eventTicker | string | The parent event ticker (matches kalshi-sports' event identity). |
eventTitle | string | Parent event title when fetched with nested events; the /markets list publishes no event titles. |
question | string | The market's title text (field name matches the polymarket-clob-monitor market rows for cross-venue unions). |
status | string | Native row status: initialized (unopened), active (open), determined (closed), finalized (settled). |
active | boolean | True when the native status is active (trading now). |
closed | boolean | True when the native status is determined or finalized. |
openTime | string | — |
closeTime | string | Trading close (ISO) — the monitor's end-of-life timestamp. |
createdTime | string | Market creation time (ISO) — the lookback window key. |
endDate | string | Alias of closeTime under the polymarket-clob-monitor field name (cross-venue unions join on endDate). |
lastPrice | number | Last trade in dollars per contract (0..1) — the same numeric probability space as polymarket token prices. |
yesBid | number | — |
yesAsk | number | — |
noBid | number | — |
noAsk | number | — |
yesProbability | number | Indicative Yes mark: bid/ask midpoint when a positive uncrossed two-sided quote exists, else a last trade only with positive volume; null when the venue's sentinel 0/1 quotes carry no information. |
noProbability | number | Derived complement of yesProbability (1 - yes); null together with it. |
probabilitySource | string | How the indicative probability was derived, or null when no sensible mark exists. one of bid_ask_midpoint, last_trade |
outcomes | array of objects | The two contract sides with the venue's own labels (yes/no sub-titles). price is the yes-side last trade in dollar-probability space; the no-side price is unpublished (derivable, never guessed) and s… |
volume | number | Total traded volume in USD (volume_fp). |
volume24h | number | 24h traded volume in USD (volume_24h_fp). |
liquidity | number | Resting liquidity in USD. |
openInterest | number | Open interest in USD (open_interest_fp). |
crossVenue | object | Present only when the cross-venue map matched (market ticker first, then event ticker) — the PK x Kalshi arb join surface. |
Example call
npx agentcash@latest fetch https://api.ssh.autos/v1/markets/kalshi/snapshot -m POST -b '{"status": "open", "maxResults": 3}'
The example values come from the API spec or the actor’s own sample input. Running it is a paid call.
What is and isn’t charged
You pay the call price for
- An answer, including a definitive “not found” or an empty result.
- Confirmed no matches returns records: [] (charged: it is an answer).
Free
- Invalid input (422), busy (503), source failure (502), timeout (504) and calls whose client hung up are never charged.
- Invalid input and source failures are not charged.
Prefer a subscription? Run it on Apify
This data source is a public actor on the Apify Store: Kalshi Market Monitor. Run it with your Apify account and plan for larger, scheduled or exported runs; it may offer more input options than the per-call endpoint.
How x402 payment works
- Your client sends the request. The API answers
402 Payment Requiredwith the price and where to pay. - The client pays from its own wallet: USDC on Base or Solana over x402, or over MPP on Tempo. No account, sign-up or API key.
- The client retries with the payment attached and gets the JSON answer in the same call. You are only charged for answers.
The AgentCash CLI in the example does all three steps for you and pays from your AgentCash wallet. Any x402 or MPP client works the same way.
Machine-readable: openapi.json · llms.txt