SheetsApps Script below

CS2 data in a spreadsheet.

Two Apps Script custom functions put the VRS table and recent results in any cell. No add-on, no export: type =CS2_VRS(30) and the table fills in.

  • Custom functions
  • No add-on needed
  • 500 free requests / month
GET /cs2/rankings/vrs?limit=3200 OK
$ curl "https://api.citoapi.com/api/v1/cs2/rankings/vrs?limit=3" \ -H "x-api-key: $CITO_API_KEY"
{  "data": [    {      "rank": 1,      "teamName": "Spirit",      "region": "Europe"    },    {      "rank": 2,      "teamName": "Legacy",      "region": "South America"    }    ...  ]}

Seamless Integration with our MCP Server

Give Claude, Cursor and ChatGPT the CS2 data. One command writes the MCP config; agents call live scoreboard, team map stat, opening duel and transfer tools instead of inventing match IDs, and your key stays on your machine.

MCPInstall the Cito MCP server
Claude
Cursor
OpenAI
Python
Cito API
Next.js
Discord
Slack
GitHub

What analysts keep in Sheets

Tables that refresh when you reopen the sheet.

Rankings

The VRS table with points and change.

Results

Recent results with event and score.

Player lines

A player's recent maps, row by row.

Schedules

Upcoming matches for a planning sheet.

Skin prices

Track a watchlist of skins by price.

Refresh on open

Custom functions recalculate with the sheet.

Rankings and results functions

Code.gs
// Extensions > Apps Script. Save your key under Project Settings > Script properties
// as CITO_API_KEY, then type =CS2_VRS(30) in a cell.
function CS2_VRS(limit) {
  const key = PropertiesService.getScriptProperties().getProperty("CITO_API_KEY");
  const res = UrlFetchApp.fetch(
    "https://api.citoapi.com/api/v1/cs2/rankings/vrs?limit=" + (limit || 30),
    { headers: { "x-api-key": key } }
  );
  const rows = JSON.parse(res.getContentText()).data;
  return [["Rank", "Team", "Points", "Change"]].concat(
    rows.map(function (r) { return [r.rank, r.teamName, r.points, r.change]; })
  );
}

function CS2_RESULTS(limit) {
  const key = PropertiesService.getScriptProperties().getProperty("CITO_API_KEY");
  const res = UrlFetchApp.fetch(
    "https://api.citoapi.com/api/v1/cs2/matches/recent?limit=" + (limit || 20),
    { headers: { "x-api-key": key } }
  );
  const rows = JSON.parse(res.getContentText()).data;
  return [["Event", "Team 1", "Score", "Team 2"]].concat(
    rows.map(function (m) { return [m.eventName, m.team1Name, m.team1Score + "-" + m.team2Score, m.team2Name]; })
  );
}

Endpoints you can ship with

Any list endpoint can become a sheet function.

Rankings

The world team ranking and the Valve Regional Standings, with points and movement, plus one table per region.

View docs
  • GET/api/v1/cs2/rankings/world

    The latest world team ranking.

  • GET/api/v1/cs2/rankings/vrs

    The latest Valve Regional Standings (VRS).

  • GET/api/v1/cs2/rankings/region/{region}

    One region, with each team's world and regional rank.

  • GET/api/v1/cs2/rankings

    One row per team, with points and change since the previous ranking.

Frequently asked questions

Apps Script, keys and refresh

Something missing? Email support@citoapi.com.

Can I get CS2 data into Google Sheets?

Yes. Add an Apps Script custom function that calls the API with UrlFetchApp and returns rows, like CS2_VRS above.

Where do I keep the API key?

In Project Settings > Script properties as CITO_API_KEY, so it is not in the sheet.

How often does it refresh?

Custom functions recalculate when the sheet or their arguments change. Add a time-driven trigger for a schedule.

Does each cell use a request?

Each function call is one request. Put the function in one cell and let it fill the table.

Can I use it in Excel?

Yes, with Power Query: add a web source with the x-api-key header.

See pricing

Put CS2 in a ranking sheet

Get a free key and paste the script.