What you are actually installing
No dependencies. The client uses standard fetch, AbortController and WebCrypto, and imports nothing from node:*, so there is no tree of transitive packages to audit and nothing for a bundler targeting the edge to polyfill. It ships both ESM and CommonJS, so import and require both work.
That makes the runtime list short and boring, which is the point: Node 18 and later, Deno, Bun, Cloudflare Workers, Vercel Edge and browsers. The webhook signature verification uses WebCrypto rather than node:crypto for the same reason — one implementation, working the same way in a Worker and in a container.
Coverage is the whole customer-facing surface: live racing prices, the change feed, best odds across bookmakers, market movers, settled results, horse and greyhound form, premiership tables, track conditions, the permanent closing-line archive, Australian sports odds and signed webhooks. Price ingestion, key creation and signup are deliberately left out — those are not endpoints a client library should invite you to call.
- Zero dependencies
- ESM and CommonJS in one package
- Node, Deno, Bun, Workers, Vercel Edge, browsers
- Full TypeScript types, generated from the schema
- MIT licensed
Example API calls
npm install puntersedge
# ESM
import { PuntersEdge } from "puntersedge";
# CommonJS
const { PuntersEdge } = require("puntersedge");
# No key at all? The sandbox needs none and costs nothing.
const pe = new PuntersEdge();
const { races } = await pe.demo.nextToGo();
# With a key — free tier, no credit card:
const live = new PuntersEdge({ apiKey: process.env.PUNTERSEDGE_API_KEY });
const board = await live.racing.bestOdds({ numRaces: 3 });
curl "https://api.puntersedge.online/v1/racing/next-to-go?num_races=5" \
-H "X-API-Key: YOUR_API_KEY"