Screen Pinnacle odds for EV with fairProb in Python
Answer: Each outcome on GET /v1/odds includes decimal, fair (no-vig decimal) and usually fairProb. Compare another book’s decimal to Pinnacle’s fair (or to 1/fairProb) to flag positive expected value. This is educational screening, not a tip service.
Main-line soccer screen#
import os, requests
KEY = os.environ["PINNFEED_KEY"]
r = requests.get(
"https://pinnfeed.io/v1/odds",
headers={"x-api-key": KEY},
params={"sport": "soccer", "market": "moneyline", "main": "true", "limit": 40},
timeout=20,
)
r.raise_for_status()
# Example: soft book prices you already scraped elsewhere
soft = {("Home FC", "Away United", "home"): 2.40}
for ev in r.json().get("events", []):
key = (ev.get("home"), ev.get("away"))
m = next((x for x in ev.get("markets", []) if x.get("type") == "moneyline"), None)
if not m:
continue
for o in m.get("outcomes", []):
name = o.get("name") # home / away / draw
fair = o.get("fair") or (1 / o["fairProb"] if o.get("fairProb") else None)
soft_dec = soft.get((*key, name))
if fair and soft_dec and soft_dec > fair * 1.02:
print(ev["home"], "v", ev["away"], name, "soft", soft_dec, "fair", round(fair, 3))
Uses only published REST fields from /openapi.json. Free works (delayed). Live push: Builder (€99/mo). Paid plans: 3-day trial; a card is required and it is charged after day 3 unless you cancel. See also the value-betting guide. Educational content for adults (18+). No guaranteed profit.
Questions people ask#
Is fair the same as fairProb?#
fair is the no-vig decimal price; fairProb is the implied fair probability (≈ 1/fair after vig removal). Prefer the field your client already stores.
Does this find arb?#
No — it screens one sharp book (Pinnacle via PinnFeed) against another price you supply. For multi-book arb you need another data source; PinnFeed is Pinnacle-only.