On the wire · 04:51:19 UTC Live 550 · Prematch 14,382 · Markets 57,006 Vol. I · No. 5 · Friday 13 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
Tutorial · Python · FastAPI

Proxy de odds Pinnacle com FastAPI

Atualizado em · PinnFeed · 1 min de leitura

Resposta: rode uma app FastAPI pequena que leia PINNFEED_KEY do ambiente, chame /v1/odds com httpx, faça cache por alguns segundos e devolva só os campos úteis. O browser fala com a sua API; a chave não sai do servidor.

app.py#

import os, time
import httpx
from fastapi import FastAPI, HTTPException

KEY = os.environ["PINNFEED_KEY"]            # ps_live_...
API = "https://pinnfeed.io/v1"
TTL = 5                                     # seconds
cache: dict[str, tuple[float, list]] = {}
app = FastAPI()
client = httpx.AsyncClient(headers={"x-api-key": KEY}, timeout=10)

@app.get("/odds/{sport}")
async def odds(sport: str, q: str | None = None):
    ck = f"{sport}|{q}"
    hit = cache.get(ck)
    if hit and time.time() - hit[0] < TTL:
        return hit[1]
    params = {"sport": sport, "market": "moneyline", "main": "true", "limit": 100}
    if q:
        params["q"] = q
    r = await client.get(f"{API}/odds", params=params)
    if r.status_code != 200:
        raise HTTPException(r.status_code, r.json().get("error", {}).get("message", "upstream error"))
    rows = [
        {"id": e["id"], "home": e["home"], "away": e["away"], "start": e["startTime"], "live": e["live"],
         "prices": {o["name"]: o["decimal"] for m in e["markets"] for o in m["outcomes"]},
         "maxStake": max((m["maxStake"] or 0) for m in e["markets"]) if e["markets"] else None}
        for e in r.json()["events"]
    ]
    cache[ck] = (time.time(), rows)
    return rows

Rode com pip install fastapi uvicorn httpx e uvicorn app:app --port 8000, depois /odds/soccer?q=arsenal.

CTA#

Builder (€99/mês). Teste de 3 dias; cartão obrigatório. REST gratis: signup. Outros hosts: Cloudflare Worker, Supabase. Relacionado: JS browser / CORS.

Perguntas frequentes#

Por que não chamar o PinnFeed do JavaScript?#

CORS permite, mas a chave ficaria pública: JS browser e CORS.

A cache deixa odds velhas?#

Até TTL segundos. 1–5 s para prematch; WebSocket para live.

Posso usar Flask?#

Sim; o mesmo padrão com requests e um dict cache.

Conteúdo educativo para maiores de 18 anos. Sem palpites nem lucro garantido. No Brasil, aposte apenas em operadores autorizados pela SPA/MF.

O plano WebSocket: Builder, €99/mês.

Odds da Pinnacle em tempo real por um único WebSocket: os 13 esportes, todos os mercados, odds justas sem margem e odds de fechamento. 3 dias grátis, cancele com um clique.

Form K-1 · Free API key

Get your free API key.

One field. No password, no card: enter your email, click the link we send, and your key is on screen.

By continuing you agree to the Terms and Privacy Policy.

One free key per email. Link valid for 20 minutes.