API

Every number on this site comes from a handful of JSON files served over HTTPS with open CORS. They are free to use, need no key, and come with no uptime guarantee: this is a best-effort feed, not a service level. Please cache on your side and poll no faster than the data changes. Version 2 (venues, combined signal, confidence score).

Endpoints

GET /api/v1/signals.jsonEverything: combined and per-venue readings for every coin × timeframe. Written every tick (tick_seconds). Cache 10 s.
GET /api/v1/combined.jsonCombined readings only. Written once a minute. Cache 30 s.
GET /api/v1/venues/{venue}.jsonOne venue's readings. Venues: polymarket, kalshi, limitless. Written once a minute. Cache 30 s.
GET /api/v1/history/{coin}.jsonLast 48 h: combined at 1-minute and per-venue at 5-minute resolution. Coins: BTC, ETH, SOL, XRP, DOGE, HYPE, BNB. Rebuilt every 5 min.
GET /api/v1/meta.jsonCoins, timeframes (5m, 15m, 1h, 4h, 1d), venues with coverage, thresholds and methodology version.
GET /api/v1/openapi.jsonOpenAPI 3.1 description of the above.

Example

curl -s https://polysignals.net/api/v1/combined.json | jq '.coins.BTC.overall'

curl -s https://polysignals.net/api/v1/signals.json | jq '.coins.ETH.timeframes["1h"].combined.current.confidence'

curl -s https://polysignals.net/api/v1/venues/kalshi.json | jq '.coins.SOL["15m"].current.prob_up'

signals.json, trimmed to one coin, one timeframe and one venue:

{
  "version": 2,
  "generated_at": "2026-09-30T20:26:05Z",
  "tick_seconds": 30,
  "venues": ["polymarket", "kalshi", "limitless"],
  "coins": {
    "BTC": {
      "spot_usd": 83616.4,
      "overall": { "score": 9, "direction": "neutral", "confidence": 71 },
      "timeframes": {
        "1h": {
          "combined": {
            "current": {
              "prob_up": 0.511,
              "score": 2,
              "direction": "neutral",
              "late_window": false,
              "window_start": "2026-09-30T20:00:00Z",
              "window_end": "2026-09-30T21:00:00Z",
              "sources": ["polymarket", "kalshi", "limitless"],
              "divergence": 0,
              "confidence": { "score": 97, "label": "high", "depth": 0.97, "agreement": 1, "timing": 1, "sources": 3, "divergence": 0 }
            },
            "next": null
          },
          "venues": {
            "kalshi": {
              "current": {
                "venue": "kalshi", "coin": "BTC", "timeframe": "1h",
                "window_start": "2026-09-30T20:00:00Z", "window_end": "2026-09-30T21:00:00Z",
                "prob_up": 0.51, "score": 2, "direction": "neutral",
                "spread": 0.01, "volume_usd": 333616, "liquidity_usd": null,
                "derived": true, "stale": false, "late_window": false,
                "market_url": "https://kalshi.com/markets/kxbtcd/KXBTCD-26SEP3017",
                "confidence": { "score": 72, "label": "high", "quality": 0.72, "timing": 1 }
              },
              "next": null
            }
          }
        }
      }
    }
  }
}

Combined reading fields

prob_up
Quality-weighted mean of venue Up probabilities (0–1). null when no source qualifies.
score
(prob_up − 0.5) × 200, rounded. −100 to +100.
direction
strong_up · up · neutral · down · strong_down.
late_window
true when less than 20% of the window remains.
window_start / window_end
ISO-8601 UTC. Compute time remaining from window_end; there is no countdown field.
sources
Venue ids blended into this reading (quality > 0).
divergence
max − min prob_up among sources with quality ≥ 0.2; 0 with one source.
confidence
{ score, label, depth, agreement, timing, sources, divergence } — score = round(100 × depth × agreement × timing).

Venue reading fields

prob_up / score / direction
As above, for this venue alone.
spread
Best ask − best bid of the Up share. null for AMM venues.
volume_usd
Volume as reported by the venue (lags on some venues).
liquidity_usd
Pool liquidity for AMM venues, else null.
derived
true when interpolated from a strike ladder (Kalshi hourly).
stale
true when the quote could not be refreshed and the previous value is shown (quality 0).
market_url
The market on the venue's site.
confidence
{ score, label, quality, timing } — score = round(100 × quality × timing).

Per coin

overall is the confidence-weighted mean of the combined current scores across timeframes, with its own confidence; venue_overall.{venue} is the same computed from one venue’s readings (also returned as overall in venues/{venue}.json); spot_usd is a display-only spot price from Coinbase.

When no source clears the quality bar (typically a thin window with zero reported volume), the combined reading is still filled from the available prices, equal-weighted, with confidence.score 0 — so every priced window shows a direction, and the confidence tells you how much to trust it.

History file

{ coin, generated_at, resolution: { combined: "1m", venues: "5m" }, range_hours: 48, timeframes: { "1h": { combined: [{ t, prob_up, score, confidence }], venues: { kalshi: [ … ] } } } }. Minutes with no usable reading are simply absent.

Not financial advice. Not affiliated with Polymarket, Kalshi or Limitless. The feed can change or stop without notice.