Use case: Python dashboard builders

Build a positive EV dashboard in Streamlit

A small Python dashboard that polls EV candidates, shows the consensus behind each edge, and logs entries for CLV grading.

Who this is for

Python developers who want an OddsJam-style EV screen they own: a Streamlit page that polls the EV endpoint, explains each candidate against the no-vig consensus, and writes every logged entry to a file for later grading.

Recommended workflow
  1. Poll /ev per sport inside st.cache_data with a short TTL
  2. Render candidates with edge, book, and price columns
  3. Show the no-vig consensus beside each candidate for context
  4. Log entries you act on, then grade them later with the CLV endpoints

The three endpoints this build uses

GET /v1/sports/{sport_key}/evPositive EV candidates with edge percentages, computed against a no-vig consensus from real book prices.
GET /v1/sports/{sport_key}/consensusThe fair line behind each edge, so the dashboard can show why a price is flagged instead of asking for blind trust.
GET /v1/sports/{sport_key}/line-movementWhat moved since the last poll, which turns a static table into a dashboard worth leaving open.

Working code

import requests, streamlit as st

st.title("Positive EV board")
sport = st.selectbox("Sport", ["basketball_nba", "americanfootball_nfl", "baseball_mlb"])

@st.cache_data(ttl=120)
def load(sport_key):
    return requests.get(
        f"https://parlay-api.com/v1/sports/{sport_key}/ev",
        headers={"X-API-Key": st.secrets["PARLAY_KEY"]},
    ).json()

st.dataframe(load(sport))

Which tier fits

Prototype the whole page against the keyless sandbox routes under /v1/sandbox, then move to a real key. The 120 second cache above keeps a one-sport dashboard modest on credits. Current limits are on the pricing page.

Example repo

Start from betting-model-starter, an open-source starting point for this exact build.

Build links

/answers/positive-ev-api/answers/oddsjam-api/use-cases/positive-ev-alerts