See the live demo hereOpen demo

Motor racing

Virtual motor racing API

Virtual motor racing data in JSON. The races are computer-generated, so they run every day rather than on a few dozen weekends a year. The API returns events, drivers with grid 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 motorsport season is a few dozen race weekends with long breaks between them. This feed has no breaks. A race starts every few minutes, at any hour, in every month.

  • 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

Motor Racing

Motor racing

Single Seater MR

Single seater motor 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
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 driver 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.

Motor Racing

Scheduled
Draw numberDriverLast 5WinPlace
1Keller2,4,1,3,54.401.80
2Moreno1,1,3,2,43.601.65
3Sato5,6,4,7,27.502.50
4Novak6,3,7,5,89.003.00
GET /api/v1/events/{id}
{
  "success": true,
  "data": {
    "event": {
      "name": "Motor Racing",
      "status": "scheduled",
      "scheduled_at": "2026-08-15T14:03:00Z"
    },
    "runners": [
      {
        "draw_number": 1,
        "name": "Keller",
        "odds_win": 4.4,
        "odds_place": 1.8,
        "form": [
          2,
          4,
          1,
          3,
          5
        ]
      },
      {
        "draw_number": 2,
        "name": "Moreno",
        "odds_win": 3.6,
        "odds_place": 1.65,
        "form": [
          1,
          1,
          3,
          2,
          4
        ]
      },
      {
        "draw_number": 3,
        "name": "Sato",
        "odds_win": 7.5,
        "odds_place": 2.5,
        "form": [
          5,
          6,
          4,
          7,
          2
        ]
      },
      {
        "draw_number": 4,
        "name": "Novak",
        "odds_win": 9,
        "odds_place": 3,
        "form": [
          6,
          3,
          7,
          5,
          8
        ]
      }
    ]
  }
}

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.

GET /api/v1/events/{id}/results
{
  "success": true,
  "data": {
    "status": "finished",
    "positions": [
      {
        "finish_position": 1,
        "draw_number": 2,
        "name": "Moreno",
        "odds_win": 3.6,
        "odds_place": 1.65
      },
      {
        "finish_position": 2,
        "draw_number": 1,
        "name": "Keller",
        "odds_win": 4.4,
        "odds_place": 1.8
      },
      {
        "finish_position": 3,
        "draw_number": 3,
        "name": "Sato",
        "odds_win": 7.5,
        "odds_place": 2.5
      },
      {
        "finish_position": 4,
        "draw_number": 4,
        "name": "Novak",
        "odds_win": 9,
        "odds_place": 3
      }
    ],
    "settlement": {
      "win": {
        "draw_number": 2,
        "name": "Moreno",
        "odds_win": 3.6
      },
      "place": [
        {
          "finish_position": 1,
          "draw_number": 2,
          "name": "Moreno",
          "odds_place": 1.65
        },
        {
          "finish_position": 2,
          "draw_number": 1,
          "name": "Keller",
          "odds_place": 1.8
        }
      ],
      "forecast": {
        "first": 2,
        "second": 1
      },
      "tricast": {
        "first": 2,
        "second": 1,
        "third": 3
      },
      "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.

JavaScript
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 between race weekends?
No. A real motorsport calendar has a few dozen race weekends and long breaks between them. Generated motor racing starts a race every few minutes, on every day of the year.
What happens on a day with no real motorsport?
The feed does not change. Events are generated on a steady cycle, so the number of races and settled results is the same on any day you call it.
Is this real motorsport data?
No. Drivers, grid numbers, odds and results are all computer-generated. The names are invented, and nothing in the feed refers to a real team, driver or circuit. The grid position is the draw_number field on each driver.
What motor 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.

Get a free key

Free tier, no credit card. Get a key and make your first call in minutes.