VolRoc Public API

Free, read-only JSON endpoints for the prediction-market universe across Kalshi and Polymarket — the same data the Observatory pages render. No key, no auth.
Base URL https://volroc.ai Method GET Format application/json CORS * (open)

Endpoints

GET/api/public/observatory

The whole-ecosystem live measurement bundle: active markets, venue split, open interest, domain (category) composition, probability distribution, and 24-hour activity. This is the current diurnal value — it breathes with the latest capture hour. Use the archive endpoints for fixed, comparable daily values.

Updatesproducer refreshes ~every 15 minutes; edge-cached ~30 seconds
Stampedas_of carries the artifact timestamp
curl https://volroc.ai/api/public/observatory
{
  "active_markets": 109201,
  "structure": {
    "venue_distribution": [
      { "venue": "kalshi", "count": 78135 },
      { "venue": "polymarket", "count": 31066 }
    ],
    "open_interest": {
      "total": 1346586376.57,
      "by_venue": { "kalshi": 888974007.14, "polymarket": 457612369.43 },
      "unit_note": "open interest (Kalshi) + USD liquidity (polymarket) — comparable USD magnitudes"
    },
    "categories": [ { "name": "Sports", "count": 61833, "open_interest": 498727656.50 }, … ],
    "categories_meta": { "domains": 12, "other_pct": 22.3, "basis": "active markets, both venues", … }
  },
  "price_distribution": { "scale": "0-1", "n": 109201, "venues": [ "kalshi", "polymarket" ], "buckets": [ … ] },
  "activity": {
    "markets_traded_24h": 18136,
    "markets_updated_24h": 15876,
    "volume_by_venue": [
      { "venue": "kalshi", "unit": "contracts", "volume_24h": 97667570.67 },
      { "venue": "polymarket", "unit": "usd", "volume_24h": 23913420.52 }
    ]
  },
  "families": {
    "count": 2826,
    "top": [ { "ticker": "KXMVESPORTSMULTIGAMEEXTENDED", "label": "Sports — multi-game parlays", "count": 41549 }, … ],
    "venue_note": "Kalshi market families (Polymarket is not series-structured)"
  },
  "as_of": "2026-07-30T15:03:03Z"
}

GET/api/public/archive

Index of every frozen daily snapshot — one row per day with headline figures. Powers the archive list and the historical-series charts.

Updatesa new row each day after the 00:05 UTC freeze; edge-cached ~5 minutes
curl https://volroc.ai/api/public/archive
{
  "count": 56,
  "days": [
    {
      "date": "2026-06-04",
      "active_markets": 49813,
      "open_interest_total": 1394324489.62,
      "venue_distribution": [ { "venue": "kalshi", "count": 41421 }, … ],
      "categories": [ { "name": "Sports", "count": 22957, "open_interest": 603383196.75 }, … ]
    }
  ]
}

GET/api/public/archive/YYYY-MM-DD

One frozen daily snapshot — the full observatory bundle for that date, plus its freeze provenance. Records are immutable once frozen, so they cache long. Strict YYYY-MM-DD only; 404 if that day was never frozen.

Updatesnever (immutable); edge-cached ~24 hours
Errors400 bad date · 404 not frozen
curl https://volroc.ai/api/public/archive/2026-06-04
{
  "active_markets": 49813,
  "structure": { "venue_distribution": [ … ], "open_interest": { … }, "categories": [ … ] },
  "price_distribution": { "scale": "0-1", "n": 49813, "buckets": [ … ] },
  "archive": {
    "canonical_date": "2026-06-04",
    "canonical_hour_utc": "00:00",
    "frozen_at_utc": "2026-06-04T14:48:10Z"
  },
  "market_state": { "markets_tracked": 32348, … }
}

GET/api/public/world-cup

The 2026 World Cup observatory bundle: what prediction markets are pricing around the tournament across both venues — counts, open interest, category breakdown, probability distribution, and the largest markets per venue. Observational only.

Updatesproducer refreshes ~every 15 minutes; edge-cached ~60 seconds
UnitsKalshi ranked by open interest (contracts); Polymarket by 24h volume (USD) — never summed
curl https://volroc.ai/api/public/world-cup
{
  "event": { "name": "2026 FIFA World Cup", "starts": "2026-06-11",
             "ends": "2026-07-19", "hosts": "United States, Canada & Mexico",
             "teams": 48, "matches": 104 },
  "overview": { "active_markets": 1263,
                "by_venue": [ { "venue": "kalshi", "count": 1111 },
                              { "venue": "polymarket", "count": 152 } ] },
  "categories": [ { "key": "advancement", "label": "Team Advancement",
                    "count": 355, "kalshi_oi_contracts": 1458535.56 }, … ],
  "largest": {
    "kalshi": [ { "label": "Will the Portugal win the 2026 Men's World Cup?",
                  "size": 4328249.84, "size_field": "open_interest_contracts" }, … ],
    "polymarket": [ { "label": "Will Brazil win the 2026 FIFA World Cup?",
                      "size": 1956913.94, "size_field": "volume_24h_usd" }, … ]
  }
}

GET/api/public/health

Liveness and freshness of the underlying data artifact. Always returns 200; ok is false when no artifact is currently reachable.

Updatesreflects the latest published bundle
curl https://volroc.ai/api/public/health
{
  "ok": true,
  "generated_at": "2026-07-30T15:03:03Z",
  "source_freshness": {
    "unified_latest_hour": "2026-07-30T14:00:00+00:00",
    "velocity_path_ok": true,
    "velocity_rankable": true,
    "velocity_built_at": "2026-06-05T13:48:37.291602+00:00",
    "situations_path_ok": true,
    "situations_stale": true,
    "situations_count": 0
  },
  "warmup": { "note": "velocity-derived metrics stay null/[] until the velocity window warms", … }
}

Units & conventions

Venues are never blended. Kalshi open interest and volume are in contracts; Polymarket open interest is USD liquidity and volume is USD. Figures from different venues are reported per venue, each labelled with its unit, and are never summed. Where a single open-interest total is shown, it combines Kalshi open interest with Polymarket USD liquidity as comparable USD magnitudes — not an identical instrument.

Probabilities are on a 0–1 scale (yes-price), both venues. Domains are a venue-agnostic subject taxonomy classified from Kalshi series prefixes and Polymarket title keywords, with a residual Other bucket reported honestly.

Live vs. canonical hour

/observatory is the live, diurnal value — it changes through the day with the latest capture hour. The archive endpoints return the canonical value frozen at 00:00 UTC each day, which is what makes days comparable to one another. If you are building a time series, use /archive and /archive/<date>, not repeated reads of /observatory.

Attribution & citation

VolRoc’s own artifacts — canonical identifiers, edition hashes, divergence classifications, frozen daily records, and verification metadata — are free to use and cite, permanently. Attribute as “VolRoc, volroc.ai” and cite the specific endpoint or dated record where relevant.

Venue-native market data reproduced in these responses originates from Kalshi and Polymarket and is subject to their respective terms of service. VolRoc grants no redistribution rights over it. Consult each venue’s terms before bulk redistribution.

Source markets are collected from the public Kalshi and Polymarket APIs. VolRoc is an independent observatory; it is not affiliated with either venue, and it is not a sportsbook, broker, or exchange. Figures are observational and approximate.

Stay in the loop

We post a short daily read on the prediction-market universe, and we'll note material API changes there. Leave an email, or just reach the project at volroc.ai.

About VolRoc Methodology API Archive World Cup Read-only · no key required · GET only.