The canonical, developer-friendly source for live keno and Quick Draw results across 20+ US states and Canada. Free JSON, no API key required to get started.
KenoSpots aggregates official state and provincial lottery feeds into one clean, predictable JSON API. Whether you are building an app, a dashboard, or an AI agent that needs structured keno data, this endpoint gives you the latest draws in a single request.
Fetch the latest Massachusetts Keno draws with a single GET request. No authentication, no headers required.
# Latest Massachusetts Keno results
curl https://app.kenospots.com/api/results/mass-keno
The response is a JSON object with a draws array, newest draw first. Read on for the full field reference and the complete list of supported games.
There is one endpoint. Swap the {slug} for any supported game (see Game slugs).
https://app.kenospots.com
Prefer a machine-readable contract? The full endpoint, schema, and examples are published as an OpenAPI 3.0 spec. Import it into Postman, Swagger UI, or your code generator of choice, or point an AI agent straight at it. AI assistants can also start from our llms.txt (or the fuller llms-full.txt) for a plain-text map of the site and API.
https://kenospots.com/api/openapi.json
| Parameter | Type | Description |
|---|---|---|
slug |
string | The game identifier, for example mass-keno or ohio-keno. Required. See the full catalog below. |
# Ohio Keno
curl https://app.kenospots.com/api/results/ohio-keno
# New York Quick Draw
curl https://app.kenospots.com/api/results/ny-quick-draw
# OLG Daily Keno (Ontario, field of 1-70)
curl https://app.kenospots.com/api/results/daily-keno
# JavaScript (fetch)
const res = await fetch('https://app.kenospots.com/api/results/mass-keno');
const { draws } = await res.json();
console.log(draws[0].winningNumbers);
# Python (requests)
import requests
draws = requests.get('https://app.kenospots.com/api/results/mass-keno').json()['draws']
print(draws[0]['winningNumbers'])
Every request returns 200 OK with a JSON body containing a draws array ordered newest first. An unknown slug returns 404. Here is a trimmed example response:
{
"draws": [
{
"drawNumber": 3023269,
"drawDate": "2026-06-24",
"drawTime": "2026-06-24T17:12:00-04:00",
"timezone": "America/New_York",
"winningNumbers": [75, 65, 62, 31, 52, 27, 66, 12, 7, 30, 46, 10, 58, 2, 76, 32, 29, 45, 61, 59],
"ballsDrawn": 20,
"bonus": 1,
"multiplier": null,
"multiplierType": "booster",
"extraNumbers": [],
"bullseyeNumber": null,
"jackpotAmount": null,
"source": "Massachusetts Lottery feed",
"kenospotsUpdatedAt": "2026-06-24T21:13:04.512Z",
"freshnessStatus": "live",
"expectedUpdateFrequency": "every few minutes",
"isOfficial": false,
"disclaimer": "KenoSpots is an independent informational site. Verify prizes with the official lottery."
}
// ... more draws, newest first
]
}
Each object in the draws array describes one draw. Optional fields are populated only for games that report them and are null or empty otherwise.
| Field | Type | Description |
|---|---|---|
drawNumber | integer | The official sequential game number for the draw. Useful as a stable identifier and for ordering. |
drawDate | string | The draw date in YYYY-MM-DD format, in the game's local timezone. |
drawTime | string | null | The draw time as an ISO 8601 timestamp with the game's local UTC offset, derived from the draw date and timezone. Useful for games that draw every few minutes, where the date alone is not enough to order draws. null when no usable draw date is available. |
timezone | string | The IANA timezone the draw date and time are expressed in, for example America/New_York. |
winningNumbers | integer[] | The drawn numbers, in draw order. Standard keno draws 20 numbers from 1-80; some Canadian games draw from a field of 1-70. |
ballsDrawn | integer | How many numbers were drawn (typically 20). |
bonus | integer | The bonus or multiplier value applied to the draw, where the game supports it (often 1 when no enhanced multiplier is in play). |
multiplier | integer | null | The active multiplier for games that draw one separately from bonus. null when not applicable. |
multiplierType | string | null | The name of the multiplier feature for the game, for example booster. |
extraNumbers | integer[] | Any supplementary numbers some games draw in addition to the main 20. Empty for most games. |
bullseyeNumber | integer | null | The Bullseye number for games that offer a Bullseye add-on. null otherwise. |
jackpotAmount | number | null | The reported jackpot amount where the game publishes one. null otherwise. |
source | string | Human-readable name of the upstream feed this result was sourced from, for example Massachusetts Lottery feed. |
kenospotsUpdatedAt | string | null | ISO 8601 timestamp (UTC) of when KenoSpots last fetched and cached this result. |
freshnessStatus | string | How frequently this feed publishes new draws. One of live (draws every few minutes), hourly (refreshes roughly once an hour), or daily (publishes a batch each day). |
expectedUpdateFrequency | string | Human-readable cadence at which this feed updates, for example every few minutes. |
isOfficial | boolean | Always false. KenoSpots is an independent informational resource, not the official source of results. |
disclaimer | string | Standard disclaimer reminding consumers to verify prizes with the official lottery. |
The following games are available today. Pass the slug as the {slug} path parameter. We add states and games regularly, so check back or email us to request one.
mass-kenoohio-kenomichigan-club-kenocalifornia-hot-spotny-quick-drawnew-jersey-quick-drawpennsylvania-kenovirginia-kenomaryland-kenokentucky-kenogeorgia-kenooregon-kenoconnecticut-kenokansas-kenorhode-island-kenonew-hampshire-kenomissouri-kenodelaware-kenodc-kenowyoming-kenobc-kenodaily-kenokeno-atlanticThe free tier is rate limited to keep the service fast and reliable for everyone:
| Tier | Limit | Auth |
|---|---|---|
| Free | 60 requests / minute per IP | None required |
Draw data refreshes roughly every 60 seconds, so polling faster than once a minute per game offers no fresher data. Please cache responses where you can. Clients that exceed the limit receive an HTTP 429 response; back off and retry after a short delay. If you need a higher ceiling, see paid tiers.
The API is free for personal and commercial use, and we just ask one thing in return: visible attribution. If you publish or display data from this API, credit KenoSpots with a link back to kenospots.com.
Required attribution
Display a clear "Powered by KenoSpots" credit with a link, for example:
<a href="https://kenospots.com/">Keno data powered by KenoSpots</a>
Attribution helps us keep the free tier free. Please do not resell raw API responses or present the data as your own. Always verify winning tickets against the official lottery; KenoSpots is an independent informational resource and is not affiliated with any lottery commission.
The free endpoint covers the latest draws for every supported game. For heavier or commercial workloads, paid tiers are on the roadmap:
| Capability | What it adds |
|---|---|
| Historical data | Full draw history with date and game-number range queries, beyond the recent window. |
| Webhooks | Push notifications the moment a new draw posts, so you never poll. |
| Bulk & export access | Higher rate limits, bulk endpoints, and downloadable datasets for analytics. |
| SLA & support | Priority support, an uptime commitment, and an API key for usage tracking. |
Interested in early access? Email api@kenospots.com and tell us what you are building.
Questions, slug requests, bug reports, or partnership ideas, we want to hear from you. Reach the API team at api@kenospots.com.