Scrape live and pre-match odds from Pinnacle (the sharp reference) and Bovada (largest US offshore book), keyless: moneyline, spreads, totals, specials and player props, de-vigged fair odds, line movement and best-price flags. College Football (NCAAF), NFL, MLB, NBA, soccer, tennis, NHL and UFC.
Which sportsbooks to pull odds from. The form is prefilled with Bovada: the largest US offshore book, keyless JSON with no login, cookie or signature, and it answers from Apify's datacenter range in 1-13 s for every sport (measured 2026-09-10). Pinnacle is the canonical sharp-line book and the reference price for +EV work — add it alongside Bovada for cross-book best-price comparison (no-vig fair odds are a separate add-on, includeFairOdds, and work on either book). One caveat measured 2026-09-10: Pinnacle's soccer feed is a 50 MB document that takes 93-233 s through a datacenter proxy, so pair Pinnacle with a leagueFilter or a lighter sport rather than asking it for all of soccer. Kambi covers the Unibet/Paf/Betsson family from one public feed and keeps the run alive if any single book closes its doors. Bet365 is temporarily UNDER REPAIR (their public mobile-web endpoints changed; selecting it right now returns 0 events). US books (DraftKings / FanDuel / BetMGM) are intentionally out of scope: they need US residential proxy. API calls and saved Tasks that omit this field keep the long-standing default, Pinnacle, so existing integrations are unchanged.
Type:string[]
Default:
[
"pinnacle"
]
Sports
sports
Optional
Which sports to query. These are top-level categories, not league names — the leagues inside each one rotate with the calendar, so pick the category and read the league field on the rows. Measured on Bovada 2026-09-10 with the default cap of 15 events: american_football_intl 15 events / 90 rows, all NFL (College Football and CFL sit behind them in the same feed); ice_hockey 15 / 90, all NHL; soccer 15 / 105 (Premier League first, 1,477 pre-match fixtures available); basketball 15 / 74 (NBA, Euroleague, WNBA); tennis 15 / 66 but the window is thin between tournaments; baseball only 5 MLB fixtures and a same-day window. The form is prefilled with NFL + NHL, the pair that is deep, US-facing and priced end-to-end right now; API calls and saved Tasks that omit this field keep the long-standing default, soccer + tennis. On Pinnacle the shelf is different — soccer is by far the deepest (1,266 fixtures) and tennis runs year-round, but see the note on Pinnacle's soccer payload size under Sportsbooks. Empty selections waste a run budget — if a sport comes back with nothing, the run status says so explicitly.
Type:string[]
Default:
[
"soccer",
"tennis"
]
League filter (optional)
leagueFilter
Optional
Optional league codes / display-name fragments to whitelist (e.g. 'EPL', 'UEFA', 'ATP', 'NBA'). Empty = all leagues for the chosen sports. Case-insensitive substring match against the book's league label.
Type:string[]
Default:
[]
Market types
marketTypes
Optional
Which betting markets to extract per event. 'h2h' (moneyline) is the canonical sharp market. 'spreads' (handicap) and 'totals' (over/under) drive most EV-modelling pipelines. 'specials' enables Pinnacle's futures / yes-no / first-team-to-score / exact-totals / team-props markets and its over/under player props (premium $0.05 tier — thousands per sport in soccer, a few hundred in NFL, so use maxEventsPerSport to control volume). 'player_props' is the Bet365-only player-prop tier (premium $0.05 — currently returns empty while Bet365 mode is under repair).
Type:string[]
Default:
[
"h2h",
"spreads",
"totals"
]
Mode
mode
Optional
'pre_match_only' (default) returns scheduled fixtures and is the cheapest, most-common workflow (5-15 min cadence). 'live_only' returns in-play markets — premium pricing tier; use with scheduled runs at ≤5 min cadence. 'pre_match_and_live' covers both, useful for arb finders that want to compare scheduled vs in-play lines.
Type:string
Default:pre_match_only
Options:
pre_match_onlylive_onlypre_match_and_live
Price format
priceFormat
Optional
price is always decimal; priceAmerican and priceFractional are always included too — this selector has no effect on the output.
Type:string
Default:decimal
Options:
decimalamericanfractional
Max events per sport (hard cap)
maxEventsPerSport
Optional
Safety cap on number of events extracted per (book, sport) pair. Multiply by ~5-10 market-outcomes per event to estimate snapshot volume per run. The form is prefilled with 15 on purpose: at 6 rows/event and $0.01/row, the two prefilled sports cost about $1.85 per run, so a first run fits inside Apify's $5 free credit with room to try a second. API calls and saved Tasks that omit this field keep the long-standing default of 50 — across two deep sports that is ~$5.4 per run.
Type:integer
Minimum:1
Maximum:1000
Default:50
Include alternate lines (more rows, more cost)
includeAlternateLines
Optional
Pinnacle only. Off by default. When on, the whole alternate ladder is returned — every extra handicap and total, not just the primary line (e.g. spread -1.5 / -1.0 / -0.5 alongside the main one). It costs no extra request, but it multiplies BILLED rows, and HOW MUCH depends on how many events you take. Measured 2026-08-07: across a full pre-match sweep it is about ×1.7 (×1.66 soccer, ×2.59 tennis, ×3.24 basketball, ×1.58 baseball, ×1.00 ice hockey), but with maxEventsPerSport=10 the same run went 42 → 354 rows, i.e. ×8.4 — the fewer events you take, the larger the share that is ladder. Check your first run's row count before scaling up. Rows carry isAlternate so you can filter, and marketKey so two rungs at the same line stay distinguishable.
Type:boolean
Default:false
Flag best price across books
includeBestPriceFlag
Optional
When ≥2 books are selected, set isBestPriceAcrossBooks on the row with the best price for each (fixture, market, outcome, line) — only where at least two of your books quote that same outcome and line (on a tie, every tied row is flagged). Rows no other book quoted stay false.
Type:boolean
Default:true
Dedup window (seconds)
deduplicationWindowSeconds
Optional
Suppress a snapshot whose price has not changed since the row was last DELIVERED — keeps PPE cost down on cron runs where most lines are stable. Set to 0 to disable and emit every snapshot. The window runs from the last delivery, not from the previous run (a suppressed run does not restart the clock), so an unchanged price is billed again each time the window elapses: on a */5 Schedule, 3600 (the maximum) bills an unchanged row on about 1 run in 12, 600 on 1 in 3, 360 on 1 in 2, and the default 30 on every run. A changed price is always delivered and billed.
Type:integer
Minimum:0
Maximum:3600
Default:30
Optional per-book cookie strings
cookieStrings
Optional
Optional. Object keyed by book name ({ 'bet365': '...', 'pinnacle': '...' }) with raw cookie headers from your browser DevTools to raise per-IP rate limits on heavy runs. NOT required for typical workloads — both books work anonymously.
Type:object
Proxy configuration
proxyConfiguration
Optional
Leave this as it comes. The default (Apify Proxy, automatic selection) uses datacenter IPs, which is the right cost/quality point for both books — residential burns roughly 20x the proxy cost with no quality lift. Do NOT set apifyProxyGroups to "DATACENTER": that is not a real Apify group name and the run will refuse to start. If the run log shows repeated "unhealthy (code=403)" lines and a sport comes back empty, the exit range is being blocked by the book — switch apifyProxyGroups to ["RESIDENTIAL"] for that run.
Type:object
Default:
{
"useApifyProxy":true
}
Add vig-free fair odds (premium add-on)
includeFairOdds
Optional
Compute the vig-free fair probability + fair decimal odds (no-vig / CLV benchmark) for every market line and add them to each row (noVigFairPrice, noVigProb, overround) — the standard baseline for spotting +EV prices at softer books and for model calibration. Opt-in premium: from 8 Aug 2026 this charges the fair-odds-enrichment event ($0.05) per enriched snapshot, on top of the base snapshot price. Leave off for raw odds only.
Type:boolean
Default:false
Add line movement (free)
includeLineMovement
Optional
Adds movement fields to every snapshot by comparing the price to the last one this account's runs saw for the same market-outcome: previousPrice, priceChange, priceChangePct, impliedProbChange, moveDirection (shortened / drifted / unchanged), secondsSincePreviousPrice, plus firstSeenPrice and moveSinceFirstSeen for movement since the first observation. Free — it reuses the state the dedup window already keeps, so there is no extra request and no extra charge. Fields appear from your SECOND run of a market onward (the first run has nothing to compare to).