Alerte email de drops de cotes dans Google Sheets
Réponse : planifiez un déclencheur horaire Apps Script qui appelle GET /v1/drops (ou lit un board IMPORTDATA) et envoie MailApp.sendEmail quand dropPct dépasse votre seuil. Free (retard 30 s) ou Hobby suffisent pour le polling ; le push live reste le WebSocket Builder.
Schéma#
Clé dans Script Properties (pas dans la feuille partagée). Endpoint : /v1/drops?sport=soccer&minutes=10&min_pct=5.
function dropAlert() {
const key = PropertiesService.getScriptProperties().getProperty('PINNFEED_KEY'); // ps_live_...
const url = 'https://pinnfeed.io/v1/drops?sport=soccer&minutes=5&min_pct=5&limit=20';
const res = UrlFetchApp.fetch(url, { headers: { 'x-api-key': key }, muteHttpExceptions: true });
if (res.getResponseCode() !== 200) { console.log(res.getContentText()); return; }
const drops = JSON.parse(res.getContentText()).drops;
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Drops') || ss.insertSheet('Drops');
const seen = new Set(sh.getRange('A:A').getValues().flat().filter(String));
const fresh = drops.filter(d => !seen.has(d.marketId + '|' + d.outcome + '|' + d.movedAt));
if (!fresh.length) return;
fresh.forEach(d => sh.appendRow([d.marketId + '|' + d.outcome + '|' + d.movedAt, d.home, d.away,
d.market, d.outcome, d.from, d.to, d.dropPct, d.movedAt]));
const body = fresh.map(d => `${d.home} v ${d.away}: ${d.market} ${d.outcome} ${d.from} -> ${d.to} (${d.dropPct}%)`).join('\n');
MailApp.sendEmail(Session.getActiveUser().getEmail(), `Pinnacle drops: ${fresh.length}`, body);
}
Lié : dropping odds, Sheets time-driven.
CTA#
Builder (99 €/mois). Essai 3 jours ; carte requise. REST gratuit : inscription.
Questions fréquentes#
Sheets ouvre-t-il le WebSocket ?#
Non — REST planifié.
Contenu éducatif pour adultes ?#
Oui (18+).
Contenu éducatif pour adultes (18+) : ni pronostics ni promesse de gain. En France, seuls les opérateurs agréés par l'ANJ peuvent proposer des paris en ligne.