Sports Odds Aggregator — Bet365 + Pinnacle, PPE avatar

Sports Odds Aggregator — Bet365 + Pinnacle, PPE

Pricing

from $10.00 / 1,000 pre-match odds snapshots

Go to Apify Store
Sports Odds Aggregator — Bet365 + Pinnacle, PPE

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

Sami

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 hours ago

Last modified

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

  1. 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).
  2. Pick your market types. h2h (moneyline) + spreads + totals is the canonical EV-modelling triad. Add specials for 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_props is the Bet365-only player-prop slot (returns empty while Bet365 is under repair).
  3. 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 personaTypical monthly spendWhy this Actor wins
Solo sharp bettor (10-30 events/day)$30-80/moReplaces 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/moPre-match polling on a 5-min cron across 50-100 fixtures/day, h2h+spreads+totals
EV-modelling solo / small team$200-650/moPinnacle's sharp closing lines are the canonical fair-value benchmark — feed straight into your EV-model with delta polling
Specials / futures trader$150-500/mo5,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/moLive-only mode + 60-180s cadence + isLive/matchClock/matchScore on every row
Sports-media analyst / blog$35-120/moDaily pre-match dump for "lines moved" content; 6h cron covers the news cycle

Example use cases

  1. Pinnacle closing-line value (CLV) trackermode: "pre_match_only", run at T-30min and T-1min per 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.
  2. EV-model live edge harvestermode: "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.
  3. Tipster Discord auto-postersports: ["soccer"], leagueFilter: ["UEFA", "EPL"], 6h cron. Webhook → Discord with the day's top 10 spreads + totals. ~$30/mo.
  4. Specials / futures snipermarketTypes: ["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.
  5. 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.
  6. Cross-book best-price scaffoldingincludeBestPriceFlag: true is 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)

EventPriceWhen it fires
odds-snapshot-pre-match$0.01 / snapshotOne market-outcome from a scheduled (not in-play) fixture. Default tier for 5-15 min cron workflows.
odds-snapshot-live$0.02 / snapshotOne market-outcome from a live (in-play) match. Premium tier — bot pressure on live endpoints is higher.
odds-snapshot-player-prop$0.04 / snapshotOne 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 / runOnce per Actor invocation. Covers orchestration cost on quiet runs when dedup suppressed all snapshots.

Realistic monthly cost examples

WorkflowVolumeMonthly 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 ApifyClient
client = 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:

  1. Run once with default input to verify Pinnacle is returning data for your sport+league pick.
  2. Save as a Task with your tuned sports / marketTypes / mode / dedupWindow combination.
  3. Open the Task → Schedules → New Schedule with one of the cron strings below.
  4. Add a webhook to the Schedule to ship the dataset into your EV pipeline, Discord/Slack bot, or Sheets workbook.
Use caseCron stringWhat 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 dump0 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

FieldTypeNotes
snapshotIdstringStable id sha1(book | event | market | outcome | scrapedAt)[:24] — use as dataset primary key
bookstringpinnacle (Bet365 mode in repair — when it returns, this column also surfaces bet365)
sportstringCanonical sport key (e.g. soccer, tennis, basketball)
leaguestringBook-reported league/competition name
eventIdstringBook-native event id (not portable across books — use homeTeam+awayTeam+commenceTime for joins)
homeTeamstring
awayTeamstring
commenceTimeISO 8601UTC scheduled start time
isLiveboolTrue if the match is currently in-play
matchClockstring | nulle.g. "42:15" for soccer, "2nd Set" for tennis (book-dependent format)
matchScoreobject{ "home": int|null, "away": int|null } — populated when isLive
marketTypestringh2h, spreads, totals, first_half_h2h, first_half_spreads, first_half_totals, specials, player_props
marketLinefloat | nullSpread or total line (e.g. -1.5, 2.5); null for h2h
outcomeKeystringhome, away, draw, over, under, yes, no
outcomeLabelstringHuman label (e.g. "Over 2.5", "Manchester City")
pricefloatDecimal odds (canonical internal format)
priceAmericanintAlways populated (e.g. -110, +180)
priceFractionalstringAlways populated (e.g. "10/11", "7/4")
impliedProbabilityfloat1 / price
isBestPriceAcrossBooksboolTrue if this is the highest price for this (event, market, outcome, line) across all selected books
scrapedAtISO 8601UTC 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-active or throttled status on the pinnacle bucket, 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/straight endpoint (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.