FILTERS
Props
0
Betr Best
0
Obs saved
0
๐
Set filters, then click Fetch Lines
Hit Fetch Lines to load Betr standard props ranked by PP value
Hit Run Scan to find edges and build a slip
Distribution Curves
Enter a standard line to see the market prior curve. Add a player to overlay their historical distribution.
Season
Market
Player
Games
Standard line
Enter a standard line to view curveoptionally add a player to overlay historical data
Loading...
Payout Reference
Break-even probability is the per-leg win rate needed for EV = 0. Flex Play accounts for all partial payout tiers in the calculation.
Loadingโฆ
API Reference
Railway: betr-picks-production.up.railway.app
| Method | Endpoint | Triggered by | Description | ntfy? |
|---|---|---|---|---|
| GET | /health | โ | Ping โ returns {status: "ok"} | โ |
| GET | /screener-status | โ | Last screener run time, edge count, backoff state | โ |
| GET | /token-status | โ | JWT validity and seconds until expiry | โ |
| POST | /refresh-token | Vercel "Refresh Token" btn | Updates in-memory JWT and PP_JWT_CACHE env var. Body: {token, exp} | โ |
| POST | /fetch-lines | Lines tab "Fetch Lines" | Fetches one market+league from PP Screen. Saves prop_observations to Supabase. Body: {market, league, books, is_live, season} | โ |
| POST | /screen | Direct call only | Full screener scan across all SCAN_MARKETS. Returns edges. Sends ntfy push alert. | โ |
| GET | /fantasy-lines | Fantasy tab "Fetch Lines" | All Betr standard props from PP fantasy optimizer, sorted by value% desc | โ |
| GET | /slip-builder | Slip Builder "Run Scan" | Full screener scan + fantasy fetch grouped by game with same-game complements. No alert sent. | โ |
| GET | /payout-reference | Payout tab | Payout reference table (perfect play + flex, all pick counts) | โ |
| GET | /discover-markets | Direct call only | Batch-probes candidate market names across leagues. Returns hits (has Betr Alt) and misses. Add ?league=Soccer to scope to one league. Slow (~2-5 min full run). | โ |
Background Processes
โ
Screener loop
Runs every 6โ10 min (random jitter) during 8amโ10pm PT. Scans all SCAN_MARKETS (NBA, NCAAB, NHL, Soccer). Sends ntfy push on any edges found. 90s startup delay to absorb rapid Railway redeploys. 25-min backoff on PP rate limit.
External Dependencies
| Service | Purpose | Notes |
|---|---|---|
| Prop Professor | Prop line data + devig | JWT (10 min TTL) via session cookie. Rotates on new browser login โ urgent ntfy fires โ tap Refresh Token on Vercel. |
| Supabase | Postgres โ prop_observations, edges | Lines tab writes prop_observations. Screener logs edges. CurvesTab reads game_logs (currently empty). |
| ntfy.sh | Push alerts to iOS | Topic: betrounds. urgent = session expired. high = rate limited or 3+ edges. default = <3 edges. |
| Railway | FastAPI host + env vars | PP_SESSION_TOKEN, PP_JWT_CACHE, SUPABASE_URL, SUPABASE_SERVICE_KEY, NTFY_TOPIC, VERCEL_URL |
| Vercel | Next.js frontend | Auto-deploys from GitHub main. NEXT_PUBLIC_API_URL must point to Railway URL. |