Contact Us

If you still have questions or prefer to get help directly from an agent, please submit a request.
We’ll get back to you as soon as possible.

Please fill out the contact form below and we will reply as soon as possible.

  • Contact Us
  • Home
  • Client Help

What historical data does GRID offer, and how far back does it go?

Article 3776591, Status: VALIDATED

Contact Us

If you still have questions or prefer to get help directly from an agent, please submit a request.
We’ll get back to you as soon as possible.

Please fill out the contact form below and we will reply as soon as possible.

  • Client Help
  • Sky's The Limit - Cloud9 x JetBrains Hackathon
+ More

Table of Contents

❓Issue/Question 💻Environment/Context 👌Resolution/Answer Types of Historical Data Historical State Historical Events How to access historical data Option 1 — Series State API Option 2 — Series Events API (WebSocket) Option 3 — File Download API Data formats Example Data Format (End-State) Example Data Format (Event-Level - JSONL)

❓Issue/Question

  • How far back does GRID historical data go for CS2, League of Legends, Valorant, and Dota?
  • What format does GRID historical data come in?
  • What is the difference between Historical State and Historical Events?
  • What data points are included in a historical data file?
  • How can I preview or access GRID historical data?

💻Environment/Context

  • GRID Historical Data
  • Series State API
  • Series Events API (WebSocket)
  • File Download API

👌Resolution/Answer

GRID Historical Data refers to data generated from completed matches (series).

  • Historical data is availability differs from title to title, but all titles have at least 2 years worth of data available

Types of Historical Data

GRID Historical Data is derived from the Live Data Feed and exists in two forms. The right choice depends on your use case.

Historical State 

Historical Events

Represents the final aggregated snapshot of a series → e.g. Match result (score, winner), Team stats (kills, assists, objectives), Player stats (kills, deaths, weapon usage), etc. The full sequence of individual events that occurred during a series → e.g. each kill event as it happened, in order, the actor (who performed the action), the target (who/what was affected), etc.
Best suited for stats-based applications such as Fantasy platforms and visualisation widgets. Best suited for in-play betting and live series modelling that requires event-by-event sequences.
Available externally via the Series State API and as a downloadable JSON file. Provided as a compressed JSONL (JSON Lines) file via the File Download API or through the Series Events API. 
Users can re-use their existing Series State API integration seamlessly. Each event includes the actor, action, target, and how the event changed the GRID state.

How to access historical data

Option 1 — Series State API

The Series State API returns the end state of any completed series in the same structure as the live feed. Clients with an existing Series State API integration can query past series immediately without any additional setup.

  • Endpoint: the same GraphQL Series State API used for live data
  • Authentication: standard GRID API key via x-api-key header
  • Returns: aggregated end-state snapshot in JSON
  • Best for: stats, Fantasy, visualisations
 
 

Option 2 — Series Events API (WebSocket)

When you connect to the Series Events API WebSocket for a past series, GRID automatically replays the full sequence of events for that series from start to finish, exactly as they were emitted during the live match. This means the same WebSocket integration used for live coverage can be reused to retrieve historical event data with no extra configuration.

  • Protocol: WebSocket connection to the Series Events API 
  • Behaviour: connecting to a finished series triggers a full event replay from the beginning
  • Returns: stream of individual events, each with actor, action, target, and resulting state change
  • Best for: in-play betting models, live series modelling, ML training data
  • Some in-play events such as damage related events are not available through this method
  • This requires a special level of access that needs to be requested through your commercial contact
 
 
 

Option 3 — File Download API

The File Download API at https://api.grid.gg/file-download allows bulk download of historical data files for a given series. This is useful for one-off data exports or batch processing workflows that do not require a streaming integration.

The File Download API includes both the Series State and Series Events files.

More information is available here.

 
 

 

Data formats

Example Data Format (End-State)

Historical State follows the same structure as the Series State API:

{
 "data": {
   "seriesState": {
     "title": {
       "nameShortened": "cs2"
     },
     "format": "best-of-3",
     "started": true,
     "finished": true,
     "updatedAt": "2026-04-20T18:45:12Z",

     "teams": [
       {
         "name": "Team Alpha",
         "score": 2,
         "won": true,
         "kills": 192,
         "killAssistsGiven": 28,
         "deaths": 171,
         "headshots": 77,

         "weaponKills": [
           { "weaponName": "ak47", "count": 62 },
           { "weaponName": "awp", "count": 35 }
         ],

         "objectives": [
           { "type": "plantBomb", "completionCount": 15 },
           { "type": "defuseBomb", "completionCount": 7 }
         ]
       },
       {
         "name": "Team Beta",
         "score": 0,
         "won": false,
         "kills": 170,
         "killAssistsGiven": 30,
         "deaths": 193,
         "headshots": 75
       }
     ],

     "games": [
       {
         "sequenceNumber": 1,
         "map": {
           "name": "ancient"
         },
         "teams": [
           {
             "name": "Team Alpha",
             "side": "counter-terrorists",
             "players": [
               {
                 "name": "player1",
                 "kills": 22,
                 "deaths": 16,
                 "killAssistsGiven": 3,
                 "headshots": 10,

                 "weaponKills": [
                   { "weaponName": "ak47", "count": 12 },
                   { "weaponName": "awp", "count": 5 }
                 ],

                 "objectives": [
                   { "type": "defuseBomb", "completionCount": 1 }
                 ]
               }
             ]
           }
         ]
       }
     ],

     "draftActions": [
       {
         "type": "ban",
         "sequenceNumber": "1",
         "draftable": {
           "type": "map",
           "name": "inferno"
         }
       },
       {
         "type": "pick",
         "sequenceNumber": "2",
         "draftable": {
           "type": "map",
           "name": "ancient"
         }
       }
     ]
   }
 }
}

 
 

Example Data Format (Event-Level - JSONL)

Historical Events are delivered in JSON Lines (JSONL) format:

  • Each line = one transaction
  • Each transaction contains one or more events occurring at the same timestamp
  • Each event includes:
    • Actor (who performed the action)
    • Action (what happened)
    • Target (who/what was affected)
    • State delta (how the state changed)

{"id":"83e30d61-e67c-4112-9f82-7823e8774118","correlationId":"6ca602e3-0bdf-4baf-a65d-97e01d0b6484","occurredAt":"2026-02-07T16:45:17.393Z","seriesId":"2894140","sequenceNumber":29,"events":[{"id":"c2225d4c-dcaf-470d-a578-3a9fb051a800","includesFullState":false,"type":"player-equipped-item","actor":{"type":"player","id":"111697","stateDelta":{"id":"111697","series":{"id":"111697"},"game":{"id":"111697","inventory":{"items":[{"id":"item_tango","equipped":1}]}}},"state":{"id":"111697","name":"Ame","teamId":"1451","side":"radiant","series":{"id":"111697","name":"Ame"},"game":{"id":"111697","name":"Ame","money":45,"loadoutValue":90,"netWorth":135,"inventory":{"items":[{"id":"item_tango","equipped":1}]},"position":{"x":-6700.0,"y":-6700.0}}}},"action":"equipped","target":{"type":"item","id":"item_tango","stateDelta":{"id":"item_tango","equipped":1},"state":{"id":"item_tango","equipped":1}},"seriesStateDelta":{"id":"2894140","games":[{"id":"9f4c9206-6cc1-4ef5-ba48-ce96b3e21634","teams":[{"id":"1451","players":[{"id":"111697","inventory":{"items":[{"id":"item_tango","equipped":1}]}}]}]}]},"seriesState":{"id":"2894140","games":[{"id":"9f4c9206-6cc1-4ef5-ba48-ce96b3e21634","sequenceNumber":1,"clock":{"id":"39da4972-8eca-39a0-963f-d94e05287773","type":"gameClock","currentSeconds":-90},"teams":[{"id":"53014","money":330,"loadoutValue":0,"netWorth":330,"players":[{"id":"111657","name":"Sneyking","money":80,"loadoutValue":0,"netWorth":80,"position":{"x":6900.0,"y":6650.0}},{"id":"111659","name":"skiter","money":0,"loadoutValue":0,"netWorth":0,"position":{"x":6950.0,"y":6500.0}},{"id":"111661","name":"Malr1ne","money":235,"loadoutValue":0,"netWorth":235,"position":{"x":7100.0,"y":6376.0}},{"id":"111663","name":"AMMAR_THE_F","money":5,"loadoutValue":0,"netWorth":5},{"id":"111665","name":"Cr1t-","money":10,"loadoutValue":0,"netWorth":10}]},{"id":"1451","money":235,"loadoutValue":90,"netWorth":325,"players":[{"id":"111697","name":"Ame","money":45,"loadoutValue":90,"netWorth":135,"inventory":{"items":[{"id":"item_tango","equipped":1}]},"position":{"x":-6700.0,"y":-6700.0}},{"id":"111071","name":"NothingToSay","money":55,"loadoutValue":0,"netWorth":55,"position":{"x":-6750.0,"y":-6550.0}},{"id":"111701","name":"Xxs","money":5,"loadoutValue":0,"netWorth":5,"position":{"x":-6900.0,"y":-6425.0}},{"id":"111084","name":"fy","money":100,"loadoutValue":0,"netWorth":100,"position":{"x":-6950.0,"y":-6275.0}},{"id":"104663","name":"xNova","money":30,"loadoutValue":0,"netWorth":30,"position":{"x":-7100.0,"y":-6150.0}}]}]}]}}]}
 

{"id":"d97d6150-a391-410f-8baa-b93079562b20","correlationId":"6ca602e3-0bdf-4baf-a65d-97e01d0b6484","occurredAt":"2026-02-07T16:45:17.393Z","seriesId":"2894140","sequenceNumber":30,"events":[{"id":"286e9181-6cb9-4ab3-bfb8-1f9be7efc6c9","includesFullState":false,"type":"player-acquired-item","actor":{"type":"player","id":"111697","stateDelta":{"id":"111697","game":{"id":"111697","loadoutValue":200,"netWorth":200,"inventory":{"items":[{"id":"item_magic_stick","statePath":[{"id":"item_magic_stick"}],"name":"item_magic_stick","quantity":1,"equipped":0,"stashed":0}]}}},"state":{"id":"111697","name":"Ame","teamId":"1451","side":"radiant","game":{"id":"111697","name":"Ame","money":45,"loadoutValue":290,"netWorth":335,"inventory":{"items":[{"id":"item_magic_stick","statePath":[{"id":"item_magic_stick"}],"name":"item_magic_stick","quantity":1,"equipped":0,"stashed":0}]},"position":{"x":-6700.0,"y":-6700.0}}}},"action":"acquired","target":{"type":"item","id":"item_magic_stick","stateDelta":{"id":"item_magic_stick","statePath":[{"id":"item_magic_stick"}],"name":"item_magic_stick","quantity":1,"equipped":0,"stashed":0},"state":{"id":"item_magic_stick","statePath":[{"id":"item_magic_stick"}],"name":"item_magic_stick","quantity":1,"equipped":0,"stashed":0}},"seriesStateDelta":{"id":"2894140","games":[{"id":"9f4c9206-6cc1-4ef5-ba48-ce96b3e21634","teams":[{"id":"1451","loadoutValue":200,"netWorth":200,"players":[{"id":"111697","loadoutValue":200,"netWorth":200,"inventory":{"items":[{"id":"item_magic_stick","statePath":[{"id":"item_magic_stick"}],"name":"item_magic_stick","quantity":1,"equipped":0,"stashed":0}]}}]}]}]},"seriesState":{"id":"2894140","games":[{"id":"9f4c9206-6cc1-4ef5-ba48-ce96b3e21634","sequenceNumber":1,"clock":{"id":"39da4972-8eca-39a0-963f-d94e05287773","type":"gameClock","currentSeconds":-90},"teams":[{"id":"53014","money":330,"loadoutValue":0,"netWorth":330,"players":[{"id":"111657","name":"Sneyking","money":80,"loadoutValue":0,"netWorth":80,"position":{"x":6900.0,"y":6650.0}},{"id":"111659","name":"skiter","money":0,"loadoutValue":0,"netWorth":0,"position":{"x":6950.0,"y":6500.0}},{"id":"111661","name":"Malr1ne","money":235,"loadoutValue":0,"netWorth":235,"position":{"x":7100.0,"y":6376.0}},{"id":"111663","name":"AMMAR_THE_F","money":5,"loadoutValue":0,"netWorth":5},{"id":"111665","name":"Cr1t-","money":10,"loadoutValue":0,"netWorth":10}]},{"id":"1451","money":235,"loadoutValue":290,"netWorth":525,"players":[{"id":"111697","name":"Ame","money":45,"loadoutValue":290,"netWorth":335,"inventory":{"items":[{"id":"item_magic_stick","statePath":[{"id":"item_magic_stick"}],"name":"item_magic_stick","quantity":1,"equipped":0,"stashed":0}]},"position":{"x":-6700.0,"y":-6700.0}},{"id":"111071","name":"NothingToSay","money":55,"loadoutValue":0,"netWorth":55,"position":{"x":-6750.0,"y":-6550.0}},{"id":"111701","name":"Xxs","money":5,"loadoutValue":0,"netWorth":5,"position":{"x":-6900.0,"y":-6425.0}},{"id":"111084","name":"fy","money":100,"loadoutValue":0,"netWorth":100,"position":{"x":-6950.0,"y":-6275.0}},{"id":"104663","name":"xNova","money":30,"loadoutValue":0,"netWorth":30,"position":{"x":-7100.0,"y":-6150.0}}]}]}]}}]}

 
 

 

Was this article helpful?

Yes
No
Give feedback about this article

Related Articles

  • How to handle rolling starts in Series Events?
  • Can I get a list of series that are currently live?
  • What are the rate limits for our products?
  • What's the difference between actor-destroyed-target and actor-completed-destroy[target] events in the Series Events API?
  • Why is netWorth on GRID's API different from the net worth (total gold) value on the broadcast? (LoL)
Privacy Policy
Esports Players Privacy Notice
Imprint
Careers
GRID® 2022 | All Rights Reserved
Expand