Horse racing
Virtual horse racing API
Virtual horse racing data in JSON. The races are computer-generated, so the schedule never depends on a real meeting and there is no off-season. The API returns events, runners with draw numbers and form, win and place odds, and settled results.
Start free with 500 requests a day. No credit card.
How generated racing differs from a real feed
A real horse racing feed stops when the meetings stop. This one does not. Races are scheduled a few minutes apart, day and night, every day of the year.
Load test against live data
The schedule never empties, so you can point a load test at real responses at any hour. You do not have to record a set of canned responses first, or wait for a race day.
A fixed cadence to size your cache
Events arrive on a steady cycle rather than in bursts around real meetings. One cache window and one poll interval hold at 03:00 on a public holiday the same as on a Saturday afternoon.
No canceled events to handle
You never write a branch for an abandoned meeting, a postponed start or an empty day in the calendar. An event that is scheduled runs, and it settles.
Settlement arrives with the result
The finishing order and the win, place, forecast and tricast settlement come back in one response. A settled result does not change, so you can cache it and never reconcile it.
Game types
Dashing Derby
Horse racing
Horse Racing Roulette
Horse racing
These are 2 of the 8 racing game types the API serves. One integration covers all of them. The response shape does not change between game types.
Quick start
Authenticate with the X-API-Key header. List game types with /game-types, then filter events with the game_type_id and status parameters.
curl -H "X-API-Key: YOUR_KEY" \
"https://virtuals-api.sportlogic.io/api/v1/events?status=scheduled"Sample event response
GET /api/v1/events/{id} returns the event and every runner with draw number, win and place odds, and form. Odds are decimal.
The event also carries id and game_type_id. The API assigns both, so read them from /game-types and /events rather than copying numbers off this page.
Dashing Derby
Scheduled| Draw number | Runner | Last 5 | Win | Place |
|---|---|---|---|---|
| 1 | Silver Comet | 2,1,5,3,4 | 4.50 | 1.85 |
| 2 | Night Runner | 4,6,1,2,7 | 6.00 | 2.10 |
| 3 | Copper Mile | 1,3,2,1,5 | 3.20 | 1.60 |
| 4 | Quiet Storm | 7,5,8,4,6 | 9.50 | 3.00 |
{
"success": true,
"data": {
"event": {
"name": "Dashing Derby",
"status": "scheduled",
"scheduled_at": "2026-08-15T14:03:00Z"
},
"runners": [
{
"draw_number": 1,
"name": "Silver Comet",
"odds_win": 4.5,
"odds_place": 1.85,
"form": [
2,
1,
5,
3,
4
]
},
{
"draw_number": 2,
"name": "Night Runner",
"odds_win": 6,
"odds_place": 2.1,
"form": [
4,
6,
1,
2,
7
]
},
{
"draw_number": 3,
"name": "Copper Mile",
"odds_win": 3.2,
"odds_place": 1.6,
"form": [
1,
3,
2,
1,
5
]
},
{
"draw_number": 4,
"name": "Quiet Storm",
"odds_win": 9.5,
"odds_place": 3,
"form": [
7,
5,
8,
4,
6
]
}
]
}
}Results and settlement
When the event finishes, GET /api/v1/events/{id}/results returns the finishing order plus win, place, forecast and tricast settlement. You can grade bets straight from this response.
{
"success": true,
"data": {
"status": "finished",
"positions": [
{
"finish_position": 1,
"draw_number": 3,
"name": "Copper Mile",
"odds_win": 3.2,
"odds_place": 1.6
},
{
"finish_position": 2,
"draw_number": 1,
"name": "Silver Comet",
"odds_win": 4.5,
"odds_place": 1.85
},
{
"finish_position": 3,
"draw_number": 2,
"name": "Night Runner",
"odds_win": 6,
"odds_place": 2.1
},
{
"finish_position": 4,
"draw_number": 4,
"name": "Quiet Storm",
"odds_win": 9.5,
"odds_place": 3
}
],
"settlement": {
"win": {
"draw_number": 3,
"name": "Copper Mile",
"odds_win": 3.2
},
"place": [
{
"finish_position": 1,
"draw_number": 3,
"name": "Copper Mile",
"odds_place": 1.6
},
{
"finish_position": 2,
"draw_number": 1,
"name": "Silver Comet",
"odds_place": 1.85
}
],
"forecast": {
"first": 3,
"second": 1
},
"tricast": {
"first": 3,
"second": 1,
"third": 2
},
"place_terms": "1-2 of 4 runners"
}
}
}Cache responses while you build
The free plan includes 500 requests a day. That covers a full day of building if you cache. Store each response by event id and read from the cache instead of calling the API again for the same data. Fetch the schedule on a timer, not on every render. The cadence is the same at every hour, so one interval works all day. A settled result never changes, so you can cache results forever.
const cache = new Map();
async function getEvent(id) {
if (!cache.has(id)) {
const res = await fetch(`${BASE}/events/${id}`, { headers });
cache.set(id, await res.json());
}
return cache.get(id);
}Frequently asked questions
- Does the schedule stop when there is no real racing?
- No. The events are computer-generated and do not follow a real fixture list. Races are scheduled a few minutes apart, day and night, every day of the year. There is no off-season and no empty day.
- What happens when a real meeting is abandoned?
- Nothing changes here. Weather, ground and stewards have no effect on a generated race. An event that shows as scheduled will run and will settle, so you do not need a code path for an abandoned meeting.
- Is this real horse racing data?
- No. Every race, runner and result is computer-generated. The names are invented and the odds are not a real market. Use it for virtual racing products, and to build and test against a feed that is always running.
- What horse racing data does the API return?
- Scheduled and finished events, runners with draw numbers and form, win and place odds, and results with win, place, forecast and tricast settlement. Every endpoint returns JSON over REST.
- Is there a free plan?
- Yes. The free plan is $0 and includes 500 requests a day. You do not need a credit card. Paid plans start at $59 a month for 15,000 requests a day.
- How do I authenticate?
- Sign in at dashboard.sportlogic.io with Google and copy your key. Send it in the X-API-Key header on every request.
Other sports on the same API
- Virtual greyhound racing APIGreyhound events, odds and settled results in JSON.
- Virtual harness racing APIHarness racing (trotting) events, odds and results in JSON.
- Virtual steeplechase APIJumps racing events, odds and settled results in JSON.
- Virtual motor racing APIMotor racing events, odds and settled results in JSON.
- Virtual speed skating APISpeed skating events, odds and settled results in JSON.
Get a free key
Free tier, no credit card. Get a key and make your first call in minutes.