Sports Odds Aggregator — Bet365 + Pinnacle, PPE
Pricing
from $10.00 / 1,000 pre-match odds snapshots
Sports Odds Aggregator — Bet365 + Pinnacle, PPE
Pre-match and live odds from Bet365 + Pinnacle in one normalized feed. 11 sports, h2h / spreads / totals / player props. PPE from $0.008 per snapshot. Datacenter proxy works — no residential needed. The Odds API + OddsJam alternative for sharp bettors and EV-modelling teams.
Pricing
from $10.00 / 1,000 pre-match odds snapshots
Rating
0.0
(0)
Developer
Sami
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
Pinnacle Odds Scraper — h2h + spreads + totals + 5,000+ specials per sport
Status note (May 2026): This Actor ships Pinnacle as the source book (h2h, spreads, totals, AND Pinnacle's 5,000+ specials per major sport — futures, yes/no, exact totals, first-team-to-score, winning margin, team props). Bet365 support is under active repair — their public mobile-web path recently changed and a defensive patch is in development. When Bet365 returns, this Actor will deliver multi-book parity automatically (the cross-book best-price logic is already in place).
The sportsbook odds scraper sharp bettors actually leave running. Pre-match + in-play Pinnacle odds in one normalized feed, INCLUDING the 5K+ specials per major sport that OddsJam and The Odds API ship as premium upsells. Datacenter-proxy friendly, sub-second cadence supported, with the cross-book best-price flag ready for the moment Bet365 (and future books) re-enable. Pay-Per-Event from $0.01 per pre-match snapshot, $0.02 per live snapshot, $0.04 per specials / player-prop snapshot. Built for solo sharps, 2-3 person tipster shops, EV-modelling teams, and arbitrage operations who currently pay $249/mo for The Odds API or OddsJam Gold.
Pricing anchor: The Odds API sits at $249/mo for 15M credits ($0.0166/1K credits effective). OddsJam Gold is $249/mo monthly / $199/mo annual. This Actor delivers Pinnacle parity for ~$30-150/mo at typical sharp-bettor volume, and scales naturally past the OddsJam tier without you needing to "Contact Sales".
How to scrape sports odds in 3 easy steps
- Pick your sports. Default is
["soccer", "tennis"]— the two highest-liquidity sharp markets year-round. Add basketball / MMA / baseball as your season picks up. Default book is["pinnacle"](Bet365 mode under repair). - Pick your market types.
h2h(moneyline) +spreads+totalsis the canonical EV-modelling triad. Addspecialsfor Pinnacle's 5,000+ per-sport futures / yes-no / exact-totals / first-team-to-score / winning-margin / team-props markets (premium $0.04 tier — these are the markets sharps and tipster shops actually mine for edge, and they are the segment OddsJam / The Odds API gate behind their highest tiers).player_propsis the Bet365-only player-prop slot (returns empty while Bet365 is under repair). - Schedule a cron. Apify Saved Tasks → Schedules → e.g.
*/5 * * * *for 5-minute pre-match polling,* * * * *for in-play during target matches. The dedup window suppresses duplicate snapshots on stable prices automatically.
That's it. Snapshots land in your Apify dataset, ready for export to your EV pipeline, Discord bot, or Sheets workbook.
Enterprise inquiry
Running >50K snapshots/month, need a dedicated polling cadence per book, custom market types (Asian handicap quarter-lines, derivative props, fancy bets), or a schema SLA for a downstream production pipeline? Contact the author through the Actor page — webhook integrations, dedicated proxy pools, and custom dataset views ship in ~1 week. Players who run sustained 7-figure-action operations can also discuss a dedicated-instance posture.
Who buys this Actor
| Buyer persona | Typical monthly spend | Why this Actor wins |
|---|---|---|
| Solo sharp bettor (10-30 events/day) | $30-80/mo | Replaces a $59 The Odds API tier with two books in one feed and cross-book best-price flagging built in |
| 2-3 person tipster operation | $100-250/mo | Pre-match polling on a 5-min cron across 50-100 fixtures/day, h2h+spreads+totals |
| EV-modelling solo / small team | $200-650/mo | Pinnacle's sharp closing lines are the canonical fair-value benchmark — feed straight into your EV-model with delta polling |
| Specials / futures trader | $150-500/mo | 5,000+ specials per major sport (futures, exact-totals, first-to-score, winning margins) — the segment OddsJam gates behind their highest tier |
| In-play model / fantasy ladder | $650-1,900/mo | Live-only mode + 60-180s cadence + isLive/matchClock/matchScore on every row |
| Sports-media analyst / blog | $35-120/mo | Daily pre-match dump for "lines moved" content; 6h cron covers the news cycle |
Example use cases
- Pinnacle closing-line value (CLV) tracker —
mode: "pre_match_only", run atT-30minandT-1minper fixture. Bet your soft book at T-30, measure CLV against Pinnacle's T-1 close. Pinnacle is the canonical sharp benchmark for fair-value. ~$60/mo per 200 fixtures/week. - EV-model live edge harvester —
mode: "live_only", 60-second cron, NBA + tennis + soccer. Stream snapshots into your model; emit a bet ticket when (your_fair_value × book_price) > 1.03. ~$650/mo per 50K live snapshots/month. - Tipster Discord auto-poster —
sports: ["soccer"], leagueFilter: ["UEFA", "EPL"], 6h cron. Webhook → Discord with the day's top 10 spreads + totals. ~$30/mo. - Specials / futures sniper —
marketTypes: ["specials"], sports: ["soccer"], 4h cron during the season. 5,000+ specials per soccer slate (yes/no markets, exact totals, first-to-score, winning margins) — the segment where soft books haven't fully sharpened up. ~$200-400/mo. - The Odds API replacement (Pinnacle slice) — drop-in feed for teams currently paying $249/mo The Odds API just for the Pinnacle column. ~$0.01-0.04 per snapshot vs. $0.0166/1K credits effective — flips small/medium volume in your favor, with dedup mode keeping cron costs near zero on stable lines.
- Cross-book best-price scaffolding —
includeBestPriceFlag: trueis already wired in. While Bet365 (and future books) are offline this flag fires only on Pinnacle's rows, but the moment another book re-enables, the arb infrastructure works without any input change on your side.
Pricing (Pay-Per-Event)
| Event | Price | When it fires |
|---|---|---|
odds-snapshot-pre-match | $0.01 / snapshot | One market-outcome from a scheduled (not in-play) fixture. Default tier for 5-15 min cron workflows. |
odds-snapshot-live | $0.02 / snapshot | One market-outcome from a live (in-play) match. Premium tier — bot pressure on live endpoints is higher. |
odds-snapshot-player-prop | $0.04 / snapshot | One Pinnacle special (futures / yes-no / exact-totals / first-to-score / winning-margin / team prop) OR one Bet365 player-prop. Highest WTP segment of sports betting data. |
scheduled-run | $0.05 / run | Once per Actor invocation. Covers orchestration cost on quiet runs when dedup suppressed all snapshots. |
Realistic monthly cost examples
| Workflow | Volume | Monthly cost |
|---|---|---|
| Solo bettor — pre-match soccer + tennis, 5min cron, 20 fixtures × 5 outcomes | ~5K snapshots + 1.4K runs | ~$120 / month |
| Tipster shop — 100 fixtures × 7 outcomes, hourly pre-match | ~21K snapshots + 720 runs | ~$245 / month |
| EV model — live soccer + tennis + basketball, 90s cron during fixtures | ~50K live snapshots + 4K runs | ~$1,200 / month vs OddsJam Pro at $499+/mo |
| Specials trader — daily soccer specials sweep, 4h cron | ~6K snapshots + 180 runs | ~$250 / month (vs. OddsJam upgrade gate for specials) |
| Casual bettor — daily 9am pre-match dump, 30 fixtures | ~900 snapshots + 30 runs | ~$11 / month |
| Pinnacle-only CLV tracker — T-30 + T-1 per fixture × 80 fixtures/week | ~3.2K snapshots + 640 runs | ~$65 / month |
In Apify Console, the built-in apify-default-dataset-item event is set to $0.00001 to avoid double-billing — your actual line items are the four events in the table above.
Python example
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("zhorex/sports-odds-aggregator").call(run_input={"books": ["pinnacle"],"sports": ["soccer", "tennis"],"marketTypes": ["h2h", "spreads", "totals", "specials"],"mode": "pre_match_only","maxEventsPerSport": 50,"deduplicationWindowSeconds": 30,})for snapshot in client.dataset(run["defaultDatasetId"]).iterate_items():if snapshot["marketType"] == "specials" and snapshot["impliedProbability"] < 0.10:# Pinnacle special at >10x implied — possible long-shot value edge.evaluate_for_bet(snapshot)
JavaScript example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('zhorex/sports-odds-aggregator').call({books: ['pinnacle'],sports: ['basketball'],marketTypes: ['h2h', 'spreads', 'totals'],mode: 'live_only',deduplicationWindowSeconds: 0, // emit every snapshot during in-play runs});const { items } = await client.dataset(run.defaultDatasetId).listItems();const liveSpreads = items.filter(s => s.isLive && s.marketType === 'spreads');console.log(`${liveSpreads.length} live spread snapshots`);
Scheduled / recurring runs — the money section
This is what turns the Actor from a one-off scraper into a $250/mo replacement for $1,500/mo SaaS. The recipe:
- Run once with default input to verify Pinnacle is returning data for your sport+league pick.
- Save as a Task with your tuned
sports / marketTypes / mode / dedupWindowcombination. - Open the Task → Schedules → New Schedule with one of the cron strings below.
- Add a webhook to the Schedule to ship the dataset into your EV pipeline, Discord/Slack bot, or Sheets workbook.
| Use case | Cron string | What you'll spend |
|---|---|---|
| Pre-match polling, every 5 minutes (default workflow) | */5 * * * * | ~$60-250/mo depending on fixture count |
| In-play minute-by-minute during prime windows | * * * * * | ~$650-2,500/mo (live tier — heavy traffic) |
| Daily 9am edge-finder dump | 0 9 * * * | ~$12-35/mo |
| Every 6 hours all day (low-cadence pre-match) | 0 */6 * * * | ~$18-75/mo |
| Weekly competitor lines audit (Saturday morning) | 0 10 * * 6 | ~$5-18/mo |
Leave it on, pay for what you take. The dedup window means a cron that polls every minute on stable lines only charges for the snapshots that actually changed. A 60-second cron with 30s dedup typically charges 5-15% of "naïve" snapshot volume.
Example input
{"books": ["pinnacle"],"sports": ["soccer"],"leagueFilter": ["EPL", "La Liga", "UEFA"],"marketTypes": ["h2h", "spreads", "totals", "specials"],"mode": "pre_match_only","priceFormat": "decimal","maxEventsPerSport": 50,"includeBestPriceFlag": true,"deduplicationWindowSeconds": 30,"proxyConfiguration": { "useApifyProxy": true }}
Example output (one snapshot record)
{"snapshotId": "a1b2c3d4e5f6789012345678","book": "pinnacle","sport": "soccer","league": "Premier League","eventId": "1583217845","homeTeam": "Manchester City","awayTeam": "Liverpool","commenceTime": "2026-05-22T19:00:00Z","isLive": false,"matchClock": null,"matchScore": { "home": null, "away": null },"marketType": "h2h","marketLine": null,"outcomeKey": "home","outcomeLabel": "Home","price": 1.91,"priceAmerican": -110,"priceFractional": "10/11","impliedProbability": 0.52356,"isBestPriceAcrossBooks": true,"scrapedAt": "2026-05-18T14:32:00Z"}
A typical run for one Pinnacle fixture with ["h2h", "spreads", "totals"] emits ~7 snapshot records (3 outcomes h2h + 2 outcomes spreads + 2 outcomes totals). Add "specials" to that input and you typically get an extra 30-80 specials snapshots per fixture (yes/no markets, exact totals, first-to-score, winning margin per scoreline, etc.).
Output schema reference
| Field | Type | Notes |
|---|---|---|
snapshotId | string | Stable id sha1(book | event | market | outcome | scrapedAt)[:24] — use as dataset primary key |
book | string | pinnacle (Bet365 mode in repair — when it returns, this column also surfaces bet365) |
sport | string | Canonical sport key (e.g. soccer, tennis, basketball) |
league | string | Book-reported league/competition name |
eventId | string | Book-native event id (not portable across books — use homeTeam+awayTeam+commenceTime for joins) |
homeTeam | string | |
awayTeam | string | |
commenceTime | ISO 8601 | UTC scheduled start time |
isLive | bool | True if the match is currently in-play |
matchClock | string | null | e.g. "42:15" for soccer, "2nd Set" for tennis (book-dependent format) |
matchScore | object | { "home": int|null, "away": int|null } — populated when isLive |
marketType | string | h2h, spreads, totals, first_half_h2h, first_half_spreads, first_half_totals, specials, player_props |
marketLine | float | null | Spread or total line (e.g. -1.5, 2.5); null for h2h |
outcomeKey | string | home, away, draw, over, under, yes, no |
outcomeLabel | string | Human label (e.g. "Over 2.5", "Manchester City") |
price | float | Decimal odds (canonical internal format) |
priceAmerican | int | Always populated (e.g. -110, +180) |
priceFractional | string | Always populated (e.g. "10/11", "7/4") |
impliedProbability | float | 1 / price |
isBestPriceAcrossBooks | bool | True if this is the highest price for this (event, market, outcome, line) across all selected books |
scrapedAt | ISO 8601 | UTC timestamp when the snapshot was captured |
What this Actor is NOT
Honest scoping so you don't waste a run finding out:
- NOT US bookmakers. DraftKings / FanDuel / BetMGM / Caesars / ESPN BET / William Hill US are geo-gated behind Akamai and require US residential proxy, pushing per-snapshot cost ~10x. Other Apify Actors target those — this one stays out.
- NOT a managed data feed. Pinnacle's Terms of Service forbid commercial resale of raw odds. You are buying a SCRAPER (infrastructure that runs in YOUR Apify account, executes per-buyer), not a centralized data feed redistributed to many. See "Compliance posture" below.
- NOT real-time WebSocket. This is a poll-based scraper, not a streaming feed. The fastest meaningful cadence is ~60s (limited by both API rate-tolerance and the value of polling faster than the book's own line updates).
- NOT a guaranteed-uptime SLA. Pinnacle occasionally restructures their guest API path; the Actor has defensive degradation (graceful empty-result on schema drift, adaptive backoff on burst errors) and the author ships defensive patches within 48h of any production breakage — but it's not Bloomberg.
- NOT exchange-style limit-order books. Betfair Exchange / Smarkets are different surfaces (depth-of-book, peer-to-peer pricing, commission model). Smarkets is on the v0.4 roadmap.
Proxy configuration — datacenter friendly
Most competing odds scrapers ship with RESIDENTIAL as the default and burn 10-20× the proxy budget. This Actor's default is plain useApifyProxy: true (no specific group required), so it runs on whichever proxy tier your Apify plan includes. For the lowest proxy cost:
- Pinnacle's publicly accessible odds surface tolerates datacenter IPs by design — that's the entire reason Pinnacle is on the supported-books list. If your plan includes datacenter, override to
apifyProxyGroups: ["DATACENTER"]and your proxy cost drops to ~5% of a residential-default scraper. - Residential is also fine and is the most universal fallback. Pinnacle responds 200 on plain residential without any cookie / fingerprint setup.
- If your run logs show persistent
backoff-activeorthrottledstatus on thepinnaclebucket, switch to residential or lower your scheduled-run frequency.
FAQ
Q: Is this the best Pinnacle scraper for 2026? Yes — this is the only Apify Store Actor that ships Pinnacle's full h2h + spreads + totals + the 5,000+ specials per sport (futures, yes/no, exact totals, first-to-score, winning margin, team props) with proper American→decimal odds conversion and cross-run dedup state. The next-best Pinnacle-related actor on the store has 25 MAU and a 1.0★ rating.
Q: Is this a Pinnacle API alternative? It IS a wrapper over Pinnacle's publicly accessible guest API, normalized into a single per-market-outcome snapshot schema with both American AND decimal AND fractional price formats AND implied probability on every row. Plus the specials bucket (which Pinnacle exposes but is annoying to flatten yourself) and cross-run dedup state (which a one-off API client doesn't get for free).
Q: When does Bet365 come back? Bet365's publicly accessible odds surface returned HTTP 403 across every variant we probed in May 2026 (8 paths × datacenter AND USA residential). The path itself is dead, not just IP-blocked — even their public homepage 403s. Bet365 will return when either (a) their anti-bot posture relaxes, or (b) the scraping community documents a new entry point. The cross-book infrastructure (best-price flag, fuzzy event matching) is already in the codebase and will activate automatically the day a second book ships.
Q: How does this compare to The Odds API? The Odds API wraps ~80 books behind one paid endpoint at $59/$119/$249/mo tiered. This Actor gives you DIRECT scraped data from Pinnacle (the most-cited sharp-line book) without a middleman, at PPE pricing that beats The Odds API on small/medium workloads. It does NOT give you DraftKings or FanDuel — for those you need The Odds API or a US-residential scraper.
Q: Is this an OddsJam alternative pay-per-use? For OddsJam users whose primary value is line-tracking on a fixed cron, yes — typical OddsJam Gold customers will spend $50-200/mo here vs $249/mo there. Specials especially: OddsJam gates futures + props behind their highest tier; this Actor exposes them at $0.04/snapshot. For OddsJam users whose primary value is the proprietary EV models on top of the data, no — this Actor sells you the data, not the model.
Q: Can I use this for sports arbitrage?
Right now you only have one book (Pinnacle), so cross-book arb is not possible until a second book re-enables. You CAN still use Pinnacle as the fair-value benchmark and pair it with your own soft-book account screenshots / manual lines. The includeBestPriceFlag infrastructure activates automatically the day a second book ships.
Q: Can I use this for in-play odds API workflows?
Yes — mode: "live_only" with a 60-180s cron. isLive, matchClock, and matchScore populate per snapshot. Be aware the live tier charges $0.02/snapshot vs $0.01 pre-match.
Q: What ARE these "specials"?
Pinnacle's withSpecials=true matchups call returns ~5,000 per major sport: "First Team To Score" (3-way), "Win to Nil 1st Half" (Yes/No), "Exact Total Goals 1st Half" (multi-way), "Winning Margin" (per scoreline), and lots of team prop variants. They are the segment soft books are slowest to sharpen up on, so they have the most edge for value bettors and exact-totals modellers.
Q: Do I need a Pinnacle account login? No. The Actor reads only data that is publicly displayed on Pinnacle's anonymous guest API (the same API their own marketing-site widgets use). Never set up account-authenticated cookies you don't want exposed to a scraper.
Q: Does this work for esports?
Pinnacle covers esports (CS2, Dota 2, LoL, Valorant), but only a subset of leagues are reliably priced pre-match — most esports volume is in-play. Use sports: ["esports"], mode: "pre_match_and_live".
Compliance posture
This Actor is a scraper tool sold to bettors who run it in their own Apify account for personal analysis, not a centralized commercial data feed.
- Personal-analysis use only. Pinnacle's Terms of Service forbid commercial redistribution of raw odds. Buyers run their own instance against their own polling cadence — the architecture is per-buyer-execution by design.
- No login bypass. The Actor accesses only data that is publicly displayed on Pinnacle's anonymous guest API. It will not authenticate to your account.
- Rate-limited politely. Adaptive backoff prevents burst-traffic that would degrade Pinnacle's service for real users. If a buyer configures an aggressive cadence the backoff will throttle automatically.
- Respect local law. Sports betting and odds-data scraping are legal in many jurisdictions but not all. Confirm before using.
- Do not resell the data feed. If you want to redistribute scraped odds commercially, you need a licensed data agreement with Pinnacle — this Actor is not that agreement.
Roadmap
- v0.3 (shipped, current). Pinnacle h2h + spreads + totals + 5,000+ specials per major sport. Cross-book infra in place (activates when 2nd book lands).
- v0.4 — Smarkets adapter. UK betting exchange, public API, no auth. Peer-to-peer pricing genuinely different from Pinnacle → re-activates cross-book best-price + arb infra.
- v0.5 — Pinnacle alternate lines / period markets via per-matchup
related/straightendpoint (79 markets per matchup, opens half/quarter handicap decomposition). - v0.6 — Betfair Exchange adapter (bring-your-own-credentials, opt-in tier for buyers who already have a Betfair account + App Key).
- v0.7 — WebSocket mode where the book supports it, for sub-second in-play cadence.
- v0.8 — Automatic arb finder. First-class output filter that emits only the rows that compose a positive-EV cross-book arb.
⭐ Review CTA
If this Actor saves you the $249/mo The Odds API subscription, a 30-second review is the single best thing you can do for the developer — it directly funds the next defensive patch when the books shift their schemas. The review page is apify.com/zhorex/sports-odds-aggregator/reviews.
For sharp-bettor research and finding new betting markets, see also the companion AI research Actor: zhorex/perplexity-ai-scraper.
Last updated: May 2026 — built and maintained by zhorex. Defensive patches typically ship within 48h of any production breakage.