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
{ "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 serverOverlays 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 (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: 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.
- GET
/api/v1/cs2/liveMatches in progress: series score, map in play, map score, current round.
- GET
/api/v1/cs2/live/{matchId}/stateOne live match: score, round, round timer, bomb status and players.
- GET
/api/v1/cs2/live/{matchId}/scoreboardSeries score, current map and round, and each player's kills, deaths, money and equipment.
- GET
/api/v1/cs2/live/{matchId}/roundsRound-by-round results so far: winner, side and how each round ended.
- GET
/api/v1/cs2/live/streamServer-Sent Events push of every live update. Every plan; counts like polling.
- GET
/api/v1/cs2/live/wsWebSocket with a room per match. Scale and Enterprise.
For live builds
- CS2 live score APISeries, map and round score for every match in progress.
- CS2 API in Node.jsFetch CS2 data from JavaScript and TypeScript.
- CS2 Discord bot APILive score and result commands for a Discord bot.
- Steam CS2 APIWhat Valve's Steam Web API and GSI cover, and what they do not.
- CS2 schedule APIUpcoming matches, today's slate and the tournament calendar.
- CS2 API endpointsEvery CS2 endpoint on one page, grouped by job.