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

Cotes Pinnacle dans Supabase avec une Edge Function

Mis à jour le · PinnFeed · 2 min de lecture

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.

Le plan WebSocket : Builder, 99 €/mois.

Les cotes Pinnacle en temps réel sur un seul WebSocket : les 13 sports, tous les marchés, cotes justes sans marge et cotes de clôture. 3 jours gratuits, résiliable en un clic.

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.