Quote Pinnacle in Google Sheets
Questa guida scrive le quote 1X2 del calcio di Pinnacle in un foglio Google Sheets: una riga per partita, con quote decimali, quote eque senza margine e il margine del mercato. Un attivatore a tempo aggiorna il foglio ogni 15 minuti. Lo script usa l'API REST di PinnFeed, quindi funziona sul piano Free (0 €, 30 secondi di ritardo, 1.000 richieste/giorno).
Passo 1 — Ottieni una chiave Free#
- Crea un account su pinnfeed.io e apri la dashboard.
- Crea una chiave e copiala. Le chiavi hanno la forma
pf_live_…. - Su Free, scegli fino a due sport nella dashboard. Lo script usa il calcio (
soccer) di default; cambiaSPORTse ne hai scelto un altro.
Per Sheets non ti serve Builder. Builder (99 €/mese, il piano WebSocket) è per client push in tempo reale come quelli della guida Python e Node.
Passo 2 — Crea il foglio di calcolo#
- Crea un nuovo foglio Google Sheets.
- Rinomina il primo foglio in Odds (nome esatto; lo script lo cerca così).
- Apri Estensioni → Apps Script. Cancella la funzione di esempio
myFunctione lascia il progetto vuoto per il passo successivo.
Passo 3 — Incolla lo script e imposta le proprietà#
Incolla questo in Code.gs:
// Google Apps Script: Estensioni → Apps Script, incolla questo file.
// Proprietà dello script (Impostazioni progetto → Proprietà dello script):
// PINNFEED_BASE = https://pinnfeed.io
// PINNFEED_KEY = pf_live_...
// Crea un foglio chiamato "Odds", esegui refreshOdds una volta, poi aggiungi un attivatore ogni 15 minuti.
const PROPS = PropertiesService.getScriptProperties();
const BASE = PROPS.getProperty('PINNFEED_BASE') || 'https://pinnfeed.io';
const KEY = PROPS.getProperty('PINNFEED_KEY');
const SPORT = 'soccer'; // cambialo in basketball, tennis, … (deve essere nel tuo piano)
function refreshOdds() {
if (!KEY) {
console.error('Set script property PINNFEED_KEY first');
return;
}
const url = BASE + '/v1/odds'
+ '?sport=' + encodeURIComponent(SPORT)
+ '&market=moneyline&main=true&live=false&limit=500';
const res = UrlFetchApp.fetch(url, {
headers: { 'x-api-key': KEY },
muteHttpExceptions: true,
});
const code = res.getResponseCode();
if (code !== 200) {
console.warn('PinnFeed HTTP ' + code + ': ' + res.getContentText().slice(0, 300));
return; // se la chiamata fallisce, il foglio resta com'è
}
const data = JSON.parse(res.getContentText());
const rows = [];
for (const ev of data.events || []) {
const ml = (ev.markets || []).find((m) => m.type === 'moneyline' && m.main);
if (!ml) continue;
const byName = {};
for (const o of ml.outcomes || []) byName[o.name] = o;
const home = byName.home || {};
const draw = byName.draw || {};
const away = byName.away || {};
rows.push([
ev.startTime ? new Date(ev.startTime) : '',
(ev.league && ev.league.name) || '',
ev.home || '',
ev.away || '',
home.decimal || '',
draw.decimal || '',
away.decimal || '',
home.fair || '',
draw.fair || '',
away.fair || '',
ml.margin != null ? ml.margin : '',
ev.id,
]);
}
const sheet = SpreadsheetApp.getActive().getSheetByName('Odds');
if (!sheet) {
console.error('Create a tab named Odds first');
return;
}
sheet.clearContents();
sheet.appendRow([
'Starts', 'League', 'Home', 'Away',
'1', 'X', '2',
'Fair 1', 'Fair X', 'Fair 2',
'Margin', 'Event id',
]);
if (rows.length) {
sheet.getRange(2, 1, rows.length, 12).setValues(rows);
}
console.log('Wrote ' + rows.length + ' moneyline rows for ' + SPORT);
}
Poi apri l'ingranaggio del progetto (Impostazioni progetto) e, in Proprietà dello script, aggiungi:
| Proprietà | Valore |
|---|---|
PINNFEED_KEY | la tua chiave (pf_live_…) |
PINNFEED_BASE | https://pinnfeed.io (opzionale; è il valore predefinito) |
Non incollare mai la chiave nelle celle del foglio e non condividere pubblicamente il progetto Apps Script.
Passo 4 — Eseguilo una volta e autorizzalo#
- Scegli
refreshOddsnel menu delle funzioni e premi Esegui. - Google ti chiederà il permesso di connettersi a un servizio esterno e modificare il foglio. Concedilo per il tuo account.
- Ricarica il foglio. Il foglio Odds dovrebbe mostrare le colonne
Starts,League,Home,Away,1,X,2, le tre quote eque,MarginedEvent id.
Se una chiamata fallisce (chiave sbagliata, limite di richieste, sport fuori dal tuo piano), lo script registra un avviso e lascia le righe precedenti com'erano, così un minuto storto non svuota mai la tua tabella.
Passo 5 — Aggiungi un attivatore ogni 15 minuti#
- In Apps Script apri Attivatori (icona dell'orologio) → Aggiungi attivatore.
- Funzione:
refreshOdds. Origine evento: Basato sul tempo. Tipo: Timer minuti. Intervallo: Ogni 15 minuti. - Salva.
Sono 96 chiamate al giorno per uno sport, ben sotto le 1.000 richieste/giorno e 1 req/s del piano Free. Due sport ogni 30 minuti fanno sempre 96. Vedi piani e limiti (in inglese).
| Attivatore | Chiamate / giorno | Rientra in Free? |
|---|---|---|
| Ogni 15 min, 1 sport | 96 | sì |
| Ogni 30 min, 2 sport | 96 | sì |
| Ogni 15 min, 2 sport | 192 | sì |
| Ogni minuto, 1 sport | 1.440 | no — serve Hobby o superiore (senza limite giornaliero) |
Apps Script ha anche le sue quote; l'attivatore a tempo più breve è di un minuto.
Passo 6 — Leggi quote eque e margini#
Ogni riga 1X2 riporta i campi senza margine di PinnFeed descritti nello schema:
Fair 1/Fair X/Fair 2— la quota decimalefairdi ogni esito (margine rimosso, metodo moltiplicativo).Margin— ilmargindel mercato (aggio = somma delle probabilità implicite − 1).
Usa queste colonne quando confronti la quota di un bookmaker soft in un altro foglio: il valore atteso è soft × (1 / fair) − 1, lo stesso calcolo della guida al value betting. Per gli steam move live, Sheets non è lo strumento giusto: usa il WebSocket di Builder e la guida al rilevamento dello steam.
Domande frequenti#
Quale piano di PinnFeed mi serve?#
Free basta per una tabella in ritardo che si aggiorna ogni pochi minuti. Hobby (29 €/mese) toglie il limite giornaliero e i 30 secondi di ritardo, ma resta solo REST. Il push in tempo reale richiede Builder (99 €/mese).
Perché lo script usa x-api-key invece di un parametro nell'URL?#
È l'header di autenticazione consigliato nella documentazione. UrlFetchApp di Apps Script può inviare header, quindi non c'è motivo di mettere la chiave nell'URL (dove può finire nei log).
Posso fare un grafico dello storico dei prezzi?#
Sì. Lascia il foglio Odds come tabella live (viene svuotato e riscritto a ogni esecuzione). Aggiungi un secondo foglio che si limita ad accodare righe dopo ogni aggiornamento e inserisci un grafico a linee. Non cancellare il foglio dello storico.
È un contenuto educativo per maggiorenni?#
Sì. I dati sulle quote e gli strumenti per fogli di calcolo sono materiale educativo per maggiori di 18 anni. Niente di tutto questo è un pronostico, una scommessa sicura o una promessa di guadagno.
Correlati#
- Riferimento dell'API REST (in inglese) — filtri e paginazione di
/v1/odds - Value betting con quote eque senza margine
- Bot di pronostici per Telegram — se il foglio non ti basta più
- Prezzi