ParlayIQ API

Read-only JSON feed of currently-open markets with AI probabilities and edge.

Endpoint

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).

GET/api/v1/markets

Authorization

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" }.

Key generation

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 & pathAuthDescription
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"}'

Rate limits

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.

Query parameters

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.

Example requests

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'

Response schema

{
  "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_idintUnique market identifier.
questionstringHuman-readable market question.
sportstringLowercase sport slug (e.g. nfl).
categorystringMarket category (e.g. moneyline, spread).
team_homestringHome team name.
team_awaystringAway team name.
closes_atISO 8601Timestamp the market settles (event tip-off).
yes_pricefloatCurrent YES price, 0.000–1.000.
ai_probabilityfloat?Model probability of YES, 0.000–1.000. Nullable.
ai_confidencefloat?Model confidence, 0.00–1.00. Nullable.
edgefloatai_probability − yes_price.
recommended_sidestring"YES" or "NO" depending on edge direction.

Notes

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).