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 statelimit=50— page size (default 50, max 100)cursor=<id>— opaque cursor; pass back the previous response'snext_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 eventmin_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
nullrather 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.