Build a useful comparison feed.

Start with runnable Node.js and Python clients, including bounded pagination and conditional polling.

Start with priced NBA, NFL and NHL props. Fetch multiple leagues together, follow pagination, and avoid repeatedly downloading unchanged answers.

curl -i 'https://prizepicksapi.com/api/v1/compare?league=NBA,NFL,NHL&priced_only=true&alt_lines=false&view=compact&limit=100' \
  -H "Authorization: Bearer $PRIZEPICKS_API_KEY" -H "X-User-Request: Compare priced NBA NFL and NHL props"
  1. Use priced_only=true to ask for rows with matched book or exchange quotes. Set alt_lines=false for main lines. Inspect returned tier fields; these filters alone do not guarantee standard PrizePicks tiers.
  2. Keep every filter unchanged while following meta.next_cursor. Stop when it is null. Deduplicate by the returned projection ID, and start a new traversal to refresh; live pagination is not a frozen historical snapshot.
  3. Save each response and its ETag. Revalidate that exact URL with If-None-Match. A 304 means reuse your saved response; it costs zero. Honor X-Next-Update-Seconds and Retry-After.
  4. A 100-row comparison page costs 5 credits on new plans—the same as a 50-row page. Batch within that block where useful. Read X-Usage-Unit and X-Credits-Remaining; existing request contracts keep their allowance.
  5. Compare matching player, stat, period, line and side. Keep source and receive timestamps visible. Missing quotes are unknown, not zero prices. Different lines, adjusted pick payouts and correlated entries cannot be treated as directly equivalent probabilities.
  6. Retry transient 503s with bounded exponential backoff and jitter. Do not loop on a monthly-quota response. Coverage remains free on credit plans.

Keep the complete board separate from priced comparisons

Read /api/v1/projections?league=NBA,NFL,NHL&view=compact&limit=100 for current PrizePicks lines, including lines without a matched sportsbook quote. Read /compare to enrich the board with prices. Join by projection ID and keep unpriced rows visible when your product promises the full board. An empty priced comparison page does not mean the league has no PrizePicks props.

Comparison leagues are NBA, NFL and NHL. A league listed by /coverage can have projections without supported sportsbook comparisons: CFB and UCL, for example, are not valid comparison leagues. Request their board lines from /projections instead. League codes match exactly; NBA and NBA1Q are different filters.

Read the selected response shape

FieldProjections fullComparisons fullCompact, either endpoint
Projection IDidprojection.idid
Leagueleagueprojection.leagueleague
Player nameplayer.nameprojection.player.nameplayer
Market and periodmarket.stat, market.periodprojection.market.stat, projection.market.periodstat, period
Start timeevent.starts_atprojection.event.starts_atstarts_at

If NFL rows disappear in your app, inspect these paths before filtering. A multi-league page is sorted by projection ID, not balanced across leagues: follow its cursor or query a league separately before declaring it absent. Do not discard a row merely because a missing field was read from the wrong shape. For a pregame-only view, require a known future start time; do not treat null as a completed game. alt_lines=false still permits a book main line different from the PrizePicks line; require same_line=true for an exact-line price comparison.

For push updates use the live feed (SSE) to detect changed props and selectively refresh comparisons. A prop update is not a promise that a sportsbook quote changed at the same instant.

Authenticated REST requests accept an optional brief non-sensitive task summary in X-User-Request; reuse it while paging and update it when the task changes. Task summaries are retained for 35 days; omit private prompts, secrets and personal information.

Open playground Credit calculator