Cotes Pinnacle dans Supabase avec une Edge Function
Réponse : gardez la clé API en secret Supabase, écrivez une Edge Function qui appelle GET /v1/drops (ou /v1/odds) et upsert les lignes via le client admin @supabase/server, puis laissez pg_cron + pg_net l'appeler chaque minute avec une clé secrète dans Vault. Les Edge Functions sont courtes — c'est du polling REST, pas un listener WebSocket. Marche sur Free (retard 30 s, 2 sports) et en temps réel dès Hobby.
1. Table#
create table if not exists pinnacle_drops (
event_id bigint, market_id text, outcome text,
price_from numeric, price_to numeric, drop_pct numeric,
moved_at timestamptz, home text, away text,
primary key (market_id, outcome, moved_at)
);
2. Secret#
supabase secrets set PINNFEED_KEY=ps_live_your_key
3. Function supabase/functions/pinnfeed-drops/index.ts#
import { withSupabase } from 'npm:@supabase/server@1';
// auth: 'secret' accepts only callers that send your project's secret key on the apikey header
export default {
fetch: withSupabase({ auth: 'secret' }, async (_req, ctx) => {
const r = await fetch('https://pinnfeed.io/v1/drops?sport=soccer&minutes=5&min_pct=3&limit=100', {
headers: { 'x-api-key': Deno.env.get('PINNFEED_KEY')! },
});
if (!r.ok) return new Response(await r.text(), { status: r.status });
const { drops } = await r.json();
const rows = drops.map((d: any) => ({
event_id: d.eventId, market_id: d.marketId, outcome: d.outcome,
price_from: d.from, price_to: d.to, drop_pct: d.dropPct,
moved_at: d.movedAt, home: d.home, away: d.away,
}));
const { error } = await ctx.supabaseAdmin.from('pinnacle_drops').upsert(rows, { ignoreDuplicates: true });
return Response.json({ saved: rows.length, error: error?.message ?? null });
}),
};
4. Déploiement#
Déployez la fonction, stockez l'URL projet et la service role dans Vault, planifiez pg_cron pour un net.http_post minute par minute (auth apikey). Détails cron : doc EN Supabase Edge. Lié : Cloudflare Worker, CORS.
CTA#
Builder (99 €/mois). Essai 3 jours ; carte requise. REST gratuit : inscription.
Questions fréquentes#
Peut-on streamer le WebSocket depuis une Edge Function ?#
Non — trop courte. Polling REST ici ; WS sur un serveur long-running (Builder).
Free suffit-il ?#
Oui pour prototyper (retard 30 s, 2 sports, 1 000/jour).
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.