Quick start
New here? Here's the lay of the land in four steps.
Check results
Open in the menu and pick a game, or browse the latest draws on the home page.
Play with tools
Generate lucky numbers, explore hot & cold numbers, all under .
Get an API key
Under → Generate API Key. It's free and emailed to you instantly.
Build & subscribe
Read the docs, copy a script, then choose a plan to start pulling live results.
Finding results
Every game has its own page, grouped by country in the Results menu.
- Home page: the latest draw for each South African game at a glance, plus an archived-results filter.
- Lottery Results menu: grouped by region: South Africa, United Kingdom, United States, Europe and Africa. Pick any game to open its dedicated page. Horse Racing Results has its own menu item.
- Each game page shows: the latest winning numbers and bonus ball, the prize-division breakdown, jackpot and sales stats, and an Archived Draw Results filter.
- Archive filter: choose a date range and pass the quick human check (Cloudflare) to pull historical draws for that game.
Supported games
Lottery games and horse racing results across multiple regions, each with a dedicated results page and API endpoint.
Open any game from the menu or , or fetch them programmatically. See the API Documentation.
Tools
Free helpers under the menu.
The API
A REST API for live lottery data. Everything API-related lives under the menu.
Getting started
- Generate API Key: create a free key (verify your email; it's delivered instantly).
- API Documentation: full endpoint reference with live "Try it" examples.
- Scripts: copy-paste Python & JavaScript snippets for every endpoint.
- Pricing: choose a subscription to activate your key.
What you can do
/check_api_key_balance endpoint (free; does not count against your limit).Subscriptions, billing & top-ups
How plans, top-ups and upgrades work.
Monthly subscriptions
When your subscription activates you get a fixed number of API calls for the next 30 days. Your counter resets each billing cycle. Unused calls do not carry over.
| Plan | Price / month | Calls | Per call |
|---|---|---|---|
| Starter | R149 | 300 | R0.50 |
| Basic | R299 | 1,500 | R0.20 |
| Professional | R599 | 6,000 | R0.10 |
| Unlimited | R1,000 | Unlimited* | n/a |
*Unlimited is subject to fair use and a 60 requests/minute rate limit; exceeding it triggers a 5-minute cooldown.
Top-up calls
Run out before your cycle resets? Buy a top-up, added on top of your limit, available instantly. Top-ups reset with your monthly counter and don't carry over.
Upgrading (pro-rata)
Upgrade any time from Pricing or the portal. Mid-cycle upgrades on an active subscription are charged pro-rata, only the price difference, scaled to the days left in your cycle.
Subscriber portal
Your account dashboard, open it from the Subscriber Portal button (top-right of the menu).
What you can do
- Dashboard: plan & status, calls used this cycle, a usage bar, your primary key, and recent invoices.
- Subscribe / Upgrade / Complete payment: pick a plan and pay securely via iKhokha; finish a pending payment in one click.
- Invoices: download branded PDF tax invoices for every confirmed payment.
- API keys & sub-keys: view your primary key and create up to 10 labelled sub-keys you can revoke independently.
- Telegram alerts: link the ResultsZA bot for instant subscription & payment notifications (mute or unlink any time).
- Account settings: change password or email, reset a forgotten password, or delete your account (Danger Zone), which revokes keys, ends the subscription with no refund, and removes your data.
Handy tips
Webhook Push Plan
Receive lottery and horse racing results posted directly to your server the moment they are published. No polling, no missed draws.
Get an API key
If you do not have one yet, generate a free API key and verify your email. Your key is your account identifier for the push subscription.
Subscribe
Go to the Webhook Pricing page. Enter your email and API key, choose a subscription period, and pay via iKhokha.
Note your signing secret
Your webhook signing secret appears on the payment confirmation page. Copy it immediately. You can also reveal it at any time in Push Settings inside the portal.
Configure your endpoint
Log in to your subscriber portal, open Push Settings, paste your webhook URL, select the games you want, and click Save.
Logging in to the portal
Go to the subscriber portal. Use your email address and your API key as the password on first login. You will be prompted to set a permanent password at that point.
Finding Push Settings
Once logged in, the portal dashboard shows a Push Subscription card on the right. Click Manage Push Settings to open the configuration page.
- Webhook URL field: paste the HTTPS endpoint on your server that will receive payloads.
- Games to Receive: a card for each country/region with checkboxes. Tick the games you care about. Use "Select all" to toggle a whole group at once.
- Signing Secret: click Reveal Secret to view your HMAC key. Copy it into your server config.
- Test Webhook: sends a live test payload to your URL so you can confirm your endpoint is reachable before any real results arrive.
- Delivery Log: shows the last 50 delivery attempts with status (Delivered / Failed / Pending), attempt count, and timestamps.
Your webhook URL requirements
- Must be HTTPS (plain HTTP is rejected).
- Must return a 2xx HTTP response within 10 seconds.
- Can be any path on your server, e.g.
https://myapp.com/webhooks/resultsza.
Verifying incoming payloads
Every POST from ResultsZA includes an X-ResultsZA-Signature header. Compute HMAC-SHA256(raw_request_body, signing_secret) and compare it to that header. Reject anything that does not match. Verify against the raw request bytes, exactly as received: if you parse the JSON and re-serialise it the bytes change and the signature will never match. The header value includes the sha256= prefix, so compare against the full string.
import hmac, hashlibexpected = "sha256=" + hmac.new(secret.encode(), body_bytes, digestmod=hashlib.sha256).hexdigest()if not hmac.compare_digest(expected, request.headers.get("X-ResultsZA-Signature", "")): abort(403)
The request also includes X-ResultsZA-Game (game identifier) and X-ResultsZA-Event (always result.published) headers so you can route or filter without parsing the body first.
Retry policy
If your endpoint does not respond with 2xx, ResultsZA retries up to 3 times, spaced 10 minutes apart. After 3 failed attempts the delivery is marked failed and you receive an email notification. The Delivery Log on the Push Settings page shows the full history so you can see exactly what happened and when.
Delivery is at-least-once
Treat every delivery as at-least-once: the same result can arrive more than once (for example if a retry overlaps a slow but successful response). De-duplicate on the game plus the draw identifier (draw_date or draw_number, and race_date for horse racing) and make your processing idempotent, so a repeat delivery is a harmless no-op.
Selecting games
On Push Settings, games are grouped by country: SA Lottery, Nigeria (Baba Ijebu), Ghana, Kenya, UK 49s, EuroMillions, US Lottery, and Horse Racing. Only the games you tick will generate deliveries. Unselected games are silently skipped, so you only receive what you need.
View full payload reference for all games — includes field tables, number formats, and a live interactive example for every game.