Eyewall Markets Market Compendium
Reference § API · /api/v1 · Edge tier
Read-only

Programmatic access · Edge subscribers

API reference

Version v1 JSON over HTTPS 10 req/sec/key

The Eyewall Markets API exposes Storm's canonical event ontology, current cross-venue prices and spreads, and venue metadata through a small set of read-only JSON endpoints. It is included with the Edge tier and inaccessible from any other plan.

§ 1. Authentication

Every request carries an Authorization: Bearer <api_key> header. Your API key is generated on first Edge sign-in and visible under API access on your account page; regenerate it from the same place if it leaks.

Requests without a valid key return 401. Authenticated requests from non-Edge subscribers (or expired Edge subscriptions) return 403.

§ 2. Rate limit

10 requests per second per API key. Bursts above this return 429 Too Many Requests with a Retry-After: 1 header. The bucket refills continuously, so a well-behaved client that paces itself never sees a 429.

§ 3. Endpoints

GET /api/v1/events

List events. Cursor-paginated by event id ascending. Query parameters:

  • category=<slug> — restrict to a category (e.g. us_elections)
  • status=open|resolved|expired — filter by lifecycle state
  • limit=50 — page size (default 50, max 100)
  • cursor=<id> — opaque cursor; pass back the previous response's next_cursor
{
  "events": [
    {
      "id": 163,
      "slug": "2028_us_presidential_election_winner",
      "title": "2028 US presidential election — winner",
      "status": "open",
      "category": "us_elections",
      "canonical_outcomes": [{"slug":"trump","label":"Trump"}, ...],
      "canonical_resolution_date": "2028-11-07"
    }
  ],
  "next_cursor": "171"
}

GET /api/v1/events/:slug

Single event with linked markets, outcomes, and current bid/ask pricing where the venue publishes it. Returns 404 if the slug is unknown.

GET /api/v1/spreads

Recent cross-venue published-price observations. Each row records the prices the two venues published for the same outcome at a single observation timestamp, the gap in basis points, and the gap normalised for each venue's posted fees. Query parameters:

  • event_slug=<slug> — narrow to one event
  • min_edge_bps=50 — minimum normalised price gap, in basis points (default 50)
  • since=<iso-8601> — observed_at lower bound (default: last 24 h)
  • limit=100 — page size (default 100, max 100)
{
  "spreads": [
    {
      "event_slug": "...",
      "outcome": "yes",
      "venue_a": "polymarket",
      "venue_b": "kalshi",
      "price_a": 0.985,
      "price_b": 0.980,
      "ask_a": 0.987,
      "ask_b": 0.982,
      "pricing_basis": "ask",
      "spread_bps": 50,
      "fees_bps_est": 21,
      "net_edge_bps": 29,
      "observed_at": "2026-04-26 18:31:02"
    }
  ]
}

GET /api/v1/markets/:venue/:external_id

Single market by venue slug + venue's own external id. Returns the market metadata, current outcome prices, and any canonical events the market is linked to.

GET /api/v1/venues

List of venues Storm consumes. Each entry carries publishes_volume and publishes_liquidity flags so a consumer knows where those fields are real and where they are null.

§ 4. Example

curl -H "Authorization: Bearer $EYEWALL_API_KEY" \
     https://eyewallmarkets.com/api/v1/spreads?min_edge_bps=100&limit=10

§ 5. Conventions

  • All responses are application/json; charset=utf-8.
  • Timestamps are ISO-8601 UTC.
  • Prices are 0..1 implied probabilities.
  • Fields that the underlying venue does not publish (e.g. Kalshi liquidity, PredictIt volume) are returned as null rather than zero so a consumer can tell "we don't see it" from "the venue says zero."
  • The API is read-only. No POST endpoints under /api/v1/*; no order placement, no account mutation.