BetrPicks
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
MethodEndpointTriggered byDescriptionntfy?
GET/healthPing — returns {status: "ok"}
GET/screener-statusLast screener run time, edge count, backoff state
GET/token-statusJWT validity and seconds until expiry
POST/refresh-tokenVercel "Refresh Token" btnUpdates in-memory JWT and PP_JWT_CACHE env var. Body: {token, exp}
POST/fetch-linesLines tab "Fetch Lines"Fetches one market+league from PP Screen. Saves prop_observations to Supabase. Body: {market, league, books, is_live, season}
POST/screenDirect call onlyFull screener scan across all SCAN_MARKETS. Returns edges. Sends ntfy push alert.
GET/fantasy-linesFantasy tab "Fetch Lines"All Betr standard props from PP fantasy optimizer, sorted by value% desc
GET/slip-builderSlip Builder "Run Scan"Full screener scan + fantasy fetch grouped by game with same-game complements. No alert sent.
GET/payout-referencePayout tabPayout reference table (perfect play + flex, all pick counts)
GET/discover-marketsDirect call onlyBatch-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
ServicePurposeNotes
Prop ProfessorProp line data + devigJWT (10 min TTL) via session cookie. Rotates on new browser login → urgent ntfy fires → tap Refresh Token on Vercel.
SupabasePostgres — prop_observations, edgesLines tab writes prop_observations. Screener logs edges. CurvesTab reads game_logs (currently empty).
ntfy.shPush alerts to iOSTopic: betrounds. urgent = session expired. high = rate limited or 3+ edges. default = <3 edges.
RailwayFastAPI host + env varsPP_SESSION_TOKEN, PP_JWT_CACHE, SUPABASE_URL, SUPABASE_SERVICE_KEY, NTFY_TOPIC, VERCEL_URL
VercelNext.js frontendAuto-deploys from GitHub main. NEXT_PUBLIC_API_URL must point to Railway URL.