Punts is free and independent. We earn a commission when you join a licensed bookmaker through our links; it never changes a tip.Free and independent: we earn from our links, never from a tip. 18+.

Betting odds API for South Africa

The Punts betting odds API gives your code every sure bet, value bet, tip and market price from 25 licensed South African bookmakers as JSON, and posts each new sure bet and value bet to your server the moment the engine finds it, so you can build your own bots and tools. R1,000 a month, Pro included.

Get Pro + API for R1,000 a month

Get a key

Join the Pro + API plan, sign in, and press Create key on your account page. The key is shown once; we keep only a fingerprint of it. Make a new one any time, and the old one stops working.

Ask for data

Send the key in the Authorization header. Every answer is JSON: ok, at (when the board was collected), count and data.

curl -H "Authorization: Bearer pk_your_key" https://punts.co.za/api/v1/sure-bets
Endpoint (GET)What it returns
/api/v1/sure-betsEvery open sure bet: the match, market, margin, and each leg with its book, price and the stake for R1,000.
/api/v1/value-betsEvery value bet: a licensed SA price at least 3% over Pinnacle's fair price on a firm market, with the edge.
/api/v1/tipsThe model's strongest football calls of the next 48 hours, with chance and best price.
/api/v1/movesPrices that moved 8% or more in 24 hours, with the price before and now.
/api/v1/oddsEvery market line on the board for every upcoming match: each side's best price and the book paying it.
/api/v1/markets/{id}One match, every market, every book's price. The id is the first item of each match in /api/v1/odds.
/api/v1/statusWhen the board was collected, how many of each there are now, and your plan.

A sure bet, as the API returns it

{
  "ok": true,
  "at": "2026-11-10T08:15:02.072Z",
  "count": 1,
  "data": [{
    "key": "football:...|Match result|",
    "kickoff": "2026-11-10T17:45:00Z",
    "sport": "Football", "comp": "Amateur Cup",
    "home": "ASV 13 Vienna", "away": "FC Hellas Kagran",
    "market": "Match result", "line": null, "margin": 0.0093,
    "legs": [
      { "side": "home", "label": "ASV 13 Vienna", "book": "Goldrush", "price": 2.64, "stake": 382.35 },
      { "side": "draw", "label": "Draw", "book": "Hollywoodbets", "price": 4.4, "stake": 229.41 },
      { "side": "away", "label": "FC Hellas Kagran", "book": "Hollywoodbets", "price": 2.6, "stake": 388.24 }
    ],
    "returns": 1009.41
  }]
}

Get pushed the moment something appears

Save a public https address as your webhook on your account page. Each time the price board changes (about every 4 minutes, day and night) we POST each sure bet and value bet you have not had yet, in one request. Answer with any 2xx and those items are marked sent; anything else is retried on the next push.

POST https://your-server.example/punts
X-Punts-Event: new
X-Punts-Signature: sha256=5d41402abc4b2a76b9719d911017c592...

{ "event": "new", "at": "2026-11-10T08:15:02.072Z",
  "sureBets": [ ...each new sure bet, the shape above... ],
  "valueBets": [ ...each new value bet... ] }

Every request is signed with your webhook secret, shown when you save the address. Check it before you trust the body:

import crypto from 'node:crypto';

// in your webhook handler, with the raw request body as a string
function verify(rawBody, header, secret) {
  const want = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
  return crypto.timingSafeEqual(Buffer.from(want), Buffer.from(header || ''));
}
import hmac, hashlib

def verify(raw_body: bytes, header: str, secret: str) -> bool:
    want = 'sha256=' + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(want, header or '')

Press Send a test on your account page to get an empty test event and check your handler.

Limits and rules

  • 120 requests a minute and 20,000 a day per key; over that, a 429 with Retry-After.
  • The key is for your own tools. No resale or republishing of the feed, and no sharing of keys.
  • Prices move: a sure bet holds only if every leg is placed at its price and every book settles alike. Nothing here guarantees winnings.
  • 18+ only. Licensed bookmakers may limit accounts that keep taking these prices. Free, confidential help: 0800 006 008.

Betting odds API: questions

What does the Punts betting odds API cost?

R1,000 a month on the Pro + API plan, billed monthly by card through Paystack. It includes everything in Punts Pro. Cancel any time from your account.

How fresh is the data?

The board re-reads every licensed book every few minutes. Sure bets and value bets are recomputed each time the board changes, about every 4 minutes, day and night; tips and price moves every 15 minutes from 05:00 to 23:45 SAST. Every answer carries `at`, the time the board was collected.

Can I place bets through the API?

No. Punts is not a bookmaker and places no bets. The API tells your code where the prices are; you place bets at the licensed books yourself, under their rules.

Can I resell or republish the data?

No. The key is for your own tools and bots. Republishing the feed, or sharing a key, ends the plan.

What happens if my webhook is down?

Items that did not get a 2xx are sent again on the next push. After 50 failures in a row we stop calling the address until you save it again on your account page.

18+ only. Gambling can be addictive: bet only what you can afford to lose. Free, confidential help: National Responsible Gambling Programme 0800 006 008. Winners know when to stop.
Get the free tips by email