⛽ SA Fuel Prices
Loading prices…

Build with the ResultsZA API

Copy-paste scripts for every endpoint — Python and JavaScript.

11 endpoints Python & JavaScript 🟢 Live data previews SA Lotto · Powerball · UK 49s & more

🔑 All examples below use YOUR_API_KEY as a placeholder — replace it with your own key before running. Don't have one? Get an API key →

🎮 Interactive previews — every widget below runs against our live API. Hit ▶ Try live or ↺ Refresh on any card to fetch fresh data. You get 5 refreshes per endpoint for free — or get your own API key for unlimited access.

Get results

Fetch the latest or historic draw results.

Get the latest results for all games

Fetches the most recent draw for every game in a single call. Results are keyed by game name (e.g. lotto_results, powerball_results).

GET/api/get_latest_results

import requests

API_KEY = "YOUR_API_KEY"

resp = requests.get(
    "https://resultsza.co.za/api/get_latest_results",
    params={"api_key": API_KEY},
    timeout=10,
)
resp.raise_for_status()
data = resp.json()

# data["results"] keys: lotto_results, powerball_results, daily_lotto_results, etc.
for game_key, r in data.get("results", {}).items():
    nums    = r.get("winning_numbers", [])
    # Each game uses a different field for its special ball
    special = r.get("bonus_ball") or r.get("powerball") or r.get("booster_ball")
    date    = r.get("date", "")[:10]
    draw    = r.get("draw_id")
    label   = r.get("game_type", game_key)
    extra   = f"  +{special}" if special else ""
    print(f"{label:<22}  Draw #{draw:<5}  {date}  {nums}{extra}")

Live response

Latest SA Lotto Draws
Lotto
Draw #2644 · 9 May 2026
182124455256+53Bonus
Powerball
Draw #1718 · 8 May 2026
132404348+9PB
Daily Lotto
Draw #2612 · 10 May 2026
120222527
Show raw JSON response
{
  "status": "success",
  "results": {
    "daily_lotto_results": {
      "date": "2026-05-10T20:00:00Z",
      "draw_id": 2612,
      "draw_machine": "RNG 3",
      "game_type": "Daily Lotto",
      "total_pool_size": 766663.5,
      "total_sales": 1533327.0,
      "winning_numbers": [
        1,
        20,
        22,
        25,
        27
      ],
      "bonus_ball": null,
      "next_draw_date": "2026-05-11T20:00:00Z",
      "divisions": [
        {
          "division": "DIV 1",
          "winners": 4,
          "winning_amount": 68233.0
        },
        {
          "division": "DIV 2",
          "winners": 183,
          "winning_amount": 343.5
        },
        {
          "division": "DIV 3",
          "winners": 5972,
          "winning_amount": 21.1
        },
        {
          "division": "DIV 4",
          "winners": 60670,
          "winning_amount": 5.1
        }
      ]
    },
    "daily_lotto_plus1_results": {
      "date": "2026-05-10T20:00:00Z",
      "draw_id": 2612,
      "draw_machine": "RNG 3",
      "game_type": "Daily Lotto Plus",
      "total_pool_size": 238487.25,
      "total_sales": 476974.5,
      "winning_numbers": [
        13,
        16,
        18,
        19,
        33
      ],
      "bonus_ball": null,
      "next_draw_date": "2026-05-11T20:00:00Z",
      "divisions": [
        {
          "division": "DIV 1",
          "winners": 1,
          "winning_amount": 84901.5
        },
        {
          "division": "DIV 2",
          "winners": 130,
          "winning_amount": 150.3
        },
        {
          "division": "DIV 3",
          "winners": 3836,
          "winning_amount": 10.2
        },
        {
          "division": "DIV 4",
          "winners": 38051,
          "winning_amount": 2.4
        }
      ]
    },
    "lotto_results": {
      "date": "2026-05-09T20:00:00Z",
      "draw_id": 2644,
      "draw_machine": "RNG 3",
      "game_type": "Lotto",
      "total_pool_size": 6579986.4,
      "total_sales": 13708305.0,
      "winning_numbers": [
        18,
        21,
        24,
        45,
        52,
        56
      ],
      "bonus_ball": 53,
      "next_draw_date": "2026-05-13T20:00:00Z",
      "divisions": [
        {
          "division": "DIV 1",
          "winners": 0,
          "winning_amount": 0.0
        },
        {
          "division": "DIV 2",
          "winners": 1,
          "winning_amount": 59219.9
        },
        {
          "division": "DIV 3",
          "winners": 19,
          "winning_amount": 4848.4
        },
        {
          "division": "DIV 4",
          "winners": 31,
          "winning_amount": 4245.2
        },
        {
          "division": "DIV 5",
          "winners": 1153,
          "winning_amount": 285.4
        },
        {
          "division": "DIV 6",
          "winners": 1357,
          "winning_amount": 194.0
        },
        {
          "division": "DIV 7",
          "winners": 25662,
          "winning_amount": 53.8
        },
        {
          "division": "DIV 8",
          "winners": 259226,
          "winning_amount": 7.4
        }
      ]
    },
    "lotto_plus1_results": {
      "date": "2026-05-09T20:00:00Z",
      "draw_id": 2644,
      "draw_machine": "RNG 3",
      "game_type": "Lotto Plus 1",
      "total_pool_size": 2997920.0,
      "total_sales": 5995840.0,
      "winning_numbers": [
        8,
        27,
        36,
        43,
        48,
        52
      ],
      "bonus_ball": 54,
      "next_draw_date": "2026-05-13T20:00:00Z",
      "divisions": [
        {
          "division": "DIV 1",
          "winners": 0,
          "winning_amount": 0.0
        },
        {
          "division": "DIV 2",
          "winners": 0,
          "winning_amount": 0.0
        },
        {
          "division": "DIV 3",
          "winners": 22,
          "winning_amount": 3134.1
        },
        {
          "division": "DIV 4",
          "winners": 30,
          "winning_amount": 1998.6
        },
        {
          "division": "DIV 5",
          "winners": 1219,
          "winning_amount": 122.9
        },
        {
          "division": "DIV 6",
          "winners": 1274,
          "winning_amount": 94.2
        },
        {
          "division": "DIV 7",
          "winners": 24128,
          "winning_amount": 26.1
        },
        {
          "division": "DIV 8",
          "winners": 235575,
          "winning_amount": 4.7
        }
      ]
    },
    "lotto_plus2_results": {
      "date": "2026-05-09T20:00:00Z",
      "draw_id": 2644,
      "draw_machine": "RNG 2",
      "game_type": "Lotto Plus 2",
      "total_pool_size": 2865010.0,
      "total_sales": 5730020.0,
      "winning_numbers": [
        9,
        15,
        22,
        39,
        45,
        55
      ],
      "bonus_ball": 50,
      "next_draw_date": "2026-05-13T20:00:00Z",
      "divisions": [
        {
          "division": "DIV 1",
          "winners": 0,
          "winning_amount": 0.0
        },
        {
          "division": "DIV 2",
          "winners": 0,
          "winning_amount": 0.0
        },
        {
          "division": "DIV 3",
          "winners": 17,
          "winning_amount": 3876.2
        },
        {
          "division": "DIV 4",
          "winners": 51,
          "winning_amount": 1123.5
        },
        {
          "division": "DIV 5",
          "winners": 965,
          "winning_amount": 148.4
        },
        {
          "division": "DIV 6",
          "winners": 1272,
          "winning_amount": 90.1
        },
        {
          "division": "DIV 7",
          "winners": 22714,
          "winning_amount": 26.5
        },
        {
          "division": "DIV 8",
          "winners": 226709,
          "winning_amount": 4.7
        }
      ]
    },
    "powerball_results": {
      "date": "2026-05-08T20:00:00Z",
      "draw_id": 1718,
      "draw_machine": "RNG 3",
      "game_type": "Powerball",
      "total_pool_size": 12037997.5,
      "total_sales": 24075995.0,
      "winning_numbers": [
        1,
        32,
        40,
        43,
        48
      ],
      "powerball": 9,
      "next_draw_date": "2026-05-12T20:00:00Z",
      "divisions": [
        {
          "division": "DIV 1",
          "winners": 0,
          "winning_amount": 0.0
        },
        {
          "division": "DIV 2",
          "winners": 1,
          "winning_amount": 484265.3
        },
        {
          "division": "DIV 3",
          "winners": 27,
          "winning_amount": 11231.4
        },
        {
          "division": "DIV 4",
          "winners": 409,
          "winning_amount": 1257.0
        },
        {
          "division": "DIV 5",
          "winners": 995,
          "winning_amount": 584.3
        },
        {
          "division": "DIV 6",
          "winners": 18376,
          "winning_amount": 26.3
        },
        {
          "division": "DIV 7",
          "winners": 14429,
          "winning_amount": 25.2
        },
        {
          "division": "DIV 8",
          "winners": 82388,
          "winning_amount": 15.0
        },
        {
          "division": "DIV 9",
          "winners": 147144,
          "winning_amount": 10.0
        }
      ]
    },
    "powerball_plus_results": {
      "date": "2026-05-08T20:00:00Z",
      "draw_id": 1718,
      "draw_machine": "RNG 1",
      "game_type": "Powerball Plus",
      "total_pool_size": 5437165.0,
      "total_sales": 10874330.0,
      "winning_numbers": [
        13,
        17,
        28,
        41,
        47
      ],
      "powerball": 19,
      "next_draw_date": "2026-05-12T20:00:00Z",
      "divisions": [
        {
          "division": "DIV 1",
          "winners": 0,
          "winning_amount": 0.0
        },
        {
          "division": "DIV 2",
          "winners": 2,
          "winning_amount": 110251.6
        },
        {
          "division": "DIV 3",
          "winners": 17,
          "winning_amount": 8122.4
        },
        {
          "division": "DIV 4",
          "winners": 428,
          "winning_amount": 547.0
        },
        {
          "division": "DIV 5",
          "winners": 940,
          "winning_amount": 281.6
        },
        {
          "division": "DIV 6",
          "winners": 18824,
          "winning_amount": 11.7
        },
        {
          "division": "DIV 7",
          "winners": 14029,
          "winning_amount": 11.8
        },
        {
          "division": "DIV 8",
          "winners": 75397,
          "winning_amount": 7.5
        },
        {
          "division": "DIV 9",
          "winners": 124614,
          "winning_amount": 5.0
        }
      ]
    }
  }
}

Get results for a specific game and date

Returns draw result(s) for the game on the date you specify. Omit date to get the latest draw.

GET/api/get_results_by_game

import requests

API_KEY = "YOUR_API_KEY"
GAME = "Lotto"
DATE = "2026-05-09"

resp = requests.get(
    "https://resultsza.co.za/api/get_results_by_game",
    params={"api_key": API_KEY, "game": GAME, "date": DATE},
    timeout=10,
)
resp.raise_for_status()
data = resp.json()

# Each result has draw_id, draw_date, winning_numbers, and bonus_ball / powerball / booster_ball
for r in data.get("results", []):
    nums    = r.get("winning_numbers", [])
    special = r.get("bonus_ball") or r.get("powerball") or r.get("booster_ball")
    date    = r.get("draw_date", "")[:10]
    print(f"Draw #{r.get('draw_id')}  {date}  {r.get('game_name')}")
    print(f"  Numbers : {nums}")
    if special is not None:
        label = "Powerball" if r.get("powerball") else ("Booster" if r.get("booster_ball") else "Bonus")
        print(f"  {label:9}: {special}")

Live response

Lotto · Draw #2644
9 May 2026
182124455256+53Bonus
Show raw JSON response
{
  "status": "success",
  "results": [
    {
      "draw_id": 2644,
      "game_name": "Lotto",
      "draw_day": "Saturday",
      "draw_date": "2026-05-09T20:00:00Z",
      "winning_numbers": [
        18,
        21,
        24,
        45,
        52,
        56
      ],
      "bonus_ball": 53
    }
  ]
}

Get UK 49s results

Fetches results for any of the four daily UK 49s draws. Omit date to get the latest draw.

GET/api/get_uk49s_results

import requests

API_KEY = "YOUR_API_KEY"
GAME = "UK49s Teatime"
DATE = "2026-05-09"

resp = requests.get(
    "https://resultsza.co.za/api/get_uk49s_results",
    params={"api_key": API_KEY, "game": GAME, "date": DATE},
    timeout=10,
)
resp.raise_for_status()
data = resp.json()

# Each result has draw_date, winning_numbers (6 balls), and booster_ball
for r in data.get("results", []):
    nums    = r.get("winning_numbers", [])
    booster = r.get("booster_ball")
    date    = r.get("draw_date", "")[:10]
    print(f"{GAME}  {date}")
    print(f"  Numbers : {nums}")
    print(f"  Booster : {booster}")

Live response

UK49s Teatime
10 May 2026
141830373844+45Booster
Show raw JSON response
{
  "status": "success",
  "results": [
    {
      "draw_id": null,
      "game_name": "UK49s Teatime",
      "draw_day": "Sunday",
      "draw_date": "2026-05-10T20:00:00Z",
      "winning_numbers": [
        14,
        18,
        30,
        37,
        38,
        44
      ],
      "booster_ball": 45
    }
  ]
}

Stats & analysis

Hot/cold, frequencies, and pair analysis.

Get hot and cold numbers

Returns the most frequently drawn (hot) and least frequently drawn (cold) numbers for a game.

GET/api/get_hot_cold_numbers_stats

import requests, random

API_KEY = "YOUR_API_KEY"
PRODUCT = "Lotto"

resp = requests.get(
    "https://resultsza.co.za/api/get_hot_cold_numbers_stats",
    params={"api_key": API_KEY, "product": PRODUCT},
    timeout=10,
)
resp.raise_for_status()
data = resp.json()

hot  = data.get("hot",  [])
cold = data.get("cold", [])

print(f"🔥 Hottest {PRODUCT} numbers : {hot}")
print(f"❄️  Coldest {PRODUCT} numbers : {cold}")

# Build a blended pick — 4 hot numbers + 2 cold numbers
pick = sorted(random.sample(hot[:10], 4) + random.sample(cold[:10], 2))
print(f"
Blended lucky pick: {pick}")

Live response

Hot & Cold Numbers
🔥 Hot
164882314
❄️ Cold
5557545356
Show raw JSON response
{
  "cold": [
    55,
    57,
    54,
    53,
    56
  ],
  "hot": [
    16,
    48,
    8,
    23,
    14
  ],
  "product": "Lotto",
  "status": "success"
}

Get number draw frequencies

Returns how many times each number has been drawn, plus the date it was last drawn.

GET/api/get_number_frequencies

import requests

API_KEY = "YOUR_API_KEY"
PRODUCT = "Lotto"

resp = requests.get(
    "https://resultsza.co.za/api/get_number_frequencies",
    params={"api_key": API_KEY, "product": PRODUCT},
    timeout=10,
)
resp.raise_for_status()
data = resp.json()

stats   = data.get("statistics", [])
top10   = stats[:10]
max_frq = top10[0]["frequency"] if top10 else 1

print(f"Top 10 most-drawn {PRODUCT} numbers:
")
for s in top10:
    bar = "█" * round(s["frequency"] / max_frq * 20)
    print(f"  {s['number']:>3}  {bar:<21}  {s['frequency']}x   last: {s['last_drawn']}")

Live response

Number Frequencies — Top 8
8
344x
16
344x
48
342x
23
339x
14
335x
30
333x
29
329x
46
329x
Show raw JSON response
{
  "product": "Lotto",
  "statistics": [
    {
      "frequency": 344,
      "last_drawn": "2026-05-06",
      "number": 8
    },
    {
      "frequency": 344,
      "last_drawn": "2026-03-21",
      "number": 16
    },
    {
      "frequency": 342,
      "last_drawn": "2026-04-18",
      "number": 48
    },
    {
      "frequency": 339,
      "last_drawn": "2026-05-06",
      "number": 23
    },
    {
      "frequency": 335,
      "last_drawn": "2026-04-01",
      "number": 14
    },
    {
      "frequency": 333,
      "last_drawn": "2026-04-25",
      "number": 30
    },
    {
      "frequency": 329,
      "last_drawn": "2026-04-01",
      "number": 29
    },
    {
      "frequency": 329,
      "last_drawn": "2026-03-18",
      "number": 46
    },
    {
      "frequency": 326,
      "last_drawn": "2026-04-15",
      "number": 2
    },
    {
      "frequency": 326,
      "last_drawn": "2026-05-09",
      "number": 18
    },
    {
      "frequency": 324,
      "last_drawn": "2026-03-04",
      "number": 17
    },
    {
      "frequency": 321,
      "last_drawn": "2026-04-04",
      "number": 11
    },
    {
      "frequency": 320,
      "last_drawn": "2026-05-09",
      "number": 24
    },
    {
      "frequency": 319,
      "last_drawn": "2026-04-15",
      "number": 1
    },
    {
      "frequency": 319,
      "last_drawn": "2026-05-06",
      "number": 6
    },
    {
      "frequency": 319,
      "last_drawn": "2026-05-02",
      "number": 7
    },
    {
      "frequency": 319,
      "last_drawn": "2026-04-11",
      "number": 41
    },
    {
      "frequency": 319,
      "last_drawn": "2026-04-11",
      "number": 43
    },
    {
      "frequency": 318,
      "last_drawn": "2026-05-02",
      "number": 49
    },
    {
      "frequency": 317,
      "last_drawn": "2026-04-04",
      "number": 13
    },
    {
      "frequency": 317,
      "last_drawn": "2026-02-28",
      "number": 33
    },
    {
      "frequency": 317,
      "last_drawn": "2026-04-04",
      "number": 39
    },
    {
      "frequency": 315,
      "last_drawn": "2026-05-06",
      "number": 44
    },
    {
      "frequency": 314,
      "last_drawn": "2026-04-22",
      "number": 27
    },
    {
      "frequency": 314,
      "last_drawn": "2026-05-09",
      "number": 45
    },
    {
      "frequency": 313,
      "last_drawn": "2026-04-30",
      "number": 3
    },
    {
      "frequency": 310,
      "last_drawn": "2026-04-25",
      "number": 22
    },
    {
      "frequency": 308,
      "last_drawn": "2026-03-07",
      "number": 20
    },
    {
      "frequency": 307,
      "last_drawn": "2026-04-30",
      "number": 9
    },
    {
      "frequency": 307,
      "last_drawn": "2026-02-11",
      "number": 35
    },
    {
      "frequency": 304,
      "last_drawn": "2026-01-14",
      "number": 34
    },
    {
      "frequency": 302,
      "last_drawn": "2026-02-28",
      "number": 38
    },
    {
      "frequency": 301,
      "last_drawn": "2026-04-25",
      "number": 26
    },
    {
      "frequency": 300,
      "last_drawn": "2026-05-06",
      "number": 40
    },
    {
      "frequency": 298,
      "last_drawn": "2026-04-22",
      "number": 12
    },
    {
      "frequency": 298,
      "last_drawn": "2026-03-07",
      "number": 47
    },
    {
      "frequency": 297,
      "last_drawn": "2026-05-02",
      "number": 32
    },
    {
      "frequency": 296,
      "last_drawn": "2026-05-02",
      "number": 28
    },
    {
      "frequency": 296,
      "last_drawn": "2026-05-06",
      "number": 42
    },
    {
      "frequency": 293,
      "last_drawn": "2026-04-30",
      "number": 15
    },
    {
      "frequency": 291,
      "last_drawn": "2026-03-18",
      "number": 4
    },
    {
      "frequency": 290,
      "last_drawn": "2026-03-11",
      "number": 5
    },
    {
      "frequency": 289,
      "last_drawn": "2026-04-18",
      "number": 25
    },
    {
      "frequency": 288,
      "last_drawn": "2026-04-18",
      "number": 31
    },
    {
      "frequency": 287,
      "last_drawn": "2026-04-22",
      "number": 10
    },
    {
      "frequency": 287,
      "last_drawn": "2026-03-25",
      "number": 19
    },
    {
      "frequency": 281,
      "last_drawn": "2026-04-30",
      "number": 36
    },
    {
      "frequency": 278,
      "last_drawn": "2026-05-09",
      "number": 21
    },
    {
      "frequency": 271,
      "last_drawn": "2026-04-22",
      "number": 37
    },
    {
      "frequency": 112,
      "last_drawn": "2026-04-25",
      "number": 50
    },
    {
      "frequency": 101,
      "last_drawn": "2026-02-07",
      "number": 51
    },
    {
      "frequency": 97,
      "last_drawn": "2026-05-09",
      "number": 52
    },
    {
      "frequency": 13,
      "last_drawn": "2026-04-11",
      "number": 58
    },
    {
      "frequency": 12,
      "last_drawn": "2026-05-09",
      "number": 56
    },
    {
      "frequency": 10,
      "last_drawn": "2026-04-18",
      "number": 53
    },
    {
      "frequency": 8,
      "last_drawn": "2026-04-25",
      "number": 54
    },
    {
      "frequency": 7,
      "last_drawn": "2026-03-28",
      "number": 55
    },
    {
      "frequency": 5,
      "last_drawn": "2026-04-11",
      "number": 57
    }
  ],
  "status": "success"
}

Get most common number pairs

Returns pairs of numbers that have appeared together most often in the same draw.

GET/api/get_number_pairs

import requests

API_KEY = "YOUR_API_KEY"
PRODUCT = "Lotto"

resp = requests.get(
    "https://resultsza.co.za/api/get_number_pairs",
    params={"api_key": API_KEY, "product": PRODUCT},
    timeout=10,
)
resp.raise_for_status()
data = resp.json()

pairs = data.get("pairs", [])
print(f"Most common {PRODUCT} number pairs:
")
for p in pairs[:10]:
    print(f"  [{p['number1']:>3}] + [{p['number2']:>3}]  —  together {p['frequency']}x   last: {p['last_drawn']}")

Live response

Most Common Number Pairs
18+20drawn 48×
29+35drawn 47×
8+43drawn 47×
14+30drawn 47×
8+17drawn 46×
Show raw JSON response
{
  "pairs": [
    {
      "frequency": 48,
      "last_drawn": "2025-06-28",
      "number1": 18,
      "number2": 20
    },
    {
      "frequency": 47,
      "last_drawn": "2025-12-06",
      "number1": 29,
      "number2": 35
    },
    {
      "frequency": 47,
      "last_drawn": "2025-10-04",
      "number1": 8,
      "number2": 43
    },
    {
      "frequency": 47,
      "last_drawn": "2025-10-01",
      "number1": 14,
      "number2": 30
    },
    {
      "frequency": 46,
      "last_drawn": "2025-10-22",
      "number1": 8,
      "number2": 17
    },
    {
      "frequency": 46,
      "last_drawn": "2025-08-27",
      "number1": 11,
      "number2": 44
    },
    {
      "frequency": 46,
      "last_drawn": "2025-08-16",
      "number1": 2,
      "number2": 23
    },
    {
      "frequency": 46,
      "last_drawn": "2024-07-17",
      "number1": 15,
      "number2": 47
    },
    {
      "frequency": 46,
      "last_drawn": "2024-07-03",
      "number1": 24,
      "number2": 43
    },
    {
      "frequency": 46,
      "last_drawn": "2024-05-25",
      "number1": 1,
      "number2": 45
    }
  ],
  "product": "Lotto",
  "status": "success"
}

Generate numbers

Random or text-derived lucky numbers.

Generate random numbers

Generates one or more sets of random numbers that are valid for the chosen game.

GET/api/generate_random_numbers

import requests

API_KEY = "YOUR_API_KEY"
GAME  = "Lotto"
LINES = 5

resp = requests.get(
    "https://resultsza.co.za/api/generate_random_numbers",
    params={"api_key": API_KEY, "game": GAME, "lines": LINES},
    timeout=10,
)
resp.raise_for_status()
data = resp.json()

print(f"Generated {data.get('lines')} lucky lines for {data.get('game')}:
")
for i, line in enumerate(data.get("random_numbers", []), start=1):
    # Powerball returns {"main_numbers": [...], "powerball": N}; other games return a plain list
    if isinstance(line, dict):
        nums = line.get("main_numbers", [])
        pb   = line.get("powerball")
        print(f"  Line {i}: {nums}  PB: {pb}")
    else:
        print(f"  Line {i}: {line}")

Live response

🎲 Your Lotto Lucky Pick
21119243956
Refresh the page for a new pick
Show raw JSON response
{
  "game": "Lotto",
  "lines": 1,
  "random_numbers": [
    [
      2,
      11,
      19,
      24,
      39,
      56
    ]
  ],
  "status": "success"
}

Convert text into lucky numbers

Hashes any text (a name, a phrase, a birthday) into a set of game-valid numbers.

POST/api/text_to_lucky_numbers

import requests

API_KEY = "YOUR_API_KEY"
GAME = "Lotto"
TEXT = "happy birthday Grandma"

resp = requests.post(
    "https://resultsza.co.za/api/text_to_lucky_numbers",
    params={"api_key": API_KEY, "game": GAME},
    json={"text": TEXT},
    timeout=10,
)
resp.raise_for_status()
data = resp.json()

print(f"Text   : {data.get('text')}")
print(f"Game   : {data.get('game_type')}")
print(f"Numbers: {data.get('lucky_numbers')}")
if data.get("powerball") is not None:
    print(f"PB     : {data.get('powerball')}")

Live response

✨ Text → Lucky Numbers
ResultsZA
23293131814
Show raw JSON response
{
  "game_type": "Lotto",
  "lucky_numbers": [
    23,
    29,
    31,
    3,
    18,
    14
  ],
  "powerball": null,
  "status": "success",
  "text": "ResultsZA"
}

Check your numbers

See if your numbers won — single, bulk, or stored.

Check if your numbers won

Checks up to 10 lines of numbers against the draw results for a given game and date.

POST/api/check_played_numbers

import requests

API_KEY = "YOUR_API_KEY"
GAME = "Lotto"
DATE = "2026-05-09"

resp = requests.post(
    "https://resultsza.co.za/api/check_played_numbers",
    params={"api_key": API_KEY, "game": GAME, "date": DATE},
    json={"played_numbers": [7, 14, 21, 28, 35, 42]},
    timeout=10,
)
resp.raise_for_status()
data = resp.json()

r       = data.get("results", {})
outcome = r.get("result", {})
matches = outcome.get("matches", {})
special = r.get("bonus_ball") or r.get("powerball")

print(f"Draw : {data.get('draw_date')}  ({data.get('game')})")
print(f"Drawn: {r.get('winning_numbers')}" + (f"  +{special}" if special else ""))
print(f"Yours: {r.get('played_numbers')}")
print(f"Main matches : {matches.get('main_matches', 0)}")

if outcome.get("division"):
    print(f"🏆 Division {outcome['division']} winner!  Prize: R{outcome.get('winning_amount')}")
else:
    print("No division win this draw.")

ℹ️ Lotto/Daily Lotto: enter main numbers only. Powerball/Powerball Plus: enter 5 main numbers then the Powerball as the last number (e.g. 1, 2, 3, 4, 5, 7 — where 7 is the Powerball).

Live response

🎫 Did You Win?
Draw: 2026-01-21
Played
123456
Drawn
91832355456+2Bonus
No division win — 0 match(es) + bonus
Show raw JSON response
{
  "status": "success",
  "game": "Lotto",
  "draw_date": "2026-01-21",
  "results": {
    "played_numbers": [
      1,
      2,
      3,
      4,
      5,
      6
    ],
    "winning_numbers": [
      9,
      18,
      32,
      35,
      54,
      56
    ],
    "bonus_ball": 2,
    "result": {
      "matches": {
        "main_matches": 0,
        "bonus_match": true
      },
      "division": null,
      "winning_amount": null
    }
  }
}

Bulk-check up to 500 lines

Checks up to 500 lines of numbers against a single draw — ideal for checking a full season of tickets.

POST/api/bulk_check_numbers

import requests

API_KEY = "YOUR_API_KEY"
GAME = "Lotto"
DATE = "2026-05-09"

tickets = [
    [1,  2,  3,  4,  5,  6],
    [7,  14, 21, 28, 35, 42],
    [10, 20, 30, 40, 50, 58],
]

resp = requests.post(
    "https://resultsza.co.za/api/bulk_check_numbers",
    params={"api_key": API_KEY, "game": GAME, "date": DATE},
    json={"played_numbers": tickets},
    timeout=10,
)
resp.raise_for_status()
data = resp.json()

winners = sum(1 for r in data.get("results", {}).values() if r.get("result", {}).get("division"))
print(f"Checked {data.get('lines_checked')} tickets for {data.get('game')} on {data.get('draw_date')}")
print(f"Winners: {winners}
")

for key, r in data.get("results", {}).items():
    nums    = r.get("played_numbers", [])
    m       = r.get("result", {}).get("matches", {}).get("main_matches", 0)
    div     = r.get("result", {}).get("division")
    amount  = r.get("result", {}).get("winning_amount")
    status  = f"🏆 Div {div} — R{amount}" if div else f"No win ({m} match{'es' if m != 1 else ''})"
    print(f"  {key}: {nums}  →  {status}")

ℹ️ One ticket per line. Lotto/Daily Lotto: main numbers only. Powerball: 5 main numbers then the Powerball as the last number on each line (e.g. 1, 2, 3, 4, 5, 7 — where 7 is the Powerball).

Live response

🧾 Bulk Ticket Check
Draw: 2026-01-21 — 2 ticket(s) checked, 0 winner(s)
NumbersMatchesResult
123456
0No win
789101112
1No win
Show raw JSON response
{
  "status": "success",
  "game": "Lotto",
  "draw_date": "2026-01-21",
  "lines_checked": 2,
  "results": {
    "line1_results": {
      "played_numbers": [
        1,
        2,
        3,
        4,
        5,
        6
      ],
      "winning_numbers": [
        9,
        18,
        32,
        35,
        54,
        56
      ],
      "bonus_ball": 2,
      "result": {
        "matches": {
          "main_matches": 0,
          "bonus_match": true
        },
        "division": null,
        "winning_amount": null
      }
    },
    "line2_results": {
      "played_numbers": [
        7,
        8,
        9,
        10,
        11,
        12
      ],
      "winning_numbers": [
        9,
        18,
        32,
        35,
        54,
        56
      ],
      "bonus_ball": 2,
      "result": {
        "matches": {
          "main_matches": 1,
          "bonus_match": false
        },
        "division": null,
        "winning_amount": null
      }
    }
  }
}

Account

Check your monthly quota.

Check your API key balance

Returns remaining tokens or subscription usage details for your API key.

GET/check_api_key_balance

import requests

API_KEY = "YOUR_API_KEY"

resp = requests.get(
    "https://resultsza.co.za/check_api_key_balance",
    params={"api_key": API_KEY},
    timeout=10,
)
resp.raise_for_status()
data = resp.json()

billing = data.get("billing_model")
print(f"Billing model : {billing}")

if billing == "token":
    print(f"Tokens left   : {data.get('tokens_remaining')}")
else:
    tier      = data.get("tier")
    status    = data.get("subscription_status")
    remaining = data.get("remaining")
    unlimited = data.get("is_unlimited", False)
    print(f"Tier          : {tier}  ({status})")
    print(f"Calls left    : {'Unlimited' if unlimited else remaining}")

ℹ️ Paste a real API key — this calls the live balance endpoint (free, no quota deducted).

💡 Best-practice patterns

Avoid common mistakes. Save quota.

Respect rate-limit headers (Unlimited tier only)

Read X-RateLimit-Remaining on every response. Pause before you hit zero, or you'll trigger a 5-minute cooldown.

import time
import requests

API_KEY = "YOUR_API_KEY"
MAX_RETRIES = 5  # bail out after this many cooldown bounces


def call_with_backoff(url, params):
    for attempt in range(MAX_RETRIES):
        resp = requests.get(url, params=params, timeout=10)

        # Pre-empt the cooldown: if the window is nearly full, sleep until reset
        remaining = int(resp.headers.get("X-RateLimit-Remaining", "60"))
        if remaining < 5:
            reset_ts = int(resp.headers.get("X-RateLimit-Reset", time.time() + 60))
            time.sleep(max(0, reset_ts - time.time()))

        if resp.status_code != 429:
            resp.raise_for_status()
            return resp.json()

        # Rate-limited: sleep the cooldown and retry
        cooldown = int(resp.headers.get("X-RateLimit-Cooldown", "300"))
        print(f"Cooldown active ({cooldown}s). Attempt {attempt + 1} of {MAX_RETRIES}.")
        time.sleep(cooldown)

    raise RuntimeError(f"Still rate-limited after {MAX_RETRIES} attempts; giving up.")


for game in ["Lotto", "Lotto Plus 1", "Lotto Plus 2"]:
    print(call_with_backoff(
        "https://resultsza.co.za/api/get_latest_results",
        {"api_key": API_KEY, "game": game},
    ))

Check your monthly quota before bulk operations

Avoid mid-job failures: hit /check_api_key_balance first and bail out early if you don't have enough credit.

import requests

API_KEY = "YOUR_API_KEY"
NEEDED_CALLS = 500

resp = requests.get(
    "https://resultsza.co.za/check_api_key_balance",
    params={"api_key": API_KEY},
    timeout=10,
)
resp.raise_for_status()
balance = resp.json()

billing_model = balance.get("billing_model")

if billing_model == "subscription":
    remaining = balance.get("remaining")
    if remaining == "Unlimited (Fair Use)" or balance.get("is_unlimited"):
        print("Unlimited tier — proceed.")
    elif isinstance(remaining, int) and remaining < NEEDED_CALLS:
        raise SystemExit(f"Only {remaining} calls left this month, need {NEEDED_CALLS}. Aborting.")
    else:
        print(f"OK — {remaining} calls available, will use {NEEDED_CALLS}.")
        # ... your bulk job here
elif billing_model == "token":
    # Token plan: server returns tokens_remaining instead
    tokens = balance.get("tokens_remaining", 0)
    if tokens < NEEDED_CALLS:
        raise SystemExit(f"Only {tokens} token calls left, need {NEEDED_CALLS}. Aborting.")
    print(f"OK — {tokens} token calls available.")
else:
    raise SystemExit(f"Unrecognised billing_model: {billing_model!r}")