LiveLive scores API

A live CS2 score on your stream.

Show the live map score and round for any tracked match in an OBS browser source. A ten-line proxy keeps your key off the page; the overlay polls it every five seconds.

  • OBS browser source
  • Key stays server-side
  • 500 free requests / month
GET /cs2/live200 OK
$ curl "https://api.citoapi.com/api/v1/cs2/live" \ -H "x-api-key: $CITO_API_KEY"
{  "data": [    ...    {      "matchId": "cs2-match-2398694",      "team1Name": "The Last Resort",      "team2Name": "Famalicão",      "currentMap": "de_inferno",      "currentMapScore": { "team1": 1, "team2": 2 },      "streamLinks": [        ...        { "platform": "twitch", "label": "Hotspawn" }      ]    }  ]}

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

Overlays and widgets

For watch parties, co-streams and community sites.

Map score

The live score of the map being played.

Round

The current round number.

Series score

Maps won by each team.

Scoreboard

Player kills, deaths and money for a full board.

Streams

Official and co-stream links per match.

Push

Swap polling for the SSE stream when you are ready.

Proxy and overlay

Run the proxy with CITO_API_KEY set, then add overlay.html as a browser source.

proxy.mjs
// proxy.mjs  (Node 18+). Keeps your key off the overlay page.
import http from "node:http";

http
  .createServer(async (_req, res) => {
    const upstream = await fetch("https://api.citoapi.com/api/v1/cs2/live", {
      headers: { "x-api-key": process.env.CITO_API_KEY },
    });
    res.writeHead(upstream.status, {
      "content-type": "application/json",
      "access-control-allow-origin": "*",
    });
    res.end(await upstream.text());
  })
  .listen(8787);
overlay.html
<!-- overlay.html: add as an OBS Browser Source -->
<div id="score" style="font: 700 42px system-ui; color: white"></div>
<script>
  const MATCH_ID = "cs2-match-2398694";
  async function tick() {
    const { data } = await (await fetch("http://localhost:8787/")).json();
    const m = data.find((x) => x.matchId === MATCH_ID);
    if (!m) return;
    const s = m.currentMapScore || { team1: 0, team2: 0 };
    document.getElementById("score").textContent =
      m.team1Name + " " + s.team1 + " - " + s.team2 + " " + m.team2Name + "  R" + m.currentRound;
  }
  tick();
  setInterval(tick, 5000);
</script>

Endpoints you can ship with

Live endpoints for overlays: list, state, scoreboard and stream.

Live matches

Poll the live list for every match in progress, open one match for its round, timer, bomb and players, or keep an SSE stream open and get each update pushed.

View docs
  • GET/api/v1/cs2/live

    Matches in progress: series score, map in play, map score, current round.

  • GET/api/v1/cs2/live/{matchId}/state

    One live match: score, round, round timer, bomb status and players.

  • GET/api/v1/cs2/live/{matchId}/scoreboard

    Series score, current map and round, and each player's kills, deaths, money and equipment.

  • GET/api/v1/cs2/live/{matchId}/rounds

    Round-by-round results so far: winner, side and how each round ended.

  • GET/api/v1/cs2/live/stream

    Server-Sent Events push of every live update. Every plan; counts like polling.

  • GET/api/v1/cs2/live/ws

    WebSocket with a room per match. Scale and Enterprise.

FAQs

Overlays, delay and keys

Can't find what you're looking for? Contact our customer support team

See pricing

Put CS2 on your stream

Get a free key and run the proxy.