Read-only JSON feed of currently-open markets with AI probabilities and edge.
Returns every market that is currently open, has an AI probability assigned, and has not yet tipped off. Ordered by event time (soonest closing first).
All /api/v1/* requests must include Authorization: Bearer <api_key>. Requests without it receive 401 { "error": "Missing or invalid Authorization header" }. Requests with a key that doesn't exist or has been revoked receive 401 { "error": "Invalid API key" }.
Authenticated users can issue a key at POST /api/v1/keys (cookie session, JSON body { "label": "..." }). Response includes the plain key — store it, the server only stores a hash.
| Method & path | Auth | Description |
|---|---|---|
POST /api/v1/keys |
Cookie session | Issue a new key. Body: { "label": "your-label" }. Returns { id, key, label, created_at }. key is shown only here. |
GET /api/v1/keys |
Cookie session | List the current user's keys (id, label, created_at, last_used_at, revoked_at). Never returns the hash or plain key. |
DELETE /api/v1/keys/:id |
Cookie session | Revoke a key you own. Sets revoked_at = NOW(); subsequent calls using that key return 401. |
# after logging in via the browser, the session cookie goes here:
curl -s 'http://ip-177-54-159-63.us-east-1.prod.aws.beamlit.net/api/v1/keys' \
-H 'Content-Type: application/json' \
-b 'connect.sid=YOUR_SESSION_COOKIE' \
-d '{"label":"quant-research-bot"}'
Each key is limited to 60 requests per minute. Over-limit requests receive 429 { "error": "Rate limit exceeded" } with a Retry-After header (seconds). The counter is a 60-second fixed window per key.
| Name | Type | Default | Description |
|---|---|---|---|
sport |
string | none | Optional. Filter to a single sport. One of nba, nfl, mlb, nhl. |
min_edge |
float | none | Optional. Minimum absolute edge (gap between AI probability and YES price), e.g. 0.05 means |ai_probability − yes_price| ≥ 0.05. |
limit |
integer | 50 | Page size. Must be between 1 and 100. |
page |
integer | 1 | Page number, 1-based. Offset is capped at 1000. |
curl -s 'http://ip-177-54-159-63.us-east-1.prod.aws.beamlit.net/api/v1/markets?limit=5&sport=nfl'
curl -s 'http://ip-177-54-159-63.us-east-1.prod.aws.beamlit.net/api/v1/markets?sport=nba&min_edge=0.08&page=1'
curl -s 'http://ip-177-54-159-63.us-east-1.prod.aws.beamlit.net/api/v1/markets?sport=nhl&min_edge=0.10&page=2'
{
"data": [
{
"market_id": 123,
"question": "Will the Chiefs beat the Bills?",
"sport": "nfl",
"category": "moneyline",
"team_home": "Chiefs",
"team_away": "Bills",
"closes_at": "2026-08-04T20:00:00.000Z",
"yes_price": 0.55,
"ai_probability": 0.62,
"ai_confidence": 0.71,
"edge": 0.07,
"recommended_side": "YES"
}
],
"page": 1,
"limit": 50,
"count": 50
}
| Field | Type | Description |
|---|---|---|
market_id | int | Unique market identifier. |
question | string | Human-readable market question. |
sport | string | Lowercase sport slug (e.g. nfl). |
category | string | Market category (e.g. moneyline, spread). |
team_home | string | Home team name. |
team_away | string | Away team name. |
closes_at | ISO 8601 | Timestamp the market settles (event tip-off). |
yes_price | float | Current YES price, 0.000–1.000. |
ai_probability | float? | Model probability of YES, 0.000–1.000. Nullable. |
ai_confidence | float? | Model confidence, 0.00–1.00. Nullable. |
edge | float | ai_probability − yes_price. |
recommended_side | string | "YES" or "NO" depending on edge direction. |
Prices are point-in-time snapshots — they refresh on a short cadence as new odds come in. The endpoint sends Cache-Control: public, max-age=15 so light polling is safe. Every contract settles to $1.00 on resolution (YES if the event resolves YES, otherwise NO).