Start building
Your first lottery data request.
A few clear steps from your API key to a structured response.
Lottery data as a versioned REST API: the catalogue of games, their schedules, every result we have recorded as far back as your plan reaches, published prize breakdowns, fixed-odds payout tables and historical number statistics — delivered by request, by webhook, or over a live stream.
| Base URL | https://api.lottevo.com |
| Version | every route is under /v1; there is no /api segment |
| Format | JSON in, JSON out; payloads are wrapped in data |
| Credential | an API key, issued from your account |
1. Create an API key
Create a key from your workspace with the scopes and lotteries your application needs. Keep it on your server and out of source control — the full key is shown once.
2. Make a request
curl https://api.lottevo.com/v1/lotteries/EU-002/draws \
-H 'Authorization: Bearer lv_a1b2c3d4e5f6_…' \
-H 'Accept: application/json'
const response = await fetch('https://api.lottevo.com/v1/lotteries/EU-002/draws', {
headers: { 'X-Api-Key': process.env.LOTTEVO_API_KEY, Accept: 'application/json' },
})
const { data, meta, links } = await response.json()
GET /v1/account is the smoke test. It needs no scope and answers with your key's plan,
scopes, catalogue entitlement and what your account has spent today.
3. Read the response
Results are wrapped in data. Collections add links and meta for cursor pagination. This
shortened draw shows the fields an interface usually needs:
{
"data": [{
"lottery_code": "EU-002",
"numbers": [4, 7, 12, 31, 44],
"bonus_numbers": [8, 11],
"currency": "EUR",
"drawn_at": "2026-09-29T19:45:00+00:00",
"prizes_status": "published"
}]
}
What bounds a key
Four things, and it is worth knowing which one refused you:
- Scopes — what the key may read or manage. A missing one is
403 insufficient_scope. - Request ceilings — per minute on every plan, per UTC day on metered ones.
429. - Catalogue entitlement — the games the key covers. A game outside it is
403 lottery_not_entitled, not a 404: the game plainly exists. - History depth — how far back your plan reaches;
history_frominGET /v1/accountsays where it starts. Listings simply stop there, and asking for an older result by id is403 history_not_included.