pinnapi
v0.1.0
Published
Real-time Pinnacle odds & drop alerts — REST snapshots and SSE drop streams from pinnapi.com, the drop-in alternative to the closed Pinnacle API. Zero dependencies.
Downloads
164
Maintainers
Readme
pinnapi — Pinnacle odds API for Node.js / TypeScript
Real-time Pinnacle odds and drop alerts in JavaScript: REST snapshots of live + prematch markets, and Server-Sent-Events streams that push every odds drop to your code in ~15–40 ms. Zero dependencies (Node 18+).
npm install pinnapiDoes Pinnacle still have a public API? No — Pinnacle closed its public API on July 23, 2025 (only bespoke commercial/academic access remains). pinnapi.com is an independent drop-in replacement: the same familiar response shape, served from its own real-time feed. No Pinnacle account needed — your API key is your login, and a free trial key takes seconds (no card).
Quickstart
import { Client, SPORTS } from "pinnapi"; // or: const { Client, SPORTS } = require("pinnapi")
const api = new Client("YOUR_KEY"); // free trial key at https://pinnapi.com/
// Live soccer markets (moneyline, spreads, totals, team totals — every period)
const events = await api.markets({ sportId: SPORTS.soccer });
// Prematch instead of live
const fixtures = await api.prematchFixtures({ sportId: SPORTS.tennis });
// What just dropped? (queryable buffer, no open connection needed)
const recent = await api.drops({ mode: "live", minDropPct: 5 });Real-time drop alerts (SSE)
Stream every market whose price falls past your threshold, the instant it happens — the feed for steam chasing, dropping-odds alerts, and arbitrage windows:
// Requires a plan with SSE (Drops / Edge / Scale)
for await (const drop of api.streamDrops({ mode: "live", minDrop: 5 })) {
console.log(`${drop.home} v ${drop.away} · ${drop.market} ` +
`${drop.from} → ${drop.to} (▼${drop.drop_pct}%)`);
}mode: "prematch" streams pre-game drops (optional recheck: N holds an alert N seconds and re-verifies). Reconnects automatically on network hiccups; auth/plan errors throw. Pass an AbortSignal to stop cleanly.
Why Pinnacle's line?
Pinnacle is the market's reference price — the sharp line the rest of the market follows. When it breaks, soft books take seconds to correct; everything in between is your window. A polled aggregator hears about the move on its next cycle; this feed is push, not poll.
API surface
| Method | Endpoint | What it returns |
|---|---|---|
| markets({sportId, eventType}) | GET /kit/v1/markets | Live (default) or prematch markets for a sport |
| details(eventId) | GET /kit/v1/details | One live event |
| prematchFixtures({sportId}) | GET /kit/v1/prematch/fixtures | All prematch fixtures + markets |
| prematchMarkets(eventId) | GET /kit/v1/prematch/markets | Markets for one prematch event |
| prematchLines(eventId) | GET /kit/v1/prematch/lines | Compact line view |
| drops({mode, ...}) | GET /api/drops | Recent dropping-odds buffer (filterable) |
| streamDrops({mode, minDrop}) | SSE /odds-drop[-prematch] | Async generator of drop alerts |
| health() / ping() | GET /health / /ping | Service status / liveness |
Sports (SPORTS): soccer=1, tennis=2, basketball=3, hockey=4, football=5, baseball=6, rugby=7, mma=8, boxing=9, other=10, esports=11, golf=12. TypeScript types ship in the box (index.d.ts).
Errors: AuthError (bad key / plan lacks the surface), RateLimitError (with .retryAfter seconds), PinnapiError (everything else, with .status and .payload).
Pricing & limits
Free trial: 100 REST requests/day, no card. Paid plans from $99/mo (SSE drop streams, 10–30 req/sec REST, raw WebSocket add-on). Full details: pinnapi.com · API docs · LLM-friendly reference · Python: pip install pinnapi.
Notes
- Real-time feed only (live + prematch) — no historical archive; buffer the stream yourself if you need history.
- One concurrent SSE connection per account per stream (live and prematch counted separately).
- pinnapi is an independent service, not affiliated with or endorsed by Pinnacle.
MIT licensed.
