import requests, os
API = "https://pinnfeed.io/v1/odds"
r = requests.get(API, params={"sport": "soccer", "market": "moneyline", "main": "true"},
headers={"x-api-key": os.environ["PINNSOCKET_KEY"]}, timeout=10)
r.raise_for_status()
def soft_price(event, outcome):
"""Return the price your other bookmaker offers (your own scraper/API)."""
return None
for ev in r.json()["events"]:
for m in ev["markets"]:
for o in m["outcomes"]:
soft = soft_price(ev, o["name"])
if soft and soft > o["fair"]:
edge = soft / o["fair"] - 1
print(f'{ev["home"]} v {ev["away"]} {o["name"]}: {soft} vs fair {o["fair"]} (+{edge:.1%})')
import requests, os
H = {"x-api-key": os.environ["PINNSOCKET_KEY"]}
def clv(event_id, market_key, outcome, price_taken):
r = requests.get(f"https://pinnfeed.io/v1/closing/{event_id}", headers=H, timeout=10).json()
m = next(x["market"] for x in r["markets"] if x["market"]["key"] == market_key)
fair_close = next(o["fair"] for o in m["outcomes"] if o["name"] == outcome)
return price_taken / fair_close - 1 # > 0 means you beat the closing line
print(clv(1639922643, "s;0;m", "home", 2.10))
<script>
// Keys in browsers are visible to users: use a dedicated key, or proxy through your backend.
const ws = new WebSocket('wss://pinnfeed.io/v1/stream?key=YOUR_KEY&sports=tennis');
ws.onmessage = (e) => {
const msg = JSON.parse(e.data);
if (msg.type === 'ping') ws.send('{"type":"pong"}');
if (msg.type === 'delta') console.log(msg.changes.length, 'changes');
};
</script>